summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Wisbon <ian.wisbon@timesys.com>2011-02-14 16:41:03 -0500
committerIan Wisbon <ian.wisbon@timesys.com>2011-02-14 16:44:16 -0500
commitf3e8554f6e7441c1159994f93cf7bad631a122c1 (patch)
tree80f5d89cca49330e137688c72fb10c9f42dc5663
parent14a4057959f8ee0a2249eb2abd64fd6b1f571d98 (diff)
Digi Release Code from del-5.6/main
-rw-r--r--Documentation/connector/cn_test.c4
-rw-r--r--Documentation/connector/connector.txt8
-rw-r--r--Documentation/dontdiff1
-rw-r--r--Documentation/filesystems/ext4.txt10
-rw-r--r--Documentation/filesystems/tmpfs.txt6
-rw-r--r--Documentation/kernel-parameters.txt2
-rw-r--r--Documentation/networking/timestamping/timestamping.c2
-rw-r--r--Documentation/video4linux/gspca.txt2
-rw-r--r--MAINTAINERS8
-rw-r--r--Makefile7
-rw-r--r--arch/alpha/kernel/core_marvel.c2
-rw-r--r--arch/alpha/kernel/core_titan.c2
-rw-r--r--arch/alpha/kernel/pci_impl.h2
-rw-r--r--arch/alpha/kernel/pci_iommu.c4
-rw-r--r--arch/alpha/kernel/vmlinux.lds.S1
-rw-r--r--arch/arm/Kconfig2
-rw-r--r--arch/arm/Makefile2
-rw-r--r--arch/arm/configs/imx23evk_updater_defconfig1
-rw-r--r--arch/arm/configs/imx28evk_defconfig29
-rw-r--r--arch/arm/configs/imx28evk_updater_defconfig1
-rw-r--r--arch/arm/configs/imx5_defconfig16
-rw-r--r--arch/arm/configs/imx5_updater_defconfig309
-rw-r--r--arch/arm/include/asm/kmap_types.h6
-rw-r--r--arch/arm/kernel/Makefile3
-rw-r--r--arch/arm/mach-mx23/device.c44
-rw-r--r--arch/arm/mach-mx23/mx23evk_pins.c22
-rw-r--r--arch/arm/mach-mx23/usb_dr.c30
-rw-r--r--arch/arm/mach-mx25/mx25_3stack.c2
-rw-r--r--arch/arm/mach-mx25/usb_dr.c24
-rw-r--r--arch/arm/mach-mx28/bus_freq.c16
-rw-r--r--arch/arm/mach-mx28/device.c100
-rw-r--r--arch/arm/mach-mx28/emi_settings.c1
-rw-r--r--arch/arm/mach-mx28/mx28evk.c2
-rw-r--r--arch/arm/mach-mx28/mx28evk.h3
-rw-r--r--arch/arm/mach-mx28/mx28evk_pins.c233
-rw-r--r--arch/arm/mach-mx28/pm.c52
-rw-r--r--arch/arm/mach-mx28/sleep.S195
-rw-r--r--arch/arm/mach-mx28/usb_dr.c24
-rw-r--r--arch/arm/mach-mx3/devices.c17
-rw-r--r--arch/arm/mach-mx3/usb_dr.c22
-rw-r--r--arch/arm/mach-mx35/devices.c17
-rw-r--r--arch/arm/mach-mx35/mx35_3stack.c8
-rw-r--r--arch/arm/mach-mx35/usb_dr.c22
-rw-r--r--arch/arm/mach-mx37/cpu.c2
-rw-r--r--arch/arm/mach-mx37/crm_regs.h10
-rw-r--r--arch/arm/mach-mx37/devices.c27
-rw-r--r--arch/arm/mach-mx37/usb_dr.c23
-rw-r--r--arch/arm/mach-mx5/Kconfig10
-rw-r--r--arch/arm/mach-mx5/Makefile18
-rw-r--r--arch/arm/mach-mx5/bus_freq.c570
-rw-r--r--arch/arm/mach-mx5/clock.c17
-rw-r--r--arch/arm/mach-mx5/clock_mx50.c858
-rw-r--r--arch/arm/mach-mx5/cpu.c46
-rw-r--r--arch/arm/mach-mx5/crm_regs.h96
-rw-r--r--arch/arm/mach-mx5/devices.c229
-rw-r--r--arch/arm/mach-mx5/devices.h14
-rw-r--r--arch/arm/mach-mx5/devices_ccwmx51.c60
-rw-r--r--arch/arm/mach-mx5/devices_ccwmx51.h5
-rw-r--r--arch/arm/mach-mx5/displays/hdmi_ad9389.h4
-rw-r--r--arch/arm/mach-mx5/mm.c2
-rw-r--r--arch/arm/mach-mx5/mx50_arm2.c921
-rw-r--r--arch/arm/mach-mx5/mx50_arm2_gpio.c658
-rw-r--r--arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c23
-rw-r--r--arch/arm/mach-mx5/mx50_pins.h340
-rw-r--r--arch/arm/mach-mx5/mx51_3stack.c88
-rw-r--r--arch/arm/mach-mx5/mx51_babbage.c595
-rw-r--r--arch/arm/mach-mx5/mx51_babbage_gpio.c60
-rw-r--r--arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c6
-rw-r--r--arch/arm/mach-mx5/mx51_ccwmx51js.c79
-rw-r--r--arch/arm/mach-mx5/mx53_evk.c807
-rw-r--r--arch/arm/mach-mx5/mx53_evk_gpio.c730
-rw-r--r--arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c18
-rw-r--r--arch/arm/mach-mx5/pm.c77
-rw-r--r--arch/arm/mach-mx5/system.c115
-rw-r--r--arch/arm/mach-mx5/usb_dr.c169
-rw-r--r--arch/arm/mach-mx5/usb_h1.c47
-rw-r--r--arch/arm/mach-pxa/cpufreq-pxa2xx.c2
-rw-r--r--arch/arm/mach-pxa/em-x270.c11
-rw-r--r--arch/arm/mach-pxa/sharpsl_pm.c4
-rw-r--r--arch/arm/mm/highmem.c8
-rw-r--r--arch/arm/plat-mxc/clock.c21
-rw-r--r--arch/arm/plat-mxc/dvfs_core.c64
-rw-r--r--arch/arm/plat-mxc/include/mach/iomux-v3.h50
-rw-r--r--arch/arm/plat-mxc/include/mach/mmc.h3
-rw-r--r--arch/arm/plat-mxc/include/mach/mx5x.h28
-rw-r--r--arch/arm/plat-mxc/include/mach/mxc.h36
-rw-r--r--arch/arm/plat-mxc/include/mach/mxc_dvfs.h21
-rw-r--r--arch/arm/plat-mxc/include/mach/system.h3
-rw-r--r--arch/arm/plat-mxc/iomux-v3.c45
-rw-r--r--arch/arm/plat-mxc/usb_common.c17
-rw-r--r--arch/arm/plat-mxs/device.c18
-rw-r--r--arch/arm/plat-mxs/dma-apbx.c3
-rw-r--r--arch/arm/plat-mxs/dmaengine.c12
-rw-r--r--arch/arm/plat-mxs/include/mach/device.h6
-rw-r--r--arch/arm/plat-mxs/include/mach/dmaengine.h1
-rw-r--r--arch/arm/plat-mxs/include/mach/timex.h2
-rw-r--r--arch/arm/plat-mxs/timer-nomatch.c9
-rw-r--r--arch/arm/plat-mxs/usb_common.c21
-rw-r--r--arch/arm/plat-mxs/utmixc.c2
-rw-r--r--arch/arm/tools/mach-types3
-rw-r--r--arch/cris/Makefile2
-rw-r--r--arch/cris/kernel/Makefile1
-rw-r--r--arch/m68k/Kconfig6
-rw-r--r--arch/mips/Makefile27
-rw-r--r--arch/mips/kernel/Makefile2
-rw-r--r--arch/mips/kernel/vmlinux.lds.S13
-rw-r--r--arch/powerpc/Makefile2
-rw-r--r--arch/powerpc/include/asm/elf.h8
-rw-r--r--arch/powerpc/include/asm/kmap_types.h11
-rw-r--r--arch/powerpc/include/asm/mmu-hash64.h2
-rw-r--r--arch/powerpc/include/asm/pmc.h16
-rw-r--r--arch/powerpc/include/asm/pte-common.h2
-rw-r--r--arch/powerpc/include/asm/thread_info.h2
-rw-r--r--arch/powerpc/kernel/lparcfg.c3
-rw-r--r--arch/powerpc/kernel/perf_counter.c68
-rw-r--r--arch/powerpc/kernel/process.c12
-rw-r--r--arch/powerpc/kernel/rtas.c7
-rw-r--r--arch/powerpc/kernel/sysfs.c3
-rw-r--r--arch/powerpc/kernel/vector.S2
-rw-r--r--arch/powerpc/mm/pgtable.c19
-rw-r--r--arch/powerpc/mm/slb.c16
-rw-r--r--arch/powerpc/platforms/powermac/cpufreq_32.c8
-rw-r--r--arch/powerpc/platforms/powermac/low_i2c.c7
-rw-r--r--arch/powerpc/platforms/powermac/pci.c61
-rw-r--r--arch/powerpc/platforms/powermac/smp.c2
-rw-r--r--arch/powerpc/platforms/pseries/msi.c2
-rw-r--r--arch/powerpc/platforms/pseries/reconfig.c9
-rw-r--r--arch/powerpc/platforms/pseries/setup.c4
-rw-r--r--arch/powerpc/platforms/pseries/xics.c9
-rw-r--r--arch/s390/include/asm/kvm.h3
-rw-r--r--arch/s390/kvm/kvm-s390.c25
-rw-r--r--arch/sh/kernel/process_64.c2
-rw-r--r--arch/sparc/Makefile6
-rw-r--r--arch/sparc/include/asm/elf_64.h13
-rw-r--r--arch/sparc/include/asm/thread_info_64.h4
-rw-r--r--arch/sparc/kernel/Makefile6
-rw-r--r--arch/sparc/kernel/ldc.c4
-rw-r--r--arch/sparc/kernel/of_device_64.c14
-rw-r--r--arch/sparc/kernel/process_64.c8
-rw-r--r--arch/sparc/kernel/prom_common.c4
-rw-r--r--arch/sparc/kernel/setup_32.c2
-rw-r--r--arch/sparc/kernel/setup_64.c2
-rw-r--r--arch/sparc/kernel/visemul.c2
-rw-r--r--arch/sparc/lib/mcount.S5
-rw-r--r--arch/sparc/mm/init_64.h2
-rw-r--r--arch/um/Makefile9
-rw-r--r--arch/um/kernel/Makefile3
-rw-r--r--arch/um/kernel/vmlinux.lds.S3
-rw-r--r--arch/x86/ia32/ia32_aout.c12
-rw-r--r--arch/x86/ia32/ia32entry.S41
-rw-r--r--arch/x86/include/asm/amd_iommu.h1
-rw-r--r--arch/x86/include/asm/checksum_32.h3
-rw-r--r--arch/x86/include/asm/elf.h12
-rw-r--r--arch/x86/include/asm/fixmap.h6
-rw-r--r--arch/x86/include/asm/io_apic.h1
-rw-r--r--arch/x86/include/asm/kvm_host.h1
-rw-r--r--arch/x86/include/asm/kvm_x86_emulate.h2
-rw-r--r--arch/x86/include/asm/mce.h6
-rw-r--r--arch/x86/include/asm/paravirt.h38
-rw-r--r--arch/x86/include/asm/processor.h14
-rw-r--r--arch/x86/include/asm/stackprotector.h4
-rw-r--r--arch/x86/include/asm/system.h2
-rw-r--r--arch/x86/include/asm/thread_info.h2
-rw-r--r--arch/x86/include/asm/uv/uv_hub.h9
-rw-r--r--arch/x86/kernel/acpi/boot.c9
-rw-r--r--arch/x86/kernel/acpi/cstate.c2
-rw-r--r--arch/x86/kernel/acpi/processor.c3
-rw-r--r--arch/x86/kernel/amd_iommu.c12
-rw-r--r--arch/x86/kernel/amd_iommu_init.c26
-rw-r--r--arch/x86/kernel/apic/apic_flat_64.c5
-rw-r--r--arch/x86/kernel/apic/es7000_32.c2
-rw-r--r--arch/x86/kernel/apic/io_apic.c50
-rw-r--r--arch/x86/kernel/apic/x2apic_uv_x.c8
-rw-r--r--arch/x86/kernel/cpu/common.c2
-rw-r--r--arch/x86/kernel/cpu/cpufreq/powernow-k8.c20
-rw-r--r--arch/x86/kernel/cpu/cpufreq/speedstep-ich.c19
-rw-r--r--arch/x86/kernel/cpu/intel_cacheinfo.c5
-rw-r--r--arch/x86/kernel/cpu/mcheck/mce.c3
-rw-r--r--arch/x86/kernel/cpu/mcheck/therm_throt.c96
-rw-r--r--arch/x86/kernel/cpu/perfctr-watchdog.c2
-rw-r--r--arch/x86/kernel/e820.c4
-rw-r--r--arch/x86/kernel/head_32.S1
-rw-r--r--arch/x86/kernel/i8253.c27
-rw-r--r--arch/x86/kernel/kvm.c7
-rw-r--r--arch/x86/kernel/kvmclock.c4
-rw-r--r--arch/x86/kernel/microcode_core.c4
-rw-r--r--arch/x86/kernel/pci-calgary_64.c12
-rw-r--r--arch/x86/kernel/pci-dma.c2
-rw-r--r--arch/x86/kernel/pci-gart_64.c2
-rw-r--r--arch/x86/kernel/process.c12
-rw-r--r--arch/x86/kernel/process_64.c11
-rw-r--r--arch/x86/kernel/ptrace.c16
-rw-r--r--arch/x86/kernel/reboot.c8
-rw-r--r--arch/x86/kernel/setup.c3
-rw-r--r--arch/x86/kernel/tlb_uv.c4
-rw-r--r--arch/x86/kvm/i8254.c2
-rw-r--r--arch/x86/kvm/lapic.c13
-rw-r--r--arch/x86/kvm/mmu.c9
-rw-r--r--arch/x86/kvm/svm.c25
-rw-r--r--arch/x86/kvm/vmx.c19
-rw-r--r--arch/x86/kvm/x86.c39
-rw-r--r--arch/x86/kvm/x86_emulate.c22
-rw-r--r--arch/x86/mm/Makefile5
-rw-r--r--arch/x86/mm/mmap.c17
-rw-r--r--arch/x86/mm/pageattr.c9
-rw-r--r--arch/x86/pci/i386.c9
-rw-r--r--arch/x86/xen/Makefile2
-rw-r--r--arch/x86/xen/enlighten.c150
-rw-r--r--arch/x86/xen/smp.c1
-rw-r--r--arch/x86/xen/spinlock.c28
-rw-r--r--arch/xtensa/kernel/Makefile3
-rw-r--r--block/blk-sysfs.c7
-rw-r--r--block/genhd.c17
-rw-r--r--drivers/Kconfig2
-rw-r--r--drivers/Makefile1
-rw-r--r--drivers/acpi/osl.c8
-rw-r--r--drivers/acpi/pci_root.c11
-rw-r--r--drivers/acpi/pci_slot.c4
-rw-r--r--drivers/acpi/processor_idle.c28
-rw-r--r--drivers/acpi/scan.c12
-rw-r--r--drivers/acpi/sleep.c40
-rw-r--r--drivers/ata/ahci.c56
-rw-r--r--drivers/ata/libata-core.c20
-rw-r--r--drivers/ata/libata-eh.c56
-rw-r--r--drivers/ata/pata_amd.c3
-rw-r--r--drivers/ata/pata_cmd64x.c2
-rw-r--r--drivers/ata/pata_hpt37x.c32
-rw-r--r--drivers/ata/pata_hpt3x2n.c79
-rw-r--r--drivers/ata/pata_sc1200.c3
-rw-r--r--drivers/ata/pata_via.c2
-rw-r--r--drivers/ata/sata_nv.c18
-rw-r--r--drivers/ata/sata_via.c1
-rw-r--r--drivers/base/base.h2
-rw-r--r--drivers/base/bus.c23
-rw-r--r--drivers/base/class.c2
-rw-r--r--drivers/base/core.c2
-rw-r--r--drivers/base/driver.c2
-rw-r--r--drivers/block/cciss.c3
-rw-r--r--drivers/char/Kconfig24
-rw-r--r--drivers/char/Makefile1
-rw-r--r--drivers/char/agp/backend.c4
-rw-r--r--drivers/char/agp/intel-agp.c54
-rw-r--r--drivers/char/hvc_xen.c25
-rw-r--r--drivers/char/hw_random/fsl-rngc.c48
-rw-r--r--drivers/char/keyboard.c2
-rw-r--r--drivers/char/nozomi.c2
-rw-r--r--drivers/char/pty.c6
-rw-r--r--drivers/char/tpm/tpm.c8
-rw-r--r--drivers/char/tpm/tpm_tis.c12
-rw-r--r--drivers/char/tty_buffer.c29
-rw-r--r--drivers/char/tty_io.c3
-rw-r--r--drivers/char/tty_ldisc.c7
-rw-r--r--drivers/char/tty_port.c39
-rw-r--r--drivers/char/vt.c3
-rw-r--r--drivers/connector/cn_proc.c3
-rw-r--r--drivers/connector/cn_queue.c15
-rw-r--r--drivers/connector/connector.c197
-rw-r--r--drivers/cpuidle/cpuidle.c5
-rw-r--r--drivers/crypto/Kconfig2
-rw-r--r--drivers/crypto/dcp.c102
-rw-r--r--drivers/crypto/padlock-aes.c4
-rw-r--r--drivers/dma/at_hdmac.c4
-rw-r--r--drivers/dma/pxp/pxp_device.c8
-rw-r--r--drivers/dma/pxp/pxp_dma.c211
-rw-r--r--drivers/edac/i5000_edac.c8
-rw-r--r--drivers/firewire/ohci.c12
-rw-r--r--drivers/gpu/drm/Kconfig1
-rw-r--r--drivers/gpu/drm/drm_edid.c6
-rw-r--r--drivers/gpu/drm/drm_irq.c34
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c2
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h7
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c55
-rw-r--r--drivers/gpu/drm/i915/i915_gem_tiling.c15
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c10
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h22
-rw-r--r--drivers/gpu/drm/i915/i915_suspend.c2
-rw-r--r--drivers/gpu/drm/i915/intel_bios.c3
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c13
-rw-r--r--drivers/gpu/drm/i915/intel_display.c173
-rw-r--r--drivers/gpu/drm/i915/intel_fb.c8
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c11
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c96
-rw-r--r--drivers/gpu/drm/i915/intel_tv.c11
-rw-r--r--drivers/gpu/drm/r128/r128_cce.c18
-rw-r--r--drivers/gpu/drm/r128/r128_drv.h8
-rw-r--r--drivers/gpu/drm/r128/r128_state.c36
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c8
-rw-r--r--drivers/gpu/drm/radeon/radeon_fb.c6
-rw-r--r--drivers/gpu/drm/radeon/radeon_legacy_crtc.c7
-rw-r--r--drivers/hid/hid-apple.c7
-rw-r--r--drivers/hid/hid-core.c4
-rw-r--r--drivers/hid/hid-ids.h3
-rw-r--r--drivers/hwmon/adt7462.c4
-rw-r--r--drivers/hwmon/adt7475.c5
-rw-r--r--drivers/hwmon/coretemp.c2
-rw-r--r--drivers/hwmon/fschmd.c9
-rw-r--r--drivers/hwmon/it87.c5
-rw-r--r--drivers/hwmon/lm78.c25
-rw-r--r--drivers/hwmon/sht15.c6
-rw-r--r--drivers/hwmon/w83781d.c26
-rw-r--r--drivers/i2c/busses/i2c-amd756.c2
-rw-r--r--drivers/i2c/busses/i2c-amd8111.c4
-rw-r--r--drivers/i2c/busses/i2c-i801.c4
-rw-r--r--drivers/i2c/busses/i2c-isch.c2
-rw-r--r--drivers/i2c/busses/i2c-mxs.c45
-rw-r--r--drivers/i2c/busses/i2c-mxs.h1
-rw-r--r--drivers/i2c/busses/i2c-pca-isa.c4
-rw-r--r--drivers/i2c/busses/i2c-pca-platform.c4
-rw-r--r--drivers/i2c/busses/i2c-piix4.c4
-rw-r--r--drivers/i2c/busses/i2c-sis96x.c2
-rw-r--r--drivers/i2c/busses/i2c-tiny-usb.c12
-rw-r--r--drivers/i2c/busses/i2c-viapro.c2
-rw-r--r--drivers/i2c/chips/tsl2550.c3
-rw-r--r--drivers/i2c/i2c-core.c16
-rw-r--r--drivers/ide/cmd64x.c6
-rw-r--r--drivers/ide/ide-ioctls.c2
-rw-r--r--drivers/ide/ide-probe.c9
-rw-r--r--drivers/ide/sis5513.c10
-rw-r--r--drivers/ide/slc90e66.c3
-rw-r--r--drivers/input/evdev.c29
-rw-r--r--drivers/input/keyboard/Makefile2
-rw-r--r--drivers/input/keyboard/atkbd.c9
-rw-r--r--drivers/input/keyboard/mxc_keyb.c2
-rw-r--r--drivers/input/mouse/alps.c252
-rw-r--r--drivers/input/mouse/alps.h1
-rw-r--r--drivers/input/mouse/synaptics.c10
-rw-r--r--drivers/input/touchscreen/mxc_ts.c55
-rw-r--r--drivers/isdn/gigaset/interface.c19
-rw-r--r--drivers/isdn/hisax/hfc_usb.c4
-rw-r--r--drivers/isdn/i4l/isdn_ppp.c342
-rw-r--r--drivers/leds/leds-mxs-pwm.c25
-rw-r--r--drivers/macintosh/therm_adt746x.c17
-rw-r--r--drivers/macintosh/therm_pm72.c4
-rw-r--r--drivers/macintosh/via-pmu.c40
-rw-r--r--drivers/macintosh/windfarm_lm75_sensor.c4
-rw-r--r--drivers/macintosh/windfarm_max6690_sensor.c4
-rw-r--r--drivers/macintosh/windfarm_smu_sat.c4
-rw-r--r--drivers/md/bitmap.c24
-rw-r--r--drivers/md/bitmap.h2
-rw-r--r--drivers/md/dm-exception-store.c22
-rw-r--r--drivers/md/dm-exception-store.h8
-rw-r--r--drivers/md/dm-log-userspace-base.c4
-rw-r--r--drivers/md/dm-log-userspace-transfer.c6
-rw-r--r--drivers/md/dm-snap-persistent.c16
-rw-r--r--drivers/md/dm-snap.c25
-rw-r--r--drivers/md/dm.c11
-rw-r--r--drivers/md/md.c16
-rw-r--r--drivers/md/md.h1
-rw-r--r--drivers/md/raid1.c8
-rw-r--r--drivers/md/raid10.c1
-rw-r--r--drivers/md/raid5.c2
-rw-r--r--drivers/media/common/tuners/mxl5007t.c2
-rw-r--r--drivers/media/common/tuners/tda18271-fe.c8
-rw-r--r--drivers/media/dvb/dvb-usb/af9015.c4
-rw-r--r--drivers/media/dvb/dvb-usb/cxusb.c10
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-ids.h1
-rw-r--r--drivers/media/dvb/frontends/dib7000p.c5
-rw-r--r--drivers/media/dvb/siano/smsusb.c6
-rw-r--r--drivers/media/radio/radio-gemtek-pci.c2
-rw-r--r--drivers/media/video/Kconfig11
-rw-r--r--drivers/media/video/Makefile1
-rw-r--r--drivers/media/video/bt8xx/bttv-driver.c33
-rw-r--r--drivers/media/video/em28xx/em28xx-audio.c5
-rw-r--r--drivers/media/video/em28xx/em28xx-cards.c32
-rw-r--r--drivers/media/video/em28xx/em28xx-dvb.c1
-rw-r--r--drivers/media/video/em28xx/em28xx.h4
-rw-r--r--drivers/media/video/gspca/m5602/m5602_s5k4aa.c20
-rw-r--r--drivers/media/video/gspca/ov519.c1
-rw-r--r--drivers/media/video/gspca/sonixj.c40
-rw-r--r--drivers/media/video/mxc/capture/mxc_v4l2_capture.c2
-rw-r--r--drivers/media/video/mxc/capture/ov3640.c9
-rw-r--r--drivers/media/video/mxc/output/Makefile3
-rw-r--r--drivers/media/video/mxc/output/mxc_v4l2_output.c157
-rw-r--r--drivers/media/video/mxc/output/mxc_v4l2_output.h5
-rw-r--r--drivers/media/video/ov511.c2
-rw-r--r--drivers/media/video/pwc/pwc-ctrl.c2
-rw-r--r--drivers/media/video/s2255drv.c5
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c1
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c56
-rw-r--r--drivers/media/video/saa7134/saa7134-ts.c6
-rw-r--r--drivers/media/video/saa7134/saa7134.h5
-rw-r--r--drivers/media/video/sn9c102/sn9c102_devtable.h2
-rw-r--r--drivers/media/video/uvc/uvc_driver.c3
-rw-r--r--drivers/media/video/uvc/uvc_video.c8
-rw-r--r--drivers/media/video/uvc/uvcvideo.h3
-rw-r--r--drivers/media/video/v4l1-compat.c14
-rw-r--r--drivers/media/video/videobuf-dma-contig.c2
-rw-r--r--drivers/message/fusion/mptbase.c10
-rw-r--r--drivers/mfd/ab3100-core.c2
-rw-r--r--drivers/misc/Kconfig12
-rw-r--r--drivers/misc/Makefile3
-rw-r--r--drivers/misc/enclosure.c1
-rw-r--r--drivers/misc/sgi-gru/gruprocfs.c13
-rw-r--r--drivers/mmc/core/mmc.c298
-rw-r--r--drivers/mmc/core/sd.c10
-rw-r--r--drivers/mmc/host/mx_sdhci.c130
-rw-r--r--drivers/mmc/host/mx_sdhci.h3
-rw-r--r--drivers/mmc/host/mxs-mmc.c24
-rw-r--r--drivers/mmc/host/pxamci.c4
-rw-r--r--drivers/mtd/chips/cfi_cmdset_0002.c11
-rw-r--r--drivers/mtd/chips/cfi_util.c4
-rw-r--r--drivers/mtd/nand/Kconfig2
-rw-r--r--drivers/mtd/nand/gpmi-nfc/Makefile1
-rw-r--r--drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c65
-rw-r--r--drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c41
-rw-r--r--drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h8
-rw-r--r--drivers/mtd/nand/mxc_nd2.c47
-rw-r--r--drivers/mtd/nand/ndfc.c4
-rw-r--r--drivers/mtd/ofpart.c21
-rw-r--r--drivers/mtd/ubi/cdev.c1
-rw-r--r--drivers/mxc/amd-gpu/Kconfig2
-rw-r--r--drivers/mxc/amd-gpu/Makefile20
-rw-r--r--drivers/mxc/amd-gpu/common/gsl_device.c50
-rw-r--r--drivers/mxc/amd-gpu/common/gsl_driver.c9
-rw-r--r--drivers/mxc/amd-gpu/common/gsl_g12.c6
-rw-r--r--drivers/mxc/amd-gpu/common/gsl_yamato.c1
-rw-r--r--drivers/mxc/amd-gpu/include/api/gsl_types.h1
-rw-r--r--drivers/mxc/amd-gpu/include/gsl_driver.h1
-rw-r--r--drivers/mxc/amd-gpu/include/gsl_hal.h10
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX35/gsl_buildconfig.h62
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX35/gsl_config.h195
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX35/gsl_halconfig.h63
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX35/linux/gsl_hal.c524
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.c31
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.h41
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX51/gsl_buildconfig.h62
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX51/gsl_config.h222
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX51/gsl_halconfig.h58
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX51/linux/gsl_hal.c598
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.c31
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.h40
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h27
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c103
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h2
-rw-r--r--drivers/mxc/ipu3/ipu_capture.c118
-rw-r--r--drivers/mxc/ipu3/ipu_common.c40
-rw-r--r--drivers/mxc/ipu3/ipu_disp.c142
-rw-r--r--drivers/mxc/ipu3/ipu_regs.h1
-rw-r--r--drivers/mxc/vpu/mxc_vpu.c23
-rw-r--r--drivers/net/acenic.c3
-rw-r--r--drivers/net/appletalk/ipddp.c3
-rw-r--r--drivers/net/au1000_eth.c15
-rw-r--r--drivers/net/b44.c6
-rw-r--r--drivers/net/bonding/bond_main.c10
-rw-r--r--drivers/net/can/flexcan/mbm.c2
-rw-r--r--drivers/net/can/vcan.c2
-rw-r--r--drivers/net/e100.c19
-rw-r--r--drivers/net/e1000e/82571.c4
-rw-r--r--drivers/net/fec.c45
-rw-r--r--drivers/net/fec_1588.c92
-rw-r--r--drivers/net/fec_1588.h45
-rw-r--r--drivers/net/fec_switch.c17
-rw-r--r--drivers/net/iseries_veth.c2
-rw-r--r--drivers/net/mlx4/eq.c42
-rw-r--r--drivers/net/mlx4/main.c9
-rw-r--r--drivers/net/mlx4/mlx4.h7
-rw-r--r--drivers/net/sfc/rx.c9
-rw-r--r--drivers/net/sfc/tx.c4
-rw-r--r--drivers/net/sky2.c6
-rw-r--r--drivers/net/smc91x.c2
-rw-r--r--drivers/net/smsc9420.c14
-rw-r--r--drivers/net/tun.c4
-rw-r--r--drivers/net/usb/hso.c4
-rw-r--r--drivers/net/usb/kaweth.c18
-rw-r--r--drivers/net/usb/rtl8150.c2
-rw-r--r--drivers/net/usb/smsc95xx.c2
-rw-r--r--drivers/net/usb/usbnet.c2
-rw-r--r--drivers/net/wireless/airo.c34
-rw-r--r--drivers/net/wireless/ath/ar9170/usb.c2
-rw-r--r--drivers/net/wireless/ath/ath5k/ath5k.h1
-rw-r--r--drivers/net/wireless/ath/ath5k/attach.c2
-rw-r--r--drivers/net/wireless/ath/ath5k/base.c57
-rw-r--r--drivers/net/wireless/ath/ath5k/eeprom.c33
-rw-r--r--drivers/net/wireless/ath/ath5k/eeprom.h8
-rw-r--r--drivers/net/wireless/ath/ath5k/phy.c26
-rw-r--r--drivers/net/wireless/ath/ath5k/reset.c155
-rw-r--r--drivers/net/wireless/b43/b43.h1
-rw-r--r--drivers/net/wireless/b43/dma.c36
-rw-r--r--drivers/net/wireless/b43/main.c13
-rw-r--r--drivers/net/wireless/b43/rfkill.c3
-rw-r--r--drivers/net/wireless/b43legacy/rfkill.c7
-rw-r--r--drivers/net/wireless/hostap/hostap_main.c3
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2100.c11
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-1000.c7
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c40
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c39
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c58
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c29
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-rs.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c67
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h18
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h43
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-eeprom.c184
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-eeprom.h10
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-prph.h5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-rx.c34
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-scan.c3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-tx.c10
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c78
-rw-r--r--drivers/net/wireless/libertas/if_usb.c2
-rw-r--r--drivers/net/wireless/libertas/wext.c2
-rw-r--r--drivers/net/wireless/p54/p54usb.c11
-rw-r--r--drivers/net/wireless/ray_cs.c2
-rw-r--r--drivers/net/wireless/rtl818x/rtl8187_leds.c4
-rw-r--r--drivers/parisc/ccio-dma.c4
-rw-r--r--drivers/parisc/sba_iommu.c4
-rw-r--r--drivers/pci/dmar.c22
-rw-r--r--drivers/pci/pcie/aer/aerdrv.c2
-rw-r--r--drivers/pci/quirks.c4
-rw-r--r--drivers/pcmcia/at91_cf.c2
-rw-r--r--drivers/pcmcia/au1000_generic.c2
-rw-r--r--drivers/pcmcia/bfin_cf_pcmcia.c2
-rw-r--r--drivers/pcmcia/cs.c69
-rw-r--r--drivers/pcmcia/i82092.c2
-rw-r--r--drivers/pcmcia/i82365.c2
-rw-r--r--drivers/pcmcia/m32r_cfc.c2
-rw-r--r--drivers/pcmcia/m32r_pcc.c2
-rw-r--r--drivers/pcmcia/m8xx_pcmcia.c2
-rw-r--r--drivers/pcmcia/omap_cf.c2
-rw-r--r--drivers/pcmcia/pd6729.c2
-rw-r--r--drivers/pcmcia/pxa2xx_base.c2
-rw-r--r--drivers/pcmcia/sa1100_generic.c2
-rw-r--r--drivers/pcmcia/sa1111_generic.c2
-rw-r--r--drivers/pcmcia/tcic.c2
-rw-r--r--drivers/pcmcia/vrc4171_card.c2
-rw-r--r--drivers/pcmcia/yenta_socket.c98
-rw-r--r--drivers/platform/x86/acerhdf.c118
-rw-r--r--drivers/platform/x86/asus-laptop.c4
-rw-r--r--drivers/platform/x86/sony-laptop.c6
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c46
-rw-r--r--drivers/pps/kapi.c20
-rw-r--r--drivers/pps/pps.c11
-rw-r--r--drivers/ps3/ps3stor_lib.c65
-rw-r--r--drivers/regulator/max17135-regulator.c163
-rw-r--r--drivers/rtc/Kconfig10
-rw-r--r--drivers/rtc/Makefile1
-rw-r--r--drivers/rtc/rtc-fm3130.c6
-rw-r--r--drivers/rtc/rtc-mxs.c2
-rw-r--r--drivers/rtc/rtc-v3020.c2
-rw-r--r--drivers/s390/block/dasd_diag.c19
-rw-r--r--drivers/scsi/dpt_i2o.c4
-rw-r--r--drivers/scsi/gdth.c2
-rw-r--r--drivers/scsi/hosts.c13
-rw-r--r--drivers/scsi/libsrp.c1
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c2
-rw-r--r--drivers/scsi/megaraid/megaraid_sas.c10
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_base.c23
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_base.h43
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_config.c61
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_ctl.c16
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_scsih.c224
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_transport.c29
-rw-r--r--drivers/scsi/qla2xxx/qla_attr.c3
-rw-r--r--drivers/scsi/scsi.c11
-rw-r--r--drivers/scsi/scsi_error.c3
-rw-r--r--drivers/scsi/scsi_lib_dma.c4
-rw-r--r--drivers/scsi/scsi_transport_fc.c17
-rw-r--r--drivers/scsi/sd.c2
-rw-r--r--drivers/scsi/sg.c12
-rw-r--r--drivers/serial/8250.c15
-rw-r--r--drivers/serial/8250_pci.c11
-rw-r--r--drivers/serial/8250_pnp.c10
-rw-r--r--drivers/serial/Kconfig18
-rw-r--r--drivers/serial/bfin_5xx.c4
-rw-r--r--drivers/serial/mxs-auart.c163
-rw-r--r--drivers/serial/of_serial.c1
-rw-r--r--drivers/serial/serial_cs.c1
-rw-r--r--drivers/serial/suncore.c37
-rw-r--r--drivers/serial/suncore.h5
-rw-r--r--drivers/serial/sunhv.c2
-rw-r--r--drivers/serial/sunsab.c9
-rw-r--r--drivers/serial/sunsu.c36
-rw-r--r--drivers/serial/sunzilog.c8
-rw-r--r--drivers/ssb/sprom.c20
-rw-r--r--drivers/staging/android/binder.c10
-rw-r--r--drivers/staging/android/logger.c7
-rw-r--r--drivers/staging/android/logger.h1
-rw-r--r--drivers/staging/android/lowmemorykiller.c40
-rw-r--r--drivers/staging/dst/dcore.c8
-rw-r--r--drivers/staging/pohmelfs/config.c6
-rw-r--r--drivers/staging/rt2860/common/cmm_data_2860.c2
-rw-r--r--drivers/uio/uio_pdrv_genirq.c6
-rw-r--r--drivers/usb/class/cdc-acm.c7
-rw-r--r--drivers/usb/class/cdc-wdm.c30
-rw-r--r--drivers/usb/class/usbtmc.c36
-rw-r--r--drivers/usb/core/config.c2
-rw-r--r--drivers/usb/core/devices.c2
-rw-r--r--drivers/usb/core/devio.c61
-rw-r--r--drivers/usb/core/driver.c3
-rw-r--r--drivers/usb/core/generic.c27
-rw-r--r--drivers/usb/core/hcd.c27
-rw-r--r--drivers/usb/core/hub.c19
-rw-r--r--drivers/usb/core/message.c8
-rw-r--r--drivers/usb/core/sysfs.c6
-rw-r--r--drivers/usb/core/usb.c31
-rw-r--r--drivers/usb/gadget/Kconfig9
-rw-r--r--drivers/usb/gadget/Makefile2
-rw-r--r--drivers/usb/gadget/amd5536udc.c49
-rw-r--r--drivers/usb/gadget/arcotg_udc.c451
-rw-r--r--drivers/usb/gadget/arcotg_udc.h11
-rw-r--r--drivers/usb/gadget/composite.c39
-rw-r--r--drivers/usb/gadget/f_acm.c9
-rw-r--r--drivers/usb/gadget/file_storage.c9
-rw-r--r--drivers/usb/host/ehci-arc.c280
-rw-r--r--drivers/usb/host/ehci-hcd.c7
-rw-r--r--drivers/usb/host/ehci-hub.c21
-rw-r--r--drivers/usb/host/ehci-pci.c6
-rw-r--r--drivers/usb/host/ehci-q.c27
-rw-r--r--drivers/usb/host/ehci-sched.c12
-rw-r--r--drivers/usb/host/ehci.h2
-rw-r--r--drivers/usb/host/ohci-hcd.c5
-rw-r--r--drivers/usb/host/ohci-pci.c20
-rw-r--r--drivers/usb/host/ohci-q.c18
-rw-r--r--drivers/usb/host/ohci.h9
-rw-r--r--drivers/usb/host/sl811-hcd.c8
-rw-r--r--drivers/usb/host/uhci-hcd.c15
-rw-r--r--drivers/usb/host/uhci-hub.c2
-rw-r--r--drivers/usb/host/xhci-dbg.c5
-rw-r--r--drivers/usb/host/xhci-hcd.c370
-rw-r--r--drivers/usb/host/xhci-mem.c74
-rw-r--r--drivers/usb/host/xhci-pci.c13
-rw-r--r--drivers/usb/host/xhci-ring.c239
-rw-r--r--drivers/usb/host/xhci.h41
-rw-r--r--drivers/usb/misc/appledisplay.c4
-rw-r--r--drivers/usb/misc/emi62.c2
-rw-r--r--drivers/usb/mon/mon_bin.c11
-rw-r--r--drivers/usb/musb/musb_gadget.c79
-rw-r--r--drivers/usb/musb/musb_gadget_ep0.c15
-rw-r--r--drivers/usb/otg/fsl_otg.c219
-rw-r--r--drivers/usb/serial/ark3116.c46
-rw-r--r--drivers/usb/serial/console.c28
-rw-r--r--drivers/usb/serial/cp210x.c28
-rw-r--r--drivers/usb/serial/cypress_m8.c12
-rw-r--r--drivers/usb/serial/digi_acceleport.c8
-rw-r--r--drivers/usb/serial/empeg.c12
-rw-r--r--drivers/usb/serial/ftdi_sio.c432
-rw-r--r--drivers/usb/serial/ftdi_sio.h10
-rw-r--r--drivers/usb/serial/generic.c4
-rw-r--r--drivers/usb/serial/ipaq.c9
-rw-r--r--drivers/usb/serial/iuu_phoenix.c31
-rw-r--r--drivers/usb/serial/kobil_sct.c22
-rw-r--r--drivers/usb/serial/option.c60
-rw-r--r--drivers/usb/serial/oti6858.c21
-rw-r--r--drivers/usb/serial/pl2303.c9
-rw-r--r--drivers/usb/serial/pl2303.h4
-rw-r--r--drivers/usb/serial/sierra.c23
-rw-r--r--drivers/usb/serial/spcp8x5.c21
-rw-r--r--drivers/usb/serial/usb-serial.c391
-rw-r--r--drivers/usb/serial/whiteheat.c6
-rw-r--r--drivers/usb/storage/initializers.c2
-rw-r--r--drivers/usb/storage/onetouch.c2
-rw-r--r--drivers/usb/storage/transport.c59
-rw-r--r--drivers/usb/storage/unusual_devs.h14
-rw-r--r--drivers/usb/storage/usb.c21
-rw-r--r--drivers/video/backlight/lcd.c2
-rw-r--r--drivers/video/console/Kconfig9
-rw-r--r--drivers/video/console/Makefile12
-rw-r--r--drivers/video/console/fbcon.c10
-rw-r--r--drivers/video/matrox/g450_pll.c3
-rw-r--r--drivers/video/modedb.c5
-rw-r--r--drivers/video/mxc/Kconfig4
-rw-r--r--drivers/video/mxc/Makefile1
-rw-r--r--drivers/video/mxc/mxc_elcdif_fb.c73
-rw-r--r--drivers/video/mxc/mxc_epdc_fb.c630
-rw-r--r--drivers/video/mxc/mxc_ipuv3_fb.c306
-rw-r--r--drivers/video/mxc/tve.c7
-rw-r--r--drivers/video/s3c-fb.c2
-rw-r--r--drivers/video/sis/vstruct.h2
-rw-r--r--drivers/video/uvesafb.c6
-rw-r--r--drivers/virtio/virtio_ring.c3
-rw-r--r--drivers/w1/w1_netlink.c3
-rw-r--r--drivers/watchdog/riowd.c2
-rw-r--r--drivers/xen/Makefile3
-rw-r--r--drivers/xen/balloon.c4
-rw-r--r--firmware/Makefile3
-rw-r--r--firmware/imx/epdc.fw.ihex45914
-rw-r--r--fs/binfmt_aout.c1
-rw-r--r--fs/binfmt_elf.c55
-rw-r--r--fs/binfmt_elf_fdpic.c3
-rw-r--r--fs/binfmt_flat.c1
-rw-r--r--fs/binfmt_som.c1
-rw-r--r--fs/block_dev.c2
-rw-r--r--fs/cifs/cifsglob.h4
-rw-r--r--fs/cifs/cifsproto.h1
-rw-r--r--fs/cifs/connect.c24
-rw-r--r--fs/cifs/dir.c6
-rw-r--r--fs/cifs/inode.c7
-rw-r--r--fs/cifs/misc.c14
-rw-r--r--fs/cifs/readdir.c8
-rw-r--r--fs/compat_ioctl.c4
-rw-r--r--fs/debugfs/inode.c55
-rw-r--r--fs/devpts/inode.c16
-rw-r--r--fs/ecryptfs/crypto.c9
-rw-r--r--fs/ecryptfs/file.c14
-rw-r--r--fs/ecryptfs/inode.c2
-rw-r--r--fs/ecryptfs/keystore.c28
-rw-r--r--fs/ecryptfs/kthread.c24
-rw-r--r--fs/ecryptfs/main.c10
-rw-r--r--fs/exec.c39
-rw-r--r--fs/ext3/inode.c18
-rw-r--r--fs/ext4/balloc.c8
-rw-r--r--fs/ext4/block_validity.c2
-rw-r--r--fs/ext4/ext4.h111
-rw-r--r--fs/ext4/ext4_extents.h7
-rw-r--r--fs/ext4/ext4_jbd2.c9
-rw-r--r--fs/ext4/ext4_jbd2.h27
-rw-r--r--fs/ext4/extents.c493
-rw-r--r--fs/ext4/fsync.c54
-rw-r--r--fs/ext4/inode.c730
-rw-r--r--fs/ext4/ioctl.c32
-rw-r--r--fs/ext4/mballoc.c322
-rw-r--r--fs/ext4/migrate.c28
-rw-r--r--fs/ext4/move_extent.c572
-rw-r--r--fs/ext4/namei.c47
-rw-r--r--fs/ext4/resize.c2
-rw-r--r--fs/ext4/super.c244
-rw-r--r--fs/ext4/xattr.c22
-rw-r--r--fs/fat/dir.c9
-rw-r--r--fs/fat/fat.h1
-rw-r--r--fs/fcntl.c102
-rw-r--r--fs/fuse/dir.c3
-rw-r--r--fs/fuse/file.c5
-rw-r--r--fs/hfs/catalog.c4
-rw-r--r--fs/hfs/dir.c11
-rw-r--r--fs/hfs/super.c7
-rw-r--r--fs/hfsplus/wrapper.c4
-rw-r--r--fs/inode.c14
-rw-r--r--fs/jbd2/commit.c4
-rw-r--r--fs/jbd2/journal.c18
-rw-r--r--fs/jbd2/transaction.c7
-rw-r--r--fs/jffs2/gc.c3
-rw-r--r--fs/jffs2/read.c9
-rw-r--r--fs/namei.c21
-rw-r--r--fs/nfs/client.c2
-rw-r--r--fs/nfs/dir.c2
-rw-r--r--fs/nfs/direct.c1
-rw-r--r--fs/nfs/fscache.c21
-rw-r--r--fs/nfs/nfs4proc.c17
-rw-r--r--fs/nfs/nfs4renewd.c6
-rw-r--r--fs/nfs/nfs4xdr.c1
-rw-r--r--fs/nfs/super.c2
-rw-r--r--fs/nfsd/nfs4callback.c4
-rw-r--r--fs/nilfs2/btnode.c4
-rw-r--r--fs/nilfs2/ioctl.c30
-rw-r--r--fs/notify/dnotify/dnotify.c3
-rw-r--r--fs/notify/inode_mark.c6
-rw-r--r--fs/notify/inotify/inotify_fsnotify.c2
-rw-r--r--fs/notify/inotify/inotify_user.c4
-rw-r--r--fs/notify/notification.c2
-rw-r--r--fs/ntfs/malloc.h2
-rw-r--r--fs/partitions/check.c9
-rw-r--r--fs/partitions/efi.c30
-rw-r--r--fs/partitions/efi.h8
-rw-r--r--fs/pipe.c41
-rw-r--r--fs/proc/base.c38
-rw-r--r--fs/proc/kcore.c8
-rw-r--r--fs/proc/task_mmu.c3
-rw-r--r--fs/proc/uptime.c7
-rw-r--r--fs/quota/dquot.c216
-rw-r--r--fs/reiserfs/dir.c2
-rw-r--r--fs/reiserfs/inode.c17
-rw-r--r--fs/reiserfs/xattr.c19
-rw-r--r--fs/stat.c10
-rw-r--r--fs/sysfs/file.c14
-rw-r--r--fs/udf/super.c32
-rw-r--r--fs/xfs/xfs_log_recover.c4
-rw-r--r--include/drm/drmP.h1
-rw-r--r--include/drm/drm_pciids.h1
-rw-r--r--include/linux/binfmts.h1
-rw-r--r--include/linux/connector.h43
-rw-r--r--include/linux/enclosure.h2
-rw-r--r--include/linux/fec.h3
-rw-r--r--include/linux/fs.h1
-rw-r--r--include/linux/fsl_devices.h1
-rw-r--r--include/linux/ftrace.h2
-rw-r--r--include/linux/hrtimer.h4
-rw-r--r--include/linux/ipu.h2
-rw-r--r--include/linux/isdn_ppp.h2
-rw-r--r--include/linux/kvm.h8
-rw-r--r--include/linux/kvm_para.h1
-rw-r--r--include/linux/mm.h2
-rw-r--r--include/linux/mmc/card.h4
-rw-r--r--include/linux/mmc/mmc.h27
-rw-r--r--include/linux/moduleparam.h1
-rw-r--r--include/linux/msdos_fs.h12
-rw-r--r--include/linux/mxcfb.h6
-rw-r--r--include/linux/pci_ids.h4
-rw-r--r--include/linux/quota.h5
-rw-r--r--include/linux/regulator/max17135.h2
-rw-r--r--include/linux/sched.h40
-rw-r--r--include/linux/skbuff.h2
-rw-r--r--include/linux/sockios.h1
-rw-r--r--include/linux/tty.h8
-rw-r--r--include/linux/usb/composite.h1
-rw-r--r--include/linux/usb/serial.h4
-rw-r--r--include/linux/usb/usbnet.h1
-rw-r--r--include/linux/usb_usual.h4
-rw-r--r--include/net/bluetooth/hci.h6
-rw-r--r--include/net/bluetooth/hci_core.h11
-rw-r--r--include/net/bluetooth/sco.h4
-rw-r--r--include/net/ipv6.h7
-rw-r--r--include/net/mac80211.h6
-rw-r--r--include/net/netfilter/ipv6/nf_conntrack_ipv6.h2
-rw-r--r--include/net/netfilter/nf_conntrack.h8
-rw-r--r--include/net/netfilter/nf_nat_helper.h4
-rw-r--r--include/net/tcp.h2
-rw-r--r--include/pcmcia/ss.h6
-rw-r--r--include/scsi/osd_protocol.h1
-rw-r--r--include/scsi/scsi_host.h16
-rw-r--r--include/trace/events/ext4.h60
-rw-r--r--init/Kconfig9
-rw-r--r--init/main.c15
-rw-r--r--ipc/msg.c1
-rw-r--r--ipc/sem.c1
-rw-r--r--ipc/shm.c3
-rw-r--r--kernel/acct.c11
-rw-r--r--kernel/audit_tree.c13
-rw-r--r--kernel/exit.c2
-rw-r--r--kernel/fork.c26
-rw-r--r--kernel/futex.c102
-rw-r--r--kernel/irq/handle.c3
-rw-r--r--kernel/module.c5
-rw-r--r--kernel/params.c17
-rw-r--r--kernel/perf_counter.c66
-rw-r--r--kernel/posix-timers.c11
-rw-r--r--kernel/power/Kconfig67
-rw-r--r--kernel/power/Makefile5
-rw-r--r--kernel/power/main.c20
-rw-r--r--kernel/power/power.h24
-rw-r--r--kernel/power/process.c25
-rw-r--r--kernel/power/suspend.c3
-rw-r--r--kernel/sched.c9
-rw-r--r--kernel/signal.c3
-rw-r--r--kernel/time/clockevents.c21
-rw-r--r--kernel/time/tick-sched.c9
-rw-r--r--kernel/trace/ftrace.c23
-rw-r--r--kernel/trace/trace_events_filter.c3
-rw-r--r--kernel/user.c2
-rw-r--r--mm/Makefile1
-rw-r--r--mm/highmem.c17
-rw-r--r--mm/hugetlb.c2
-rw-r--r--mm/memcontrol.c8
-rw-r--r--mm/memory.c3
-rw-r--r--mm/mempolicy.c53
-rw-r--r--mm/migrate.c5
-rw-r--r--mm/mincore.c37
-rw-r--r--mm/mlock.c99
-rw-r--r--mm/mmap.c4
-rw-r--r--mm/nommu.c40
-rw-r--r--mm/oom_kill.c2
-rw-r--r--mm/page_alloc.c18
-rw-r--r--mm/pagewalk.c16
-rw-r--r--mm/shmem.c13
-rw-r--r--mm/slab.c2
-rw-r--r--mm/swap.c2
-rw-r--r--mm/swap_state.c70
-rw-r--r--mm/swapfile.c3
-rw-r--r--mm/vmalloc.c8
-rw-r--r--mm/vmscan.c2
-rw-r--r--net/8021q/vlan.c7
-rw-r--r--net/appletalk/aarp.c16
-rw-r--r--net/appletalk/ddp.c58
-rw-r--r--net/ax25/af_ax25.c8
-rw-r--r--net/bluetooth/hci_conn.c50
-rw-r--r--net/bluetooth/hci_event.c8
-rw-r--r--net/bluetooth/hidp/core.c65
-rw-r--r--net/bluetooth/hidp/hidp.h2
-rw-r--r--net/bluetooth/l2cap.c5
-rw-r--r--net/bluetooth/rfcomm/core.c13
-rw-r--r--net/bluetooth/sco.c54
-rw-r--r--net/bridge/br_netfilter.c2
-rw-r--r--net/bridge/netfilter/ebt_ulog.c2
-rw-r--r--net/bridge/netfilter/ebtables.c6
-rw-r--r--net/can/af_can.c4
-rw-r--r--net/core/datagram.c10
-rw-r--r--net/core/dev.c28
-rw-r--r--net/core/rtnetlink.c4
-rw-r--r--net/core/skbuff.c3
-rw-r--r--net/core/sock.c23
-rw-r--r--net/dccp/proto.c6
-rw-r--r--net/decnet/dn_route.c2
-rw-r--r--net/ipv4/af_inet.c2
-rw-r--r--net/ipv4/devinet.c9
-rw-r--r--net/ipv4/ip_fragment.c2
-rw-r--r--net/ipv4/ip_output.c2
-rw-r--r--net/ipv4/netfilter/nf_nat_core.c5
-rw-r--r--net/ipv4/netfilter/nf_nat_helper.c34
-rw-r--r--net/ipv4/route.c2
-rw-r--r--net/ipv4/tcp.c4
-rw-r--r--net/ipv4/tcp_ipv4.c44
-rw-r--r--net/ipv4/tcp_minisocks.c2
-rw-r--r--net/ipv4/udp.c78
-rw-r--r--net/ipv6/exthdrs.c7
-rw-r--r--net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c13
-rw-r--r--net/ipv6/netfilter/nf_conntrack_reasm.c7
-rw-r--r--net/ipv6/reassembly.c5
-rw-r--r--net/ipv6/sit.c2
-rw-r--r--net/ipv6/udp.c4
-rw-r--r--net/mac80211/agg-rx.c4
-rw-r--r--net/mac80211/agg-tx.c17
-rw-r--r--net/mac80211/cfg.c6
-rw-r--r--net/mac80211/ht.c8
-rw-r--r--net/mac80211/ieee80211_i.h2
-rw-r--r--net/mac80211/rx.c10
-rw-r--r--net/mac80211/sta_info.c2
-rw-r--r--net/mac80211/tx.c5
-rw-r--r--net/mac80211/util.c2
-rw-r--r--net/netfilter/ipvs/ip_vs_ctl.c4
-rw-r--r--net/netfilter/nf_conntrack_core.c18
-rw-r--r--net/netfilter/nf_conntrack_ftp.c18
-rw-r--r--net/netfilter/nf_conntrack_proto_tcp.c64
-rw-r--r--net/netfilter/x_tables.c2
-rw-r--r--net/netfilter/xt_connlimit.c10
-rw-r--r--net/netfilter/xt_hashlimit.c8
-rw-r--r--net/netlink/af_netlink.c6
-rw-r--r--net/packet/af_packet.c4
-rw-r--r--net/rfkill/core.c7
-rw-r--r--net/sched/act_pedit.c2
-rw-r--r--net/sched/cls_api.c2
-rw-r--r--net/sctp/protocol.c6
-rw-r--r--net/socket.c18
-rw-r--r--net/sunrpc/auth_gss/auth_gss.c2
-rw-r--r--net/sunrpc/svcsock.c10
-rw-r--r--net/unix/af_unix.c7
-rw-r--r--net/wireless/scan.c2
-rw-r--r--scripts/Kbuild.include4
-rw-r--r--scripts/Makefile1
-rw-r--r--scripts/Makefile.build3
-rw-r--r--scripts/kallsyms.c2
-rw-r--r--security/integrity/ima/ima_iint.c4
-rw-r--r--security/keys/keyctl.c2
-rw-r--r--security/selinux/hooks.c2
-rw-r--r--sound/aoa/codecs/tas.c9
-rw-r--r--sound/arm/aaci.c6
-rw-r--r--sound/arm/mxc-alsa-spdif.c18
-rw-r--r--sound/core/hrtimer.c15
-rw-r--r--sound/core/rawmidi.c44
-rw-r--r--sound/core/seq/seq_midi.c1
-rw-r--r--sound/mips/sgio2audio.c2
-rw-r--r--sound/pci/cs46xx/cs46xx_lib.h2
-rw-r--r--sound/pci/hda/hda_intel.c11
-rw-r--r--sound/pci/hda/patch_realtek.c1
-rw-r--r--sound/pci/hda/patch_sigmatel.c2
-rw-r--r--sound/pci/ice1712/ice1724.c2
-rw-r--r--sound/pci/mixart/mixart.c24
-rw-r--r--sound/pci/oxygen/oxygen_io.c11
-rw-r--r--sound/pci/via82xx.c27
-rw-r--r--sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c2
-rw-r--r--sound/ppc/keywest.c12
-rw-r--r--sound/soc/codecs/sgtl5000.c2
-rw-r--r--sound/soc/codecs/tlv320aic23.c3
-rw-r--r--sound/soc/codecs/wm9712.c3
-rw-r--r--sound/soc/mxs/mxs-dai.c1
-rw-r--r--sound/soc/mxs/mxs-pcm.c1
-rw-r--r--sound/soc/soc-dapm.c16
-rw-r--r--sound/usb/usbaudio.c4
-rw-r--r--sound/usb/usbaudio.h2
-rw-r--r--tools/perf/builtin-annotate.c4
-rw-r--r--tools/perf/builtin-report.c4
-rw-r--r--tools/perf/builtin-stat.c170
-rw-r--r--tools/perf/util/module.c2
-rw-r--r--virt/kvm/ioapic.c2
-rw-r--r--virt/kvm/kvm_main.c7
963 files changed, 62057 insertions, 14361 deletions
diff --git a/Documentation/connector/cn_test.c b/Documentation/connector/cn_test.c
index 6a5be5d5c8e4..473c589c4509 100644
--- a/Documentation/connector/cn_test.c
+++ b/Documentation/connector/cn_test.c
@@ -32,10 +32,8 @@ static char cn_test_name[] = "cn_test";
static struct sock *nls;
static struct timer_list cn_test_timer;
-void cn_test_callback(void *data)
+static void cn_test_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
{
- struct cn_msg *msg = (struct cn_msg *)data;
-
printk("%s: %lu: idx=%x, val=%x, seq=%u, ack=%u, len=%d: %s.\n",
__func__, jiffies, msg->id.idx, msg->id.val,
msg->seq, msg->ack, msg->len, (char *)msg->data);
diff --git a/Documentation/connector/connector.txt b/Documentation/connector/connector.txt
index ad6e0ba7b38c..3e6dcc7a0980 100644
--- a/Documentation/connector/connector.txt
+++ b/Documentation/connector/connector.txt
@@ -23,7 +23,7 @@ handling... Connector allows any kernelspace agents to use netlink
based networking for inter-process communication in a significantly
easier way:
-int cn_add_callback(struct cb_id *id, char *name, void (*callback) (void *));
+int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
void cn_netlink_send(struct cn_msg *msg, u32 __group, int gfp_mask);
struct cb_id
@@ -53,15 +53,15 @@ struct cn_msg
Connector interfaces.
/*****************************************/
-int cn_add_callback(struct cb_id *id, char *name, void (*callback) (void *));
+int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
Registers new callback with connector core.
struct cb_id *id - unique connector's user identifier.
It must be registered in connector.h for legal in-kernel users.
char *name - connector's callback symbolic name.
-void (*callback) (void *) - connector's callback.
- Argument must be dereferenced to struct cn_msg *.
+void (*callback) (struct cn..) - connector's callback.
+ cn_msg and the sender's credentials
void cn_del_callback(struct cb_id *id);
diff --git a/Documentation/dontdiff b/Documentation/dontdiff
index 88519daab6e9..e1efc400bed6 100644
--- a/Documentation/dontdiff
+++ b/Documentation/dontdiff
@@ -152,7 +152,6 @@ piggy.gz
piggyback
pnmtologo
ppc_defs.h*
-promcon_tbl.c
pss_boot.h
qconf
raid6altivec*.c
diff --git a/Documentation/filesystems/ext4.txt b/Documentation/filesystems/ext4.txt
index 7be02ac5fa36..32c3da454afa 100644
--- a/Documentation/filesystems/ext4.txt
+++ b/Documentation/filesystems/ext4.txt
@@ -153,8 +153,8 @@ journal_dev=devnum When the external journal device's major/minor numbers
identified through its new major/minor numbers encoded
in devnum.
-noload Don't load the journal on mounting. Note that
- if the filesystem was not unmounted cleanly,
+norecovery Don't load the journal on mounting. Note that
+noload if the filesystem was not unmounted cleanly,
skipping the journal replay will lead to the
filesystem containing inconsistencies that can
lead to any number of problems.
@@ -338,6 +338,12 @@ noauto_da_alloc replacing existing files via patterns such as
system crashes before the delayed allocation
blocks are forced to disk.
+discard Controls whether ext4 should issue discard/TRIM
+nodiscard(*) commands to the underlying block device when
+ blocks are freed. This is useful for SSD devices
+ and sparse/thinly-provisioned LUNs, but it is off
+ by default until sufficient testing has been done.
+
Data Mode
=========
There are 3 different data modes:
diff --git a/Documentation/filesystems/tmpfs.txt b/Documentation/filesystems/tmpfs.txt
index 3015da0c6b2a..fe09a2cb1858 100644
--- a/Documentation/filesystems/tmpfs.txt
+++ b/Documentation/filesystems/tmpfs.txt
@@ -82,11 +82,13 @@ tmpfs has a mount option to set the NUMA memory allocation policy for
all files in that instance (if CONFIG_NUMA is enabled) - which can be
adjusted on the fly via 'mount -o remount ...'
-mpol=default prefers to allocate memory from the local node
+mpol=default use the process allocation policy
+ (see set_mempolicy(2))
mpol=prefer:Node prefers to allocate memory from the given Node
mpol=bind:NodeList allocates memory only from nodes in NodeList
mpol=interleave prefers to allocate from each node in turn
mpol=interleave:NodeList allocates from each node of NodeList in turn
+mpol=local prefers to allocate memory from the local node
NodeList format is a comma-separated list of decimal numbers and ranges,
a range being two hyphen-separated decimal numbers, the smallest and
@@ -134,3 +136,5 @@ Author:
Christoph Rohland <cr@sap.com>, 1.12.01
Updated:
Hugh Dickins, 4 June 2007
+Updated:
+ KOSAKI Motohiro, 16 Mar 2010
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 7936b801fe6a..3d5a9581ab5c 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2561,6 +2561,8 @@ and is between 256 and 4096 characters. It is defined in the file
to a common usb-storage quirk flag as follows:
a = SANE_SENSE (collect more than 18 bytes
of sense data);
+ b = BAD_SENSE (don't collect more than 18
+ bytes of sense data);
c = FIX_CAPACITY (decrease the reported
device capacity by one sector);
h = CAPACITY_HEURISTICS (decrease the
diff --git a/Documentation/networking/timestamping/timestamping.c b/Documentation/networking/timestamping/timestamping.c
index 43d143104210..a7936fe8444a 100644
--- a/Documentation/networking/timestamping/timestamping.c
+++ b/Documentation/networking/timestamping/timestamping.c
@@ -381,7 +381,7 @@ int main(int argc, char **argv)
memset(&hwtstamp, 0, sizeof(hwtstamp));
strncpy(hwtstamp.ifr_name, interface, sizeof(hwtstamp.ifr_name));
hwtstamp.ifr_data = (void *)&hwconfig;
- memset(&hwconfig, 0, sizeof(&hwconfig));
+ memset(&hwconfig, 0, sizeof(hwconfig));
hwconfig.tx_type =
(so_timestamping_flags & SOF_TIMESTAMPING_TX_HARDWARE) ?
HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
diff --git a/Documentation/video4linux/gspca.txt b/Documentation/video4linux/gspca.txt
index 573f95b58807..03d58d223ae1 100644
--- a/Documentation/video4linux/gspca.txt
+++ b/Documentation/video4linux/gspca.txt
@@ -37,6 +37,7 @@ ov519 041e:405f Creative Live! VISTA VF0330
ov519 041e:4060 Creative Live! VISTA VF0350
ov519 041e:4061 Creative Live! VISTA VF0400
ov519 041e:4064 Creative Live! VISTA VF0420
+ov519 041e:4067 Creative Live! Cam Video IM (VF0350)
ov519 041e:4068 Creative Live! VISTA VF0470
spca561 0458:7004 Genius VideoCAM Express V2
sunplus 0458:7006 Genius Dsc 1.3 Smart
@@ -284,6 +285,7 @@ sonixj 0c45:613a Microdia Sonix PC Camera
sonixj 0c45:613b Surfer SN-206
sonixj 0c45:613c Sonix Pccam168
sonixj 0c45:6143 Sonix Pccam168
+sonixj 0c45:6148 Digitus DA-70811/ZSMC USB PC Camera ZS211/Microdia
sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001)
sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111)
sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655)
diff --git a/MAINTAINERS b/MAINTAINERS
index 8dca9d89c6c1..94138c41e1c2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -897,6 +897,12 @@ W: http://wireless.kernel.org/en/users/Drivers/ar9170
S: Maintained
F: drivers/net/wireless/ath/ar9170/
+ATK0110 HWMON DRIVER
+M: Luca Tettamanti <kronos.it@gmail.com>
+L: lm-sensors@lm-sensors.org
+S: Maintained
+F: drivers/hwmon/asus_atk0110.c
+
ATI_REMOTE2 DRIVER
M: Ville Syrjala <syrjala@sci.fi>
S: Maintained
@@ -1986,7 +1992,7 @@ S: Maintained
F: fs/*
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
-M: Riku Voipio <riku.vipio@iki.fi>
+M: Riku Voipio <riku.voipio@iki.fi>
L: lm-sensors@lm-sensors.org
S: Maintained
F: drivers/hwmon/f75375s.c
diff --git a/Makefile b/Makefile
index 789d315711e0..0f3a87b4833c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 31
-EXTRAVERSION =
+EXTRAVERSION = .14
NAME = Man-Eating Seals of Antiquity
# *DOCUMENTATION*
@@ -975,11 +975,6 @@ prepare0: archprepare FORCE
# All the preparing..
prepare: prepare0
-# Leave this as default for preprocessing vmlinux.lds.S, which is now
-# done in arch/$(ARCH)/kernel/Makefile
-
-export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
-
# The asm symlink changes when $(ARCH) changes.
# Detect this and ask user to run make mrproper
# If asm is a stale symlink (point to dir that does not exist) remove it
diff --git a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c
index e302daecbe56..8e059e58b0ac 100644
--- a/arch/alpha/kernel/core_marvel.c
+++ b/arch/alpha/kernel/core_marvel.c
@@ -1016,7 +1016,7 @@ marvel_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *m
{
struct marvel_agp_aperture *aper = agp->aperture.sysdata;
return iommu_bind(aper->arena, aper->pg_start + pg_start,
- mem->page_count, mem->memory);
+ mem->page_count, mem->pages);
}
static int
diff --git a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c
index 319fcb74611e..76686497b1e2 100644
--- a/arch/alpha/kernel/core_titan.c
+++ b/arch/alpha/kernel/core_titan.c
@@ -680,7 +680,7 @@ titan_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *me
{
struct titan_agp_aperture *aper = agp->aperture.sysdata;
return iommu_bind(aper->arena, aper->pg_start + pg_start,
- mem->page_count, mem->memory);
+ mem->page_count, mem->pages);
}
static int
diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h
index 00edd04b585e..85457b2d4516 100644
--- a/arch/alpha/kernel/pci_impl.h
+++ b/arch/alpha/kernel/pci_impl.h
@@ -198,7 +198,7 @@ extern unsigned long size_for_memory(unsigned long max);
extern int iommu_reserve(struct pci_iommu_arena *, long, long);
extern int iommu_release(struct pci_iommu_arena *, long, long);
-extern int iommu_bind(struct pci_iommu_arena *, long, long, unsigned long *);
+extern int iommu_bind(struct pci_iommu_arena *, long, long, struct page **);
extern int iommu_unbind(struct pci_iommu_arena *, long, long);
diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c
index bfb880af959d..eadd63bec4c0 100644
--- a/arch/alpha/kernel/pci_iommu.c
+++ b/arch/alpha/kernel/pci_iommu.c
@@ -880,7 +880,7 @@ iommu_release(struct pci_iommu_arena *arena, long pg_start, long pg_count)
int
iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count,
- unsigned long *physaddrs)
+ struct page **pages)
{
unsigned long flags;
unsigned long *ptes;
@@ -900,7 +900,7 @@ iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count,
}
for(i = 0, j = pg_start; i < pg_count; i++, j++)
- ptes[j] = mk_iommu_pte(physaddrs[i]);
+ ptes[j] = mk_iommu_pte(page_to_phys(pages[i]));
spin_unlock_irqrestore(&arena->lock, flags);
diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S
index b9d6568e5f7f..1e0c7121c57d 100644
--- a/arch/alpha/kernel/vmlinux.lds.S
+++ b/arch/alpha/kernel/vmlinux.lds.S
@@ -1,4 +1,5 @@
#include <asm-generic/vmlinux.lds.h>
+#include <asm/thread_info.h>
#include <asm/page.h>
OUTPUT_FORMAT("elf64-alpha")
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 7f161d76e5d2..3f1b470beacf 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1502,8 +1502,6 @@ source "drivers/accessibility/Kconfig"
source "drivers/leds/Kconfig"
-source "drivers/switch/Kconfig"
-
source "drivers/rtc/Kconfig"
source "drivers/dma/Kconfig"
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 3ca5dd71b3ae..3fe66f3935ed 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -14,7 +14,7 @@ LDFLAGS_vmlinux :=-p --no-undefined -X
ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
LDFLAGS_vmlinux += --be8
endif
-CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)
+
OBJCOPYFLAGS :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
GZFLAGS :=-9
#KBUILD_CFLAGS +=-pipe
diff --git a/arch/arm/configs/imx23evk_updater_defconfig b/arch/arm/configs/imx23evk_updater_defconfig
index f6a430b5bf5f..739e7bd912ec 100644
--- a/arch/arm/configs/imx23evk_updater_defconfig
+++ b/arch/arm/configs/imx23evk_updater_defconfig
@@ -558,7 +558,6 @@ CONFIG_HW_RANDOM=y
# CONFIG_I2C is not set
# CONFIG_I2C_SLAVE is not set
# CONFIG_SPI is not set
-CONFIG_FSL_OTP=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_GPIOLIB=y
# CONFIG_GPIO_SYSFS is not set
diff --git a/arch/arm/configs/imx28evk_defconfig b/arch/arm/configs/imx28evk_defconfig
index 9d3b1c98d198..40c35b60a811 100644
--- a/arch/arm/configs/imx28evk_defconfig
+++ b/arch/arm/configs/imx28evk_defconfig
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.31
-# Tue Aug 3 11:34:57 2010
+# Tue Jun 8 11:22:27 2010
#
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -851,7 +851,6 @@ CONFIG_MXS_VIIM=y
#
CONFIG_SERIAL_MXS_DUART=y
CONFIG_SERIAL_MXS_AUART=y
-# CONFIG_SERIAL_MXS_AUART_CONSOLE is not set
CONFIG_SERIAL_MXS_DUART_CONSOLE=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
@@ -1256,18 +1255,16 @@ CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set
-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
#
# Miscellaneous USB options
#
# CONFIG_USB_DEVICEFS is not set
# CONFIG_USB_DEVICE_CLASS is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-CONFIG_USB_SUSPEND=y
-CONFIG_USB_OTG=y
-# CONFIG_USB_OTG_WHITELIST is not set
-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+CONFIG_USB_DYNAMIC_MINORS=y
+# CONFIG_USB_SUSPEND is not set
+# CONFIG_USB_OTG is not set
# CONFIG_USB_MON is not set
# CONFIG_USB_WUSB is not set
# CONFIG_USB_WUSB_CBAF is not set
@@ -1276,15 +1273,11 @@ CONFIG_USB_OTG=y
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
-CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_HCD=m
CONFIG_USB_EHCI_ARC=y
CONFIG_USB_EHCI_ARC_H1=y
-CONFIG_USB_EHCI_ARC_OTG=y
+# CONFIG_USB_EHCI_ARC_OTG is not set
# CONFIG_USB_STATIC_IRAM is not set
-# CONFIG_USB_EHCI_FSL_MC13783 is not set
-# CONFIG_USB_EHCI_FSL_1301 is not set
-# CONFIG_USB_EHCI_FSL_1504 is not set
-CONFIG_USB_EHCI_FSL_UTMI=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
# CONFIG_USB_OXU210HP_HCD is not set
@@ -1361,7 +1354,7 @@ CONFIG_USB_STORAGE=y
# CONFIG_USB_TEST is not set
# CONFIG_USB_ISIGHTFW is not set
# CONFIG_USB_VST is not set
-CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET=m
# CONFIG_USB_GADGET_DEBUG_FILES is not set
# CONFIG_USB_GADGET_DEBUG_FS is not set
CONFIG_USB_GADGET_VBUS_DRAW=2
@@ -1383,7 +1376,7 @@ CONFIG_USB_GADGET_SELECTED=y
# CONFIG_USB_GADGET_NET2280 is not set
# CONFIG_USB_GADGET_GOKU is not set
CONFIG_USB_GADGET_ARC=y
-CONFIG_USB_ARC=y
+CONFIG_USB_ARC=m
CONFIG_WORKAROUND_ARCUSB_REG_RW=y
# CONFIG_USB_GADGET_LANGWELL is not set
# CONFIG_USB_GADGET_DUMMY_HCD is not set
@@ -1407,7 +1400,7 @@ CONFIG_USB_G_SERIAL=m
CONFIG_USB_OTG_UTILS=y
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_NOP_USB_XCEIV is not set
-CONFIG_MXC_OTG=y
+# CONFIG_MXC_OTG is not set
CONFIG_MMC=y
# CONFIG_MMC_DEBUG is not set
CONFIG_MMC_UNSAFE_RESUME=y
@@ -1506,7 +1499,6 @@ CONFIG_DMADEVICES=y
#
# DMA Devices
#
-# CONFIG_MXC_PXP is not set
# CONFIG_AUXDISPLAY is not set
CONFIG_REGULATOR=y
# CONFIG_REGULATOR_DEBUG is not set
@@ -1517,7 +1509,6 @@ CONFIG_REGULATOR=y
# CONFIG_REGULATOR_MAX1586 is not set
# CONFIG_REGULATOR_LP3971 is not set
CONFIG_REGULATOR_MXS=y
-# CONFIG_REGULATOR_MAX17135 is not set
# CONFIG_UIO is not set
# CONFIG_STAGING is not set
diff --git a/arch/arm/configs/imx28evk_updater_defconfig b/arch/arm/configs/imx28evk_updater_defconfig
index fe9a908e7e62..21223ed3f678 100644
--- a/arch/arm/configs/imx28evk_updater_defconfig
+++ b/arch/arm/configs/imx28evk_updater_defconfig
@@ -531,7 +531,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_I2C is not set
# CONFIG_I2C_SLAVE is not set
# CONFIG_SPI is not set
-CONFIG_FSL_OTP=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_GPIOLIB=y
# CONFIG_GPIO_SYSFS is not set
diff --git a/arch/arm/configs/imx5_defconfig b/arch/arm/configs/imx5_defconfig
index 47cf51acaa53..8336690d1bf4 100644
--- a/arch/arm/configs/imx5_defconfig
+++ b/arch/arm/configs/imx5_defconfig
@@ -204,8 +204,6 @@ CONFIG_MACH_MX51_3DS=y
CONFIG_MACH_MX51_BABBAGE=y
CONFIG_MACH_MX53_EVK=y
CONFIG_MACH_MX50_ARM2=y
-CONFIG_MACH_MX50_RDP=y
-CONFIG_ARCH_MXC_IOMUX_V3=y
#
# MX5x Options:
@@ -489,7 +487,7 @@ CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_CONCAT=y
+# CONFIG_MTD_CONCAT is not set
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_TESTS is not set
# CONFIG_MTD_REDBOOT_PARTS is not set
@@ -827,7 +825,6 @@ CONFIG_DEVKMEM=y
# CONFIG_SERIAL_NONSTANDARD is not set
CONFIG_FM_SI4702=m
CONFIG_MXC_IIM=y
-CONFIG_MXS_VIIM=y
CONFIG_IMX_SIM=m
#
@@ -1310,7 +1307,6 @@ CONFIG_FB_MXC_EPSON_VGA_SYNC_PANEL=y
CONFIG_FB_MXC_TVOUT_TVE=y
CONFIG_FB_MXC_LDB=y
# CONFIG_FB_MXC_CLAA_WVGA_SYNC_PANEL is not set
-CONFIG_FB_MXC_SII9022=y
CONFIG_FB_MXC_CH7026=y
# CONFIG_FB_MXC_TVOUT_CH7024 is not set
# CONFIG_FB_MXC_ASYNC_PANEL is not set
@@ -2065,8 +2061,8 @@ CONFIG_CRYPTO=y
# CONFIG_CRYPTO_NULL is not set
# CONFIG_CRYPTO_CRYPTD is not set
# CONFIG_CRYPTO_AUTHENC is not set
-CONFIG_CRYPTO_TEST=m
-CONFIG_CRYPTO_CRYPTODEV=y
+# CONFIG_CRYPTO_TEST is not set
+# CONFIG_CRYPTO_CRYPTODEV is not set
#
# Authenticated Encryption with Associated Data
@@ -2078,10 +2074,10 @@ CONFIG_CRYPTO_CRYPTODEV=y
#
# Block modes
#
-CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_CBC is not set
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_CTS is not set
-CONFIG_CRYPTO_ECB=y
+# CONFIG_CRYPTO_ECB is not set
# CONFIG_CRYPTO_LRW is not set
# CONFIG_CRYPTO_PCBC is not set
# CONFIG_CRYPTO_XTS is not set
@@ -2112,7 +2108,7 @@ CONFIG_CRYPTO_ECB=y
#
# Ciphers
#
-CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_AES is not set
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_BLOWFISH is not set
diff --git a/arch/arm/configs/imx5_updater_defconfig b/arch/arm/configs/imx5_updater_defconfig
index f594185b5e0a..801eca586a13 100644
--- a/arch/arm/configs/imx5_updater_defconfig
+++ b/arch/arm/configs/imx5_updater_defconfig
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.31
-# Tue Jul 27 15:14:58 2010
+# Wed Jun 23 17:31:28 2010
#
CONFIG_ARM=y
CONFIG_HAVE_PWM=y
@@ -192,13 +192,11 @@ CONFIG_FORCE_MAX_ZONEORDER=13
CONFIG_ARCH_MXC_HAS_NFC_V3=y
CONFIG_ARCH_MX51=y
CONFIG_ARCH_MX53=y
-CONFIG_ARCH_MX50=y
CONFIG_MX5_OPTIONS=y
CONFIG_MX5_MULTI_ARCH=y
CONFIG_MACH_MX51_3DS=y
CONFIG_MACH_MX51_BABBAGE=y
CONFIG_MACH_MX53_EVK=y
-CONFIG_MACH_MX50_ARM2=y
#
# MX5x Options:
@@ -208,8 +206,7 @@ CONFIG_MXC_TZIC=y
CONFIG_ISP1504_MXC=y
# CONFIG_MXC_IRQ_PRIOR is not set
CONFIG_MXC_PWM=y
-CONFIG_ARCH_MXC_IOMUX_V3=y
-CONFIG_MXC_DVFS_PER=y
+# CONFIG_MXC_DVFS_PER is not set
#
# Processor Type
@@ -303,16 +300,16 @@ CONFIG_CPU_FREQ_TABLE=y
# CONFIG_CPU_FREQ_DEBUG is not set
CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_IMX=y
# CONFIG_CPU_IDLE is not set
@@ -525,7 +522,14 @@ CONFIG_SCSI_LOWLEVEL=y
# CONFIG_SCSI_DEBUG is not set
# CONFIG_SCSI_DH is not set
# CONFIG_SCSI_OSD_INITIATOR is not set
-# CONFIG_ATA is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+# CONFIG_SATA_PMP is not set
+# CONFIG_SATA_AHCI_PLATFORM is not set
+CONFIG_ATA_SFF=y
+# CONFIG_SATA_MV is not set
+# CONFIG_PATA_PLATFORM is not set
+CONFIG_PATA_FSL=y
# CONFIG_MD is not set
#
@@ -636,7 +640,6 @@ CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
# CONFIG_IPMI_HANDLER is not set
CONFIG_HW_RANDOM=y
-CONFIG_FSL_OTP=y
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
# CONFIG_R3964 is not set
# CONFIG_RAW_DRIVER is not set
@@ -830,7 +833,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
#
# Watchdog Device Drivers
#
-CONFIG_SOFT_WATCHDOG=y
+# CONFIG_SOFT_WATCHDOG is not set
CONFIG_MXC_WATCHDOG=y
#
@@ -867,12 +870,196 @@ CONFIG_MEDIA_SUPPORT=y
#
# Multimedia core support
#
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_VIDEO_MEDIA is not set
+CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_V4L2_COMMON=y
+CONFIG_VIDEO_ALLOW_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_MEDIA=y
#
# Multimedia drivers
#
+CONFIG_MEDIA_TUNER=y
+CONFIG_MEDIA_TUNER_CUSTOMISE=y
+# CONFIG_MEDIA_TUNER_SIMPLE is not set
+# CONFIG_MEDIA_TUNER_TDA8290 is not set
+# CONFIG_MEDIA_TUNER_TDA827X is not set
+# CONFIG_MEDIA_TUNER_TDA18271 is not set
+# CONFIG_MEDIA_TUNER_TDA9887 is not set
+# CONFIG_MEDIA_TUNER_TEA5761 is not set
+# CONFIG_MEDIA_TUNER_TEA5767 is not set
+# CONFIG_MEDIA_TUNER_MT20XX is not set
+# CONFIG_MEDIA_TUNER_MT2060 is not set
+# CONFIG_MEDIA_TUNER_MT2266 is not set
+# CONFIG_MEDIA_TUNER_MT2131 is not set
+# CONFIG_MEDIA_TUNER_QT1010 is not set
+# CONFIG_MEDIA_TUNER_XC2028 is not set
+# CONFIG_MEDIA_TUNER_XC5000 is not set
+# CONFIG_MEDIA_TUNER_MXL5005S is not set
+# CONFIG_MEDIA_TUNER_MXL5007T is not set
+# CONFIG_MEDIA_TUNER_MC44S803 is not set
+CONFIG_VIDEO_V4L2=y
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_CAPTURE_DRIVERS=y
+# CONFIG_VIDEO_ADV_DEBUG is not set
+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set
+
+#
+# Encoders/decoders and other helper chips
+#
+
+#
+# Audio decoders
+#
+# CONFIG_VIDEO_TVAUDIO is not set
+# CONFIG_VIDEO_TDA7432 is not set
+# CONFIG_VIDEO_TDA9840 is not set
+# CONFIG_VIDEO_TDA9875 is not set
+# CONFIG_VIDEO_TEA6415C is not set
+# CONFIG_VIDEO_TEA6420 is not set
+# CONFIG_VIDEO_MSP3400 is not set
+# CONFIG_VIDEO_CS5345 is not set
+# CONFIG_VIDEO_CS53L32A is not set
+# CONFIG_VIDEO_M52790 is not set
+# CONFIG_VIDEO_TLV320AIC23B is not set
+# CONFIG_VIDEO_WM8775 is not set
+# CONFIG_VIDEO_WM8739 is not set
+# CONFIG_VIDEO_VP27SMPX is not set
+
+#
+# RDS decoders
+#
+# CONFIG_VIDEO_SAA6588 is not set
+
+#
+# Video decoders
+#
+# CONFIG_VIDEO_BT819 is not set
+# CONFIG_VIDEO_BT856 is not set
+# CONFIG_VIDEO_BT866 is not set
+# CONFIG_VIDEO_KS0127 is not set
+# CONFIG_VIDEO_OV7670 is not set
+# CONFIG_VIDEO_MT9V011 is not set
+# CONFIG_VIDEO_TCM825X is not set
+# CONFIG_VIDEO_SAA7110 is not set
+# CONFIG_VIDEO_SAA711X is not set
+# CONFIG_VIDEO_SAA717X is not set
+# CONFIG_VIDEO_SAA7191 is not set
+# CONFIG_VIDEO_TVP514X is not set
+# CONFIG_VIDEO_TVP5150 is not set
+# CONFIG_VIDEO_VPX3220 is not set
+
+#
+# Video and audio decoders
+#
+# CONFIG_VIDEO_CX25840 is not set
+
+#
+# MPEG video encoders
+#
+# CONFIG_VIDEO_CX2341X is not set
+
+#
+# Video encoders
+#
+# CONFIG_VIDEO_SAA7127 is not set
+# CONFIG_VIDEO_SAA7185 is not set
+# CONFIG_VIDEO_ADV7170 is not set
+# CONFIG_VIDEO_ADV7175 is not set
+# CONFIG_VIDEO_THS7303 is not set
+# CONFIG_VIDEO_ADV7343 is not set
+
+#
+# Video improvement chips
+#
+# CONFIG_VIDEO_UPD64031A is not set
+# CONFIG_VIDEO_UPD64083 is not set
+# CONFIG_VIDEO_VIVI is not set
+CONFIG_VIDEO_MXC_CAMERA=y
+
+#
+# MXC Camera/V4L2 PRP Features support
+#
+CONFIG_VIDEO_MXC_IPU_CAMERA=y
+# CONFIG_VIDEO_MXC_CSI_CAMERA is not set
+# CONFIG_MXC_CAMERA_MC521DA is not set
+# CONFIG_MXC_EMMA_CAMERA_MICRON111 is not set
+# CONFIG_MXC_CAMERA_OV2640_EMMA is not set
+# CONFIG_MXC_CAMERA_MICRON111 is not set
+# CONFIG_MXC_CAMERA_OV2640 is not set
+CONFIG_MXC_CAMERA_OV3640=y
+# CONFIG_MXC_TVIN_ADV7180 is not set
+CONFIG_MXC_IPU_PRP_VF_SDC=y
+CONFIG_MXC_IPU_PRP_ENC=y
+CONFIG_MXC_IPU_CSI_ENC=y
+CONFIG_VIDEO_MXC_OUTPUT=y
+CONFIG_VIDEO_MXC_IPU_OUTPUT=y
+# CONFIG_VIDEO_MXC_IPUV1_WVGA_OUTPUT is not set
+# CONFIG_VIDEO_MXC_OPL is not set
+# CONFIG_VIDEO_CPIA is not set
+# CONFIG_VIDEO_CPIA2 is not set
+# CONFIG_VIDEO_SAA5246A is not set
+# CONFIG_VIDEO_SAA5249 is not set
+# CONFIG_SOC_CAMERA is not set
+CONFIG_V4L_USB_DRIVERS=y
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
+CONFIG_USB_GSPCA=y
+# CONFIG_USB_M5602 is not set
+# CONFIG_USB_STV06XX is not set
+# CONFIG_USB_GSPCA_CONEX is not set
+# CONFIG_USB_GSPCA_ETOMS is not set
+# CONFIG_USB_GSPCA_FINEPIX is not set
+# CONFIG_USB_GSPCA_MARS is not set
+# CONFIG_USB_GSPCA_MR97310A is not set
+# CONFIG_USB_GSPCA_OV519 is not set
+# CONFIG_USB_GSPCA_OV534 is not set
+# CONFIG_USB_GSPCA_PAC207 is not set
+# CONFIG_USB_GSPCA_PAC7311 is not set
+# CONFIG_USB_GSPCA_SN9C20X is not set
+# CONFIG_USB_GSPCA_SONIXB is not set
+# CONFIG_USB_GSPCA_SONIXJ is not set
+# CONFIG_USB_GSPCA_SPCA500 is not set
+# CONFIG_USB_GSPCA_SPCA501 is not set
+# CONFIG_USB_GSPCA_SPCA505 is not set
+# CONFIG_USB_GSPCA_SPCA506 is not set
+# CONFIG_USB_GSPCA_SPCA508 is not set
+# CONFIG_USB_GSPCA_SPCA561 is not set
+# CONFIG_USB_GSPCA_SQ905 is not set
+# CONFIG_USB_GSPCA_SQ905C is not set
+# CONFIG_USB_GSPCA_STK014 is not set
+# CONFIG_USB_GSPCA_SUNPLUS is not set
+# CONFIG_USB_GSPCA_T613 is not set
+# CONFIG_USB_GSPCA_TV8532 is not set
+# CONFIG_USB_GSPCA_VC032X is not set
+# CONFIG_USB_GSPCA_ZC3XX is not set
+# CONFIG_VIDEO_PVRUSB2 is not set
+# CONFIG_VIDEO_HDPVR is not set
+# CONFIG_VIDEO_EM28XX is not set
+# CONFIG_VIDEO_CX231XX is not set
+# CONFIG_VIDEO_USBVISION is not set
+# CONFIG_USB_VICAM is not set
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_KONICAWC is not set
+# CONFIG_USB_QUICKCAM_MESSENGER is not set
+# CONFIG_USB_ET61X251 is not set
+# CONFIG_VIDEO_OVCAMCHIP is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_SE401 is not set
+# CONFIG_USB_SN9C102 is not set
+# CONFIG_USB_STV680 is not set
+# CONFIG_USB_ZC0301 is not set
+# CONFIG_USB_PWC is not set
+CONFIG_USB_PWC_INPUT_EVDEV=y
+# CONFIG_USB_ZR364XX is not set
+# CONFIG_USB_STKWEBCAM is not set
+# CONFIG_USB_S2255 is not set
+CONFIG_RADIO_ADAPTERS=y
+# CONFIG_USB_DSBR is not set
+# CONFIG_USB_SI470X is not set
+# CONFIG_USB_MR800 is not set
+# CONFIG_RADIO_TEA5764 is not set
# CONFIG_DAB is not set
#
@@ -904,15 +1091,13 @@ CONFIG_FB_MODE_HELPERS=y
#
CONFIG_FB_MXC=y
CONFIG_FB_MXC_SYNC_PANEL=y
-# CONFIG_FB_MXC_EPSON_VGA_SYNC_PANEL is not set
-# CONFIG_FB_MXC_TVOUT_TVE is not set
-# CONFIG_FB_MXC_LDB is not set
+CONFIG_FB_MXC_EPSON_VGA_SYNC_PANEL=y
+CONFIG_FB_MXC_TVOUT_TVE=y
+CONFIG_FB_MXC_LDB=y
# CONFIG_FB_MXC_CLAA_WVGA_SYNC_PANEL is not set
-# CONFIG_FB_MXC_CH7026 is not set
+CONFIG_FB_MXC_CH7026=y
# CONFIG_FB_MXC_TVOUT_CH7024 is not set
# CONFIG_FB_MXC_ASYNC_PANEL is not set
-# CONFIG_FB_MXC_EINK_PANEL is not set
-# CONFIG_FB_MXC_ELCDIF_FB is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FB_METRONOME is not set
@@ -954,7 +1139,52 @@ CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_MONO is not set
# CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_LOGO_LINUX_CLUT224=y
-# CONFIG_SOUND is not set
+CONFIG_SOUND=y
+CONFIG_SOUND_OSS_CORE=y
+CONFIG_SND=y
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+CONFIG_SND_JACK=y
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=y
+CONFIG_SND_PCM_OSS=y
+CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_HRTIMER is not set
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+# CONFIG_SND_RAWMIDI_SEQ is not set
+# CONFIG_SND_OPL3_LIB_SEQ is not set
+# CONFIG_SND_OPL4_LIB_SEQ is not set
+# CONFIG_SND_SBAWE_SEQ is not set
+# CONFIG_SND_EMU10K1_SEQ is not set
+CONFIG_SND_DRIVERS=y
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+CONFIG_SND_ARM=y
+CONFIG_SND_MXC_SPDIF=y
+CONFIG_SND_SPI=y
+CONFIG_SND_USB=y
+# CONFIG_SND_USB_AUDIO is not set
+# CONFIG_SND_USB_CAIAQ is not set
+CONFIG_SND_SOC=y
+CONFIG_SND_MXC_SOC=y
+CONFIG_SND_MXC_SOC_SSI=y
+CONFIG_SND_MXC_SOC_IRAM=y
+CONFIG_SND_SOC_IMX_3STACK_SGTL5000=y
+# CONFIG_SND_SOC_IMX_3STACK_AK4647 is not set
+# CONFIG_SND_SOC_IMX_3STACK_WM8580 is not set
+# CONFIG_SND_SOC_IMX_3STACK_AK5702 is not set
+# CONFIG_SND_SOC_IMX_3STACK_BLUETOOTH is not set
+CONFIG_SND_SOC_I2C_AND_SPI=y
+# CONFIG_SND_SOC_ALL_CODECS is not set
+CONFIG_SND_SOC_SGTL5000=y
+# CONFIG_SOUND_PRIME is not set
CONFIG_HID_SUPPORT=y
CONFIG_HID=y
# CONFIG_HID_DEBUG is not set
@@ -1255,20 +1485,7 @@ CONFIG_RTC_INTF_DEV_UIE_EMUL=y
# CONFIG_RTC_DRV_MXC_V2 is not set
# CONFIG_RTC_DRV_IMXDI is not set
CONFIG_RTC_MC13892=y
-CONFIG_DMADEVICES=y
-
-#
-# DMA Devices
-#
-CONFIG_MXC_PXP=y
-CONFIG_MXC_PXP_CLIENT_DEVICE=y
-CONFIG_DMA_ENGINE=y
-
-#
-# DMA Clients
-#
-# CONFIG_ASYNC_TX_DMA is not set
-# CONFIG_DMATEST is not set
+# CONFIG_DMADEVICES is not set
# CONFIG_AUXDISPLAY is not set
CONFIG_REGULATOR=y
# CONFIG_REGULATOR_DEBUG is not set
@@ -1279,7 +1496,6 @@ CONFIG_REGULATOR=y
# CONFIG_REGULATOR_MAX1586 is not set
# CONFIG_REGULATOR_LP3971 is not set
CONFIG_REGULATOR_MC13892=y
-CONFIG_REGULATOR_MAX17135=y
CONFIG_UIO=y
# CONFIG_UIO_PDRV is not set
CONFIG_UIO_PDRV_GENIRQ=y
@@ -1351,8 +1567,9 @@ CONFIG_MXC_MC13892_POWER=y
#
# MXC VPU(Video Processing Unit) support
#
-# CONFIG_MXC_VPU is not set
-# CONFIG_MXC_VPU_IRAM is not set
+CONFIG_MXC_VPU=y
+CONFIG_MXC_VPU_IRAM=y
+# CONFIG_MXC_VPU_DEBUG is not set
#
# MXC Asynchronous Sample Rate Converter support
@@ -1379,11 +1596,6 @@ CONFIG_MXC_MLB=y
# CONFIG_IMX_ADC is not set
#
-# MXC GPU support
-#
-# CONFIG_MXC_AMD_GPU is not set
-
-#
# File systems
#
CONFIG_EXT2_FS=y
@@ -1553,8 +1765,8 @@ CONFIG_NLS_UTF8=y
# Kernel hacking
#
# CONFIG_PRINTK_TIME is not set
-# CONFIG_ENABLE_WARN_DEPRECATED is not set
-# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=1024
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_UNUSED_SYMBOLS is not set
@@ -1565,16 +1777,15 @@ CONFIG_FRAME_WARN=1024
# CONFIG_SLUB_STATS is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
# CONFIG_DEBUG_MEMORY_INIT is not set
-CONFIG_FRAME_POINTER=y
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
# CONFIG_LATENCYTOP is not set
-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_TRACING_SUPPORT=y
# CONFIG_FTRACE is not set
# CONFIG_SAMPLES is not set
CONFIG_HAVE_ARCH_KGDB=y
-# CONFIG_ARM_UNWIND is not set
+CONFIG_ARM_UNWIND=y
# CONFIG_DEBUG_USER is not set
#
diff --git a/arch/arm/include/asm/kmap_types.h b/arch/arm/include/asm/kmap_types.h
index d16ec97ec9a9..c019949a5189 100644
--- a/arch/arm/include/asm/kmap_types.h
+++ b/arch/arm/include/asm/kmap_types.h
@@ -22,4 +22,10 @@ enum km_type {
KM_TYPE_NR
};
+#ifdef CONFIG_DEBUG_HIGHMEM
+#define KM_NMI (-1)
+#define KM_NMI_PTE (-1)
+#define KM_IRQ_PTE (-1)
+#endif
+
#endif
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index ff89d0b3abc5..60be28ddc813 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -2,7 +2,8 @@
# Makefile for the linux kernel.
#
-AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
+CPPFLAGS_vmlinux.lds := -DTEXT_OFFSET=$(TEXT_OFFSET)
+AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
ifdef CONFIG_DYNAMIC_FTRACE
CFLAGS_REMOVE_ftrace.o = -pg
diff --git a/arch/arm/mach-mx23/device.c b/arch/arm/mach-mx23/device.c
index cda2285ec3bc..814c4ef59266 100644
--- a/arch/arm/mach-mx23/device.c
+++ b/arch/arm/mach-mx23/device.c
@@ -931,49 +931,6 @@ static void mx23_init_persistent()
}
#endif
-#if defined(CONFIG_FSL_OTP)
-/* Building up eight registers's names of a bank */
-#define BANK(a, b, c, d, e, f, g, h) \
- {\
- ("HW_OCOTP_"#a), ("HW_OCOTP_"#b), ("HW_OCOTP_"#c), ("HW_OCOTP_"#d), \
- ("HW_OCOTP_"#e), ("HW_OCOTP_"#f), ("HW_OCOTP_"#g), ("HW_OCOTP_"#h) \
- }
-
-#define BANKS (4)
-#define BANK_ITEMS (8)
-static const char *bank_reg_desc[BANKS][BANK_ITEMS] = {
- BANK(CUST0, CUST1, CUST2, CUST3, CRYPTO0, CRYPTO1, CRYPTO2, CRYPTO3),
- BANK(HWCAP0, HWCAP1, HWCAP2, HWCAP3, HWCAP4, HWCAP5, SWCAP, CUSTCAP),
- BANK(LOCK, OPS0, OPS1, OPS2, OPS3, UN0, UN1, UN2),
- BANK(ROM0, ROM1, ROM2, ROM3, ROM4, ROM5, ROM6, ROM7),
-};
-
-static struct fsl_otp_data otp_data = {
- .fuse_name = (char **)bank_reg_desc,
- .regulator_name = "vddio",
- .fuse_num = BANKS * BANK_ITEMS,
-};
-#undef BANK
-#undef BANKS
-#undef BANK_ITEMS
-
-static void mx23_init_otp(void)
-{
- struct platform_device *pdev;
- pdev = mxs_get_device("ocotp", 0);
- if (pdev == NULL || IS_ERR(pdev))
- return;
- pdev->dev.platform_data = &otp_data;
- pdev->resource = NULL;
- pdev->num_resources = 0;
- mxs_add_device(pdev, 3);
-}
-#else
-static void mx23_init_otp(void)
-{
-}
-#endif
-
int __init mx23_device_init(void)
{
mx23_init_dma();
@@ -994,7 +951,6 @@ int __init mx23_device_init(void)
mx23_init_pxp();
mx23_init_battery();
mx23_init_persistent();
- mx23_init_otp();
return 0;
}
diff --git a/arch/arm/mach-mx23/mx23evk_pins.c b/arch/arm/mach-mx23/mx23evk_pins.c
index cdf86cfbea63..c12235d75e8c 100644
--- a/arch/arm/mach-mx23/mx23evk_pins.c
+++ b/arch/arm/mach-mx23/mx23evk_pins.c
@@ -61,28 +61,6 @@ static struct pin_desc mx23evk_fixed_pins[] = {
},
#endif
-#ifdef CONFIG_MXS_AUART2_DEVICE_ENABLE
- {
- .name = "AUART2.RX",
- .id = PINID_GPMI_D14,
- .fun = PIN_FUN2,
- },
- {
- .name = "AUART2.TX",
- .id = PINID_GPMI_D15,
- .fun = PIN_FUN2,
- },
- {
- .name = "AUART2.CTS",
- .id = PINID_ROTARYB,
- .fun = PIN_FUN2,
- },
- {
- .name = "AUART2.RTS",
- .id = PINID_ROTARYA,
- .fun = PIN_FUN2,
- },
-#endif
#if defined(CONFIG_I2C_MXS) || \
defined(CONFIG_I2C_MXS_MODULE)
{
diff --git a/arch/arm/mach-mx23/usb_dr.c b/arch/arm/mach-mx23/usb_dr.c
index 4c702ffcd07c..ed4bde71391c 100644
--- a/arch/arm/mach-mx23/usb_dr.c
+++ b/arch/arm/mach-mx23/usb_dr.c
@@ -64,7 +64,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = {
};
/*
- * OTG resources
+ * resources
*/
static struct resource otg_resources[] = {
[0] = {
@@ -84,28 +84,6 @@ static struct resource otg_resources[] = {
},
};
-/*
- * UDC resources (same as OTG resource)
- */
-static struct resource udc_resources[] = {
- [0] = {
- .start = (u32)USBCTRL_PHYS_ADDR,
- .end = (u32)(USBCTRL_PHYS_ADDR + 0x1ff),
- .flags = IORESOURCE_MEM,
- },
-
- [1] = {
- .start = IRQ_USB_CTRL,
- .flags = IORESOURCE_IRQ,
- },
-
- [2] = {
- .start = IRQ_USB_WAKEUP,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-
static u64 dr_udc_dmamask = ~(u32) 0;
static void dr_udc_release(struct device *dev)
{
@@ -123,8 +101,8 @@ static struct platform_device dr_udc_device = {
.dma_mask = &dr_udc_dmamask,
.coherent_dma_mask = 0xffffffff,
},
- .resource = udc_resources,
- .num_resources = ARRAY_SIZE(udc_resources),
+ .resource = otg_resources,
+ .num_resources = ARRAY_SIZE(otg_resources),
};
static u64 dr_otg_dmamask = ~(u32) 0;
@@ -189,5 +167,5 @@ void fsl_phy_set_power(struct fsl_xcvr_ops *this,
#ifdef CONFIG_MXS_VBUS_CURRENT_DRAW
fs_initcall(usb_dr_init);
#else
- subsys_initcall(usb_dr_init);
+ module_init(usb_dr_init);
#endif
diff --git a/arch/arm/mach-mx25/mx25_3stack.c b/arch/arm/mach-mx25/mx25_3stack.c
index c73bcbf6371e..cc651bf713ec 100644
--- a/arch/arm/mach-mx25/mx25_3stack.c
+++ b/arch/arm/mach-mx25/mx25_3stack.c
@@ -318,7 +318,7 @@ static struct spi_board_info mxc_spi_board_info[] __initdata = {
.max_speed_hz = 18000000,
.bus_num = 1,
.chip_select = 0,
- .mode = SPI_MODE_0,
+ .mode = SPI_MODE_2,
},
{
.modalias = "wm8580_spi",
diff --git a/arch/arm/mach-mx25/usb_dr.c b/arch/arm/mach-mx25/usb_dr.c
index b3d024cb06f8..b185d5cdeff5 100644
--- a/arch/arm/mach-mx25/usb_dr.c
+++ b/arch/arm/mach-mx25/usb_dr.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -39,7 +39,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = {
};
/*
- * OTG resources
+ * resources
*/
static struct resource otg_resources[] = {
[0] = {
@@ -53,22 +53,6 @@ static struct resource otg_resources[] = {
},
};
-/*
- * UDC resources (same as OTG resource)
- */
-static struct resource udc_resources[] = {
- [0] = {
- .start = (u32)(USB_OTGREGS_BASE),
- .end = (u32)(USB_OTGREGS_BASE + 0x1ff),
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = MXC_INT_USB_OTG,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-
static u64 dr_udc_dmamask = ~(u32) 0;
static void dr_udc_release(struct device *dev)
{
@@ -91,8 +75,8 @@ static struct platform_device __maybe_unused dr_udc_device = {
.dma_mask = &dr_udc_dmamask,
.coherent_dma_mask = 0xffffffff,
},
- .resource = udc_resources,
- .num_resources = ARRAY_SIZE(udc_resources),
+ .resource = otg_resources,
+ .num_resources = ARRAY_SIZE(otg_resources),
};
static struct platform_device __maybe_unused dr_otg_device = {
diff --git a/arch/arm/mach-mx28/bus_freq.c b/arch/arm/mach-mx28/bus_freq.c
index ef01a41fc095..1ea76cbdb4e3 100644
--- a/arch/arm/mach-mx28/bus_freq.c
+++ b/arch/arm/mach-mx28/bus_freq.c
@@ -49,14 +49,16 @@
#define BF(value, field) (((value) << BP_##field) & BM_##field)
struct profile profiles[] = {
- { 454736, 151570, 205710, 0, 1550000,
+ { 454736, 151580, 196360, 0, 1550000,
1450000, 355000, 3300000, 1750000, 24000, 0 },
- { 360000, 120000, 130910, 0, 1350000,
- 1250000, 200000, 3300000, 1750000, 24000, 0 },
- { 261818, 130910, 130910, 0, 1350000,
- 1250000, 173000, 3300000, 1750000, 24000, 0 },
- { 64000, 64000, 130910, 3, 1350000,
- 1250000, 150000, 3300000, 1750000, 24000, 0 },
+ { 392727, 130910, 160000, 0, 1475000,
+ 1375000, 225000, 3300000, 1750000, 24000, 0 },
+ { 360000, 120000, 130910, 0, 1375000,
+ 1275000, 200000, 3300000, 1750000, 24000, 0 },
+ { 261818, 130910, 130910, 0, 1275000,
+ 1175000, 173000, 3300000, 1750000, 24000, 0 },
+ { 64000, 64000, 130910, 3, 1050000,
+ 975000, 150000, 3300000, 1750000, 24000, 0 },
{ 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
};
diff --git a/arch/arm/mach-mx28/device.c b/arch/arm/mach-mx28/device.c
index 35e8f14a5568..7305b35bc74b 100644
--- a/arch/arm/mach-mx28/device.c
+++ b/arch/arm/mach-mx28/device.c
@@ -27,7 +27,6 @@
#include <linux/platform_device.h>
#include <linux/mmc/host.h>
#include <linux/phy.h>
-#include <linux/etherdevice.h>
#include <linux/fec.h>
#include <linux/gpmi-nfc.h>
@@ -36,7 +35,6 @@
#include <mach/hardware.h>
#include <mach/regs-timrot.h>
#include <mach/regs-lradc.h>
-#include <mach/regs-ocotp.h>
#include <mach/device.h>
#include <mach/dma.h>
#include <mach/lradc.h>
@@ -556,10 +554,9 @@ static struct mxs_mmc_platform_data mmc0_data = {
.get_wp = mxs_mmc_get_wp_ssp0,
.cmd_pullup = mxs_mmc_cmd_pullup_ssp0,
.setclock = mxs_mmc_setclock_ssp0,
- .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA
- | MMC_CAP_DATA_DDR,
+ .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
.min_clk = 400000,
- .max_clk = 48000000,
+ .max_clk = 52000000,
.read_uA = 50000,
.write_uA = 70000,
.clock_mmc = "ssp.0",
@@ -595,10 +592,9 @@ static struct mxs_mmc_platform_data mmc1_data = {
.get_wp = mxs_mmc_get_wp_ssp1,
.cmd_pullup = mxs_mmc_cmd_pullup_ssp1,
.setclock = mxs_mmc_setclock_ssp1,
- .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA
- | MMC_CAP_DATA_DDR,
+ .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
.min_clk = 400000,
- .max_clk = 48000000,
+ .max_clk = 52000000,
.read_uA = 50000,
.write_uA = 70000,
.clock_mmc = "ssp.1",
@@ -761,16 +757,7 @@ static void __init mx28_init_fec(void)
{
struct platform_device *pdev;
struct mxs_dev_lookup *lookup;
- struct fec_platform_data *pfec;
int i;
- u32 val;
-
- __raw_writel(BM_OCOTP_CTRL_RD_BANK_OPEN,
- IO_ADDRESS(OCOTP_PHYS_ADDR) + HW_OCOTP_CTRL_SET);
-
- while (BM_OCOTP_CTRL_BUSY &
- __raw_readl(IO_ADDRESS(OCOTP_PHYS_ADDR) + HW_OCOTP_CTRL))
- udelay(10);
lookup = mxs_get_devices("mxs-fec");
if (lookup == NULL || IS_ERR(lookup))
@@ -778,8 +765,6 @@ static void __init mx28_init_fec(void)
for (i = 0; i < lookup->size; i++) {
pdev = lookup->pdev + i;
- val = __raw_readl(IO_ADDRESS(OCOTP_PHYS_ADDR) +
- HW_OCOTP_CUSTn(pdev->id));
switch (pdev->id) {
case 0:
pdev->resource = fec0_resource;
@@ -794,15 +779,6 @@ static void __init mx28_init_fec(void)
default:
return;
}
-
- pfec = (struct fec_platform_data *)pdev->dev.platform_data;
- pfec->mac[0] = 0x00;
- pfec->mac[1] = 0x04;
- pfec->mac[2] = (val >> 24) & 0xFF;
- pfec->mac[3] = (val >> 16) & 0xFF;
- pfec->mac[4] = (val >> 8) & 0xFF;
- pfec->mac[5] = (val >> 0) & 0xFF;
-
mxs_add_device(pdev, 2);
}
}
@@ -848,36 +824,13 @@ static struct switch_platform_data l2switch_data = {
static void __init mx28_init_l2switch(void)
{
struct platform_device *pdev;
- struct switch_platform_data *pswitch;
- struct fec_platform_data *pfec;
- u32 val;
-
- __raw_writel(BM_OCOTP_CTRL_RD_BANK_OPEN,
- IO_ADDRESS(OCOTP_PHYS_ADDR) + HW_OCOTP_CTRL_SET);
-
- while (BM_OCOTP_CTRL_BUSY &
- __raw_readl(IO_ADDRESS(OCOTP_PHYS_ADDR) + HW_OCOTP_CTRL))
- udelay(10);
-
pdev = mxs_get_device("mxs-l2switch", 0);
if (pdev == NULL || IS_ERR(pdev))
return;
- val = __raw_readl(IO_ADDRESS(OCOTP_PHYS_ADDR) +
- HW_OCOTP_CUSTn(pdev->id));
pdev->resource = l2switch_resources;
pdev->num_resources = ARRAY_SIZE(l2switch_resources);
pdev->dev.platform_data = &l2switch_data;
-
- pswitch = (struct switch_platform_data *)pdev->dev.platform_data;
- pfec = pswitch->fec_enet;
- pfec->mac[0] = 0x00;
- pfec->mac[1] = 0x04;
- pfec->mac[2] = (val >> 24) & 0xFF;
- pfec->mac[3] = (val >> 16) & 0xFF;
- pfec->mac[4] = (val >> 8) & 0xFF;
- pfec->mac[5] = (val >> 0) & 0xFF;
-
mxs_add_device(pdev, 2);
}
#else
@@ -1459,50 +1412,6 @@ static void mx28_init_persistent()
}
#endif
-#if defined(CONFIG_FSL_OTP)
-/* Building up eight registers's names of a bank */
-#define BANK(a, b, c, d, e, f, g, h) \
- {\
- ("HW_OCOTP_"#a), ("HW_OCOTP_"#b), ("HW_OCOTP_"#c), ("HW_OCOTP_"#d), \
- ("HW_OCOTP_"#e), ("HW_OCOTP_"#f), ("HW_OCOTP_"#g), ("HW_OCOTP_"#h) \
- }
-
-#define BANKS (5)
-#define BANK_ITEMS (8)
-static const char *bank_reg_desc[BANKS][BANK_ITEMS] = {
- BANK(CUST0, CUST1, CUST2, CUST3, CRYPTO0, CRYPTO1, CRYPTO2, CRYPTO3),
- BANK(HWCAP0, HWCAP1, HWCAP2, HWCAP3, HWCAP4, HWCAP5, SWCAP, CUSTCAP),
- BANK(LOCK, OPS0, OPS1, OPS2, OPS3, UN0, UN1, UN2),
- BANK(ROM0, ROM1, ROM2, ROM3, ROM4, ROM5, ROM6, ROM7),
- BANK(SRK0, SRK1, SRK2, SRK3, SRK4, SRK5, SRK6, SRK7),
-};
-
-static struct fsl_otp_data otp_data = {
- .fuse_name = (char **)bank_reg_desc,
- .regulator_name = "vddio",
- .fuse_num = BANKS * BANK_ITEMS,
-};
-#undef BANK
-#undef BANKS
-#undef BANK_ITEMS
-
-static void __init mx28_init_otp(void)
-{
- struct platform_device *pdev;
- pdev = mxs_get_device("ocotp", 0);
- if (pdev == NULL || IS_ERR(pdev))
- return;
- pdev->dev.platform_data = &otp_data;
- pdev->resource = NULL;
- pdev->num_resources = 0;
- mxs_add_device(pdev, 3);
-}
-#else
-static void mx28_init_otp(void)
-{
-}
-#endif
-
int __init mx28_device_init(void)
{
mx28_init_dma();
@@ -1527,7 +1436,6 @@ int __init mx28_device_init(void)
mx28_init_dcp();
mx28_init_battery();
mx28_init_persistent();
- mx28_init_otp();
return 0;
}
diff --git a/arch/arm/mach-mx28/emi_settings.c b/arch/arm/mach-mx28/emi_settings.c
index 56df6ad0c0d4..7dd62b9dd65a 100644
--- a/arch/arm/mach-mx28/emi_settings.c
+++ b/arch/arm/mach-mx28/emi_settings.c
@@ -27,6 +27,7 @@
#include <linux/platform_device.h>
#include <linux/mmc/host.h>
#include <linux/phy.h>
+#include <linux/fec.h>
#include <asm/mach/map.h>
diff --git a/arch/arm/mach-mx28/mx28evk.c b/arch/arm/mach-mx28/mx28evk.c
index 37beb27f7065..768b21a5ffe5 100644
--- a/arch/arm/mach-mx28/mx28evk.c
+++ b/arch/arm/mach-mx28/mx28evk.c
@@ -39,7 +39,7 @@ static struct i2c_board_info __initdata mxs_i2c_device[] = {
{ I2C_BOARD_INFO("sgtl5000-i2c", 0x14), .flags = I2C_M_TEN }
};
-static void __init i2c_device_init(void)
+static void i2c_device_init(void)
{
i2c_register_board_info(0, mxs_i2c_device, ARRAY_SIZE(mxs_i2c_device));
}
diff --git a/arch/arm/mach-mx28/mx28evk.h b/arch/arm/mach-mx28/mx28evk.h
index d973c0f7ef19..58910271343d 100644
--- a/arch/arm/mach-mx28/mx28evk.h
+++ b/arch/arm/mach-mx28/mx28evk.h
@@ -21,8 +21,5 @@
extern void __init mx28evk_pins_init(void);
extern int mx28evk_enet_gpio_init(void);
-void mx28evk_enet_io_lowerpower_enter(void);
-void mx28evk_enet_io_lowerpower_exit(void);
-
#endif /* __ASM_ARM_MACH_MX28EVK_H */
diff --git a/arch/arm/mach-mx28/mx28evk_pins.c b/arch/arm/mach-mx28/mx28evk_pins.c
index 7d5b64328324..a7c81b3cf023 100644
--- a/arch/arm/mach-mx28/mx28evk_pins.c
+++ b/arch/arm/mach-mx28/mx28evk_pins.c
@@ -531,106 +531,16 @@ static struct pin_desc mx28evk_fixed_pins[] = {
.name = "SSP0_SCK",
.id = PINID_SSP0_SCK,
.fun = PIN_FUN1,
- .strength = PAD_12MA,
+ .strength = PAD_8MA,
.voltage = PAD_3_3V,
.pullup = 0,
- .drive = 2,
- .pull = 0,
- },
-#endif
-#if defined(CONFIG_LEDS_MXS) || defined(CONFIG_LEDS_MXS_MODULE)
- {
- .name = "LEDS_PWM0",
- .id = PINID_AUART1_RX,
- .fun = PIN_FUN3,
- .strength = PAD_8MA,
- .voltage = PAD_3_3V,
- .pullup = 1,
- .drive = 1,
- .pull = 1,
- },
- {
- .name = "LEDS_PWM1",
- .id = PINID_AUART1_TX,
- .fun = PIN_FUN3,
- .strength = PAD_8MA,
- .voltage = PAD_3_3V,
- .pullup = 1,
- .drive = 1,
- .pull = 1,
- },
-#endif
-#if defined(CONFIG_SND_MXS_SOC_DAI) || defined(CONFIG_SND_MXS_SOC_DAI_MODULE)
- /* Configurations of SAIF0 port pins */
- {
- .name = "SAIF0_MCLK",
- .id = PINID_SAIF0_MCLK,
- .fun = PIN_FUN1,
- .strength = PAD_12MA,
- .voltage = PAD_3_3V,
- .pullup = 1,
- .drive = 1,
- .pull = 1,
- },
- {
- .name = "SAIF0_LRCLK",
- .id = PINID_SAIF0_LRCLK,
- .fun = PIN_FUN1,
- .strength = PAD_12MA,
- .voltage = PAD_3_3V,
- .pullup = 1,
.drive = 1,
- .pull = 1,
- },
- {
- .name = "SAIF0_BITCLK",
- .id = PINID_SAIF0_BITCLK,
- .fun = PIN_FUN1,
- .strength = PAD_12MA,
- .voltage = PAD_3_3V,
- .pullup = 1,
- .drive = 1,
- .pull = 1,
- },
- {
- .name = "SAIF0_SDATA0",
- .id = PINID_SAIF0_SDATA0,
- .fun = PIN_FUN1,
- .strength = PAD_12MA,
- .voltage = PAD_3_3V,
- .pullup = 1,
- .drive = 1,
- .pull = 1,
- },
- {
- .name = "SAIF1_SDATA0",
- .id = PINID_SAIF1_SDATA0,
- .fun = PIN_FUN1,
- .strength = PAD_12MA,
- .voltage = PAD_3_3V,
- .pullup = 1,
- .drive = 1,
- .pull = 1,
+ .pull = 0,
},
#endif
-#if defined(CONFIG_SND_SOC_MXS_SPDIF) || \
- defined(CONFIG_SND_SOC_MXS_SPDIF_MODULE)
- {
- .name = "SPDIF",
- .id = PINID_SPDIF,
- .fun = PIN_FUN1,
- .strength = PAD_12MA,
- .voltage = PAD_3_3V,
- .pullup = 1,
- .drive = 1,
- .pull = 1,
- },
-#endif
-};
#if defined(CONFIG_FEC) || defined(CONFIG_FEC_MODULE)\
|| defined(CONFIG_FEC_L2SWITCH)
-static struct pin_desc mx28evk_eth_pins[] = {
{
.name = "ENET0_MDC",
.id = PINID_ENET0_MDC,
@@ -781,8 +691,97 @@ static struct pin_desc mx28evk_eth_pins[] = {
.voltage = PAD_3_3V,
.drive = 1,
},
-};
#endif
+#if defined(CONFIG_LEDS_MXS) || defined(CONFIG_LEDS_MXS_MODULE)
+ {
+ .name = "LEDS_PWM0",
+ .id = PINID_AUART1_RX,
+ .fun = PIN_FUN3,
+ .strength = PAD_8MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
+ {
+ .name = "LEDS_PWM1",
+ .id = PINID_AUART1_TX,
+ .fun = PIN_FUN3,
+ .strength = PAD_8MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
+#endif
+#if defined(CONFIG_SND_MXS_SOC_DAI) || defined(CONFIG_SND_MXS_SOC_DAI_MODULE)
+ /* Configurations of SAIF0 port pins */
+ {
+ .name = "SAIF0_MCLK",
+ .id = PINID_SAIF0_MCLK,
+ .fun = PIN_FUN1,
+ .strength = PAD_12MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
+ {
+ .name = "SAIF0_LRCLK",
+ .id = PINID_SAIF0_LRCLK,
+ .fun = PIN_FUN1,
+ .strength = PAD_12MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
+ {
+ .name = "SAIF0_BITCLK",
+ .id = PINID_SAIF0_BITCLK,
+ .fun = PIN_FUN1,
+ .strength = PAD_12MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
+ {
+ .name = "SAIF0_SDATA0",
+ .id = PINID_SAIF0_SDATA0,
+ .fun = PIN_FUN1,
+ .strength = PAD_12MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
+ {
+ .name = "SAIF1_SDATA0",
+ .id = PINID_SAIF1_SDATA0,
+ .fun = PIN_FUN1,
+ .strength = PAD_12MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
+#endif
+#if defined(CONFIG_SND_SOC_MXS_SPDIF) || \
+ defined(CONFIG_SND_SOC_MXS_SPDIF_MODULE)
+ {
+ .name = "SPDIF",
+ .id = PINID_SPDIF,
+ .fun = PIN_FUN1,
+ .strength = PAD_12MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
+#endif
+};
+
static int __initdata enable_ssp1 = { 0 };
static int __init ssp1_setup(char *__unused)
@@ -898,10 +897,10 @@ static struct pin_desc mx28evk_ssp1_pins[] = {
.name = "SSP1_SCK",
.id = PINID_GPMI_WRN,
.fun = PIN_FUN2,
- .strength = PAD_12MA,
+ .strength = PAD_8MA,
.voltage = PAD_3_3V,
.pullup = 0,
- .drive = 2,
+ .drive = 1,
.pull = 0,
},
};
@@ -1088,49 +1087,11 @@ int mx28evk_enet_gpio_init(void)
return 0;
}
-
-void mx28evk_enet_io_lowerpower_enter(void)
-{
- int i;
- gpio_direction_output(MXS_PIN_TO_GPIO(PINID_SSP1_DATA3), 1);
- gpio_direction_output(MXS_PIN_TO_GPIO(PINID_ENET0_RX_CLK), 0);
- gpio_request(MXS_PIN_TO_GPIO(PINID_ENET0_TX_CLK), "ETH_INT");
- gpio_direction_output(MXS_PIN_TO_GPIO(PINID_ENET0_TX_CLK), 0);
-
- for (i = 0; i < ARRAY_SIZE(mx28evk_eth_pins); i++) {
- mxs_release_pin(mx28evk_eth_pins[i].id,
- mx28evk_eth_pins[i].name);
- gpio_request(MXS_PIN_TO_GPIO(mx28evk_eth_pins[i].id),
- mx28evk_eth_pins[i].name);
- gpio_direction_output(
- MXS_PIN_TO_GPIO(mx28evk_eth_pins[i].id), 0);
- }
-
-}
-
-void mx28evk_enet_io_lowerpower_exit(void)
-{
- int i;
- gpio_direction_output(MXS_PIN_TO_GPIO(PINID_SSP1_DATA3), 0);
- gpio_direction_output(MXS_PIN_TO_GPIO(PINID_ENET0_RX_CLK), 1);
- gpio_free(MXS_PIN_TO_GPIO(PINID_ENET0_TX_CLK));
- for (i = 0; i < ARRAY_SIZE(mx28evk_eth_pins); i++) {
- gpio_free(MXS_PIN_TO_GPIO(mx28evk_eth_pins[i].id));
- mxs_request_pin(mx28evk_eth_pins[i].id,
- mx28evk_eth_pins[i].fun,
- mx28evk_eth_pins[i].name);
- }
-}
-
#else
int mx28evk_enet_gpio_init(void)
{
return 0;
}
-void mx28evk_enet_io_lowerpower_enter(void)
-{}
-void mx28evk_enet_io_lowerpower_exit(void)
-{}
#endif
void __init mx28evk_init_pin_group(struct pin_desc *pins, unsigned count)
@@ -1174,9 +1135,5 @@ void __init mx28evk_pins_init(void)
mx28evk_init_pin_group(mx28evk_gpmi_pins,
ARRAY_SIZE(mx28evk_gpmi_pins));
}
-#if defined(CONFIG_FEC) || defined(CONFIG_FEC_MODULE)\
- || defined(CONFIG_FEC_L2SWITCH)
- mx28evk_init_pin_group(mx28evk_eth_pins,
- ARRAY_SIZE(mx28evk_eth_pins));
-#endif
+
}
diff --git a/arch/arm/mach-mx28/pm.c b/arch/arm/mach-mx28/pm.c
index 4ac13bc3248c..c26a495f59e2 100644
--- a/arch/arm/mach-mx28/pm.c
+++ b/arch/arm/mach-mx28/pm.c
@@ -36,13 +36,12 @@
#include <mach/dma.h>
#include <mach/regs-rtc.h>
#include "regs-clkctrl.h"
+#include "regs-pinctrl.h"
#include <mach/regs-power.h>
#include <mach/regs-pwm.h>
#include <mach/regs-rtc.h>
#include <mach/../../regs-icoll.h>
#include "regs-dram.h"
-#include "mx28_pins.h"
-#include "mx28evk.h"
#include "sleep.h"
@@ -80,8 +79,7 @@ static inline void do_standby(void)
u32 reg_clkctrl_clkseq, reg_clkctrl_xtal;
unsigned long iram_phy_addr;
void *iram_virtual_addr;
- int wakeupirq;
- mx28evk_enet_io_lowerpower_enter();
+
/*
* 1) switch clock domains from PLL to 24MHz
* 2) lower voltage (TODO)
@@ -112,8 +110,7 @@ static inline void do_standby(void)
cpu_parent = clk_get_parent(cpu_clk);
hbus_rate = clk_get_rate(hbus_clk);
clk_set_parent(cpu_clk, osc_clk);
- } else
- pr_err("fail to get cpu clk\n");
+ }
local_fiq_disable();
@@ -125,18 +122,15 @@ static inline void do_standby(void)
reg_clkctrl_xtal = __raw_readl(REGS_CLKCTRL_BASE + HW_CLKCTRL_XTAL);
-
/* do suspend */
mx28_cpu_standby_ptr = iram_virtual_addr;
mx28_cpu_standby_ptr();
- wakeupirq = __raw_readl(IO_ADDRESS(ICOLL_PHYS_ADDR) + HW_ICOLL_STAT);
-
- pr_info("wakeup irq = %d\n", wakeupirq);
__raw_writel(reg_clkctrl_clkseq, REGS_CLKCTRL_BASE + HW_CLKCTRL_CLKSEQ);
__raw_writel(reg_clkctrl_xtal, REGS_CLKCTRL_BASE + HW_CLKCTRL_XTAL);
+
saved_sleep_state = 0; /* waking from standby */
__raw_writel(BM_POWER_CTRL_PSWITCH_IRQ,
REGS_POWER_BASE + HW_POWER_CTRL_CLR);
@@ -155,7 +149,6 @@ static inline void do_standby(void)
clk_put(cpu_clk);
iram_free(iram_phy_addr, MAX_POWEROFF_CODE_SIZE);
- mx28evk_enet_io_lowerpower_exit();
}
static noinline void do_mem(void)
@@ -262,52 +255,38 @@ static struct mx28_pswitch_state pswitch_state = {
.dev_running = 0,
};
-#define PSWITCH_POWER_DOWN_DELAY 30
-static struct delayed_work pswitch_work;
-static void pswitch_check_work(struct work_struct *work)
+static irqreturn_t pswitch_interrupt(int irq, void *dev)
{
int pin_value, i;
- for (i = 0; i < PSWITCH_POWER_DOWN_DELAY; i++) {
+
+ /* check if irq by pswitch */
+ if (!(__raw_readl(REGS_POWER_BASE + HW_POWER_CTRL) &
+ BM_POWER_CTRL_PSWITCH_IRQ))
+ return IRQ_HANDLED;
+ for (i = 0; i < 3000; i++) {
pin_value = __raw_readl(REGS_POWER_BASE + HW_POWER_STS) &
BF_POWER_STS_PSWITCH(0x1);
if (pin_value == 0)
break;
- msleep(100);
+ mdelay(1);
}
- if (i < PSWITCH_POWER_DOWN_DELAY) {
+ if (i < 3000) {
pr_info("pswitch goto suspend\n");
complete(&suspend_request);
} else {
pr_info("release pswitch to power down\n");
- for (i = 0; i < 500; i++) {
+ for (i = 0; i < 5000; i++) {
pin_value = __raw_readl(REGS_POWER_BASE + HW_POWER_STS)
& BF_POWER_STS_PSWITCH(0x1);
if (pin_value == 0)
break;
- msleep(10);
+ mdelay(1);
}
pr_info("pswitch power down\n");
mx28_pm_power_off();
}
__raw_writel(BM_POWER_CTRL_PSWITCH_IRQ,
REGS_POWER_BASE + HW_POWER_CTRL_CLR);
- __raw_writel(BM_POWER_CTRL_ENIRQ_PSWITCH,
- REGS_POWER_BASE + HW_POWER_CTRL_SET);
- __raw_writel(BM_POWER_CTRL_PSWITCH_IRQ,
- REGS_POWER_BASE + HW_POWER_CTRL_CLR);
-}
-
-
-static irqreturn_t pswitch_interrupt(int irq, void *dev)
-{
-
- /* check if irq by pswitch */
- if (!(__raw_readl(REGS_POWER_BASE + HW_POWER_CTRL) &
- BM_POWER_CTRL_PSWITCH_IRQ))
- return IRQ_HANDLED;
- __raw_writel(BM_POWER_CTRL_ENIRQ_PSWITCH,
- REGS_POWER_BASE + HW_POWER_CTRL_CLR);
- schedule_delayed_work(&pswitch_work, 1);
return IRQ_HANDLED;
}
@@ -320,7 +299,6 @@ static struct irqaction pswitch_irq = {
static void init_pswitch(void)
{
- INIT_DELAYED_WORK(&pswitch_work, pswitch_check_work);
kthread_run(suspend_thread_fn, NULL, "pswitch");
__raw_writel(BM_POWER_CTRL_PSWITCH_IRQ,
REGS_POWER_BASE + HW_POWER_CTRL_CLR);
diff --git a/arch/arm/mach-mx28/sleep.S b/arch/arm/mach-mx28/sleep.S
index 54e86bd4f717..438f588f85d3 100644
--- a/arch/arm/mach-mx28/sleep.S
+++ b/arch/arm/mach-mx28/sleep.S
@@ -25,7 +25,6 @@
#include <mach/hardware.h>
#include <mach/regs-power.h>
#include <mach/regs-rtc.h>
-#include "regs-pinctrl.h"
#include "regs-clkctrl.h"
#include "regs-dram.h"
#include "sleep.h"
@@ -40,104 +39,11 @@
#define HW_DRAM_CTL17_ADDR \
(MX28_SOC_IO_ADDRESS(DRAM_PHYS_ADDR) + HW_DRAM_CTL17)
-#define HW_DRAM_CTL22_ADDR \
- (MX28_SOC_IO_ADDRESS(DRAM_PHYS_ADDR) + HW_DRAM_CTL22)
-
#define HW_RTC_PERSISTENT0_ADDR \
(MX28_SOC_IO_ADDRESS(RTC_PHYS_ADDR) + HW_RTC_PERSISTENT0)
-#define HW_CLKCTRL_EMI_ADDR \
- (MX28_SOC_IO_ADDRESS(CLKCTRL_PHYS_ADDR) + HW_CLKCTRL_EMI)
-#define HW_CLKCTRL_PLL0CTRL0_ADDR \
- (MX28_SOC_IO_ADDRESS(CLKCTRL_PHYS_ADDR) + HW_CLKCTRL_PLL0CTRL0)
-#define HW_POWER_VDDIOCTRL_ADDR \
- (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_VDDIOCTRL)
-#define HW_POWER_VDDDCTRL_ADDR \
- (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_VDDDCTRL)
-#define HW_POWER_VDDACTRL_ADDR \
- (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_VDDACTRL)
-#define HW_PINCTRL_EMI_DS_CTRL_ADDR \
- (MX28_SOC_IO_ADDRESS(PINCTRL_PHYS_ADDR) + HW_PINCTRL_EMI_DS_CTRL)
-
-#define HW_POWER_LOOPCTRL_ADDR \
- (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_LOOPCTRL)
-
-#define HW_POWER_MINPWR_ADDR \
- (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_MINPWR)
#define PHYS_RAM_START 0x40000000
-#define LOWER_VDDIO 6
-#define LOWER_VDDA 9
-#define LOWER_VDDD 0x16
-
-#define VDDIOCTRL_BACKUP 0
-#define VDDACTRL_BACKUP 1
-#define VDDDCTRL_BACKUP 2
-#define POWER_LOOPCTRL_BACKUP 3
-#define POWER_MINPWR_BACKUP 4
-
-.macro PM_BITS_SET, addr, val
- mov r0, #(\addr & 0x000000FF)
- orr r0, r0, #(\addr & 0x0000FF00)
- orr r0, r0, #(\addr & 0x00FF0000)
- orr r0, r0, #(\addr & 0xFF000000)
- ldr r1, [r0]
- orr r1, r1, #(\val)
- str r1, [r0]
-.endm
-
-.macro PM_BITS_CLR, addr, val
- mov r0, #(\addr & 0x000000FF)
- orr r0, r0, #(\addr & 0x0000FF00)
- orr r0, r0, #(\addr & 0x00FF0000)
- orr r0, r0, #(\addr & 0xFF000000)
- ldr r1, [r0]
- bic r1, r1, #(\val)
- str r1, [r0]
-.endm
-
-.macro PM_BACKUP_REG, addr, num
- mov r0, #(\addr & 0x000000FF)
- orr r0, r0, #(\addr & 0x0000FF00)
- orr r0, r0, #(\addr & 0x00FF0000)
- orr r0, r0, #(\addr & 0xFF000000)
- ldr r1, [r0]
- str r1, __mx28_temp_stack + \num * 4
-.endm
-
-.macro PM_WRITE_REG_MASK, addr, bitmask, val
- mov r0, #(\addr & 0x000000FF)
- orr r0, r0, #(\addr & 0x0000FF00)
- orr r0, r0, #(\addr & 0x00FF0000)
- orr r0, r0, #(\addr & 0xFF000000)
- ldr r1, [r0]
- bic r1, r1, #(\bitmask)
- orr r1, r1, #(\val)
- str r1, [r0]
-.endm
-
-.macro PM_SET_AND_BACKUP_REG, addr, bitmask, val, num
- mov r0, #(\addr & 0x000000FF)
- orr r0, r0, #(\addr & 0x0000FF00)
- orr r0, r0, #(\addr & 0x00FF0000)
- orr r0, r0, #(\addr & 0xFF000000)
- ldr r1, [r0]
- str r1, __mx28_temp_stack + \num * 4
- bic r1, r1, #(\bitmask)
- orr r1, r1, #(\val)
- str r1, [r0]
-.endm
-
-.macro PM_SET_RESTORE_REG, addr, num
- mov r0, #(\addr & 0x000000FF)
- orr r0, r0, #(\addr & 0x0000FF00)
- orr r0, r0, #(\addr & 0x00FF0000)
- orr r0, r0, #(\addr & 0xFF000000)
- ldr r1, __mx28_temp_stack + \num * 4
- str r1, [r0]
-.endm
-
-
.global cpu_arm926_switch_mm
.text
@@ -153,6 +59,7 @@ ENTRY(mx28_cpu_standby)
ldr r1, __mx28_flush_cache_addr
mov lr, pc
mov pc, r1
+
@ put DRAM into self refresh
mov r0, #(HW_DRAM_CTL17_ADDR & 0x000000FF)
orr r0, r0, #(HW_DRAM_CTL17_ADDR & 0x0000FF00)
@@ -162,67 +69,6 @@ ENTRY(mx28_cpu_standby)
orr r1, r1, #(BM_DRAM_CTL17_SREFRESH)
str r1, [r0]
@ wait for it to actually happen
- mov r0, #24 << 5
-11: sub r0, r0, #1
- cmp r0, #0
- bne 11b
-
- @ gate clk
- mov r0, #(HW_CLKCTRL_EMI_ADDR & 0x000000FF)
- orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x0000FF00)
- orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x00FF0000)
- orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0xFF000000)
- ldr r1, [r0]
- orr r1, r1, #(BM_CLKCTRL_EMI_CLKGATE)
- str r1, [r0]
-
-// PM_SET_AND_BACKUP_REG HW_PINCTRL_EMI_DS_CTRL_ADDR,\
-// BM_PINCTRL_EMI_DS_CTRL_DDR_MODE,\
-// BF_PINCTRL_EMI_DS_CTRL_DDR_MODE(0x1), 4
-
- // vddio
- PM_SET_AND_BACKUP_REG HW_POWER_VDDIOCTRL_ADDR,\
- BM_POWER_VDDIOCTRL_TRG, LOWER_VDDIO, VDDIOCTRL_BACKUP
- mov r0, #24 << 10
-1: sub r0, r0, #1
- cmp r0, #0
- bne 1b
-
- PM_SET_AND_BACKUP_REG HW_POWER_VDDACTRL_ADDR,\
- BM_POWER_VDDACTRL_TRG, LOWER_VDDA, VDDACTRL_BACKUP
- mov r0, #24 << 10
-2: sub r0, r0, #1
- cmp r0, #0
- bne 2b
-
- PM_SET_AND_BACKUP_REG HW_POWER_VDDDCTRL_ADDR,\
- BM_POWER_VDDDCTRL_TRG, LOWER_VDDD, VDDDCTRL_BACKUP
- mov r0, #24 << 10
-3: sub r0, r0, #1
- cmp r0, #0
- bne 3b
-
- PM_BACKUP_REG HW_POWER_LOOPCTRL_ADDR, POWER_LOOPCTRL_BACKUP
- PM_BACKUP_REG HW_POWER_MINPWR_ADDR, POWER_MINPWR_BACKUP
-
-// PM_BITS_CLR HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_EN_RCSCALE
-// PM_WRITE_REG_MASK HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_DC_R,\
-// (2<<BP_POWER_LOOPCTRL_DC_R)
-
- // half fets
- PM_BITS_SET HW_POWER_MINPWR_ADDR, BM_POWER_MINPWR_HALF_FETS
-
- PM_BITS_CLR HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_CM_HYST_THRESH
- PM_BITS_CLR HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_EN_CM_HYST
- PM_BITS_CLR HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_EN_DF_HYST
-
- // enable PFM
- PM_BITS_SET HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_HYST_SIGN
- PM_BITS_SET HW_POWER_MINPWR_ADDR, BM_POWER_MINPWR_EN_DC_PFM
-
-
- //Gated PLL0
- PM_BITS_CLR HW_CLKCTRL_PLL0CTRL0_ADDR, BM_CLKCTRL_PLL0CTRL0_POWER
@ do enter standby
mov r0, #(HW_CLKCTRL_CPU_ADDR & 0x000000FF)
@@ -243,39 +89,6 @@ ENTRY(mx28_cpu_standby)
nop
nop
- PM_BITS_SET HW_CLKCTRL_PLL0CTRL0_ADDR, BM_CLKCTRL_PLL0CTRL0_POWER
-
- PM_SET_RESTORE_REG HW_POWER_MINPWR_ADDR, POWER_MINPWR_BACKUP
-
- PM_SET_RESTORE_REG HW_POWER_LOOPCTRL_ADDR, POWER_LOOPCTRL_BACKUP
-
- // vddio
- PM_SET_RESTORE_REG HW_POWER_VDDIOCTRL_ADDR, VDDIOCTRL_BACKUP
- mov r0, #24 << 10
-10: sub r0, r0, #1
- cmp r0, #0
- bne 10b
- PM_SET_RESTORE_REG HW_POWER_VDDACTRL_ADDR, VDDACTRL_BACKUP
- mov r0, #24 << 10
-20: sub r0, r0, #1
- cmp r0, #0
- bne 20b
- PM_SET_RESTORE_REG HW_POWER_VDDDCTRL_ADDR, VDDDCTRL_BACKUP
- mov r0, #24 << 10
-30: sub r0, r0, #1
- cmp r0, #0
- bne 30b
-
- @ ungate clk
- mov r0, #(HW_CLKCTRL_EMI_ADDR & 0x000000FF)
- orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x0000FF00)
- orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x00FF0000)
- orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0xFF000000)
- ldr r1, [r0]
- bic r1, r1, #(BM_CLKCTRL_EMI_CLKGATE)
- str r1, [r0]
-
-// PM_SET_RESTORE_REG HW_PINCTRL_EMI_DS_CTRL_ADDR, 4
@ restore normal DRAM mode
mov r0, #(HW_DRAM_CTL17_ADDR & 0x000000FF)
orr r0, r0, #(HW_DRAM_CTL17_ADDR & 0x0000FF00)
@@ -285,10 +98,6 @@ ENTRY(mx28_cpu_standby)
bic r1, r1, #BM_DRAM_CTL17_SREFRESH
str r1, [r0]
@ wait for it to actually happen
- mov r0, #24 << 5
-12: sub r0, r0, #1
- cmp r0, #0
- bne 12b
nop
nop
@@ -299,7 +108,7 @@ ENTRY(mx28_cpu_standby)
.space 0x100
__mx28_temp_stack:
- .space 128
+ .word 0
#ifdef CONFIG_STMP378X_RAM_FREQ_SCALING
#include "emi.inc"
diff --git a/arch/arm/mach-mx28/usb_dr.c b/arch/arm/mach-mx28/usb_dr.c
index 50a2f8b381af..13344ef0e26f 100644
--- a/arch/arm/mach-mx28/usb_dr.c
+++ b/arch/arm/mach-mx28/usb_dr.c
@@ -63,7 +63,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = {
};
/*
- * OTG resources
+ * resources
*/
static struct resource otg_resources[] = {
[0] = {
@@ -78,22 +78,6 @@ static struct resource otg_resources[] = {
},
};
-/*
- * UDC resources (same as OTG resource)
- */
-static struct resource udc_resources[] = {
- [0] = {
- .start = (u32)USBCTRL0_PHYS_ADDR,
- .end = (u32)(USBCTRL0_PHYS_ADDR + 0x1ff),
- .flags = IORESOURCE_MEM,
- },
-
- [1] = {
- .start = IRQ_USB0,
- .flags = IORESOURCE_IRQ,
- },
-};
-
static u64 dr_udc_dmamask = ~(u32) 0;
static void dr_udc_release(struct device *dev)
{
@@ -127,8 +111,8 @@ static struct platform_device __maybe_unused dr_otg_device = {
.dma_mask = &dr_otg_dmamask,
.coherent_dma_mask = 0xffffffff,
},
- .resource = udc_resources,
- .num_resources = ARRAY_SIZE(udc_resources),
+ .resource = otg_resources,
+ .num_resources = ARRAY_SIZE(otg_resources),
};
@@ -172,5 +156,5 @@ void fsl_phy_set_power(struct fsl_xcvr_ops *this,
#ifdef CONFIG_MXS_VBUS_CURRENT_DRAW
fs_initcall(usb_dr_init);
#else
- subsys_initcall(usb_dr_init);
+ module_init(usb_dr_init);
#endif
diff --git a/arch/arm/mach-mx3/devices.c b/arch/arm/mach-mx3/devices.c
index c7d9560f0850..2861ecf81235 100644
--- a/arch/arm/mach-mx3/devices.c
+++ b/arch/arm/mach-mx3/devices.c
@@ -891,22 +891,6 @@ static inline void mxc_init_iim(void)
}
#endif
-static struct platform_device mxc_v4l2_device = {
- .name = "mxc_v4l2_capture",
- .id = 0,
-};
-
-static struct platform_device mxc_v4l2out_device = {
- .name = "mxc_v4l2_output",
- .id = 0,
-};
-
-static inline void mxc_init_v4l2()
-{
- platform_device_register(&mxc_v4l2_device);
- platform_device_register(&mxc_v4l2out_device);
-}
-
int __init mxc_init_devices(void)
{
mxc_init_wdt();
@@ -926,7 +910,6 @@ int __init mxc_init_devices(void)
mxc_init_vpu();
mxc_init_rnga();
mxc_init_iim();
- mxc_init_v4l2();
return 0;
}
diff --git a/arch/arm/mach-mx3/usb_dr.c b/arch/arm/mach-mx3/usb_dr.c
index d84fea7f1a80..7331463173e9 100644
--- a/arch/arm/mach-mx3/usb_dr.c
+++ b/arch/arm/mach-mx3/usb_dr.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -59,7 +59,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_1504_config = {
/*
- * OTG resources
+ * resources
*/
static struct resource otg_resources[] = {
[0] = {
@@ -73,20 +73,6 @@ static struct resource otg_resources[] = {
},
};
-/*
- * UDC resources (same as OTG resource)
- */
-static struct resource udc_resources[] = {
- [0] = {
- .start = (u32)(USB_OTGREGS_BASE),
- .end = (u32)(USB_OTGREGS_BASE + 0x1ff),
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = MXC_INT_USB3,
- .flags = IORESOURCE_IRQ,
- },
-};
static u64 dr_udc_dmamask = ~(u32) 0;
static void dr_udc_release(struct device *dev)
@@ -110,8 +96,8 @@ static struct platform_device __maybe_unused dr_udc_device = {
.dma_mask = &dr_udc_dmamask,
.coherent_dma_mask = 0xffffffff,
},
- .resource = udc_resources,
- .num_resources = ARRAY_SIZE(udc_resources),
+ .resource = otg_resources,
+ .num_resources = ARRAY_SIZE(otg_resources),
};
static struct platform_device __maybe_unused dr_otg_device = {
diff --git a/arch/arm/mach-mx35/devices.c b/arch/arm/mach-mx35/devices.c
index 02c971659bd4..9d030e1ecfeb 100644
--- a/arch/arm/mach-mx35/devices.c
+++ b/arch/arm/mach-mx35/devices.c
@@ -902,22 +902,6 @@ static inline void mxc_init_ssi(void)
}
#endif /* CONFIG_SND_MXC_SOC_SSI */
-static struct platform_device mxc_v4l2_device = {
- .name = "mxc_v4l2_capture",
- .id = 0,
-};
-
-static struct platform_device mxc_v4l2out_device = {
- .name = "mxc_v4l2_output",
- .id = 0,
-};
-
-static inline void mxc_init_v4l2()
-{
- platform_device_register(&mxc_v4l2_device);
- platform_device_register(&mxc_v4l2out_device);
-}
-
int __init mxc_init_devices(void)
{
mxc_init_wdt();
@@ -937,7 +921,6 @@ int __init mxc_init_devices(void)
mxc_init_gpu();
mxc_init_ssi();
mxc_init_esai();
- mxc_init_v4l2();
return 0;
}
diff --git a/arch/arm/mach-mx35/mx35_3stack.c b/arch/arm/mach-mx35/mx35_3stack.c
index 868cf12ca2e6..35d639b5a534 100644
--- a/arch/arm/mach-mx35/mx35_3stack.c
+++ b/arch/arm/mach-mx35/mx35_3stack.c
@@ -605,13 +605,6 @@ static struct mxc_mmc_platform_data mmc1_data = {
#endif
.min_clk = 150000,
.max_clk = 52000000,
- /* Do not disable the eSDHC clk on MX35 3DS board,
- * since SYSTEM can't boot up after the reset key
- * is pressed when the SD/MMC boot mode is used.
- * The root cause is that the ROM code don't ensure
- * the SD/MMC clk is running when boot system.
- * */
- .clk_always_on = 1,
.card_inserted_state = 0,
.status = sdhc_get_card_det_status,
.wp_status = sdhc_write_protect,
@@ -658,7 +651,6 @@ static struct mxc_mmc_platform_data mmc2_data = {
.caps = MMC_CAP_4_BIT_DATA,
.min_clk = 150000,
.max_clk = 50000000,
- .clk_always_on = 1,
.card_inserted_state = 0,
.status = sdhc_get_card_det_status,
.wp_status = sdhc_write_protect,
diff --git a/arch/arm/mach-mx35/usb_dr.c b/arch/arm/mach-mx35/usb_dr.c
index 4ebb27c5342b..18f76b90907a 100644
--- a/arch/arm/mach-mx35/usb_dr.c
+++ b/arch/arm/mach-mx35/usb_dr.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -37,7 +37,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = {
/*
- * OTG resources
+ * resources
*/
static struct resource otg_resources[] = {
[0] = {
@@ -51,20 +51,6 @@ static struct resource otg_resources[] = {
},
};
-/*
- * UDC resources (same as OTG resource)
- */
-static struct resource udc_resources[] = {
- [0] = {
- .start = (u32)(USB_OTGREGS_BASE),
- .end = (u32)(USB_OTGREGS_BASE + 0x1ff),
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = MXC_INT_USBOTG,
- .flags = IORESOURCE_IRQ,
- },
-};
static u64 dr_udc_dmamask = ~(u32) 0;
static void dr_udc_release(struct device *dev)
@@ -88,8 +74,8 @@ static struct platform_device __maybe_unused dr_udc_device = {
.dma_mask = &dr_udc_dmamask,
.coherent_dma_mask = 0xffffffff,
},
- .resource = udc_resources,
- .num_resources = ARRAY_SIZE(udc_resources),
+ .resource = otg_resources,
+ .num_resources = ARRAY_SIZE(otg_resources),
};
static struct platform_device __maybe_unused dr_otg_device = {
diff --git a/arch/arm/mach-mx37/cpu.c b/arch/arm/mach-mx37/cpu.c
index 3832473f781e..3729ac11ca80 100644
--- a/arch/arm/mach-mx37/cpu.c
+++ b/arch/arm/mach-mx37/cpu.c
@@ -25,7 +25,6 @@
#include <asm/hardware/cache-l2x0.h>
void __iomem *gpc_base;
-void __iomem *ccm_base;
/*!
* CPU initialization. It is called by fixup_mxc_board()
@@ -74,7 +73,6 @@ static int __init post_cpu_init(void)
iram_init(IRAM_BASE_ADDR, iram_size);
gpc_base = ioremap(GPC_BASE_ADDR, SZ_4K);
- ccm_base = ioremap(CCM_BASE_ADDR, SZ_4K);
/* Set ALP bits to 000. Set ALP_EN bit in Arm Memory Controller reg. */
reg = __raw_readl(MXC_ARM1176_BASE + 0x1C);
diff --git a/arch/arm/mach-mx37/crm_regs.h b/arch/arm/mach-mx37/crm_regs.h
index bfb9bff13d46..607e7cfd5bdf 100644
--- a/arch/arm/mach-mx37/crm_regs.h
+++ b/arch/arm/mach-mx37/crm_regs.h
@@ -502,11 +502,6 @@
#define MXC_CCM_CCGR5_CG1_OFFSET 2
#define MXC_CCM_CCGR5_CG0_OFFSET 0
-/* CCM Register Offsets. */
-#define MXC_CCM_CDCR_OFFSET 0x6C
-#define MXC_CCM_CACRR_OFFSET 0x10
-#define MXC_CCM_CDHIPR_OFFSET 0x68
-
#define MXC_ARM1176_BASE IO_ADDRESS(ARM1176_BASE_ADDR)
#define MXC_GPC_BASE IO_ADDRESS(GPC_BASE_ADDR)
#define MXC_DPTC_LP_BASE IO_ADDRESS(GPC_BASE_ADDR + 0x80)
@@ -535,11 +530,6 @@
#define MXC_GPC_PGR (MXC_GPC_BASE + 0x4)
#define MXC_GPC_VCR (MXC_GPC_BASE + 0x8)
-/*GPC OFFSETS */
-#define MXC_GPC_CNTR_OFFSET 0x0
-#define MXC_GPC_PGR_OFFSET 0x4
-#define MXC_GPC_VCR_OFFSET 0x8
-
/* DVFS CORE */
#define MXC_DVFSTHRS (MXC_DVFS_CORE_BASE + 0x00)
#define MXC_DVFSCOUN (MXC_DVFS_CORE_BASE + 0x04)
diff --git a/arch/arm/mach-mx37/devices.c b/arch/arm/mach-mx37/devices.c
index ce1f33112396..fd4011b36c31 100644
--- a/arch/arm/mach-mx37/devices.c
+++ b/arch/arm/mach-mx37/devices.c
@@ -661,11 +661,11 @@ struct mxc_dvfs_platform_data dvfs_core_data = {
.reg_id = "SW1",
.clk1_id = "cpu_clk",
.clk2_id = "gpc_dvfs_clk",
- .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET,
- .gpc_vcr_offset = MXC_GPC_VCR_OFFSET,
- .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET,
- .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET,
- .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET,
+ .gpc_cntr_reg_addr = MXC_GPC_CNTR,
+ .gpc_vcr_reg_addr = MXC_GPC_VCR,
+ .ccm_cdcr_reg_addr = MXC_CCM_CDCR,
+ .ccm_cacrr_reg_addr = MXC_CCM_CACRR,
+ .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR,
.prediv_mask = 0x3800,
.prediv_offset = 11,
.prediv_val = 1,
@@ -1168,22 +1168,6 @@ static inline void mxc_init_ssi(void)
}
#endif /* CONFIG_SND_MXC_SOC_SSI */
-static struct platform_device mxc_v4l2_device = {
- .name = "mxc_v4l2_capture",
- .id = 0,
-};
-
-static struct platform_device mxc_v4l2out_device = {
- .name = "mxc_v4l2_output",
- .id = 0,
-};
-
-static inline void mxc_init_v4l2()
-{
- platform_device_register(&mxc_v4l2_device);
- platform_device_register(&mxc_v4l2out_device);
-}
-
int __init mxc_init_devices(void)
{
mxc_init_wdt();
@@ -1205,7 +1189,6 @@ int __init mxc_init_devices(void)
mxc_init_rngc();
mxc_init_iim();
mxc_init_ssi();
- mxc_init_v4l2();
return 0;
}
diff --git a/arch/arm/mach-mx37/usb_dr.c b/arch/arm/mach-mx37/usb_dr.c
index eb7fc463526c..c8cbed1cc2d4 100644
--- a/arch/arm/mach-mx37/usb_dr.c
+++ b/arch/arm/mach-mx37/usb_dr.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -43,7 +43,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = {
/*
- * OTG resources
+ * resources
*/
static struct resource otg_resources[] = {
[0] = {
@@ -57,20 +57,7 @@ static struct resource otg_resources[] = {
},
};
-/*
- * UDC resources (same as OTG resource)
- */
-static struct resource udc_resources[] = {
- [0] = {
- .start = (u32)(OTG_BASE_ADDR),
- .end = (u32)(OTG_BASE_ADDR + 0x620),
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = MXC_INT_USB_OTG,
- .flags = IORESOURCE_IRQ,
- },
-};
+
static u64 dr_udc_dmamask = ~(u32) 0;
static void dr_udc_release(struct device *dev)
{
@@ -88,8 +75,8 @@ static struct platform_device dr_udc_device = {
.dma_mask = &dr_udc_dmamask,
.coherent_dma_mask = 0xffffffff,
},
- .resource = udc_resources,
- .num_resources = ARRAY_SIZE(udc_resources),
+ .resource = otg_resources,
+ .num_resources = ARRAY_SIZE(otg_resources),
};
static u64 dr_otg_dmamask = ~(u32) 0;
diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig
index 7152e3c0f34f..c45880ff8521 100644
--- a/arch/arm/mach-mx5/Kconfig
+++ b/arch/arm/mach-mx5/Kconfig
@@ -2,14 +2,12 @@ if ARCH_MX5
config ARCH_MX51
bool "MX51"
- select ARCH_MXC_IOMUX_V3
config ARCH_MX53
bool "MX53"
config ARCH_MX50
bool
- select ARCH_HAS_RNGC
config FORCE_MAX_ZONEORDER
int "MAX_ORDER"
@@ -63,14 +61,6 @@ config MODULE_CCXMX51
config LATE_CPU_CLK_ENABLE
bool
-config MACH_MX50_RDP
- bool "Support MX50 Reference Design Platform"
- select ARCH_MX50
- help
- Include support for MX50 RDP platform. This includes specific
- configurations for the board and its peripherals.
-
-
config MACH_CCWMX51JS
bool "Support for the ConnectCore Wi-i.MX51 module, on the JSK base board"
select MODULE_CCXMX51
diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile
index 90baa14638fe..34d8ae473789 100644
--- a/arch/arm/mach-mx5/Makefile
+++ b/arch/arm/mach-mx5/Makefile
@@ -5,20 +5,16 @@
# Object file lists.
obj-y := system.o iomux.o cpu.o mm.o devices.o serial.o dma.o lpmodes.o pm.o \
-sdram_autogating.o bus_freq.o usb_dr.o usb_h1.o usb_h2.o dummy_gpio.o early_setup.o
+sdram_autogating.o bus_freq.o usb_dr.o usb_h1.o usb_h2.o dummy_gpio.o wfi.o suspend.o early_setup.o
--obj-$(CONFIG_ARCH_MX51) += clock.o
--obj-$(CONFIG_ARCH_MX53) += clock.o
--obj-$(CONFIG_ARCH_MX50) += clock_mx50.o
-obj-$(CONFIG_ARCH_MX51) += clock.o suspend.o
-obj-$(CONFIG_ARCH_MX53) += clock.o suspend.o
-obj-$(CONFIG_ARCH_MX50) += clock_mx50.o dmaengine.o dma-apbh.o mx50_suspend.o mx50_ddr_freq.o mx50_wfi.o
+obj-$(CONFIG_ARCH_MX51) += clock.o
+obj-$(CONFIG_ARCH_MX53) += clock.o
+obj-$(CONFIG_ARCH_MX50) += clock_mx50.o
obj-$(CONFIG_MACH_MX51_3DS) += mx51_3stack.o mx51_3stack_gpio.o mx51_3stack_pmic_mc13892.o
-obj-$(CONFIG_MACH_MX51_BABBAGE) += mx51_babbage.o mx51_babbage_pmic_mc13892.o
-obj-$(CONFIG_MACH_MX53_EVK) += mx53_evk.o mx53_evk_pmic_mc13892.o
-obj-$(CONFIG_MACH_MX50_ARM2) += mx50_arm2.o mx50_arm2_pmic_mc13892.o
+obj-$(CONFIG_MACH_MX51_BABBAGE) += mx51_babbage.o mx51_babbage_gpio.o mx51_babbage_pmic_mc13892.o
+obj-$(CONFIG_MACH_MX53_EVK) += mx53_evk.o mx53_evk_gpio.o mx53_evk_pmic_mc13892.o
+obj-$(CONFIG_MACH_MX50_ARM2) += mx50_arm2.o mx50_arm2_gpio.o mx50_arm2_pmic_mc13892.o
obj-$(CONFIG_MACH_CCWMX51JS) += devices_ccwmx51.o mx51_ccwmx51js.o mx51_ccwmx51js_gpio.o
obj-$(CONFIG_MACH_CCMX51JS) += devices_ccwmx51.o mx51_ccwmx51js.o mx51_ccwmx51js_gpio.o
obj-$(CONFIG_MXC_PMIC_MC13892) += mx51_ccwmx51js_pmic_mc13892.o
-obj-$(CONFIG_MACH_MX50_RDP) += mx50_rdp.o mx50_rdp_pmic_mc13892.o
diff --git a/arch/arm/mach-mx5/bus_freq.c b/arch/arm/mach-mx5/bus_freq.c
index ec2addfd977b..4fcaf95e3019 100644
--- a/arch/arm/mach-mx5/bus_freq.c
+++ b/arch/arm/mach-mx5/bus_freq.c
@@ -27,19 +27,12 @@
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/regulator/consumer.h>
-#include <linux/iram_alloc.h>
-#include <linux/mutex.h>
#include <mach/hardware.h>
#include <mach/clock.h>
#include <mach/mxc_dvfs.h>
#include <mach/sdram_autogating.h>
-#include <asm/mach/map.h>
-#include <asm/cacheflush.h>
-#include <asm/tlb.h>
#include "crm_regs.h"
-#define LP_LOW_VOLTAGE 1050000
-#define LP_NORMAL_VOLTAGE 1250000
#define LP_APM_CLK 24000000
#define NAND_LP_APM_CLK 12000000
#define AXI_A_NORMAL_CLK 166250000
@@ -48,9 +41,6 @@
#define AHB_CLK_NORMAL_DIV AXI_B_CLK_NORMAL_DIV
#define EMI_SLOW_CLK_NORMAL_DIV AXI_B_CLK_NORMAL_DIV
#define NFC_CLK_NORMAL_DIV 4
-#define SPIN_DELAY 1000000 /* in nanoseconds */
-
-DEFINE_SPINLOCK(ddr_freq_lock);
static unsigned long lp_normal_rate;
static unsigned long lp_med_rate;
@@ -59,24 +49,25 @@ static unsigned long ddr_low_rate;
static struct clk *ddr_clk;
static struct clk *pll1_sw_clk;
-static struct clk *pll1;
static struct clk *pll2;
static struct clk *pll3;
-static struct clk *pll4;
static struct clk *main_bus_clk;
static struct clk *axi_a_clk;
static struct clk *axi_b_clk;
static struct clk *cpu_clk;
static struct clk *ddr_hf_clk;
+static struct clk *nfc_clk;
static struct clk *ahb_clk;
+static struct clk *vpu_clk;
+static struct clk *vpu_core_clk;
+static struct clk *emi_slow_clk;
static struct clk *ddr_clk;
+static struct clk *ipu_clk;
static struct clk *periph_apm_clk;
static struct clk *lp_apm;
static struct clk *osc;
static struct clk *gpc_dvfs_clk;
static struct clk *emi_garb_clk;
-static void __iomem *pll1_base;
-static void __iomem *pll4_base;
struct regulator *lp_regulator;
int low_bus_freq_mode;
@@ -88,7 +79,6 @@ char *lp_reg_id = "SW2";
static struct cpu_wp *cpu_wp_tbl;
static struct device *busfreq_dev;
static int busfreq_suspended;
-static int cpu_podf;
/* True if bus_frequency is scaled not using DVFS-PER */
int bus_freq_scaling_is_active;
@@ -96,20 +86,8 @@ int cpu_wp_nr;
int lp_high_freq;
int lp_med_freq;
-void enter_lpapm_mode_mx50(void);
-void enter_lpapm_mode_mx51(void);
-void exit_lpapm_mode_mx50(void);
-void exit_lpapm_mode_mx51(void);
-void *ddr_freq_change_iram_base;
-void (*change_ddr_freq)(void *ccm_addr, void *databahn_addr, u32 freq) = NULL;
-
-extern void mx50_ddr_freq_change(u32 ccm_base,
- u32 databahn_addr, u32 freq);
extern int dvfs_core_is_active;
extern struct cpu_wp *(*get_cpu_wp)(int *wp);
-extern void propagate_rate(struct clk *tclk);
-extern void __iomem *ccm_base;
-extern void __iomem *databahn_base;
struct dvfs_wp dvfs_core_setpoint[] = {
{33, 8, 33, 10, 10, 0x08},
@@ -120,198 +98,75 @@ struct dvfs_wp dvfs_core_setpoint[] = {
int set_low_bus_freq(void)
{
u32 reg;
- struct timespec nstimeofday;
- struct timespec curtime;
if (busfreq_suspended)
return 0;
if (bus_freq_scaling_initialized) {
/* can not enter low bus freq, when cpu is in highest freq */
- if (clk_get_rate(cpu_clk) !=
- cpu_wp_tbl[cpu_wp_nr - 1].cpu_rate) {
+ if (clk_get_rate(cpu_clk) != cpu_wp_tbl[cpu_wp_nr - 1].cpu_rate)
+ return 0;
+
+ /* currently not support on mx53 */
+ if (cpu_is_mx53())
return 0;
- }
stop_dvfs_per();
stop_sdram_autogating();
+ /*Change the DDR freq to 133Mhz. */
+ clk_set_rate(ddr_hf_clk,
+ clk_round_rate(ddr_hf_clk, ddr_low_rate));
+
/* Set PLL3 to 133Mhz if no-one is using it. */
- if ((clk_get_usecount(pll3) == 0) && !cpu_is_mx53()) {
+ if (clk_get_usecount(pll3) == 0) {
u32 pll3_rate = clk_get_rate(pll3);
clk_enable(pll3);
clk_set_rate(pll3, clk_round_rate(pll3, 133000000));
- if (cpu_is_mx50())
- enter_lpapm_mode_mx50();
- else
- enter_lpapm_mode_mx51();
-
- /* Set PLL3 back to original rate. */
- clk_set_rate(pll3, clk_round_rate(pll3, pll3_rate));
- clk_disable(pll3);
-
- } else if (cpu_is_mx53()) {
- /*Change the DDR freq to 133Mhz. */
- clk_set_rate(ddr_hf_clk,
- clk_round_rate(ddr_hf_clk, ddr_low_rate));
-
- /* move cpu clk to pll2, 400 / 3 = 133Mhz for cpu */
- clk_set_parent(pll1_sw_clk, pll2);
-
- cpu_podf = __raw_readl(MXC_CCM_CACRR);
- reg = __raw_readl(MXC_CCM_CDHIPR);
- if ((reg & MXC_CCM_CDHIPR_ARM_PODF_BUSY) == 0)
- __raw_writel(0x2, MXC_CCM_CACRR);
- else
- printk(KERN_DEBUG "ARM_PODF still in busy!!!!\n");
-
- /* ahb = 400/8, axi_b = 400/8, axi_a = 133*/
+ /* Set the parent of Periph_apm_clk to be PLL3 */
+ clk_set_parent(periph_apm_clk, pll3);
+ clk_set_parent(main_bus_clk, periph_apm_clk);
+
+ /* Set the AHB dividers to be 1. */
+ /* Set the dividers to be 1, so the clock rates
+ * are at 133MHz.
+ */
reg = __raw_readl(MXC_CCM_CBCDR);
reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK
- | MXC_CCM_CBCDR_AXI_B_PODF_MASK
- | MXC_CCM_CBCDR_AHB_PODF_MASK);
- reg |= (2 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET
- | 7 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET
- | 7 << MXC_CCM_CBCDR_AHB_PODF_OFFSET);
+ | MXC_CCM_CBCDR_AXI_B_PODF_MASK
+ | MXC_CCM_CBCDR_AHB_PODF_MASK
+ | MXC_CCM_CBCDR_EMI_PODF_MASK
+ | MXC_CCM_CBCDR_NFC_PODF_OFFSET);
+ reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET
+ | 0 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET
+ | 0 << MXC_CCM_CBCDR_AHB_PODF_OFFSET
+ | 0 << MXC_CCM_CBCDR_EMI_PODF_OFFSET
+ | 3 << MXC_CCM_CBCDR_NFC_PODF_OFFSET);
__raw_writel(reg, MXC_CCM_CBCDR);
- getnstimeofday(&nstimeofday);
- while (__raw_readl(MXC_CCM_CDHIPR) &
- (MXC_CCM_CDHIPR_AXI_A_PODF_BUSY |
- MXC_CCM_CDHIPR_AXI_B_PODF_BUSY |
- MXC_CCM_CDHIPR_AHB_PODF_BUSY)) {
- getnstimeofday(&curtime);
- if (curtime.tv_nsec - nstimeofday.tv_nsec
- > SPIN_DELAY)
- panic("low bus freq set rate error\n");
- }
+ clk_enable(emi_garb_clk);
+ while (__raw_readl(MXC_CCM_CDHIPR) & 0x1F)
+ udelay(10);
+ clk_disable(emi_garb_clk);
- /* keep this infront of propagating */
- low_bus_freq_mode = 1;
- high_bus_freq_mode = 0;
+ /* Set the source of Periph_APM_Clock to be lp-apm. */
+ clk_set_parent(periph_apm_clk, lp_apm);
- propagate_rate(main_bus_clk);
- propagate_rate(pll1_sw_clk);
+ /* Set PLL3 back to original rate. */
+ clk_set_rate(pll3, clk_round_rate(pll3, pll3_rate));
+ clk_disable(pll3);
- if (clk_get_usecount(pll1) == 0) {
- reg = __raw_readl(pll1_base + MXC_PLL_DP_CTL);
- reg &= ~MXC_PLL_DP_CTL_UPEN;
- __raw_writel(reg, pll1_base + MXC_PLL_DP_CTL);
- }
- if (clk_get_usecount(pll4) == 0) {
- reg = __raw_readl(pll4_base + MXC_PLL_DP_CTL);
- reg &= ~MXC_PLL_DP_CTL_UPEN;
- __raw_writel(reg, pll4_base + MXC_PLL_DP_CTL);
- }
+ low_bus_freq_mode = 1;
+ high_bus_freq_mode = 0;
}
}
return 0;
}
-void enter_lpapm_mode_mx50()
-{
- u32 reg;
- unsigned long flags;
-
- spin_lock_irqsave(&ddr_freq_lock, flags);
-
- /* Set the parent of main_bus_clk to be PLL3 */
- clk_set_parent(main_bus_clk, pll3);
-
- /* Set the AHB dividers to be 1. */
- /* Set the dividers to be 1, so the clock rates
- * are at 133MHz.
- */
- reg = __raw_readl(MXC_CCM_CBCDR);
- reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK
- | MXC_CCM_CBCDR_AXI_B_PODF_MASK
- | MXC_CCM_CBCDR_AHB_PODF_MASK
- | MX50_CCM_CBCDR_WEIM_PODF_MASK);
- reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET
- | 0 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET
- | 0 << MXC_CCM_CBCDR_AHB_PODF_OFFSET
- | 0 << MX50_CCM_CBCDR_WEIM_PODF_OFFSET);
- __raw_writel(reg, MXC_CCM_CBCDR);
- while (__raw_readl(MXC_CCM_CDHIPR) & 0x0F)
- udelay(10);
- low_bus_freq_mode = 1;
- high_bus_freq_mode = 0;
-
- /* Set the source of main_bus_clk to be lp-apm. */
- clk_set_parent(main_bus_clk, lp_apm);
-
- /* Set SYS_CLK to 24MHz. sourced from XTAL*/
- /* Turn on the XTAL_CLK_GATE. */
- reg = __raw_readl(MXC_CCM_CLK_SYS);
- reg |= 3 << MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_OFFSET;
- __raw_writel(reg, MXC_CCM_CLK_SYS);
-
- /* Set the divider. */
- reg = __raw_readl(MXC_CCM_CLK_SYS);
- reg &= ~MXC_CCM_CLK_SYS_DIV_XTAL_MASK;
- reg |= 1 << MXC_CCM_CLK_SYS_DIV_XTAL_OFFSET;
- __raw_writel(reg, MXC_CCM_CLK_SYS);
- while (__raw_readl(MXC_CCM_CSR2) & 0x1)
- udelay(10);
-
- /* Set the source to be XTAL. */
- reg = __raw_readl(MXC_CCM_CLKSEQ_BYPASS);
- reg &= ~0x1;
- __raw_writel(reg, MXC_CCM_CLKSEQ_BYPASS);
- while (!(__raw_readl(MXC_CCM_CSR2) & 0x400))
- udelay(10);
-
- /* Turn OFF the PLL_CLK_GATE. */
- reg = __raw_readl(MXC_CCM_CLK_SYS);
- reg &= ~MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_CLK_SYS);
- spin_unlock_irqrestore(&ddr_freq_lock, flags);
-
-}
-
-void enter_lpapm_mode_mx51()
-{
- u32 reg;
-
- /*Change the DDR freq to 133Mhz. */
- clk_set_rate(ddr_hf_clk,
- clk_round_rate(ddr_hf_clk, ddr_low_rate));
-
- /* Set the parent of Periph_apm_clk to be PLL3 */
- clk_set_parent(periph_apm_clk, pll3);
- clk_set_parent(main_bus_clk, periph_apm_clk);
-
- /* Set the dividers to be 1, so the clock rates
- * are at 133MHz.
- */
- reg = __raw_readl(MXC_CCM_CBCDR);
- reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK
- | MXC_CCM_CBCDR_AXI_B_PODF_MASK
- | MXC_CCM_CBCDR_AHB_PODF_MASK
- | MXC_CCM_CBCDR_EMI_PODF_MASK
- | MXC_CCM_CBCDR_NFC_PODF_OFFSET);
- reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET
- | 0 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET
- | 0 << MXC_CCM_CBCDR_AHB_PODF_OFFSET
- | 0 << MXC_CCM_CBCDR_EMI_PODF_OFFSET
- | 3 << MXC_CCM_CBCDR_NFC_PODF_OFFSET);
- __raw_writel(reg, MXC_CCM_CBCDR);
-
- clk_enable(emi_garb_clk);
- while (__raw_readl(MXC_CCM_CDHIPR) & 0x1F)
- udelay(10);
- clk_disable(emi_garb_clk);
-
- /* Set the source of Periph_APM_Clock to be lp-apm. */
- clk_set_parent(periph_apm_clk, lp_apm);
-}
-
int set_high_bus_freq(int high_bus_freq)
{
u32 reg;
- struct timespec nstimeofday;
- struct timespec curtime;
if (bus_freq_scaling_initialized) {
@@ -319,65 +174,48 @@ int set_high_bus_freq(int high_bus_freq)
if (low_bus_freq_mode) {
/* Relock PLL3 to 133MHz */
- if ((clk_get_usecount(pll3) == 0) && !cpu_is_mx53()) {
+ if (clk_get_usecount(pll3) == 0) {
u32 pll3_rate = clk_get_rate(pll3);
clk_enable(pll3);
clk_set_rate(pll3,
clk_round_rate(pll3, 133000000));
- if (cpu_is_mx50())
- exit_lpapm_mode_mx50();
- else
- exit_lpapm_mode_mx51();
-
- /* Relock PLL3 to its original rate */
- clk_set_rate(pll3,
- clk_round_rate(pll3, pll3_rate));
- clk_disable(pll3);
- } else if (cpu_is_mx53()) {
- /* move cpu clk to pll1 */
- reg = __raw_readl(MXC_CCM_CDHIPR);
- if ((reg & MXC_CCM_CDHIPR_ARM_PODF_BUSY) == 0)
- __raw_writel(cpu_podf & 0x7,
- MXC_CCM_CACRR);
- else
- printk(KERN_DEBUG
- "ARM_PODF still in busy!!!!\n");
-
- clk_set_parent(pll1_sw_clk, pll1);
-
- /* ahb = 400/3, axi_b = 400/3, axi_a = 400*/
+ clk_set_parent(periph_apm_clk, pll3);
+ /* Set the dividers to the default dividers */
reg = __raw_readl(MXC_CCM_CBCDR);
reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK
| MXC_CCM_CBCDR_AXI_B_PODF_MASK
- | MXC_CCM_CBCDR_AHB_PODF_MASK);
- reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET
- | 2 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET
- | 2 << MXC_CCM_CBCDR_AHB_PODF_OFFSET);
+ | MXC_CCM_CBCDR_AHB_PODF_MASK
+ | MXC_CCM_CBCDR_EMI_PODF_MASK
+ | MXC_CCM_CBCDR_NFC_PODF_OFFSET);
+ reg |= (3 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET
+ | 4 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET
+ | 4 << MXC_CCM_CBCDR_AHB_PODF_OFFSET
+ | 4 << MXC_CCM_CBCDR_EMI_PODF_OFFSET
+ | 3 << MXC_CCM_CBCDR_NFC_PODF_OFFSET);
__raw_writel(reg, MXC_CCM_CBCDR);
- getnstimeofday(&nstimeofday);
- while (__raw_readl(MXC_CCM_CDHIPR) &
- (MXC_CCM_CDHIPR_AXI_A_PODF_BUSY |
- MXC_CCM_CDHIPR_AXI_B_PODF_BUSY |
- MXC_CCM_CDHIPR_AHB_PODF_BUSY)) {
- getnstimeofday(&curtime);
- if (curtime.tv_nsec
- - nstimeofday.tv_nsec
- > SPIN_DELAY)
- panic("bus freq error\n");
- }
-
- /* keep this infront of propagating */
- low_bus_freq_mode = 1;
- high_bus_freq_mode = 0;
+ clk_enable(emi_garb_clk);
+ while (__raw_readl(MXC_CCM_CDHIPR) & 0x1F)
+ udelay(10);
- propagate_rate(main_bus_clk);
- propagate_rate(pll1_sw_clk);
- /*Change the DDR freq to mormal_rate*/
- clk_set_rate(ddr_hf_clk,
- clk_round_rate(ddr_hf_clk, ddr_normal_rate));
+ low_bus_freq_mode = 0;
+ high_bus_freq_mode = 1;
+ clk_disable(emi_garb_clk);
+
+ /*Set the main_bus_clk parent to be PLL2. */
+ clk_set_parent(main_bus_clk, pll2);
+
+ /* Relock PLL3 to its original rate */
+ clk_set_rate(pll3,
+ clk_round_rate(pll3, pll3_rate));
+ clk_disable(pll3);
}
+
+ /*Change the DDR freq to 200MHz*/
+ clk_set_rate(ddr_hf_clk,
+ clk_round_rate(ddr_hf_clk, ddr_normal_rate));
+
start_dvfs_per();
}
if (bus_freq_scaling_is_active) {
@@ -418,105 +256,11 @@ int set_high_bus_freq(int high_bus_freq)
return 0;
}
-void exit_lpapm_mode_mx50()
-{
- u32 reg;
- unsigned long flags;
-
- spin_lock_irqsave(&ddr_freq_lock, flags);
-
- /* Set SYS_CLK to source from PLL1 */
- /* Set sys_clk back to 200MHz. */
- /* Set the divider to 4. */
- reg = __raw_readl(MXC_CCM_CLK_SYS);
- reg &= ~MXC_CCM_CLK_SYS_DIV_PLL_MASK;
- reg |= 0x4 << MXC_CCM_CLK_SYS_DIV_PLL_OFFSET;
- __raw_writel(reg, MXC_CCM_CLK_SYS);
- udelay(100);
-
- /* Turn ON the PLL CLK_GATE. */
- reg = __raw_readl(MXC_CCM_CLK_SYS);
- reg |= 3 << MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_OFFSET;
- __raw_writel(reg, MXC_CCM_CLK_SYS);
-
- /* Source the SYS_CLK from PLL */
- reg = __raw_readl(MXC_CCM_CLKSEQ_BYPASS);
- reg |= 0x3;
- __raw_writel(reg, MXC_CCM_CLKSEQ_BYPASS);
- while (__raw_readl(MXC_CCM_CSR2) & 0x400)
- udelay(10);
-
- /* Turn OFF the XTAL_CLK_GATE. */
- reg = __raw_readl(MXC_CCM_CLK_SYS);
- reg &= ~MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_CLK_SYS);
-
- clk_set_parent(main_bus_clk, pll3);
-
- /* Set the dividers to the default dividers */
- reg = __raw_readl(MXC_CCM_CBCDR);
- reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK
- | MXC_CCM_CBCDR_AXI_B_PODF_MASK
- | MXC_CCM_CBCDR_AHB_PODF_MASK
- | MX50_CCM_CBCDR_WEIM_PODF_MASK);
- reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET
- |1 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET
- |2 << MXC_CCM_CBCDR_AHB_PODF_OFFSET
- |0 << MX50_CCM_CBCDR_WEIM_PODF_OFFSET);
- __raw_writel(reg, MXC_CCM_CBCDR);
-
- while (__raw_readl(MXC_CCM_CDHIPR) & 0xF)
- udelay(10);
-
- low_bus_freq_mode = 0;
- high_bus_freq_mode = 1;
-
- /*Set the main_bus_clk parent to be PLL2. */
- clk_set_parent(main_bus_clk, pll2);
- spin_unlock_irqrestore(&ddr_freq_lock, flags);
-
- udelay(100);
-}
-
-void exit_lpapm_mode_mx51()
-{
- u32 reg;
-
- clk_set_parent(periph_apm_clk, pll3);
-
- /* Set the dividers to the default dividers */
- reg = __raw_readl(MXC_CCM_CBCDR);
- reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK
- | MXC_CCM_CBCDR_AXI_B_PODF_MASK
- | MXC_CCM_CBCDR_AHB_PODF_MASK
- | MXC_CCM_CBCDR_EMI_PODF_MASK
- | MXC_CCM_CBCDR_NFC_PODF_OFFSET);
- reg |= (3 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET
- | 4 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET
- | 4 << MXC_CCM_CBCDR_AHB_PODF_OFFSET
- | 4 << MXC_CCM_CBCDR_EMI_PODF_OFFSET
- | 3 << MXC_CCM_CBCDR_NFC_PODF_OFFSET);
- __raw_writel(reg, MXC_CCM_CBCDR);
-
- clk_enable(emi_garb_clk);
- while (__raw_readl(MXC_CCM_CDHIPR) & 0x1F)
- udelay(10);
-
- low_bus_freq_mode = 0;
- high_bus_freq_mode = 1;
- clk_disable(emi_garb_clk);
-
- /*Set the main_bus_clk parent to be PLL2. */
- clk_set_parent(main_bus_clk, pll2);
-
- /*Change the DDR freq to 200MHz*/
- clk_set_rate(ddr_hf_clk,
- clk_round_rate(ddr_hf_clk, ddr_normal_rate));
-}
-
int low_freq_bus_used(void)
{
- if ((lp_high_freq == 0)
+ if ((clk_get_usecount(ipu_clk) == 0)
+ && (clk_get_usecount(vpu_clk) == 0)
+ && (lp_high_freq == 0)
&& (lp_med_freq == 0))
return 1;
else
@@ -542,7 +286,8 @@ static ssize_t bus_freq_scaling_enable_store(struct device *dev,
{
u32 reg;
- if (strncmp(buf, "1", 1) == 0) {
+
+ if (strstr(buf, "1") != NULL) {
if (dvfs_per_active()) {
printk(KERN_INFO "bus frequency scaling cannot be\
enabled when DVFS-PER is active\n");
@@ -557,12 +302,12 @@ static ssize_t bus_freq_scaling_enable_store(struct device *dev,
bus_freq_scaling_is_active = 1;
set_high_bus_freq(0);
- } else if (strncmp(buf, "0", 1) == 0) {
+ }
+ else if (strstr(buf, "0") != NULL) {
if (bus_freq_scaling_is_active)
set_high_bus_freq(1);
bus_freq_scaling_is_active = 0;
}
-
return size;
}
@@ -595,11 +340,6 @@ static int __devinit busfreq_probe(struct platform_device *pdev)
{
int err = 0;
unsigned long pll2_rate, pll1_rate;
- unsigned long iram_paddr;
-
- pll1_base = ioremap(MX53_BASE_ADDR(PLL1_BASE_ADDR), SZ_4K);
- if (cpu_is_mx53())
- pll4_base = ioremap(MX53_BASE_ADDR(PLL4_BASE_ADDR), SZ_4K);
busfreq_dev = &pdev->dev;
@@ -616,32 +356,41 @@ static int __devinit busfreq_probe(struct platform_device *pdev)
return PTR_ERR(pll1_sw_clk);
}
- pll1 = clk_get(NULL, "pll1_main_clk");
- if (IS_ERR(pll1)) {
- printk(KERN_DEBUG "%s: failed to get pll1\n", __func__);
- return PTR_ERR(pll1);
- }
-
pll2 = clk_get(NULL, "pll2");
if (IS_ERR(pll2)) {
printk(KERN_DEBUG "%s: failed to get pll2\n", __func__);
return PTR_ERR(pll2);
}
+ pll1_rate = clk_get_rate(pll1_sw_clk);
+ pll2_rate = clk_get_rate(pll2);
+
+ if (pll2_rate == 665000000) {
+ /* for mx51 */
+ lp_normal_rate = pll2_rate / 5;
+ lp_med_rate = pll2_rate / 8;
+ ddr_normal_rate = pll1_rate / 4; /* 200M */
+ ddr_low_rate = pll1_rate / 6; /* 133M */
+ } else if (pll2_rate == 600000000) {
+ /* for mx53 evk rev.A */
+ lp_normal_rate = pll2_rate / 5;
+ lp_med_rate = pll2_rate / 8;
+ ddr_normal_rate = pll2_rate / 2;
+ ddr_low_rate = pll2_rate / 2;
+ } else if (pll2_rate == 400000000) {
+ /* for mx53 evk rev.B */
+ lp_normal_rate = pll2_rate / 3;
+ lp_med_rate = pll2_rate / 5;
+ ddr_normal_rate = pll2_rate / 1;
+ ddr_low_rate = pll2_rate / 3;
+ }
+
pll3 = clk_get(NULL, "pll3");
if (IS_ERR(pll3)) {
printk(KERN_DEBUG "%s: failed to get pll3\n", __func__);
return PTR_ERR(pll3);
}
- if (cpu_is_mx53()) {
- pll4 = clk_get(NULL, "pll4");
- if (IS_ERR(pll4)) {
- printk(KERN_DEBUG "%s: failed to get pll4\n", __func__);
- return PTR_ERR(pll4);
- }
- }
-
axi_a_clk = clk_get(NULL, "axi_a_clk");
if (IS_ERR(axi_a_clk)) {
printk(KERN_DEBUG "%s: failed to get axi_a_clk\n",
@@ -656,14 +405,10 @@ static int __devinit busfreq_probe(struct platform_device *pdev)
return PTR_ERR(axi_b_clk);
}
- ddr_clk = clk_get(NULL, "ddr_clk");
- if (IS_ERR(ddr_clk)) {
- printk(KERN_DEBUG "%s: failed to get ddr_clk\n",
- __func__);
- return PTR_ERR(ddr_clk);
- }
-
- ddr_hf_clk = clk_get_parent(ddr_clk);
+ if (cpu_is_mx51())
+ ddr_hf_clk = clk_get(NULL, "ddr_hf_clk");
+ else
+ ddr_hf_clk = clk_get(NULL, "axi_a_clk");
if (IS_ERR(ddr_hf_clk)) {
printk(KERN_DEBUG "%s: failed to get ddr_hf_clk\n",
@@ -671,6 +416,20 @@ static int __devinit busfreq_probe(struct platform_device *pdev)
return PTR_ERR(ddr_hf_clk);
}
+ emi_slow_clk = clk_get(NULL, "emi_slow_clk");
+ if (IS_ERR(emi_slow_clk)) {
+ printk(KERN_DEBUG "%s: failed to get emi_slow_clk\n",
+ __func__);
+ return PTR_ERR(emi_slow_clk);
+ }
+
+ nfc_clk = clk_get(NULL, "nfc_clk");
+ if (IS_ERR(nfc_clk)) {
+ printk(KERN_DEBUG "%s: failed to get nfc_clk\n",
+ __func__);
+ return PTR_ERR(nfc_clk);
+ }
+
ahb_clk = clk_get(NULL, "ahb_clk");
if (IS_ERR(ahb_clk)) {
printk(KERN_DEBUG "%s: failed to get ahb_clk\n",
@@ -678,6 +437,20 @@ static int __devinit busfreq_probe(struct platform_device *pdev)
return PTR_ERR(ahb_clk);
}
+ vpu_core_clk = clk_get(NULL, "vpu_core_clk");
+ if (IS_ERR(vpu_core_clk)) {
+ printk(KERN_DEBUG "%s: failed to get vpu_core_clk\n",
+ __func__);
+ return PTR_ERR(vpu_core_clk);
+ }
+
+ ddr_clk = clk_get(NULL, "ddr_clk");
+ if (IS_ERR(ddr_clk)) {
+ printk(KERN_DEBUG "%s: failed to get ddr_clk\n",
+ __func__);
+ return PTR_ERR(ddr_clk);
+ }
+
cpu_clk = clk_get(NULL, "cpu_clk");
if (IS_ERR(cpu_clk)) {
printk(KERN_DEBUG "%s: failed to get cpu_clk\n",
@@ -685,25 +458,35 @@ static int __devinit busfreq_probe(struct platform_device *pdev)
return PTR_ERR(cpu_clk);
}
+ ipu_clk = clk_get(NULL, "ipu_clk");
+ if (IS_ERR(ipu_clk)) {
+ printk(KERN_DEBUG "%s: failed to get ipu_clk\n",
+ __func__);
+ return PTR_ERR(ipu_clk);
+ }
+
if (cpu_is_mx51())
emi_garb_clk = clk_get(NULL, "emi_garb_clk");
- else if (cpu_is_mx53())
- emi_garb_clk = clk_get(NULL, "emi_intr_clk.1");
else
- emi_garb_clk = clk_get(NULL, "ocram_clk");
+ emi_garb_clk = clk_get(NULL, "emi_intr_clk.1");
if (IS_ERR(emi_garb_clk)) {
printk(KERN_DEBUG "%s: failed to get emi_garb_clk\n",
__func__);
return PTR_ERR(emi_garb_clk);
}
- if (cpu_is_mx51() || cpu_is_mx53()) {
- periph_apm_clk = clk_get(NULL, "periph_apm_clk");
- if (IS_ERR(periph_apm_clk)) {
- printk(KERN_DEBUG "%s: failed to get periph_apm_clk\n",
- __func__);
- return PTR_ERR(periph_apm_clk);
- }
+ vpu_clk = clk_get(NULL, "vpu_clk");
+ if (IS_ERR(vpu_clk)) {
+ printk(KERN_DEBUG "%s: failed to get vpu_clk\n",
+ __func__);
+ return PTR_ERR(vpu_clk);
+ }
+
+ periph_apm_clk = clk_get(NULL, "periph_apm_clk");
+ if (IS_ERR(periph_apm_clk)) {
+ printk(KERN_DEBUG "%s: failed to get periph_apm_clk\n",
+ __func__);
+ return PTR_ERR(periph_apm_clk);
}
lp_apm = clk_get(NULL, "lp_apm");
@@ -732,49 +515,6 @@ static int __devinit busfreq_probe(struct platform_device *pdev)
return err;
}
- pll1_rate = clk_get_rate(pll1_sw_clk);
- pll2_rate = clk_get_rate(pll2);
-
- if (pll2_rate == 665000000) {
- /* for mx51 */
- lp_normal_rate = pll2_rate / 5;
- lp_med_rate = pll2_rate / 8;
- ddr_normal_rate = pll1_rate / 4; /* 200M */
- ddr_low_rate = pll1_rate / 6; /* 133M */
- } else if (pll2_rate == 600000000) {
- /* for mx53 evk rev.A */
- lp_normal_rate = pll2_rate / 5;
- lp_med_rate = pll2_rate / 8;
- ddr_normal_rate = pll2_rate / 2;
- ddr_low_rate = pll2_rate / 2;
- } else if (pll2_rate == 400000000) {
- /* for mx53 evk rev.B */
- lp_normal_rate = pll2_rate / 3;
- lp_med_rate = pll2_rate / 5;
- if (cpu_is_mx53()) {
- ddr_normal_rate = pll2_rate / 1;
- ddr_low_rate = pll2_rate / 3;
- } else if (cpu_is_mx50()) {
- ddr_normal_rate = clk_get_rate(ddr_clk);
- ddr_low_rate = LP_APM_CLK;
- }
- }
- if (cpu_is_mx50()) {
- iram_alloc(SZ_8K, &iram_paddr);
- /* Need to remap the area here since we want the memory region
- to be executable. */
- ddr_freq_change_iram_base = __arm_ioremap(iram_paddr,
- SZ_8K, MT_HIGH_VECTORS);
- memcpy(ddr_freq_change_iram_base, mx50_ddr_freq_change, SZ_8K);
- change_ddr_freq = (void *)ddr_freq_change_iram_base;
-
- lp_regulator = regulator_get(NULL, "SW2");
- if (IS_ERR(lp_regulator)) {
- printk(KERN_DEBUG
- "%s: failed to get lp regulator\n", __func__);
- return PTR_ERR(lp_regulator);
- }
- }
cpu_wp_tbl = get_cpu_wp(&cpu_wp_nr);
low_bus_freq_mode = 0;
high_bus_freq_mode = 1;
diff --git a/arch/arm/mach-mx5/clock.c b/arch/arm/mach-mx5/clock.c
index 5ec89a6570cd..09ea14084278 100644
--- a/arch/arm/mach-mx5/clock.c
+++ b/arch/arm/mach-mx5/clock.c
@@ -405,12 +405,7 @@ static int _clk_pll_enable(struct clk *clk)
struct timespec curtime;
pllbase = _get_pll_base(clk);
- reg = __raw_readl(pllbase + MXC_PLL_DP_CTL);
-
- if (reg & MXC_PLL_DP_CTL_UPEN)
- return 0;
-
- reg |= MXC_PLL_DP_CTL_UPEN;
+ reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) | MXC_PLL_DP_CTL_UPEN;
__raw_writel(reg, pllbase + MXC_PLL_DP_CTL);
/* Wait for lock */
@@ -4742,15 +4737,15 @@ int __init mx53_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
1 << MXC_CCM_CCGR5_CG6_OFFSET |
3 << MXC_CCM_CCGR5_CG7_OFFSET |
1 << MXC_CCM_CCGR5_CG8_OFFSET |
- 1 << MXC_CCM_CCGR5_CG9_OFFSET |
+ 3 << MXC_CCM_CCGR5_CG9_OFFSET |
1 << MXC_CCM_CCGR5_CG10_OFFSET |
3 << MXC_CCM_CCGR5_CG11_OFFSET, MXC_CCM_CCGR5);
- __raw_writel(1 << MXC_CCM_CCGR6_CG0_OFFSET |
+ __raw_writel(3 << MXC_CCM_CCGR6_CG0_OFFSET |
3 << MXC_CCM_CCGR6_CG1_OFFSET |
- 1 << MXC_CCM_CCGR6_CG4_OFFSET |
- 1 << MXC_CCM_CCGR6_CG8_OFFSET |
- 1 << MXC_CCM_CCGR6_CG9_OFFSET |
+ 3 << MXC_CCM_CCGR6_CG4_OFFSET |
+ 3 << MXC_CCM_CCGR6_CG8_OFFSET |
+ 3 << MXC_CCM_CCGR6_CG9_OFFSET |
3 << MXC_CCM_CCGR6_CG12_OFFSET |
3 << MXC_CCM_CCGR6_CG13_OFFSET , MXC_CCM_CCGR6);
diff --git a/arch/arm/mach-mx5/clock_mx50.c b/arch/arm/mach-mx5/clock_mx50.c
index a2a3c82fba77..6bd7fd3b96aa 100644
--- a/arch/arm/mach-mx5/clock_mx50.c
+++ b/arch/arm/mach-mx5/clock_mx50.c
@@ -39,18 +39,9 @@ static struct clk pll1_main_clk;
static struct clk pll1_sw_clk;
static struct clk pll2_sw_clk;
static struct clk pll3_sw_clk;
-static struct clk apbh_dma_clk;
-static struct clk apll_clk;
-static struct clk pfd0_clk;
-static struct clk pfd1_clk;
-static struct clk pfd2_clk;
-static struct clk pfd3_clk;
-static struct clk pfd4_clk;
-static struct clk pfd5_clk;
-static struct clk pfd6_clk;
-static struct clk pfd7_clk;
+static struct clk pll4_sw_clk;
static struct clk lp_apm_clk;
-static struct clk weim_clk[];
+static struct clk weim_clk;
static struct clk ddr_clk;
static struct clk axi_a_clk;
static struct clk axi_b_clk;
@@ -61,30 +52,13 @@ static struct cpu_wp *cpu_wp_tbl;
static void __iomem *pll1_base;
static void __iomem *pll2_base;
static void __iomem *pll3_base;
-static void __iomem *apll_base;
+static void __iomem *pll4_base;
extern int cpu_wp_nr;
extern int lp_high_freq;
extern int lp_med_freq;
-void __iomem *databahn;
-#define DDR_SYNC_MODE 0x30000
#define SPIN_DELAY 1000000 /* in nanoseconds */
-#define WAIT(exp, timeout) \
-({ \
- struct timespec nstimeofday; \
- struct timespec curtime; \
- int result = 1; \
- getnstimeofday(&nstimeofday); \
- while (!(exp)) { \
- getnstimeofday(&curtime); \
- if ((curtime.tv_nsec - nstimeofday.tv_nsec) > (timeout)) { \
- result = 0; \
- break; \
- } \
- } \
- result; \
-})
extern int mxc_jtag_enabled;
extern int uart_at_24;
@@ -249,6 +223,8 @@ static inline void __iomem *_get_pll_base(struct clk *pll)
return pll2_base;
else if (pll == &pll3_sw_clk)
return pll3_base;
+ else if (pll == &pll4_sw_clk)
+ return pll4_base;
else
BUG();
@@ -270,229 +246,48 @@ static struct clk osc_clk = {
.flags = RATE_PROPAGATES,
};
-static int apll_enable(struct clk *clk)
-{
- __raw_writel(1, apll_base + MXC_ANADIG_MISC_SET);
- return 0;
-}
-
-static void apll_disable(struct clk *clk)
-{
- __raw_writel(1, apll_base + MXC_ANADIG_MISC_CLR);
-}
-
static struct clk apll_clk = {
.name = "apll",
- .rate = 480000000,
- .enable = apll_enable,
- .disable = apll_disable,
.flags = RATE_PROPAGATES,
};
-static void pfd_recalc(struct clk *clk)
-{
- u32 frac;
- u64 rate;
- if (apbh_dma_clk.usecount == 0)
- apbh_dma_clk.enable(&apbh_dma_clk);
- frac = __raw_readl(apll_base +
- (int)clk->enable_reg) >> clk->enable_shift;
- frac &= MXC_ANADIG_PFD_FRAC_MASK;
- rate = (u64)clk->parent->rate * 18;
- do_div(rate, frac);
- clk->rate = rate;
- if (apbh_dma_clk.usecount == 0)
- apbh_dma_clk.disable(&apbh_dma_clk);
-}
-
-static unsigned long pfd_round_rate(struct clk *clk, unsigned long rate)
-{
- u32 frac;
- u64 tmp;
- tmp = (u64)clk->parent->rate * 18;
- do_div(tmp, rate);
- frac = tmp;
- frac = frac < 18 ? 18 : frac;
- frac = frac > 35 ? 35 : frac;
- do_div(tmp, frac);
- return tmp;
-}
-
-static int pfd_set_rate(struct clk *clk, unsigned long rate)
-{
- u32 frac;
- u64 tmp;
-
- if (apbh_dma_clk.usecount == 0)
- apbh_dma_clk.enable(&apbh_dma_clk);
- tmp = (u64)clk->parent->rate * 18;
- do_div(tmp, rate);
- frac = tmp;
- frac = frac < 18 ? 18 : frac;
- frac = frac > 35 ? 35 : frac;
- /* clear clk frac bits */
- __raw_writel(MXC_ANADIG_PFD_FRAC_MASK << clk->enable_shift,
- apll_base + (int)clk->enable_reg + 8);
- /* set clk frac bits */
- __raw_writel(frac << clk->enable_shift,
- apll_base + (int)clk->enable_reg + 4);
-
- tmp = (u64)clk->parent->rate * 18;
- do_div(tmp, frac);
- clk->rate = tmp;
- if (apbh_dma_clk.usecount == 0)
- apbh_dma_clk.disable(&apbh_dma_clk);
- return 0;
-}
-
-static int pfd_enable(struct clk *clk)
-{
- int index;
-
- if (apbh_dma_clk.usecount == 0)
- apbh_dma_clk.enable(&apbh_dma_clk);
- index = _get_mux8(clk, &pfd0_clk, &pfd1_clk, &pfd2_clk, &pfd3_clk,
- &pfd4_clk, &pfd5_clk, &pfd6_clk, &pfd7_clk);
- __raw_writel(1 << (index + MXC_ANADIG_PFD_DIS_OFFSET),
- apll_base + MXC_ANADIG_PLLCTRL_CLR);
- /* clear clk gate bit */
- __raw_writel((1 << (clk->enable_shift + 7)),
- apll_base + (int)clk->enable_reg + 8);
-
- /* check lock bit */
- if (!WAIT(__raw_readl(apll_base + MXC_ANADIG_PLLCTRL)
- & MXC_ANADIG_APLL_LOCK, 50000)) {
- __raw_writel(MXC_ANADIG_APLL_FORCE_LOCK,
- apll_base + MXC_ANADIG_PLLCTRL_CLR);
- __raw_writel(MXC_ANADIG_APLL_FORCE_LOCK,
- apll_base + MXC_ANADIG_PLLCTRL_SET);
- if (!WAIT(__raw_readl(apll_base + MXC_ANADIG_PLLCTRL)
- & MXC_ANADIG_APLL_LOCK, SPIN_DELAY))
- panic("pfd_enable failed!\n");
- }
- if (apbh_dma_clk.usecount == 0)
- apbh_dma_clk.disable(&apbh_dma_clk);
- return 0;
-}
-
-static void pfd_disable(struct clk *clk)
-{
- int index;
-
- if (apbh_dma_clk.usecount == 0)
- apbh_dma_clk.enable(&apbh_dma_clk);
- index = _get_mux8(clk, &pfd0_clk, &pfd1_clk, &pfd2_clk, &pfd3_clk,
- &pfd4_clk, &pfd5_clk, &pfd6_clk, &pfd7_clk);
- /* set clk gate bit */
- __raw_writel((1 << (clk->enable_shift + 7)),
- apll_base + (int)clk->enable_reg + 4);
- __raw_writel(1 << (index + MXC_ANADIG_PFD_DIS_OFFSET),
- apll_base + MXC_ANADIG_PLLCTRL_SET);
- if (apbh_dma_clk.usecount == 0)
- apbh_dma_clk.disable(&apbh_dma_clk);
-}
-
static struct clk pfd0_clk = {
.name = "pfd0",
- .parent = &apll_clk,
- .enable_reg = (void *)MXC_ANADIG_FRAC0,
- .enable_shift = MXC_ANADIG_PFD0_FRAC_OFFSET,
- .recalc = pfd_recalc,
- .set_rate = pfd_set_rate,
- .round_rate = pfd_round_rate,
- .enable = pfd_enable,
- .disable = pfd_disable,
.flags = RATE_PROPAGATES,
};
static struct clk pfd1_clk = {
.name = "pfd1",
- .parent = &apll_clk,
- .enable_reg = (void *)MXC_ANADIG_FRAC0,
- .enable_shift = MXC_ANADIG_PFD1_FRAC_OFFSET,
- .recalc = pfd_recalc,
- .set_rate = pfd_set_rate,
- .round_rate = pfd_round_rate,
- .enable = pfd_enable,
- .disable = pfd_disable,
.flags = RATE_PROPAGATES,
};
static struct clk pfd2_clk = {
.name = "pfd2",
- .parent = &apll_clk,
- .enable_reg = (void *)MXC_ANADIG_FRAC0,
- .enable_shift = MXC_ANADIG_PFD2_FRAC_OFFSET,
- .recalc = pfd_recalc,
- .set_rate = pfd_set_rate,
- .round_rate = pfd_round_rate,
- .enable = pfd_enable,
- .disable = pfd_disable,
.flags = RATE_PROPAGATES,
};
static struct clk pfd3_clk = {
.name = "pfd3",
- .parent = &apll_clk,
- .enable_reg = (void *)MXC_ANADIG_FRAC0,
- .enable_shift = MXC_ANADIG_PFD3_FRAC_OFFSET,
- .recalc = pfd_recalc,
- .set_rate = pfd_set_rate,
- .round_rate = pfd_round_rate,
- .enable = pfd_enable,
- .disable = pfd_disable,
.flags = RATE_PROPAGATES,
};
static struct clk pfd4_clk = {
.name = "pfd4",
- .parent = &apll_clk,
- .enable_reg = (void *)MXC_ANADIG_FRAC1,
- .enable_shift = MXC_ANADIG_PFD4_FRAC_OFFSET,
- .recalc = pfd_recalc,
- .set_rate = pfd_set_rate,
- .round_rate = pfd_round_rate,
- .enable = pfd_enable,
- .disable = pfd_disable,
.flags = RATE_PROPAGATES,
};
static struct clk pfd5_clk = {
.name = "pfd5",
- .parent = &apll_clk,
- .enable_reg = (void *)MXC_ANADIG_FRAC1,
- .enable_shift = MXC_ANADIG_PFD5_FRAC_OFFSET,
- .recalc = pfd_recalc,
- .set_rate = pfd_set_rate,
- .round_rate = pfd_round_rate,
- .enable = pfd_enable,
- .disable = pfd_disable,
.flags = RATE_PROPAGATES,
};
static struct clk pfd6_clk = {
.name = "pfd6",
- .parent = &apll_clk,
- .enable_reg = (void *)MXC_ANADIG_FRAC1,
- .enable_shift = MXC_ANADIG_PFD6_FRAC_OFFSET,
- .recalc = pfd_recalc,
- .set_rate = pfd_set_rate,
- .round_rate = pfd_round_rate,
- .enable = pfd_enable,
- .disable = pfd_disable,
.flags = RATE_PROPAGATES,
};
static struct clk pfd7_clk = {
.name = "pfd7",
- .parent = &apll_clk,
- .enable_reg = (void *)MXC_ANADIG_FRAC1,
- .enable_shift = MXC_ANADIG_PFD7_FRAC_OFFSET,
- .recalc = pfd_recalc,
- .set_rate = pfd_set_rate,
- .round_rate = pfd_round_rate,
- .enable = pfd_enable,
- .disable = pfd_disable,
.flags = RATE_PROPAGATES,
};
@@ -552,6 +347,8 @@ static int _clk_pll_set_rate(struct clk *clk, unsigned long rate)
{
u32 reg, reg1;
void __iomem *pllbase;
+ struct timespec nstimeofday;
+ struct timespec curtime;
long mfi, pdf, mfn, mfd = 999999;
s64 temp64;
@@ -599,9 +396,13 @@ static int _clk_pll_set_rate(struct clk *clk, unsigned long rate)
__raw_writel(reg1, pllbase + MXC_PLL_DP_CTL);
}
/* Wait for lock */
- if (!WAIT(__raw_readl(pllbase + MXC_PLL_DP_CTL)
- & MXC_PLL_DP_CTL_LRF, SPIN_DELAY))
- panic("pll_set_rate: pll relock failed\n");
+ getnstimeofday(&nstimeofday);
+ while (!(__raw_readl(pllbase + MXC_PLL_DP_CTL)
+ & MXC_PLL_DP_CTL_LRF)) {
+ getnstimeofday(&curtime);
+ if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY)
+ panic("pll_set_rate: pll relock failed\n");
+ }
}
clk->rate = rate;
return 0;
@@ -611,20 +412,20 @@ static int _clk_pll_enable(struct clk *clk)
{
u32 reg;
void __iomem *pllbase;
+ struct timespec nstimeofday;
+ struct timespec curtime;
pllbase = _get_pll_base(clk);
- reg = __raw_readl(pllbase + MXC_PLL_DP_CTL);
-
- if (reg & MXC_PLL_DP_CTL_UPEN)
- return 0;
-
- reg |= MXC_PLL_DP_CTL_UPEN;
+ reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) | MXC_PLL_DP_CTL_UPEN;
__raw_writel(reg, pllbase + MXC_PLL_DP_CTL);
/* Wait for lock */
- if (!WAIT(__raw_readl(pllbase + MXC_PLL_DP_CTL) & MXC_PLL_DP_CTL_LRF,
- SPIN_DELAY))
- panic("pll relock failed\n");
+ getnstimeofday(&nstimeofday);
+ while (!(__raw_readl(pllbase + MXC_PLL_DP_CTL) & MXC_PLL_DP_CTL_LRF)) {
+ getnstimeofday(&curtime);
+ if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY)
+ panic("pll relock failed\n");
+ }
return 0;
}
@@ -750,6 +551,17 @@ static struct clk pll3_sw_clk = {
.flags = RATE_PROPAGATES,
};
+/* same as pll4_main_clk. These two clocks should always be the same */
+static struct clk pll4_sw_clk = {
+ .name = "pll4",
+ .parent = &osc_clk,
+ .set_rate = _clk_pll_set_rate,
+ .recalc = _clk_pll_recalc,
+ .enable = _clk_pll_enable,
+ .disable = _clk_pll_disable,
+ .flags = RATE_PROPAGATES,
+};
+
static int _clk_lp_apm_set_parent(struct clk *clk, struct clk *parent)
{
u32 reg;
@@ -841,7 +653,7 @@ static int _clk_main_bus_set_parent(struct clk *clk, struct clk *parent)
mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk, &pll3_sw_clk,
&lp_apm_clk);
reg = __raw_readl(MXC_CCM_CBCDR) & ~MX50_CCM_CBCDR_PERIPH_CLK_SEL_MASK;
- reg |= (mux << MX50_CCM_CBCDR_PERIPH_CLK_SEL_OFFSET);
+ reg |= mux;
__raw_writel(reg, MXC_CCM_CBCDR);
return 0;
@@ -868,6 +680,8 @@ static void _clk_axi_a_recalc(struct clk *clk)
static int _clk_axi_a_set_rate(struct clk *clk, unsigned long rate)
{
u32 reg, div;
+ struct timespec nstimeofday;
+ struct timespec curtime;
div = clk->parent->rate / rate;
if (div == 0)
@@ -880,9 +694,12 @@ static int _clk_axi_a_set_rate(struct clk *clk, unsigned long rate)
reg |= (div - 1) << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET;
__raw_writel(reg, MXC_CCM_CBCDR);
- if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
- & MXC_CCM_CDHIPR_AXI_A_PODF_BUSY), SPIN_DELAY))
- panic("pll _clk_axi_a_set_rate failed\n");
+ getnstimeofday(&nstimeofday);
+ while (__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AXI_A_PODF_BUSY) {
+ getnstimeofday(&curtime);
+ if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY)
+ panic("pll _clk_axi_a_set_rate failed\n");
+ }
clk->rate = rate;
return 0;
@@ -924,6 +741,8 @@ static void _clk_axi_b_recalc(struct clk *clk)
static int _clk_axi_b_set_rate(struct clk *clk, unsigned long rate)
{
u32 reg, div;
+ struct timespec nstimeofday;
+ struct timespec curtime;
div = clk->parent->rate / rate;
if (div == 0)
@@ -936,9 +755,12 @@ static int _clk_axi_b_set_rate(struct clk *clk, unsigned long rate)
reg |= (div - 1) << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET;
__raw_writel(reg, MXC_CCM_CBCDR);
- if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
- & MXC_CCM_CDHIPR_AXI_B_PODF_BUSY), SPIN_DELAY))
- panic("_clk_axi_b_set_rate failed\n");
+ getnstimeofday(&nstimeofday);
+ while (__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AXI_B_PODF_BUSY) {
+ getnstimeofday(&curtime);
+ if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY)
+ panic("_clk_axi_b_set_rate failed\n");
+ }
clk->rate = rate;
@@ -982,6 +804,8 @@ static void _clk_ahb_recalc(struct clk *clk)
static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate)
{
u32 reg, div;
+ struct timespec nstimeofday;
+ struct timespec curtime;
div = clk->parent->rate / rate;
if (div == 0)
@@ -994,9 +818,12 @@ static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate)
reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET;
__raw_writel(reg, MXC_CCM_CBCDR);
- if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY),
- SPIN_DELAY))
+ getnstimeofday(&nstimeofday);
+ while (__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY) {
+ getnstimeofday(&curtime);
+ if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY)
panic("_clk_ahb_set_rate failed\n");
+ }
clk->rate = rate;
return 0;
@@ -1062,6 +889,85 @@ static struct clk ahb_max_clk = {
.disable = _clk_max_disable,
};
+static int _clk_weim_set_parent(struct clk *clk, struct clk *parent)
+{
+ u32 reg;
+
+ reg = __raw_readl(MXC_CCM_CBCDR);
+ if (parent == &ahb_clk)
+ reg |= MX50_CCM_CBCDR_WEIM_CLK_SEL;
+ else if (parent == &main_bus_clk)
+ reg &= ~MX50_CCM_CBCDR_WEIM_CLK_SEL;
+ else
+ BUG();
+ __raw_writel(reg, MXC_CCM_CBCDR);
+
+ return 0;
+}
+
+static void _clk_weim_recalc(struct clk *clk)
+{
+ u32 reg, div;
+
+ reg = __raw_readl(MXC_CCM_CBCDR);
+ div = ((reg & MXC_CCM_CBCDR_EMI_PODF_MASK) >>
+ MXC_CCM_CBCDR_EMI_PODF_OFFSET) + 1;
+ clk->rate = clk->parent->rate / div;
+}
+
+static int _clk_weim_set_rate(struct clk *clk, unsigned long rate)
+{
+ u32 reg, div;
+ struct timespec nstimeofday;
+ struct timespec curtime;
+
+ div = clk->parent->rate / rate;
+ if (div == 0)
+ div++;
+ if (((clk->parent->rate / div) != rate) || (div > 8))
+ return -EINVAL;
+ reg = __raw_readl(MXC_CCM_CBCDR);
+ reg &= ~MXC_CCM_CBCDR_EMI_PODF_MASK;
+ reg |= (div - 1) << MXC_CCM_CBCDR_EMI_PODF_OFFSET;
+ __raw_writel(reg, MXC_CCM_CBCDR);
+ getnstimeofday(&nstimeofday);
+ while (__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_EMI_PODF_BUSY) {
+ getnstimeofday(&curtime);
+ if ((curtime.tv_nsec - nstimeofday.tv_nsec) > SPIN_DELAY)
+ panic("_clk_emi_slow_set_rate failed\n");
+ }
+ clk->rate = rate;
+
+ return 0;
+}
+
+static unsigned long _clk_weim_round_rate(struct clk *clk,
+ unsigned long rate)
+{
+ u32 div;
+
+ div = clk->parent->rate / rate;
+ if (div > 8)
+ div = 8;
+ else if (div == 0)
+ div++;
+ return clk->parent->rate / div;
+}
+
+
+static struct clk weim_clk = {
+ .name = "weim_clk",
+ .parent = &main_bus_clk,
+ .set_parent = _clk_weim_set_parent,
+ .recalc = _clk_weim_recalc,
+ .set_rate = _clk_weim_set_rate,
+ .round_rate = _clk_weim_round_rate,
+ .enable = _clk_enable,
+ .enable_reg = MXC_CCM_CCGR5,
+ .enable_shift = MXC_CCM_CCGR5_CG8_OFFSET,
+ .disable = _clk_disable_inwait,
+ .flags = RATE_PROPAGATES,
+};
static struct clk ahbmux1_clk = {
.name = "ahbmux1_clk",
@@ -1156,138 +1062,6 @@ static struct clk ipmux2_clk = {
.disable = _clk_disable,
};
-static int _clk_sys_clk_enable(struct clk *clk)
-{
- u32 reg;
-
- reg = __raw_readl(MXC_CCM_CLK_SYS);
- reg &= ~(MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK |
- MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK);
- if (__raw_readl(MXC_CCM_CLKSEQ_BYPASS) & 0x1)
- reg |= MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK;
- else
- reg |= MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_CLK_SYS);
- return 0;
-}
-
-static void _clk_sys_clk_disable(struct clk *clk)
-{
- u32 reg, reg1;
-
- reg1 = (__raw_readl(databahn + DATABAHN_CTL_REG55))
- & DDR_SYNC_MODE;
- reg = __raw_readl(MXC_CCM_CLK_SYS);
- reg &= ~(MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK |
- MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK);
- if (__raw_readl(MXC_CCM_CLKSEQ_BYPASS) & 0x1)
- reg |= 1 << MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_OFFSET;
- else {
- /* If DDR is sourced from SYS_CLK (in Sync mode), we cannot
- * gate its clock when ARM is in wait if the DDR is not in
- * self refresh.
- */
- if (reg1 == DDR_SYNC_MODE)
- reg |= 3 << MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_OFFSET;
- else
- reg |= 1 << MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_OFFSET;
- }
- __raw_writel(reg, MXC_CCM_CLK_SYS);
-}
-
-static struct clk sys_clk = {
- .name = "sys_clk",
- .enable = _clk_sys_clk_enable,
- .disable = _clk_sys_clk_disable,
-};
-
-
-static int _clk_weim_set_parent(struct clk *clk, struct clk *parent)
-{
- u32 reg;
-
- reg = __raw_readl(MXC_CCM_CBCDR);
- if (parent == &ahb_clk)
- reg |= MX50_CCM_CBCDR_WEIM_CLK_SEL;
- else if (parent == &main_bus_clk)
- reg &= ~MX50_CCM_CBCDR_WEIM_CLK_SEL;
- else
- BUG();
- __raw_writel(reg, MXC_CCM_CBCDR);
-
- return 0;
-}
-
-static void _clk_weim_recalc(struct clk *clk)
-{
- u32 reg, div;
-
- reg = __raw_readl(MXC_CCM_CBCDR);
- div = ((reg & MXC_CCM_CBCDR_EMI_PODF_MASK) >>
- MXC_CCM_CBCDR_EMI_PODF_OFFSET) + 1;
- clk->rate = clk->parent->rate / div;
-}
-
-static int _clk_weim_set_rate(struct clk *clk, unsigned long rate)
-{
- u32 reg, div;
-
- div = clk->parent->rate / rate;
- if (div == 0)
- div++;
- if (((clk->parent->rate / div) != rate) || (div > 8))
- return -EINVAL;
- reg = __raw_readl(MXC_CCM_CBCDR);
- reg &= ~MXC_CCM_CBCDR_EMI_PODF_MASK;
- reg |= (div - 1) << MXC_CCM_CBCDR_EMI_PODF_OFFSET;
- __raw_writel(reg, MXC_CCM_CBCDR);
- if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_EMI_PODF_BUSY),
- SPIN_DELAY))
- panic("_clk_emi_slow_set_rate failed\n");
- clk->rate = rate;
-
- return 0;
-}
-
-static unsigned long _clk_weim_round_rate(struct clk *clk,
- unsigned long rate)
-{
- u32 div;
-
- div = clk->parent->rate / rate;
- if (div > 8)
- div = 8;
- else if (div == 0)
- div++;
- return clk->parent->rate / div;
-}
-
-static struct clk weim_clk[] = {
- {
- .name = "weim_clk",
- .parent = &main_bus_clk,
- .set_parent = _clk_weim_set_parent,
- .recalc = _clk_weim_recalc,
- .set_rate = _clk_weim_set_rate,
- .round_rate = _clk_weim_round_rate,
- .enable = _clk_enable,
- .enable_reg = MXC_CCM_CCGR5,
- .enable_shift = MXC_CCM_CCGR5_CG8_OFFSET,
- .disable = _clk_disable_inwait,
- .flags = RATE_PROPAGATES,
- .secondary = &weim_clk[1],
- },
- {
- .name = "weim_ipg_clk",
- .parent = &ipg_clk,
- .secondary = &sys_clk,
- .enable = _clk_enable,
- .enable_reg = MXC_CCM_CCGR5,
- .enable_shift = MXC_CCM_CCGR5_CG9_OFFSET,
- .disable = _clk_disable_inwait,
- }
-};
-
static int _clk_ocram_enable(struct clk *clk)
{
return 0;
@@ -1299,13 +1073,13 @@ static void _clk_ocram_disable(struct clk *clk)
static struct clk ocram_clk = {
.name = "ocram_clk",
- .parent = &sys_clk,
.enable_reg = MXC_CCM_CCGR6,
.enable_shift = MXC_CCM_CCGR6_CG1_OFFSET,
.enable = _clk_ocram_enable,
.disable = _clk_ocram_disable,
};
+
static struct clk aips_tz1_clk = {
.name = "aips_tz1_clk",
.parent = &ahb_clk,
@@ -1372,7 +1146,6 @@ static struct clk sdma_clk[] = {
{
.name = "sdma_ipg_clk",
.parent = &ipg_clk,
- .secondary = &ddr_clk,
},
};
@@ -1559,16 +1332,17 @@ static struct clk gpt_clk[] = {
.parent = &ipg_perclk,
.id = 0,
.enable_reg = MXC_CCM_CCGR2,
- .enable_shift = MXC_CCM_CCGR2_CG10_OFFSET,
+ .enable_shift = MXC_CCM_CCGR2_CG9_OFFSET,
.enable = _clk_enable,
.disable = _clk_disable,
+ .secondary = &gpt_clk[1],
},
{
.name = "gpt_ipg_clk",
.id = 0,
.parent = &ipg_clk,
.enable_reg = MXC_CCM_CCGR2,
- .enable_shift = MXC_CCM_CCGR2_CG9_OFFSET,
+ .enable_shift = MXC_CCM_CCGR2_CG10_OFFSET,
.enable = _clk_enable,
.disable = _clk_disable,
},
@@ -2042,12 +1816,10 @@ static struct clk tmax2_clk = {
static struct clk usb_ahb_clk = {
.name = "usb_ahb_clk",
.parent = &ipg_clk,
- .secondary = &ddr_clk,
.enable = _clk_enable,
.enable_reg = MXC_CCM_CCGR2,
.enable_shift = MXC_CCM_CCGR2_CG13_OFFSET,
.disable = _clk_disable,
- .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE,
};
static struct clk usb_phy_clk[] = {
@@ -2074,7 +1846,6 @@ static struct clk usb_phy_clk[] = {
static struct clk esdhc_dep_clks = {
.name = "sd_dep_clk",
.parent = &spba_clk,
- .secondary = &ddr_clk,
};
static void _clk_esdhc1_recalc(struct clk *clk)
@@ -2097,8 +1868,8 @@ static int _clk_esdhc1_set_parent(struct clk *clk, struct clk *parent)
reg = __raw_readl(MXC_CCM_CSCMR1);
mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk, &pll3_sw_clk,
&lp_apm_clk);
- reg = reg & ~MX50_CCM_CSCMR1_ESDHC1_CLK_SEL_MASK;
- reg |= mux << MX50_CCM_CSCMR1_ESDHC1_CLK_SEL_OFFSET;
+ reg = reg & ~MXC_CCM_CSCMR1_ESDHC1_MSHC2_CLK_SEL_MASK;
+ reg |= mux << MXC_CCM_CSCMR1_ESDHC1_MSHC2_CLK_SEL_OFFSET;
__raw_writel(reg, MXC_CCM_CSCMR1);
return 0;
@@ -2143,7 +1914,6 @@ static struct clk esdhc1_clk[] = {
.enable_shift = MXC_CCM_CCGR3_CG1_OFFSET,
.disable = _clk_disable,
.secondary = &esdhc1_clk[1],
- .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
},
{
.name = "esdhc_ipg_clk",
@@ -2170,9 +1940,9 @@ static int _clk_esdhc2_set_parent(struct clk *clk, struct clk *parent)
reg = __raw_readl(MXC_CCM_CSCMR1);
if (parent == &esdhc1_clk[0])
- reg &= ~MX50_CCM_CSCMR1_ESDHC2_CLK_SEL;
+ reg &= ~MXC_CCM_CSCMR1_ESDHC2_CLK_SEL;
else if (parent == &esdhc3_clk[0])
- reg |= MX50_CCM_CSCMR1_ESDHC2_CLK_SEL;
+ reg |= MXC_CCM_CSCMR1_ESDHC2_CLK_SEL;
else
BUG();
__raw_writel(reg, MXC_CCM_CSCMR1);
@@ -2190,7 +1960,6 @@ static struct clk esdhc2_clk[] = {
.enable_shift = MXC_CCM_CCGR3_CG3_OFFSET,
.disable = _clk_disable,
.secondary = &esdhc2_clk[1],
- .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
},
{
.name = "esdhc_ipg_clk",
@@ -2218,8 +1987,8 @@ static int _clk_esdhc3_set_parent(struct clk *clk, struct clk *parent)
mux = _get_mux8(parent, &pll1_sw_clk, &pll2_sw_clk,
&pll3_sw_clk, &lp_apm_clk, &pfd0_clk,
&pfd1_clk, &pfd4_clk, &osc_clk);
- reg = reg & ~MX50_CCM_CSCMR1_ESDHC3_CLK_SEL_MASK;
- reg |= mux << MX50_CCM_CSCMR1_ESDHC3_CLK_SEL_OFFSET;
+ reg = reg & ~MXC_CCM_CSCMR1_ESDHC3_MSHC2_CLK_SEL_MASK;
+ reg |= mux << MXC_CCM_CSCMR1_ESDHC3_MSHC2_CLK_SEL_OFFSET;
__raw_writel(reg, MXC_CCM_CSCMR1);
return 0;
@@ -2277,7 +2046,6 @@ static struct clk esdhc3_clk[] = {
.enable_shift = MXC_CCM_CCGR3_CG5_OFFSET,
.disable = _clk_disable,
.secondary = &esdhc3_clk[1],
- .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
},
{
.name = "esdhc_ipg_clk",
@@ -2303,9 +2071,9 @@ static int _clk_esdhc4_set_parent(struct clk *clk, struct clk *parent)
reg = __raw_readl(MXC_CCM_CSCMR1);
if (parent == &esdhc1_clk[0])
- reg &= ~MX50_CCM_CSCMR1_ESDHC4_CLK_SEL;
+ reg &= ~MXC_CCM_CSCMR1_ESDHC4_CLK_SEL;
else if (parent == &esdhc3_clk[0])
- reg |= MX50_CCM_CSCMR1_ESDHC4_CLK_SEL;
+ reg |= MXC_CCM_CSCMR1_ESDHC4_CLK_SEL;
else
BUG();
__raw_writel(reg, MXC_CCM_CSCMR1);
@@ -2324,7 +2092,6 @@ static struct clk esdhc4_clk[] = {
.enable_shift = MXC_CCM_CCGR3_CG7_OFFSET,
.disable = _clk_disable,
.secondary = &esdhc4_clk[1],
- .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
},
{
.name = "esdhc_ipg_clk",
@@ -2355,7 +2122,6 @@ static int _clk_ddr_set_parent(struct clk *clk, struct clk *parent)
reg &= ~MXC_CCM_CLK_DDR_DDR_PFD_SEL;
else
return -EINVAL;
- __raw_writel(reg, MXC_CCM_CLK_DDR);
return 0;
}
@@ -2372,37 +2138,12 @@ static void _clk_ddr_recalc(struct clk *clk)
clk->rate = 0;
}
-static int _clk_ddr_enable(struct clk *clk)
-{
- u32 reg;
-
- _clk_enable(clk);
- reg = (__raw_readl(databahn + DATABAHN_CTL_REG55)) &
- DDR_SYNC_MODE;
- if (reg != DDR_SYNC_MODE) {
- reg = __raw_readl(MXC_CCM_CLK_DDR);
- reg |= MXC_CCM_CLK_DDR_DDR_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_CLK_DDR);
- }
- return 0;
-}
-
-static void _clk_ddr_disable(struct clk *clk)
-{
- _clk_disable_inwait(clk);
-}
-
-
static struct clk ddr_clk = {
.name = "ddr_clk",
.parent = &pll1_sw_clk,
- .secondary = &sys_clk,
.set_parent = _clk_ddr_set_parent,
.recalc = _clk_ddr_recalc,
- .enable = _clk_ddr_enable,
- .enable_reg = MXC_CCM_CCGR6,
- .enable_shift = MXC_CCM_CCGR6_CG15_OFFSET,
- .disable = _clk_ddr_disable,
+ .flags = RATE_PROPAGATES,
};
static void _clk_pgc_recalc(struct clk *clk)
@@ -2423,6 +2164,7 @@ static struct clk pgc_clk = {
};
/*usb OTG clock */
+
static struct clk usb_clk = {
.name = "usb_clk",
.rate = 60000000,
@@ -2438,16 +2180,6 @@ static struct clk rtc_clk = {
.disable = _clk_disable,
};
-struct clk rng_clk = {
- .name = "rng_clk",
- .id = 0,
- .parent = &ipg_clk,
- .enable = _clk_enable,
- .enable_reg = MXC_CCM_CCGR7,
- .enable_shift = MXC_CCM_CCGR7_CG1_OFFSET,
- .disable = _clk_disable,
-};
-
static struct clk owire_clk = {
/* 1w driver come from upstream and use owire as clock name*/
.name = "owire",
@@ -2458,6 +2190,7 @@ static struct clk owire_clk = {
.disable = _clk_disable,
};
+
static struct clk fec_clk[] = {
{
.name = "fec_clk",
@@ -2471,106 +2204,21 @@ static struct clk fec_clk[] = {
},
{
.name = "fec_sec1_clk",
- .parent = &aips_tz2_clk,
- .secondary = &ddr_clk,
- },
-};
-
-static int gpmi_clk_enable(struct clk *clk)
-{
- u32 reg;
-
- reg = __raw_readl(MXC_CCM_GPMI);
- reg |= MXC_CCM_GPMI_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_GPMI);
- _clk_enable(clk);
- return 0;
-}
-
-static void gpmi_clk_disable(struct clk *clk)
-{
- u32 reg;
-
- reg = __raw_readl(MXC_CCM_GPMI);
- reg &= ~MXC_CCM_GPMI_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_GPMI);
- _clk_disable(clk);
-}
-
-static int bch_clk_enable(struct clk *clk)
-{
- u32 reg;
-
- reg = __raw_readl(MXC_CCM_BCH);
- reg |= MXC_CCM_BCH_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_BCH);
- _clk_enable(clk);
- return 0;
-}
-
-static void bch_clk_disable(struct clk *clk)
-{
- u32 reg;
-
- reg = __raw_readl(MXC_CCM_BCH);
- reg &= ~MXC_CCM_BCH_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_BCH);
- _clk_disable(clk);
-}
-
-static struct clk gpmi_nfc_clk[] = {
- {
- .name = "gpmi-nfc",
- .parent = &osc_clk,
- .secondary = &gpmi_nfc_clk[1],
- .enable = gpmi_clk_enable,
- .enable_reg = MXC_CCM_CCGR7,
- .enable_shift = MXC_CCM_CCGR7_CG9_OFFSET,
- .disable = gpmi_clk_disable,
- },
- {
- .name = "gpmi-apb",
- .parent = &ahb_clk,
- .secondary = &gpmi_nfc_clk[2],
- .enable = _clk_enable,
- .enable_reg = MXC_CCM_CCGR7,
- .enable_shift = MXC_CCM_CCGR7_CG8_OFFSET,
- .disable = _clk_disable,
- },
- {
- .name = "bch",
- .parent = &osc_clk,
- .secondary = &gpmi_nfc_clk[3],
- .enable = bch_clk_enable,
- .enable_reg = MXC_CCM_CCGR7,
- .enable_shift = MXC_CCM_CCGR7_CG0_OFFSET,
- .disable = bch_clk_disable,
+ .parent = &tmax2_clk,
+ .secondary = &fec_clk[2],
},
{
- .name = "bch-apb",
- .parent = &ahb_clk,
- .enable = _clk_enable,
- .enable_reg = MXC_CCM_CCGR7,
- .enable_shift = MXC_CCM_CCGR7_CG12_OFFSET,
- .disable = _clk_disable,
+ .name = "fec_sec2_clk",
+ .parent = &aips_tz2_clk,
},
};
-static struct clk ocotp_clk = {
- .name = "ocotp_ctrl_apb",
- .parent = &ahb_clk,
- .enable = _clk_enable,
- .enable_reg = MXC_CCM_CCGR7,
- .enable_shift = MXC_CCM_CCGR7_CG13_OFFSET,
- .disable = _clk_disable,
-};
-
static int _clk_gpu2d_set_parent(struct clk *clk, struct clk *parent)
{
u32 reg, mux;
reg = __raw_readl(MXC_CCM_CBCMR);
- mux = _get_mux(parent, &axi_a_clk, &axi_b_clk, &weim_clk[0], &ahb_clk);
+ mux = _get_mux(parent, &axi_a_clk, &axi_b_clk, &weim_clk, &ahb_clk);
reg = (reg & ~MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK) |
(mux << MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET);
__raw_writel(reg, MXC_CCM_CBCMR);
@@ -2581,7 +2229,6 @@ static int _clk_gpu2d_set_parent(struct clk *clk, struct clk *parent)
static struct clk gpu2d_clk = {
.name = "gpu2d_clk",
.parent = &axi_a_clk,
- .secondary = &ddr_clk,
.set_parent = _clk_gpu2d_set_parent,
.enable = _clk_enable,
.enable_reg = MXC_CCM_CCGR6,
@@ -2592,25 +2239,13 @@ static struct clk gpu2d_clk = {
static struct clk apbh_dma_clk = {
.name = "apbh_dma_clk",
- .parent = &ahb_clk,
- .secondary = &ddr_clk,
+ .parent = &pll1_sw_clk,
.enable = _clk_enable,
- .disable = _clk_disable_inwait,
+ .disable = _clk_disable,
.enable_reg = MXC_CCM_CCGR7,
.enable_shift = MXC_CCM_CCGR7_CG10_OFFSET,
};
-struct clk dcp_clk = {
- .name = "dcp_clk",
- .id = 0,
- .parent = &ahb_clk,
- .secondary = &apbh_dma_clk,
- .enable = _clk_enable,
- .enable_reg = MXC_CCM_CCGR7,
- .enable_shift = MXC_CCM_CCGR7_CG11_OFFSET,
- .disable = _clk_disable,
-};
-
static int _clk_display_axi_set_parent(struct clk *clk, struct clk *parent)
{
u32 reg, mux;
@@ -2657,15 +2292,17 @@ static int _clk_display_axi_set_rate(struct clk *clk, unsigned long rate)
reg |= new_div << MXC_CCM_DISPLAY_AXI_DIV_OFFSET;
__raw_writel(reg, MXC_CCM_DISPLAY_AXI);
+#if 0
while (__raw_readl(MXC_CCM_CSR2) & MXC_CCM_CSR2_DISPLAY_AXI_BUSY)
;
+#endif
+
return 0;
}
static struct clk display_axi_clk = {
.name = "display_axi",
.parent = &osc_clk,
- .secondary = &apbh_dma_clk,
.set_parent = _clk_display_axi_set_parent,
.recalc = _clk_display_axi_recalc,
.set_rate = _clk_display_axi_set_rate,
@@ -2674,18 +2311,17 @@ static struct clk display_axi_clk = {
.disable = _clk_disable,
.enable_reg = MXC_CCM_DISPLAY_AXI,
.enable_shift = MXC_CCM_DISPLAY_AXI_CLKGATE_OFFSET,
- .flags = RATE_PROPAGATES,
};
/* TODO: check Auto-Slow Mode */
static struct clk pxp_axi_clk = {
.name = "pxp_axi",
.parent = &display_axi_clk,
+ .secondary = &apbh_dma_clk,
.enable = _clk_enable,
.disable = _clk_disable,
.enable_reg = MXC_CCM_CCGR6,
.enable_shift = MXC_CCM_CCGR6_CG9_OFFSET,
- .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE,
};
static struct clk elcdif_axi_clk = {
@@ -2695,7 +2331,6 @@ static struct clk elcdif_axi_clk = {
.disable = _clk_disable,
.enable_reg = MXC_CCM_CCGR6,
.enable_shift = MXC_CCM_CCGR6_CG10_OFFSET,
- .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE,
};
static int _clk_elcdif_pix_set_parent(struct clk *clk, struct clk *parent)
@@ -2750,40 +2385,17 @@ static int _clk_elcdif_pix_set_rate(struct clk *clk, unsigned long rate)
return 0;
}
-static int _clk_elcdif_pix_enable(struct clk *clk)
-{
- u32 reg;
-
- _clk_enable(clk);
- reg = __raw_readl(MXC_CCM_ELCDIFPIX);
- reg |= 0x3 << MXC_CCM_ELCDIFPIX_CLKGATE_OFFSET;
- __raw_writel(reg, MXC_CCM_ELCDIFPIX);
- return 0;
-}
-
-static void _clk_elcdif_pix_disable(struct clk *clk)
-{
- u32 reg;
-
- reg = __raw_readl(MXC_CCM_ELCDIFPIX);
- reg &= ~MXC_CCM_ELCDIFPIX_CLKGATE_MASK;
- __raw_writel(reg, MXC_CCM_ELCDIFPIX);
- _clk_disable(clk);
-}
-
static struct clk elcdif_pix_clk = {
.name = "elcdif_pix",
.parent = &osc_clk,
- .secondary = &ddr_clk,
- .enable = _clk_elcdif_pix_enable,
- .disable = _clk_elcdif_pix_disable,
+ .enable = _clk_enable,
+ .disable = _clk_disable,
.enable_reg = MXC_CCM_CCGR6,
.enable_shift = MXC_CCM_CCGR6_CG6_OFFSET,
.set_parent = _clk_elcdif_pix_set_parent,
.recalc = _clk_elcdif_pix_recalc,
.round_rate = _clk_elcdif_pix_round_rate,
.set_rate = _clk_elcdif_pix_set_rate,
- .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE,
};
static int _clk_epdc_axi_set_parent(struct clk *clk, struct clk *parent)
@@ -2857,7 +2469,10 @@ static int _clk_epdc_axi_enable(struct clk *clk)
{
u32 reg;
- _clk_enable(clk);
+ reg = __raw_readl(MXC_CCM_CCGR6);
+ reg |= MXC_CCM_CCGR6_CG8_MASK;
+ __raw_writel(reg, MXC_CCM_CCGR6);
+
reg = __raw_readl(MXC_CCM_EPDC_AXI);
reg |= MXC_CCM_EPDC_AXI_CLKGATE_MASK;
__raw_writel(reg, MXC_CCM_EPDC_AXI);
@@ -2869,26 +2484,25 @@ static void _clk_epdc_axi_disable(struct clk *clk)
{
u32 reg;
+ reg = __raw_readl(MXC_CCM_CCGR6);
+ reg &= ~MXC_CCM_CCGR6_CG8_MASK;
+ __raw_writel(reg, MXC_CCM_CCGR6);
+
reg = __raw_readl(MXC_CCM_EPDC_AXI);
reg &= ~MXC_CCM_EPDC_AXI_CLKGATE_MASK;
__raw_writel(reg, MXC_CCM_EPDC_AXI);
- _clk_disable(clk);
}
/* TODO: check Auto-Slow Mode */
static struct clk epdc_axi_clk = {
.name = "epdc_axi",
- .parent = &osc_clk,
- .secondary = &apbh_dma_clk,
- .enable_reg = MXC_CCM_CCGR6,
- .enable_shift = MXC_CCM_CCGR6_CG8_OFFSET,
+ .parent = &apbh_dma_clk,
.set_parent = _clk_epdc_axi_set_parent,
.recalc = _clk_epdc_axi_recalc,
.set_rate = _clk_epdc_axi_set_rate,
.round_rate = _clk_epdc_axi_round_rate,
.enable = _clk_epdc_axi_enable,
.disable = _clk_epdc_axi_disable,
- .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE,
};
@@ -2951,7 +2565,10 @@ static int _clk_epdc_pix_enable(struct clk *clk)
{
u32 reg;
- _clk_enable(clk);
+ reg = __raw_readl(MXC_CCM_CCGR6);
+ reg |= MXC_CCM_CCGR6_CG5_MASK;
+ __raw_writel(reg, MXC_CCM_CCGR6);
+
reg = __raw_readl(MXC_CCM_EPDCPIX);
reg |= MXC_CCM_EPDC_PIX_CLKGATE_MASK;
__raw_writel(reg, MXC_CCM_EPDCPIX);
@@ -2963,26 +2580,25 @@ static void _clk_epdc_pix_disable(struct clk *clk)
{
u32 reg;
+ reg = __raw_readl(MXC_CCM_CCGR6);
+ reg &= ~MXC_CCM_CCGR6_CG5_MASK;
+ __raw_writel(reg, MXC_CCM_CCGR6);
+
reg = __raw_readl(MXC_CCM_EPDCPIX);
reg &= ~MXC_CCM_EPDC_PIX_CLKGATE_MASK;
__raw_writel(reg, MXC_CCM_EPDCPIX);
- _clk_disable(clk);
}
/* TODO: check Auto-Slow Mode */
static struct clk epdc_pix_clk = {
.name = "epdc_pix",
.parent = &osc_clk,
- .secondary = &apbh_dma_clk,
- .enable_reg = MXC_CCM_CCGR6,
- .enable_shift = MXC_CCM_CCGR6_CG5_OFFSET,
.set_parent = _clk_epdc_pix_set_parent,
.recalc = _clk_epdc_pix_recalc,
.set_rate = _clk_epdc_pix_set_rate,
.round_rate = _clk_epdc_pix_round_rate,
.enable = _clk_epdc_pix_enable,
.disable = _clk_epdc_pix_disable,
- .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE,
};
static void cko1_recalc(struct clk *clk)
@@ -3078,7 +2694,7 @@ static int cko1_set_parent(struct clk *clk, struct clk *parent)
} else if (parent == &pfd6_clk) {
sel = 7;
fast = 0;
- } else if (parent == &weim_clk[0]) {
+ } else if (parent == &weim_clk) {
sel = 10;
fast = 0;
} else if (parent == &ahb_clk) {
@@ -3106,7 +2722,6 @@ static int cko1_set_parent(struct clk *clk, struct clk *parent)
__raw_writel(reg, MXC_CCM_CCOSR);
return 0;
}
-
static struct clk cko1_clk = {
.name = "cko1_clk",
.parent = &pll1_sw_clk,
@@ -3127,15 +2742,6 @@ static struct clk *mxc_clks[] = {
&pll1_sw_clk,
&pll2_sw_clk,
&pll3_sw_clk,
- &apll_clk,
- &pfd0_clk,
- &pfd1_clk,
- &pfd2_clk,
- &pfd3_clk,
- &pfd4_clk,
- &pfd5_clk,
- &pfd6_clk,
- &pfd7_clk,
&ipmux1_clk,
&ipmux2_clk,
&gpc_dvfs_clk,
@@ -3200,16 +2806,14 @@ static struct clk *mxc_clks[] = {
&esdhc4_clk[0],
&esdhc4_clk[1],
&esdhc_dep_clks,
- &weim_clk[0],
- &weim_clk[1],
+ &weim_clk,
&ddr_clk,
&pgc_clk,
&rtc_clk,
- &rng_clk,
- &dcp_clk,
&owire_clk,
&fec_clk[0],
&fec_clk[1],
+ &fec_clk[2],
&gpu2d_clk,
&cko1_clk,
&display_axi_clk,
@@ -3218,11 +2822,6 @@ static struct clk *mxc_clks[] = {
&epdc_axi_clk,
&epdc_pix_clk,
&elcdif_pix_clk,
- &gpmi_nfc_clk[0],
- &gpmi_nfc_clk[1],
- &gpmi_nfc_clk[2],
- &gpmi_nfc_clk[3],
- &ocotp_clk,
};
static void clk_tree_init(void)
@@ -3252,10 +2851,10 @@ static void clk_tree_init(void)
pll3_sw_clk.parent = &osc_clk;
/* set weim_clk parent */
- weim_clk[0].parent = &main_bus_clk;
+ weim_clk.parent = &main_bus_clk;
reg = __raw_readl(MXC_CCM_CBCDR);
if ((reg & MX50_CCM_CBCDR_WEIM_CLK_SEL) != 0)
- weim_clk[0].parent = &ahb_clk;
+ weim_clk.parent = &ahb_clk;
/* set ipg_perclk parent */
ipg_perclk.parent = &lp_apm_clk;
@@ -3278,12 +2877,11 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
pll1_base = ioremap(MX53_BASE_ADDR(PLL1_BASE_ADDR), SZ_4K);
pll2_base = ioremap(MX53_BASE_ADDR(PLL2_BASE_ADDR), SZ_4K);
pll3_base = ioremap(MX53_BASE_ADDR(PLL3_BASE_ADDR), SZ_4K);
- apll_base = ioremap(ANATOP_BASE_ADDR, SZ_4K);
/* Turn off all possible clocks */
if (mxc_jtag_enabled) {
__raw_writel(1 << MXC_CCM_CCGR0_CG0_OFFSET |
- 3 << MXC_CCM_CCGR0_CG2_OFFSET |
+ 1 << MXC_CCM_CCGR0_CG2_OFFSET |
3 << MXC_CCM_CCGR0_CG3_OFFSET |
3 << MXC_CCM_CCGR0_CG4_OFFSET |
3 << MXC_CCM_CCGR0_CG8_OFFSET |
@@ -3304,14 +2902,17 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
__raw_writel(0, MXC_CCM_CCGR3);
__raw_writel(0, MXC_CCM_CCGR4);
- __raw_writel(3 << MXC_CCM_CCGR5_CG6_OFFSET |
+ __raw_writel(1 << MXC_CCM_CCGR5_CG6_OFFSET |
1 << MXC_CCM_CCGR5_CG8_OFFSET |
3 << MXC_CCM_CCGR5_CG9_OFFSET, MXC_CCM_CCGR5);
__raw_writel(3 << MXC_CCM_CCGR6_CG0_OFFSET |
3 << MXC_CCM_CCGR6_CG1_OFFSET |
- 2 << MXC_CCM_CCGR6_CG14_OFFSET |
- 3 << MXC_CCM_CCGR6_CG15_OFFSET, MXC_CCM_CCGR6);
+ 3 << MXC_CCM_CCGR6_CG4_OFFSET |
+ 3 << MXC_CCM_CCGR6_CG8_OFFSET |
+ 3 << MXC_CCM_CCGR6_CG9_OFFSET |
+ 3 << MXC_CCM_CCGR6_CG12_OFFSET |
+ 3 << MXC_CCM_CCGR6_CG13_OFFSET , MXC_CCM_CCGR6);
__raw_writel(0, MXC_CCM_CCGR7);
@@ -3334,8 +2935,6 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
clk_register(&i2c_clk[2]);
clk_register(&usb_phy_clk[1]);
clk_register(&ocram_clk);
- clk_register(&apbh_dma_clk);
- clk_register(&sys_clk);
/* set DDR clock parent */
reg = __raw_readl(MXC_CCM_CLK_DDR) &
@@ -3350,6 +2949,22 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
clk_set_parent(&esdhc2_clk[0], &esdhc1_clk[0]);
clk_set_parent(&esdhc3_clk[0], &pll2_sw_clk);
+ clk_register(&apbh_dma_clk);
+
+ clk_set_parent(&epdc_axi_clk, &pll1_sw_clk);
+ /* Set EPDC AXI to 200MHz */
+ /*
+ clk_set_rate(&epdc_axi_clk, 200000000);
+ */
+ __raw_writel(0xC0000008, MXC_CCM_EPDC_AXI);
+ clk_set_parent(&epdc_pix_clk, &pll1_sw_clk);
+
+ reg = __raw_readl(MXC_CCM_ELCDIFPIX);
+ reg &= ~MXC_CCM_ELCDIFPIX_CLKGATE_MASK;
+ reg = 0x3 << MXC_CCM_ELCDIFPIX_CLKGATE_OFFSET;
+ __raw_writel(reg, MXC_CCM_ELCDIFPIX);
+ clk_set_parent(&elcdif_pix_clk, &pll1_sw_clk);
+
/* This will propagate to all children and init all the clock rates */
propagate_rate(&osc_clk);
propagate_rate(&ckih_clk);
@@ -3357,15 +2972,12 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
propagate_rate(&pll1_sw_clk);
propagate_rate(&pll2_sw_clk);
propagate_rate(&pll3_sw_clk);
- propagate_rate(&apll_clk);
clk_enable(&cpu_clk);
clk_enable(&main_bus_clk);
- clk_enable(&ocotp_clk);
-
- databahn = ioremap(MX50_DATABAHN_BASE_ADDR, SZ_16K);
+ clk_enable(&apbh_dma_clk);
/* Initialise the parents to be axi_b, parents are set to
* axi_a when the clocks are enabled.
@@ -3377,35 +2989,9 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
clk_set_parent(&cspi_main_clk, &lp_apm_clk);
clk_set_rate(&cspi_main_clk, 12000000);
- /*
- * Set DISPLAY_AXI to 200Mhz
- * For Display AXI, source clocks must be
- * enabled before dividers can be changed
- */
- clk_enable(&display_axi_clk);
- clk_enable(&elcdif_axi_clk);
- clk_enable(&pxp_axi_clk);
- clk_set_parent(&display_axi_clk, &pfd2_clk);
+ /* set DISPLAY_AXI to 200Mhz */
+ clk_set_parent(&display_axi_clk, &pll1_sw_clk);
clk_set_rate(&display_axi_clk, 200000000);
- clk_disable(&display_axi_clk);
- clk_disable(&pxp_axi_clk);
- clk_disable(&elcdif_axi_clk);
-
- clk_enable(&elcdif_pix_clk);
- clk_set_parent(&elcdif_pix_clk, &pll1_sw_clk);
- clk_disable(&elcdif_pix_clk);
-
- /*
- * Enable and set EPDC AXI to 200MHz
- * For EPDC AXI, source clocks must be
- * enabled before dividers can be changed
- */
- clk_enable(&epdc_axi_clk);
- clk_set_parent(&epdc_axi_clk, &pfd3_clk);
- clk_set_rate(&epdc_axi_clk, 200000000);
- clk_disable(&epdc_axi_clk);
-
- clk_set_parent(&epdc_pix_clk, &pfd5_clk);
/* Move SSI clocks to SSI_LP_APM clock */
clk_set_parent(&ssi_lp_apm_clk, &lp_apm_clk);
@@ -3425,17 +3011,17 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
reg |= 1 << MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET;
__raw_writel(reg, MXC_CCM_CS2CDR);
- /* Change the SSI_EXT1_CLK to be sourced from SSI1_CLK_ROOT */
- clk_set_parent(&ssi_ext1_clk, &ssi1_clk[0]);
+ /* Change the SSI_EXT1_CLK to be sourced from PLL2 for camera */
+ clk_disable(&ssi_ext1_clk);
+ clk_set_parent(&ssi_ext1_clk, &pll2_sw_clk);
+ clk_set_rate(&ssi_ext1_clk, 24000000);
+ clk_enable(&ssi_ext1_clk);
clk_set_parent(&ssi_ext2_clk, &ssi2_clk[0]);
/* move usb_phy_clk to 24MHz */
clk_set_parent(&usb_phy_clk[0], &osc_clk);
clk_set_parent(&usb_phy_clk[1], &osc_clk);
- /* move gpmi-nfc to 24MHz */
- clk_set_parent(&gpmi_nfc_clk[0], &osc_clk);
-
/* set SDHC root clock as 200MHZ*/
clk_set_rate(&esdhc1_clk[0], 200000000);
clk_set_rate(&esdhc3_clk[0], 200000000);
@@ -3510,12 +3096,8 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
clk_set_parent(&uart_main_clk, &lp_apm_clk);
clk_set_parent(&gpu2d_clk, &axi_b_clk);
- clk_set_parent(&weim_clk[0], &ahb_clk);
- clk_set_rate(&weim_clk[0], clk_round_rate(&weim_clk[0], 130000000));
-
- /* Do the following just to disable the PLL since its not used */
- clk_enable(&pll3_sw_clk);
- clk_disable(&pll3_sw_clk);
+ clk_set_parent(&weim_clk, &ahb_clk);
+ clk_set_rate(&weim_clk, clk_round_rate(&weim_clk, 130000000));
base = ioremap(MX53_BASE_ADDR(GPT1_BASE_ADDR), SZ_4K);
mxc_timer_init(&gpt_clk[0], base, MXC_INT_GPT);
diff --git a/arch/arm/mach-mx5/cpu.c b/arch/arm/mach-mx5/cpu.c
index 44440569f041..5abba44d25ad 100644
--- a/arch/arm/mach-mx5/cpu.c
+++ b/arch/arm/mach-mx5/cpu.c
@@ -19,7 +19,6 @@
* @ingroup MSL_MX51
*/
-#include <linux/proc_fs.h>
#include <linux/types.h>
#include <linux/err.h>
#include <linux/kernel.h>
@@ -29,7 +28,6 @@
#include <linux/clk.h>
#include <mach/common.h>
#include <mach/hardware.h>
-#include <asm/mach/map.h>
#define CORTEXA8_PLAT_AMC 0x18
#define SRPG_NEON_PUPSCR 0x284
@@ -43,12 +41,6 @@
void __iomem *arm_plat_base;
void __iomem *gpc_base;
-void __iomem *ccm_base;
-void __iomem *databahn_base;
-void *wait_in_iram_base;
-void (*wait_in_iram)(void *ccm_addr, void *databahn_addr);
-
-extern void mx50_wait(u32 ccm_base, u32 databahn_addr);
struct cpu_wp *(*get_cpu_wp)(int *wp);
void (*set_num_cpu_wp)(int num);
@@ -138,8 +130,6 @@ static int __init post_cpu_init(void)
}
gpc_base = ioremap(MX53_BASE_ADDR(GPC_BASE_ADDR), SZ_4K);
- ccm_base = ioremap(MX53_BASE_ADDR(CCM_BASE_ADDR), SZ_4K);
-
clk_enable(gpcclk);
/* Setup the number of clock cycles to wait for SRPG
@@ -192,42 +182,6 @@ static int __init post_cpu_init(void)
iounmap(base);
}
- databahn_base = ioremap(MX50_DATABAHN_BASE_ADDR, SZ_16K);
-
- if (cpu_is_mx50()) {
- struct clk *ddr_clk = clk_get(NULL, "ddr_clk");
- unsigned long iram_paddr;
-
- iram_alloc(SZ_4K, &iram_paddr);
- /* Need to remap the area here since we want the memory region
- to be executable. */
- wait_in_iram_base = __arm_ioremap(iram_paddr,
- SZ_4K, MT_HIGH_VECTORS);
- memcpy(wait_in_iram_base, mx50_wait, SZ_4K);
- wait_in_iram = (void *)wait_in_iram_base;
-
- clk_enable(ddr_clk);
-
- /* Set the DDR to enter automatic self-refresh. */
- /* Set the DDR to automatically enter lower power mode 4. */
- reg = __raw_readl(databahn_base + DATABAHN_CTL_REG22);
- reg &= ~LOWPOWER_AUTOENABLE_MASK;
- reg |= 1 << 1;
- __raw_writel(reg, databahn_base + DATABAHN_CTL_REG22);
-
- /* set the counter for entering mode 4. */
- reg = __raw_readl(databahn_base + DATABAHN_CTL_REG21);
- reg &= ~LOWPOWER_EXTERNAL_CNT_MASK;
- reg = 128 << LOWPOWER_EXTERNAL_CNT_OFFSET;
- __raw_writel(reg, databahn_base + DATABAHN_CTL_REG21);
-
- /* Enable low power mode 4 */
- reg = __raw_readl(databahn_base + DATABAHN_CTL_REG20);
- reg &= ~LOWPOWER_CONTROL_MASK;
- reg |= 1 << 1;
- __raw_writel(reg, databahn_base + DATABAHN_CTL_REG20);
- clk_disable(ddr_clk);
- }
return 0;
}
diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-mx5/crm_regs.h
index b2660a34c0e9..a1444786b72e 100644
--- a/arch/arm/mach-mx5/crm_regs.h
+++ b/arch/arm/mach-mx5/crm_regs.h
@@ -70,56 +70,6 @@
#define MXC_PLL_DP_DESTAT_TOG_SEL (1 << 31)
#define MXC_PLL_DP_DESTAT_MFN 0x07FFFFFF
-/* Register addresses of apll and pfd*/
-#define MXC_ANADIG_FRAC0 0x10
-#define MXC_ANADIG_FRAC0_SET 0x14
-#define MXC_ANADIG_FRAC0_CLR 0x18
-#define MXC_ANADIG_FRAC1 0x20
-#define MXC_ANADIG_FRAC1_SET 0x24
-#define MXC_ANADIG_FRAC1_CLR 0x28
-#define MXC_ANADIG_MISC 0x60
-#define MXC_ANADIG_MISC_SET 0x64
-#define MXC_ANADIG_MISC_CLR 0x68
-#define MXC_ANADIG_PLLCTRL 0x70
-#define MXC_ANADIG_PLLCTRL_SET 0x74
-#define MXC_ANADIG_PLLCTRL_CLR 0x78
-
-/* apll and pfd Register Bit definitions */
-
-#define MXC_ANADIG_PFD3_CLKGATE (1 << 31)
-#define MXC_ANADIG_PFD3_STABLE (1 << 30)
-#define MXC_ANADIG_PFD3_FRAC_OFFSET 24
-#define MXC_ANADIG_PFD_FRAC_MASK 0x3F
-#define MXC_ANADIG_PFD2_CLKGATE (1 << 23)
-#define MXC_ANADIG_PFD2_STABLE (1 << 22)
-#define MXC_ANADIG_PFD2_FRAC_OFFSET 16
-#define MXC_ANADIG_PFD1_CLKGATE (1 << 15)
-#define MXC_ANADIG_PFD1_STABLE (1 << 14)
-#define MXC_ANADIG_PFD1_FRAC_OFFSET 8
-#define MXC_ANADIG_PFD0_CLKGATE (1 << 7)
-#define MXC_ANADIG_PFD0_STABLE (1 << 6)
-#define MXC_ANADIG_PFD0_FRAC_OFFSET 0
-
-#define MXC_ANADIG_PFD7_CLKGATE (1 << 31)
-#define MXC_ANADIG_PFD7_STABLE (1 << 30)
-#define MXC_ANADIG_PFD7_FRAC_OFFSET 24
-#define MXC_ANADIG_PFD6_CLKGATE (1 << 23)
-#define MXC_ANADIG_PFD6_STABLE (1 << 22)
-#define MXC_ANADIG_PFD6_FRAC_OFFSET 16
-#define MXC_ANADIG_PFD5_CLKGATE (1 << 15)
-#define MXC_ANADIG_PFD5_STABLE (1 << 14)
-#define MXC_ANADIG_PFD5_FRAC_OFFSET 8
-#define MXC_ANADIG_PFD4_CLKGATE (1 << 7)
-#define MXC_ANADIG_PFD4_STABLE (1 << 6)
-#define MXC_ANADIG_PFD4_FRAC_OFFSET 0
-
-#define MXC_ANADIG_APLL_LOCK (1 << 31)
-#define MXC_ANADIG_APLL_FORCE_LOCK (1 << 30)
-#define MXC_ANADIG_PFD_DIS_OFFSET 16
-#define MXC_ANADIG_PFD_DIS_MASK 0xff
-#define MXC_ANADIG_APLL_LOCK_CNT_OFFSET 0
-#define MXC_ANADIG_APLL_LOCK_CNT_MASK 0xffff
-
/* Register addresses of CCM*/
#define MXC_CCM_CCR (MXC_CCM_BASE + 0x00)
#define MXC_CCM_CCDR (MXC_CCM_BASE + 0x04)
@@ -168,11 +118,6 @@
#define MXC_CCM_BCH (MXC_CCM_BASE + 0xB0)
#define MXC_CCM_MSHC_XMSCKI (MXC_CCM_BASE + 0xB4)
-/* CCM Register Offsets. */
-#define MXC_CCM_CDCR_OFFSET 0x4C
-#define MXC_CCM_CACRR_OFFSET 0x10
-#define MXC_CCM_CDHIPR_OFFSET 0x48
-
/* Define the bits in register CCR */
#define MXC_CCM_CCR_COSC_EN (1 << 12)
#define MXC_CCM_CCR_FPM_MULT_MASK (1 << 11)
@@ -234,9 +179,7 @@
#define MXC_CCM_CBCDR_DDR_HF_SEL_OFFSET (30)
#define MXC_CCM_CBCDR_DDR_HF_SEL (0x1 << 30)
#define MXC_CCM_CBCDR_DDR_PODF_OFFSET (27)
-#define MXC_CCM_CBCDR_DDR_PODF_MASK (0x7 << 27)
-#define MX50_CCM_CBCDR_WEIM_PODF_OFFSET (22)
-#define MX50_CCM_CBCDR_WEIM_PODF_MASK (0x7 << 22)
+#define MXC_CCM_CBCDR_DDR_PODF_MASK (0x7 << 27)
#define MXC_CCM_CBCDR_EMI_PODF_OFFSET (22)
#define MXC_CCM_CBCDR_EMI_PODF_MASK (0x7 << 22)
#define MXC_CCM_CBCDR_AXI_B_PODF_OFFSET (19)
@@ -298,8 +241,6 @@
#define MX50_CCM_CSCMR1_ESDHC1_CLK_SEL_MASK (0x3 << 21)
#define MX50_CCM_CSCMR1_ESDHC2_CLK_SEL (0x1 << 20)
#define MX50_CCM_CSCMR1_ESDHC4_CLK_SEL (0x1 << 19)
-#define MX50_CCM_CSCMR1_ESDHC3_CLK_SEL_OFFSET (16)
-#define MX50_CCM_CSCMR1_ESDHC3_CLK_SEL_MASK (0x7 << 16)
#define MXC_CCM_CSCMR1_ESDHC3_MSHC2_CLK_SEL_OFFSET (16)
#define MXC_CCM_CSCMR1_ESDHC3_MSHC2_CLK_SEL_MASK (0x3 << 16)
#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET (14)
@@ -832,17 +773,6 @@
#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_DISPLAY_AXI_CLK_SEL_MASK (0x3 << 2)
-/* Define the bits in registers CLK_SYS */
-#define MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_OFFSET (30)
-#define MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK (0x3 << 30)
-#define MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_OFFSET (28)
-#define MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK (0x3 << 28)
-#define MXC_CCM_CLK_SYS_DIV_XTAL_OFFSET (6)
-#define MXC_CCM_CLK_SYS_DIV_XTAL_MASK (0xF << 6)
-#define MXC_CCM_CLK_SYS_DIV_PLL_OFFSET (0)
-#define MXC_CCM_CLK_SYS_DIV_PLL_MASK (0x3F)
-
-
/* Define the bits in registers CLK_DDR */
#define MXC_CCM_CLK_DDR_DDR_CLKGATE_OFFSET (30)
#define MXC_CCM_CLK_DDR_DDR_CLKGATE_MASK (0x3 << 30)
@@ -878,19 +808,6 @@
#define MXC_CCM_ELCDIFPIX_CLK_PODF_OFFSET (0)
#define MXC_CCM_ELCDIFPIX_CLK_PODF_MASK (0xFFF)
-
-/* Define the bits in register GPMI */
-#define MXC_CCM_GPMI_CLKGATE_OFFSET (30)
-#define MXC_CCM_GPMI_CLKGATE_MASK (0x3 << 30)
-#define MXC_CCM_GPMI_CLK_DIV_OFFSET (0)
-#define MXC_CCM_GPMI_CLK_DIV_MASK (0x3F)
-
-/* Define the bits in register BCH */
-#define MXC_CCM_BCH_CLKGATE_OFFSET (30)
-#define MXC_CCM_BCH_CLKGATE_MASK (0x3 << 30)
-#define MXC_CCM_BCH_CLK_DIV_OFFSET (0)
-#define MXC_CCM_BCH_CLK_DIV_MASK (0x3F)
-
#define MXC_GPC_BASE (IO_ADDRESS(GPC_BASE_ADDR))
#define MXC_DPTC_LP_BASE (MXC_GPC_BASE + 0x80)
#define MXC_DPTC_GP_BASE (MXC_GPC_BASE + 0x100)
@@ -949,12 +866,11 @@ extern void __iomem *arm_plat_base;
#define MXC_DVFSPER_PMCR1 (MXC_DVFS_PER_BASE + 0x1C)
/* GPC */
-#define MXC_GPC_CNTR (MXC_GPC_BASE + 0x0)
-#define MXC_GPC_PGR (MXC_GPC_BASE + 0x4)
-#define MXC_GPC_VCR (MXC_GPC_BASE + 0x8)
-#define MXC_GPC_CNTR_OFFSET 0x0
-#define MXC_GPC_PGR_OFFSET 0x4
-#define MXC_GPC_VCR_OFFSET 0x8
+#define MXC_GPC_CNTR (MXC_GPC_BASE + 0x0)
+#define MXC_GPC_PGR (MXC_GPC_BASE + 0x4)
+#define MXC_GPC_VCR (MXC_GPC_BASE + 0x8)
+#define MXC_GPC_ALL_PU (MXC_GPC_BASE + 0xC)
+#define MXC_GPC_NEON (MXC_GPC_BASE + 0x10)
/* PGC */
#define MXC_PGC_IPU_PGCR (MXC_PGC_IPU_BASE + 0x0)
diff --git a/arch/arm/mach-mx5/devices.c b/arch/arm/mach-mx5/devices.c
index 09188c771c9d..fe842ea8e23d 100644
--- a/arch/arm/mach-mx5/devices.c
+++ b/arch/arm/mach-mx5/devices.c
@@ -23,14 +23,12 @@
#include <linux/uio_driver.h>
#include <linux/mxc_scc2_driver.h>
#include <linux/iram_alloc.h>
-#include <linux/gpmi-nfc.h>
#include <mach/common.h>
#include <mach/hardware.h>
#include <mach/gpio.h>
#include <mach/sdma.h>
#include "mx51_pins.h"
#include "devices.h"
-#include "dma-apbh.h"
/* Flag used to indicate when IRAM has been initialized */
int iram_ready;
@@ -98,11 +96,6 @@ struct platform_device mxc_keypad_device = {
.resource = mxc_kpp_resources,
};
-struct platform_device mxc_powerkey_device = {
- .name = "mxcpwrkey",
- .id = 0,
-};
-
static struct resource rtc_resources[] = {
{
.start = SRTC_BASE_ADDR,
@@ -149,55 +142,6 @@ struct platform_device mxc_nandv2_mtd_device = {
.num_resources = ARRAY_SIZE(mxc_nand_resources),
};
-static struct resource gpmi_nfc_resources[] = {
- {
- .name = GPMI_NFC_GPMI_REGS_ADDR_RES_NAME,
- .flags = IORESOURCE_MEM,
- .start = GPMI_BASE_ADDR,
- .end = GPMI_BASE_ADDR + SZ_8K - 1,
- },
- {
- .name = GPMI_NFC_GPMI_INTERRUPT_RES_NAME,
- .flags = IORESOURCE_IRQ,
- .start = MXC_INT_RAWNAND_GPMI,
- .end = MXC_INT_RAWNAND_GPMI,
- },
- {
- .name = GPMI_NFC_BCH_REGS_ADDR_RES_NAME,
- .flags = IORESOURCE_MEM,
- .start = BCH_BASE_ADDR,
- .end = BCH_BASE_ADDR + SZ_8K - 1,
- },
- {
- .name = GPMI_NFC_BCH_INTERRUPT_RES_NAME,
- .flags = IORESOURCE_IRQ,
- .start = MXC_INT_RAWNAND_BCH,
- .end = MXC_INT_RAWNAND_BCH,
- },
- {
- .name = GPMI_NFC_DMA_CHANNELS_RES_NAME,
- .flags = IORESOURCE_DMA,
- .start = MXS_DMA_CHANNEL_AHB_APBH_GPMI0,
- .end = MXS_DMA_CHANNEL_AHB_APBH_GPMI7,
- },
- {
- .name = GPMI_NFC_DMA_INTERRUPT_RES_NAME,
- .flags = IORESOURCE_IRQ,
- .start = MXC_INT_APBHDMA_CHAN0,
- .end = MXC_INT_APBHDMA_CHAN7,
- },
-};
-
-struct platform_device gpmi_nfc_device = {
- .name = GPMI_NFC_DRIVER_NAME,
- .id = 0,
- .dev = {
- .coherent_dma_mask = DMA_BIT_MASK(32),
- },
- .resource = gpmi_nfc_resources,
- .num_resources = ARRAY_SIZE(gpmi_nfc_resources),
-};
-
static struct resource imx_nfc_resources[] = {
{
.flags = IORESOURCE_MEM,
@@ -498,53 +442,6 @@ struct platform_device mxcscc_device = {
.resource = scc_resources,
};
-static struct resource dcp_resources[] = {
-
- {
- .flags = IORESOURCE_MEM,
- .start = DCP_BASE_ADDR,
- .end = DCP_BASE_ADDR + 0x2000 - 1,
- }, {
- .flags = IORESOURCE_IRQ,
- .start = MXC_INT_DCP_CHAN0,
- .end = MXC_INT_DCP_CHAN0,
- }, {
- .flags = IORESOURCE_IRQ,
- .start = MXC_INT_DCP_CHAN1_3,
- .end = MXC_INT_DCP_CHAN1_3,
- },
-};
-
-struct platform_device dcp_device = {
- .name = "dcp",
- .id = 0,
- .num_resources = ARRAY_SIZE(dcp_resources),
- .resource = dcp_resources,
- .dev = {
- .coherent_dma_mask = DMA_BIT_MASK(32),
- },
-};
-
-
-static struct resource rngb_resources[] = {
- {
- .start = RNGB_BASE_ADDR,
- .end = RNGB_BASE_ADDR + SZ_4K - 1,
- .flags = IORESOURCE_MEM,
- },
- {
- .start = MXC_INT_RNGB_BLOCK,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-/* the RNGC driver applies for MX50's RNGB hw */
-struct platform_device mxc_rngb_device = {
- .name = "fsl_rngc",
- .id = 0,
- .num_resources = ARRAY_SIZE(rngb_resources),
- .resource = rngb_resources,
-};
static struct resource mxc_fec_resources[] = {
{
@@ -1063,20 +960,6 @@ struct platform_device pata_fsl_device = {
},
};
-/* On-Chip OTP device and resource */
-static struct resource otp_resource = {
- .start = OCOTP_CTRL_BASE_ADDR,
- .end = OCOTP_CTRL_BASE_ADDR + SZ_8K - 1,
- .flags = IORESOURCE_MEM,
-};
-
-struct platform_device fsl_otp_device = {
- .name = "ocotp",
- .id = -1,
- .resource = &otp_resource,
- .num_resources = 1,
-};
-
static struct resource ahci_fsl_resources[] = {
{
.start = MX53_SATA_BASE_ADDR,
@@ -1102,19 +985,7 @@ struct platform_device ahci_fsl_device = {
static u64 usb_dma_mask = DMA_BIT_MASK(32);
-static struct resource usbotg_host_resources[] = {
- {
- .start = OTG_BASE_ADDR,
- .end = OTG_BASE_ADDR + 0x1ff,
- .flags = IORESOURCE_MEM,
- },
- {
- .start = MXC_INT_USB_OTG,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-static struct resource usbotg_udc_resources[] = {
+static struct resource usbotg_resources[] = {
{
.start = OTG_BASE_ADDR,
.end = OTG_BASE_ADDR + 0x1ff,
@@ -1145,8 +1016,8 @@ struct platform_device mxc_usbdr_udc_device = {
.dma_mask = &usb_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
- .resource = usbotg_udc_resources,
- .num_resources = ARRAY_SIZE(usbotg_udc_resources),
+ .resource = usbotg_resources,
+ .num_resources = ARRAY_SIZE(usbotg_resources),
};
struct platform_device mxc_usbdr_otg_device = {
@@ -1163,8 +1034,8 @@ struct platform_device mxc_usbdr_otg_device = {
struct platform_device mxc_usbdr_host_device = {
.name = "fsl-ehci",
.id = 0,
- .num_resources = ARRAY_SIZE(usbotg_host_resources),
- .resource = usbotg_host_resources,
+ .num_resources = ARRAY_SIZE(usbotg_resources),
+ .resource = usbotg_resources,
.dev = {
.dma_mask = &usb_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
@@ -1405,74 +1276,6 @@ struct platform_device mxc_pxp_client_device = {
.id = -1,
};
-static u64 pxp_dma_mask = DMA_BIT_MASK(32);
-struct platform_device mxc_pxp_v4l2 = {
- .name = "pxp-v4l2",
- .id = -1,
- .dev = {
- .dma_mask = &pxp_dma_mask,
- .coherent_dma_mask = DMA_BIT_MASK(32),
- },
-};
-
-struct platform_device mxc_v4l2_device = {
- .name = "mxc_v4l2_capture",
- .id = 0,
-};
-
-struct platform_device mxc_v4l2out_device = {
- .name = "mxc_v4l2_output",
- .id = 0,
-};
-
-struct resource viim_resources[] = {
- [0] = {
- .start = (GPT1_BASE_ADDR - 0x20000000),
- .end = (GPT1_BASE_ADDR - 0x20000000) + PAGE_SIZE - 1,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = OCOTP_CTRL_BASE_ADDR,
- .end = OCOTP_CTRL_BASE_ADDR + PAGE_SIZE - 1,
- .flags = IORESOURCE_MEM,
- },
-};
-struct platform_device mxs_viim = {
- .name = "mxs_viim",
- .id = -1,
- .num_resources = ARRAY_SIZE(viim_resources),
- .resource = viim_resources,
-};
-
-static struct resource dma_apbh_resources[] = {
- {
- .start = APBHDMA_BASE_ADDR,
- .end = APBHDMA_BASE_ADDR + 0x2000 - 1,
- .flags = IORESOURCE_MEM,
- },
-};
-
-struct platform_device mxs_dma_apbh_device = {
- .name = "mxs-dma-apbh",
- .num_resources = ARRAY_SIZE(dma_apbh_resources),
- .resource = dma_apbh_resources,
-};
-
-struct platform_device mxc_android_pmem_device = {
- .name = "android_pmem",
- .id = 0,
-};
-
-struct platform_device mxc_android_pmem_gpu_device = {
- .name = "android_pmem",
- .id = 1,
-};
-
-struct platform_device android_usb_device = {
- .name = "android_usb",
- .id = -1,
-};
-
void __init mx5_init_irq(void)
{
unsigned long tzic_addr;
@@ -1731,8 +1534,6 @@ int __init mxc_init_devices(void)
scc_resources[0].end -= MX53_OFFSET;
scc_resources[1].start = MX53_SCC_RAM_BASE_ADDR;
scc_resources[1].end = MX53_SCC_RAM_BASE_ADDR + SZ_16K - 1;
- rngb_resources[0].start -= MX53_OFFSET;
- rngb_resources[0].end -= MX53_OFFSET;
mxcspi1_resources[0].start -= MX53_OFFSET;
mxcspi1_resources[0].end -= MX53_OFFSET;
mxcspi2_resources[0].start -= MX53_OFFSET;
@@ -1773,10 +1574,8 @@ int __init mxc_init_devices(void)
mxcsdhc2_resources[0].end -= MX53_OFFSET;
mxcsdhc3_resources[0].start -= MX53_OFFSET;
mxcsdhc3_resources[0].end -= MX53_OFFSET;
- usbotg_host_resources[0].start -= MX53_OFFSET;
- usbotg_host_resources[0].end -= MX53_OFFSET;
- usbotg_udc_resources[0].start -= MX53_OFFSET;
- usbotg_udc_resources[0].end -= MX53_OFFSET;
+ usbotg_resources[0].start -= MX53_OFFSET;
+ usbotg_resources[0].end -= MX53_OFFSET;
usbotg_xcvr_resources[0].start -= MX53_OFFSET;
usbotg_xcvr_resources[0].end -= MX53_OFFSET;
usbh1_resources[0].start -= MX53_OFFSET;
@@ -1785,20 +1584,10 @@ int __init mxc_init_devices(void)
usbh2_resources[0].end -= MX53_OFFSET;
mxc_gpu_resources[2].start = MX53_GPU2D_BASE_ADDR;
mxc_gpu_resources[2].end = MX53_GPU2D_BASE_ADDR + SZ_4K - 1;
+ mxc_gpu_resources[4].start = MX53_GPU_GMEM_BASE_ADDR;
+ mxc_gpu_resources[4].end = MX53_GPU_GMEM_BASE_ADDR + SZ_256K - 1;
mxc_gpu2d_resources[0].start = MX53_GPU2D_BASE_ADDR;
mxc_gpu2d_resources[0].end = MX53_GPU2D_BASE_ADDR + SZ_4K - 1;
- if (cpu_is_mx53()) {
- mxc_gpu_resources[4].start = MX53_GPU_GMEM_BASE_ADDR;
- mxc_gpu_resources[4].end = MX53_GPU_GMEM_BASE_ADDR
- + SZ_256K - 1;
- } else {
- mxc_gpu_resources[1].start = 0;
- mxc_gpu_resources[1].end = 0;
- mxc_gpu_resources[3].start = 0;
- mxc_gpu_resources[3].end = 0;
- mxc_gpu_resources[4].start = 0;
- mxc_gpu_resources[4].end = 0;
- }
ipu_resources[0].start = MX53_IPU_CTRL_BASE_ADDR;
ipu_resources[0].end = MX53_IPU_CTRL_BASE_ADDR + SZ_128M - 1;
mlb_resources[0].start -= MX53_OFFSET;
diff --git a/arch/arm/mach-mx5/devices.h b/arch/arm/mach-mx5/devices.h
index da6c6ac96428..8aaa128c561d 100644
--- a/arch/arm/mach-mx5/devices.h
+++ b/arch/arm/mach-mx5/devices.h
@@ -57,7 +57,6 @@ extern struct platform_device mxcsdhc2_device;
extern struct platform_device mxcsdhc3_device;
extern struct platform_device ahci_fsl_device;
extern struct platform_device pata_fsl_device;
-extern struct platform_device fsl_otp_device;
extern struct platform_device gpu_device;
extern struct platform_device mxc_fec_device;
extern struct platform_device mxc_usbdr_udc_device;
@@ -72,18 +71,5 @@ extern void __init ccwmx51_init_devices ( void );
extern struct platform_device mxc_nandv2_mtd_device;
extern struct platform_device mxc_pxp_device;
extern struct platform_device mxc_pxp_client_device;
-extern struct platform_device mxc_pxp_v4l2;
extern struct platform_device epdc_device;
extern struct platform_device elcdif_device;
-extern struct platform_device mxc_v4l2_device;
-extern struct platform_device mxc_v4l2out_device;
-extern struct platform_device mxs_viim;
-extern struct platform_device mxs_dma_apbh_device;
-extern struct platform_device gpmi_nfc_device;
-extern struct platform_device mxc_rngb_device;
-extern struct platform_device dcp_device;
-extern struct platform_device mxc_android_pmem_device;
-extern struct platform_device mxc_android_pmem_gpu_device;
-extern struct platform_device android_usb_device;
-extern struct platform_device mxc_powerkey_device;
-extern struct platform_device ccwmx51js_keys_gpio;
diff --git a/arch/arm/mach-mx5/devices_ccwmx51.c b/arch/arm/mach-mx5/devices_ccwmx51.c
index 27eb3dc32064..bd96da04bc62 100644
--- a/arch/arm/mach-mx5/devices_ccwmx51.c
+++ b/arch/arm/mach-mx5/devices_ccwmx51.c
@@ -55,8 +55,6 @@
#include "mx51_pins.h"
#include "displays/displays.h"
#include <linux/smc911x.h>
-#include <linux/fec.h>
-#include <linux/gpio_keys.h>
#if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE)
#include <linux/mtd/mtd.h>
@@ -523,11 +521,11 @@ struct mxc_dvfs_platform_data dvfs_core_data = {
.reg_id = "SW1",
.clk1_id = "cpu_clk",
.clk2_id = "gpc_dvfs_clk",
- .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET,
- .gpc_vcr_offset = MXC_GPC_VCR_OFFSET,
- .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET,
- .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET,
- .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET,
+ .gpc_cntr_reg_addr = MXC_GPC_CNTR,
+ .gpc_vcr_reg_addr = MXC_GPC_VCR,
+ .ccm_cdcr_reg_addr = MXC_CCM_CDCR,
+ .ccm_cacrr_reg_addr = MXC_CCM_CACRR,
+ .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR,
.prediv_mask = 0x1F800,
.prediv_offset = 11,
.prediv_val = 3,
@@ -561,11 +559,6 @@ struct mxc_dvfsper_data dvfs_per_data = {
.lp_low = 1200000,
};
-struct fec_platform_data fec_data = {
- .phy = PHY_INTERFACE_MODE_MII,
- .phy_mask = ~1UL,
-};
-
struct platform_pwm_backlight_data mxc_pwm_backlight_data = {
.pwm_id = 0,
.max_brightness = 255,
@@ -593,49 +586,6 @@ struct mxc_fb_platform_data mx51_fb_data[2] = {
}
};
-#if defined(CONFIG_KEYBOARD_GPIO)
-
-#define GPIO_BUTTON(gpio_num, ev_type, ev_code, act_low, descr) \
-{ \
- .gpio = gpio_num, \
- .type = ev_type, \
- .code = ev_code, \
- .active_low = act_low, \
- .desc = "btn " descr, \
-}
-
-#define GPIO_BUTTON_LOW(gpio_num, event_code, description) \
- GPIO_BUTTON(gpio_num, EV_KEY, event_code, 1, description)
-
-// user key 1
-#if defined(CONFIG_JSCCWMX51_V2)
-#define USER_KEY2_GPIO_NR 70
-#else
-#define USER_KEY2_GPIO_NR 8
-#endif
-// user key 2
-#define USER_KEY1_GPIO_NR 1
-
-static struct gpio_keys_button ccwmx51js_gpio_keys[] = {
- GPIO_BUTTON_LOW(USER_KEY1_GPIO_NR, KEY_MENU, "menu"),
- GPIO_BUTTON_LOW(USER_KEY2_GPIO_NR, KEY_HOME, "home"),
-};
-
-
-struct gpio_keys_platform_data ccwmx51js_gpio_key_info = {
- .buttons = ccwmx51js_gpio_keys,
- .nbuttons = ARRAY_SIZE(ccwmx51js_gpio_keys),
-};
-
-struct platform_device ccwmx51js_keys_gpio = {
- .name = "gpio-keys",
- .id = -1,
- .dev = {
- .platform_data = &ccwmx51js_gpio_key_info,
- },
-};
-#endif // KEYBOARD_GPIO
-
#if defined(CONFIG_FB_MXC_SYNC_PANEL) || defined(CONFIG_FB_MXC_SYNC_PANEL_MODULE)
struct ccwmx51_lcd_pdata plcd_platform_data[2];
diff --git a/arch/arm/mach-mx5/devices_ccwmx51.h b/arch/arm/mach-mx5/devices_ccwmx51.h
index 6e53be44a5f5..672bee19a123 100644
--- a/arch/arm/mach-mx5/devices_ccwmx51.h
+++ b/arch/arm/mach-mx5/devices_ccwmx51.h
@@ -28,7 +28,6 @@ extern struct mxc_w1_config mxc_w1_data;
extern struct mxc_spdif_platform_data mxc_spdif_data;
extern struct tve_platform_data tve_data;
extern struct mxc_dvfs_platform_data dvfs_core_data;
-extern struct fec_platform_data fec_data;
extern struct mxc_dvfsper_data dvfs_per_data;
extern struct platform_pwm_backlight_data mxc_pwm_backlight_data;
extern struct mxc_audio_platform_data wm8753_data;
@@ -48,9 +47,5 @@ extern void ccwmx51_set_mod_sn(u32 sn);
extern void ccwmx51_register_sdio(int interface);
extern void ccwmx51_init_devices(void);
extern int ccwmx51_create_sysfs_entries(void);
-extern struct gpio_keys_platform_data ccwmx51js_gpio_key_info;
-extern void ccwmx51_init_devices(void);
-extern int ccwmx51_create_sysfs_entries(void);
-
#endif /* DEVICES_CCWMX51_H_ */
diff --git a/arch/arm/mach-mx5/displays/hdmi_ad9389.h b/arch/arm/mach-mx5/displays/hdmi_ad9389.h
index 2a29cd783b48..b800fca3e9ff 100644
--- a/arch/arm/mach-mx5/displays/hdmi_ad9389.h
+++ b/arch/arm/mach-mx5/displays/hdmi_ad9389.h
@@ -24,6 +24,7 @@ static struct fb_videomode ad9389_1280x720x24 = {
.lower_margin = 3,
.hsync_len = 32,
.vsync_len = 6,
+ .sync = FB_SYNC_CLK_LAT_FALL,
};
static struct fb_videomode ad9389_1360x768x24 = {
@@ -38,6 +39,7 @@ static struct fb_videomode ad9389_1360x768x24 = {
.lower_margin = 18,
.hsync_len = 76,
.vsync_len = 6,
+ .sync = FB_SYNC_CLK_LAT_FALL,
};
@@ -53,6 +55,7 @@ static struct fb_videomode ad9389_1366x768x24 = {
.lower_margin = 18,
.hsync_len = 76,
.vsync_len = 6,
+ .sync = FB_SYNC_CLK_LAT_FALL,
};
static struct fb_videomode ad9389_1920x1080x24 = {
@@ -67,6 +70,7 @@ static struct fb_videomode ad9389_1920x1080x24 = {
.lower_margin = 4,
.hsync_len = 44,
.vsync_len = 5,
+ .sync = 0,
};
static struct fb_videomode ad9389_1024x768x24 = {
diff --git a/arch/arm/mach-mx5/mm.c b/arch/arm/mach-mx5/mm.c
index 21d654298b54..575c49830989 100644
--- a/arch/arm/mach-mx5/mm.c
+++ b/arch/arm/mach-mx5/mm.c
@@ -16,7 +16,6 @@
#include <mach/hardware.h>
#include <asm/pgtable.h>
#include <asm/mach/map.h>
-#include <mach/iomux-v3.h>
/*!
* @file mach-mx51/mm.c
@@ -61,7 +60,6 @@ void __init mx5_map_io(void)
{
int i;
- mxc_iomux_v3_init(IO_ADDRESS(IOMUXC_BASE_ADDR));
/* Fixup the mappings for MX53 */
if (cpu_is_mx53() || cpu_is_mx50()) {
for (i = 0; i < ARRAY_SIZE(mx5_io_desc); i++)
diff --git a/arch/arm/mach-mx5/mx50_arm2.c b/arch/arm/mach-mx5/mx50_arm2.c
index 13de0971ace4..3a4e8dc3e923 100644
--- a/arch/arm/mach-mx5/mx50_arm2.c
+++ b/arch/arm/mach-mx5/mx50_arm2.c
@@ -44,9 +44,6 @@
#include <linux/videodev2.h>
#include <linux/mxcfb.h>
#include <linux/fec.h>
-#include <linux/gpmi-nfc.h>
-#include <linux/android_pmem.h>
-#include <linux/usb/android.h>
#include <asm/irq.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
@@ -59,248 +56,29 @@
#include <mach/gpio.h>
#include <mach/mmc.h>
#include <mach/mxc_dvfs.h>
-#include <mach/iomux-mx50.h>
-
+#include "iomux.h"
+#include "mx50_pins.h"
#include "devices.h"
-#include "crm_regs.h"
#include "usb.h"
-#include "dma-apbh.h"
-
-#define SD1_WP (3*32 + 19) /*GPIO_4_19 */
-#define SD1_CD (0*32 + 27) /*GPIO_1_27 */
-#define SD2_WP (4*32 + 16) /*GPIO_5_16 */
-#define SD2_CD (4*32 + 17) /*GPIO_5_17 */
-#define SD3_WP (4*32 + 28) /*GPIO_5_28 */
-#define SD3_CD (3*32 + 4) /*GPIO_4_4 */
-#define HP_DETECT (3*32 + 15) /*GPIO_4_15 */
-#define PWR_INT (3*32 + 18) /*GPIO_4_18 */
-
-#define EPDC_D0 (2*32 + 1) /*GPIO_3_0 */
-#define EPDC_D1 (2*32 + 2) /*GPIO_3_1 */
-#define EPDC_D2 (2*32 + 3) /*GPIO_3_2 */
-#define EPDC_D3 (2*32 + 4) /*GPIO_3_3 */
-#define EPDC_D4 (2*32 + 5) /*GPIO_3_4 */
-#define EPDC_D5 (2*32 + 6) /*GPIO_3_5 */
-#define EPDC_D6 (2*32 + 7) /*GPIO_3_6 */
-#define EPDC_D7 (2*32 + 8) /*GPIO_3_7 */
-#define EPDC_GDCLK (2*32 + 16) /*GPIO_3_16 */
-#define EPDC_GDSP (2*32 + 17) /*GPIO_3_17 */
-#define EPDC_GDOE (2*32 + 18) /*GPIO_3_18 */
-#define EPDC_GDRL (2*32 + 19) /*GPIO_3_19 */
-#define EPDC_SDCLK (2*32 + 20) /*GPIO_3_20 */
-#define EPDC_SDOE (2*32 + 23) /*GPIO_3_23 */
-#define EPDC_SDLE (2*32 + 24) /*GPIO_3_24 */
-#define EPDC_SDSHR (2*32 + 26) /*GPIO_3_26 */
-#define EPDC_BDR0 (3*32 + 23) /*GPIO_4_23 */
-#define EPDC_SDCE0 (3*32 + 25) /*GPIO_4_25 */
-#define EPDC_SDCE1 (3*32 + 26) /*GPIO_4_26 */
-#define EPDC_SDCE2 (3*32 + 27) /*GPIO_4_27 */
-
-#define EPDC_PMIC_WAKE (5*32 + 16) /*GPIO_6_16 */
-#define EPDC_PMIC_INT (5*32 + 17) /*GPIO_6_17 */
-#define EPDC_VCOM (3*32 + 21) /*GPIO_4_21 */
-#define EPDC_PWRSTAT (2*32 + 28) /*GPIO_3_28 */
-#define EPDC_ELCDIF_BACKLIGHT (1*32 + 18) /*GPIO_2_18 */
-#define CSPI_CS1 (3*32 + 13) /*GPIO_4_13 */
-#define CSPI_CS2 (3*32 + 11) /*GPIO_4_11*/
+extern void __init mx50_arm2_io_init(void);
extern int __init mx50_arm2_init_mc13892(void);
extern struct cpu_wp *(*get_cpu_wp)(int *wp);
extern void (*set_num_cpu_wp)(int num);
-static int num_cpu_wp = 2;
-
-static struct pad_desc mx50_armadillo2[] = {
- /* SD1 */
- MX50_PAD_ECSPI2_SS0__GPIO_4_19,
- MX50_PAD_EIM_CRE__GPIO_1_27,
- MX50_PAD_SD1_CMD__SD1_CMD,
-
- MX50_PAD_SD1_CLK__SD1_CLK,
- MX50_PAD_SD1_D0__SD1_D0,
- MX50_PAD_SD1_D1__SD1_D1,
- MX50_PAD_SD1_D2__SD1_D2,
- MX50_PAD_SD1_D3__SD1_D3,
-
- /* SD2 */
- MX50_PAD_SD2_CD__GPIO_5_17,
- MX50_PAD_SD2_WP__GPIO_5_16,
- MX50_PAD_SD2_CMD__SD2_CMD,
- MX50_PAD_SD2_CLK__SD2_CLK,
- MX50_PAD_SD2_D0__SD2_D0,
- MX50_PAD_SD2_D1__SD2_D1,
- MX50_PAD_SD2_D2__SD2_D2,
- MX50_PAD_SD2_D3__SD2_D3,
- MX50_PAD_SD2_D4__SD2_D4,
- MX50_PAD_SD2_D5__SD2_D5,
- MX50_PAD_SD2_D6__SD2_D6,
- MX50_PAD_SD2_D7__SD2_D7,
-
- /* SD3 */
- MX50_PAD_SD3_WP__GPIO_5_28,
- MX50_PAD_KEY_COL2__GPIO_4_4,
- MX50_PAD_SD3_CMD__SD3_CMD,
- MX50_PAD_SD3_CLK__SD3_CLK,
- MX50_PAD_SD3_D0__SD3_D0,
- MX50_PAD_SD3_D1__SD3_D1,
- MX50_PAD_SD3_D2__SD3_D2,
- MX50_PAD_SD3_D3__SD3_D3,
- MX50_PAD_SD3_D4__SD3_D4,
- MX50_PAD_SD3_D5__SD3_D5,
- MX50_PAD_SD3_D6__SD3_D6,
- MX50_PAD_SD3_D7__SD3_D7,
-
- MX50_PAD_SSI_RXD__SSI_RXD,
- MX50_PAD_SSI_TXD__SSI_TXD,
- MX50_PAD_SSI_TXC__SSI_TXC,
- MX50_PAD_SSI_TXFS__SSI_TXFS,
-
- /* LINE1_DETECT (headphone detect) */
- MX50_PAD_ECSPI1_SS0__GPIO_4_15,
-
- /* PWR_INT */
- MX50_PAD_ECSPI2_MISO__GPIO_4_18,
-
- /* UART pad setting */
- MX50_PAD_UART1_TXD__UART1_TXD,
- MX50_PAD_UART1_RXD__UART1_RXD,
- MX50_PAD_UART1_CTS__UART1_CTS,
- MX50_PAD_UART1_RTS__UART1_RTS,
- MX50_PAD_UART2_TXD__UART2_TXD,
- MX50_PAD_UART2_RXD__UART2_RXD,
- MX50_PAD_UART2_CTS__UART2_CTS,
- MX50_PAD_UART2_RTS__UART2_RTS,
-
- MX50_PAD_I2C1_SCL__I2C1_SCL,
- MX50_PAD_I2C1_SDA__I2C1_SDA,
- MX50_PAD_I2C2_SCL__I2C2_SCL,
- MX50_PAD_I2C2_SDA__I2C2_SDA,
- MX50_PAD_I2C3_SCL__I2C3_SCL,
- MX50_PAD_I2C3_SDA__I2C3_SDA,
-
- /* EPDC pins */
- MX50_PAD_EPDC_D0__EPDC_D0,
- MX50_PAD_EPDC_D1__EPDC_D1,
- MX50_PAD_EPDC_D2__EPDC_D2,
- MX50_PAD_EPDC_D3__EPDC_D3,
- MX50_PAD_EPDC_D4__EPDC_D4,
- MX50_PAD_EPDC_D5__EPDC_D5,
- MX50_PAD_EPDC_D6__EPDC_D6,
- MX50_PAD_EPDC_D7__EPDC_D7,
- MX50_PAD_EPDC_GDCLK__EPDC_GDCLK,
- MX50_PAD_EPDC_GDSP__EPDC_GDSP,
- MX50_PAD_EPDC_GDOE__EPDC_GDOE ,
- MX50_PAD_EPDC_GDRL__EPDC_GDRL,
- MX50_PAD_EPDC_SDCLK__EPDC_SDCLK,
- MX50_PAD_EPDC_SDOE__EPDC_SDOE,
- MX50_PAD_EPDC_SDLE__EPDC_SDLE,
- MX50_PAD_EPDC_SDSHR__EPDC_SDSHR,
- MX50_PAD_EPDC_BDR0__EPDC_BDR0,
- MX50_PAD_EPDC_SDCE0__EPDC_SDCE0,
- MX50_PAD_EPDC_SDCE1__EPDC_SDCE1,
- MX50_PAD_EPDC_SDCE2__EPDC_SDCE2,
-
- MX50_PAD_EPDC_PWRSTAT__GPIO_3_28,
- MX50_PAD_EPDC_VCOM0__GPIO_4_21,
-
- MX50_PAD_DISP_D8__DISP_D8,
- MX50_PAD_DISP_D9__DISP_D9,
- MX50_PAD_DISP_D10__DISP_D10,
- MX50_PAD_DISP_D11__DISP_D11,
- MX50_PAD_DISP_D12__DISP_D12,
- MX50_PAD_DISP_D13__DISP_D13,
- MX50_PAD_DISP_D14__DISP_D14,
- MX50_PAD_DISP_D15__DISP_D15,
- MX50_PAD_DISP_RS__ELCDIF_VSYNC,
-
- /* ELCDIF contrast */
- MX50_PAD_DISP_BUSY__GPIO_2_18,
-
- MX50_PAD_DISP_CS__ELCDIF_HSYNC,
- MX50_PAD_DISP_RD__ELCDIF_EN,
- MX50_PAD_DISP_WR__ELCDIF_PIXCLK,
-
- /* EPD PMIC WAKEUP */
- MX50_PAD_UART4_TXD__GPIO_6_16,
-
- /* EPD PMIC intr */
- MX50_PAD_UART4_RXD__GPIO_6_17,
-
- MX50_PAD_EPITO__USBH1_PWR,
- /* Need to comment below line if
- * one needs to debug owire.
- */
- MX50_PAD_OWIRE__USBH1_OC,
- MX50_PAD_PWM2__USBOTG_PWR,
- MX50_PAD_PWM1__USBOTG_OC,
-
- MX50_PAD_SSI_RXC__FEC_MDIO,
- MX50_PAD_SSI_RXC__FEC_MDIO,
- MX50_PAD_DISP_D0__FEC_TXCLK,
- MX50_PAD_DISP_D1__FEC_RX_ER,
- MX50_PAD_DISP_D2__FEC_RX_DV,
- MX50_PAD_DISP_D3__FEC_RXD1,
- MX50_PAD_DISP_D4__FEC_RXD0,
- MX50_PAD_DISP_D5__FEC_TX_EN,
- MX50_PAD_DISP_D6__FEC_TXD1,
- MX50_PAD_DISP_D7__FEC_TXD0,
- MX50_PAD_SSI_RXFS__FEC_MDC,
-
- MX50_PAD_CSPI_SS0__CSPI_SS0,
- MX50_PAD_ECSPI1_MOSI__CSPI_SS1,
- MX50_PAD_CSPI_MOSI__CSPI_MOSI,
- MX50_PAD_CSPI_MISO__CSPI_MISO,
-};
-
-static struct pad_desc mx50_gpmi_nand[] = {
- MX50_PIN_EIM_DA8__NANDF_CLE,
- MX50_PIN_EIM_DA9__NANDF_ALE,
- MX50_PIN_EIM_DA10__NANDF_CE0,
- MX50_PIN_EIM_DA11__NANDF_CE1,
- MX50_PIN_EIM_DA12__NANDF_CE2,
- MX50_PIN_EIM_DA13__NANDF_CE3,
- MX50_PIN_EIM_DA14__NANDF_READY,
- MX50_PIN_EIM_DA15__NANDF_DQS,
- MX50_PIN_SD3_D4__NANDF_D0,
- MX50_PIN_SD3_D5__NANDF_D1,
- MX50_PIN_SD3_D6__NANDF_D2,
- MX50_PIN_SD3_D7__NANDF_D3,
- MX50_PIN_SD3_D0__NANDF_D4,
- MX50_PIN_SD3_D1__NANDF_D5,
- MX50_PIN_SD3_D2__NANDF_D6,
- MX50_PIN_SD3_D3__NANDF_D7,
- MX50_PIN_SD3_CLK__NANDF_RDN,
- MX50_PIN_SD3_CMD__NANDF_WRN,
- MX50_PIN_SD3_WP__NANDF_RESETN,
-};
-
-static struct mxc_dvfs_platform_data dvfs_core_data = {
- .reg_id = "SW1",
- .clk1_id = "cpu_clk",
- .clk2_id = "gpc_dvfs_clk",
- .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET,
- .gpc_vcr_offset = MXC_GPC_VCR_OFFSET,
- .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET,
- .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET,
- .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET,
- .prediv_mask = 0x1F800,
- .prediv_offset = 11,
- .prediv_val = 3,
- .div3ck_mask = 0xE0000000,
- .div3ck_offset = 29,
- .div3ck_val = 2,
- .emac_val = 0x08,
- .upthr_val = 25,
- .dnthr_val = 9,
- .pncthr_val = 33,
- .upcnt_val = 10,
- .dncnt_val = 10,
- .delay_time = 30,
- .num_wp = 2,
-};
+static int num_cpu_wp = 3;
/* working point(wp): 0 - 800MHz; 1 - 166.25MHz; */
static struct cpu_wp cpu_wp_auto[] = {
{
+ .pll_rate = 1000000000,
+ .cpu_rate = 1000000000,
+ .pdf = 0,
+ .mfi = 10,
+ .mfd = 11,
+ .mfn = 5,
+ .cpu_podf = 0,
+ .cpu_voltage = 1175000,},
+ {
.pll_rate = 800000000,
.cpu_rate = 800000000,
.pdf = 0,
@@ -308,10 +86,10 @@ static struct cpu_wp cpu_wp_auto[] = {
.mfd = 2,
.mfn = 1,
.cpu_podf = 0,
- .cpu_voltage = 1050000,},
+ .cpu_voltage = 1100000,},
{
.pll_rate = 800000000,
- .cpu_rate = 160000000,
+ .cpu_rate = 166250000,
.pdf = 4,
.mfi = 8,
.mfd = 2,
@@ -338,83 +116,12 @@ static struct mxc_w1_config mxc_w1_data = {
static struct fec_platform_data fec_data = {
.phy = PHY_INTERFACE_MODE_RMII,
- .phy_mask = ~1UL,
};
-/* workaround for cspi chipselect pin may not keep correct level when idle */
-static void mx50_arm2_gpio_spi_chipselect_active(int cspi_mode, int status,
- int chipselect)
-{
- switch (cspi_mode) {
- case 1:
- break;
- case 2:
- break;
- case 3:
- switch (chipselect) {
- case 0x1:
- {
- struct pad_desc cspi_ss0 = MX50_PAD_CSPI_SS0__CSPI_SS0;
- struct pad_desc cspi_cs1 = MX50_PAD_ECSPI1_MOSI__GPIO_4_13;
-
- /* pull up/down deassert it */
- mxc_iomux_v3_setup_pad(&cspi_ss0);
- mxc_iomux_v3_setup_pad(&cspi_cs1);
-
- gpio_request(CSPI_CS1, "cspi-cs1");
- gpio_direction_input(CSPI_CS1);
- }
- break;
- case 0x2:
- {
- struct pad_desc cspi_ss1 = MX50_PAD_ECSPI1_MOSI__CSPI_SS1;
- struct pad_desc cspi_ss0 = MX50_PAD_CSPI_SS0__GPIO_4_11;
-
- /*disable other ss */
- mxc_iomux_v3_setup_pad(&cspi_ss1);
- mxc_iomux_v3_setup_pad(&cspi_ss0);
-
- /* pull up/down deassert it */
- gpio_request(CSPI_CS2, "cspi-cs2");
- gpio_direction_input(CSPI_CS2);
- }
- break;
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-}
-
-static void mx50_arm2_gpio_spi_chipselect_inactive(int cspi_mode, int status,
- int chipselect)
-{
- switch (cspi_mode) {
- case 1:
- break;
- case 2:
- break;
- case 3:
- switch (chipselect) {
- case 0x1:
- gpio_free(CSPI_CS1);
- break;
- case 0x2:
- gpio_free(CSPI_CS2);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
-
-}
-
+extern void mx50_arm2_gpio_spi_chipselect_active(int cspi_mode, int status,
+ int chipselect);
+extern void mx50_arm2_gpio_spi_chipselect_inactive(int cspi_mode, int status,
+ int chipselect);
static struct mxc_spi_master mxcspi1_data = {
.maxchipselect = 4,
.spi_version = 23,
@@ -437,8 +144,6 @@ static struct mxc_srtc_platform_data srtc_data = {
.srtc_sec_mode_addr = OCOTP_CTRL_BASE_ADDR + 0x80,
};
-static int z160_version = 1;
-
#define mV_to_uV(mV) (mV * 1000)
#define uV_to_mV(uV) (uV / 1000)
#define V_to_uV(V) (mV_to_uV(V * 1000))
@@ -495,246 +200,7 @@ static struct regulator_init_data max17135_init_data[] __initdata = {
},
};
-static void epdc_get_pins(void)
-{
- /* Claim GPIOs for EPDC pins - used during power up/down */
- gpio_request(EPDC_D0, "epdc_d0");
- gpio_request(EPDC_D1, "epdc_d1");
- gpio_request(EPDC_D2, "epdc_d2");
- gpio_request(EPDC_D3, "epdc_d3");
- gpio_request(EPDC_D4, "epdc_d4");
- gpio_request(EPDC_D5, "epdc_d5");
- gpio_request(EPDC_D6, "epdc_d6");
- gpio_request(EPDC_D7, "epdc_d7");
- gpio_request(EPDC_GDCLK, "epdc_gdclk");
- gpio_request(EPDC_GDSP, "epdc_gdsp");
- gpio_request(EPDC_GDOE, "epdc_gdoe");
- gpio_request(EPDC_GDRL, "epdc_gdrl");
- gpio_request(EPDC_SDCLK, "epdc_sdclk");
- gpio_request(EPDC_SDOE, "epdc_sdoe");
- gpio_request(EPDC_SDLE, "epdc_sdle");
- gpio_request(EPDC_SDSHR, "epdc_sdshr");
- gpio_request(EPDC_BDR0, "epdc_bdr0");
- gpio_request(EPDC_SDCE0, "epdc_sdce0");
- gpio_request(EPDC_SDCE1, "epdc_sdce1");
- gpio_request(EPDC_SDCE2, "epdc_sdce2");
-}
-
-static void epdc_put_pins(void)
-{
- gpio_free(EPDC_D0);
- gpio_free(EPDC_D1);
- gpio_free(EPDC_D2);
- gpio_free(EPDC_D3);
- gpio_free(EPDC_D4);
- gpio_free(EPDC_D5);
- gpio_free(EPDC_D6);
- gpio_free(EPDC_D7);
- gpio_free(EPDC_GDCLK);
- gpio_free(EPDC_GDSP);
- gpio_free(EPDC_GDOE);
- gpio_free(EPDC_GDRL);
- gpio_free(EPDC_SDCLK);
- gpio_free(EPDC_SDOE);
- gpio_free(EPDC_SDLE);
- gpio_free(EPDC_SDSHR);
- gpio_free(EPDC_BDR0);
- gpio_free(EPDC_SDCE0);
- gpio_free(EPDC_SDCE1);
- gpio_free(EPDC_SDCE2);
-}
-
-static void epdc_enable_pins(void)
-{
- struct pad_desc epdc_d0 = MX50_PAD_EPDC_D0__EPDC_D0;
- struct pad_desc epdc_d1 = MX50_PAD_EPDC_D1__EPDC_D1;
- struct pad_desc epdc_d2 = MX50_PAD_EPDC_D2__EPDC_D2;
- struct pad_desc epdc_d3 = MX50_PAD_EPDC_D3__EPDC_D3;
- struct pad_desc epdc_d4 = MX50_PAD_EPDC_D4__EPDC_D4;
- struct pad_desc epdc_d5 = MX50_PAD_EPDC_D5__EPDC_D5;
- struct pad_desc epdc_d6 = MX50_PAD_EPDC_D6__EPDC_D6;
- struct pad_desc epdc_d7 = MX50_PAD_EPDC_D7__EPDC_D7;
- struct pad_desc epdc_gdclk = MX50_PAD_EPDC_GDCLK__EPDC_GDCLK;
- struct pad_desc epdc_gdsp = MX50_PAD_EPDC_GDSP__EPDC_GDSP;
- struct pad_desc epdc_gdoe = MX50_PAD_EPDC_GDOE__EPDC_GDOE;
- struct pad_desc epdc_gdrl = MX50_PAD_EPDC_GDRL__EPDC_GDRL;
- struct pad_desc epdc_sdclk = MX50_PAD_EPDC_SDCLK__EPDC_SDCLK;
- struct pad_desc epdc_sdoe = MX50_PAD_EPDC_SDOE__EPDC_SDOE;
- struct pad_desc epdc_sdle = MX50_PAD_EPDC_SDLE__EPDC_SDLE;
- struct pad_desc epdc_sdshr = MX50_PAD_EPDC_SDSHR__EPDC_SDSHR;
- struct pad_desc epdc_bdr0 = MX50_PAD_EPDC_BDR0__EPDC_BDR0;
- struct pad_desc epdc_sdce0 = MX50_PAD_EPDC_SDCE0__EPDC_SDCE0;
- struct pad_desc epdc_sdce1 = MX50_PAD_EPDC_SDCE1__EPDC_SDCE1;
- struct pad_desc epdc_sdce2 = MX50_PAD_EPDC_SDCE2__EPDC_SDCE2;
-
- /* Configure MUX settings to enable EPDC use */
- mxc_iomux_v3_setup_pad(&epdc_d0);
- mxc_iomux_v3_setup_pad(&epdc_d1);
- mxc_iomux_v3_setup_pad(&epdc_d2);
- mxc_iomux_v3_setup_pad(&epdc_d3);
- mxc_iomux_v3_setup_pad(&epdc_d4);
- mxc_iomux_v3_setup_pad(&epdc_d5);
- mxc_iomux_v3_setup_pad(&epdc_d6);
- mxc_iomux_v3_setup_pad(&epdc_d7);
- mxc_iomux_v3_setup_pad(&epdc_gdclk);
- mxc_iomux_v3_setup_pad(&epdc_gdsp);
- mxc_iomux_v3_setup_pad(&epdc_gdoe);
- mxc_iomux_v3_setup_pad(&epdc_gdrl);
- mxc_iomux_v3_setup_pad(&epdc_sdclk);
- mxc_iomux_v3_setup_pad(&epdc_sdoe);
- mxc_iomux_v3_setup_pad(&epdc_sdle);
- mxc_iomux_v3_setup_pad(&epdc_sdshr);
- mxc_iomux_v3_setup_pad(&epdc_bdr0);
- mxc_iomux_v3_setup_pad(&epdc_sdce0);
- mxc_iomux_v3_setup_pad(&epdc_sdce1);
- mxc_iomux_v3_setup_pad(&epdc_sdce2);
-
- gpio_direction_input(EPDC_D0);
- gpio_direction_input(EPDC_D1);
- gpio_direction_input(EPDC_D2);
- gpio_direction_input(EPDC_D3);
- gpio_direction_input(EPDC_D4);
- gpio_direction_input(EPDC_D5);
- gpio_direction_input(EPDC_D6);
- gpio_direction_input(EPDC_D7);
- gpio_direction_input(EPDC_GDCLK);
- gpio_direction_input(EPDC_GDSP);
- gpio_direction_input(EPDC_GDOE);
- gpio_direction_input(EPDC_GDRL);
- gpio_direction_input(EPDC_SDCLK);
- gpio_direction_input(EPDC_SDOE);
- gpio_direction_input(EPDC_SDLE);
- gpio_direction_input(EPDC_SDSHR);
- gpio_direction_input(EPDC_BDR0);
- gpio_direction_input(EPDC_SDCE0);
- gpio_direction_input(EPDC_SDCE1);
- gpio_direction_input(EPDC_SDCE2);
-}
-
-static void epdc_disable_pins(void)
-{
- struct pad_desc epdc_d0 = MX50_PAD_EPDC_D0__GPIO_3_0;
- struct pad_desc epdc_d1 = MX50_PAD_EPDC_D1__GPIO_3_1;
- struct pad_desc epdc_d2 = MX50_PAD_EPDC_D2__GPIO_3_2;
- struct pad_desc epdc_d3 = MX50_PAD_EPDC_D3__GPIO_3_3;
- struct pad_desc epdc_d4 = MX50_PAD_EPDC_D4__GPIO_3_4;
- struct pad_desc epdc_d5 = MX50_PAD_EPDC_D5__GPIO_3_5;
- struct pad_desc epdc_d6 = MX50_PAD_EPDC_D6__GPIO_3_6;
- struct pad_desc epdc_d7 = MX50_PAD_EPDC_D7__GPIO_3_7;
- struct pad_desc epdc_gdclk = MX50_PAD_EPDC_GDCLK__GPIO_3_16;
- struct pad_desc epdc_gdsp = MX50_PAD_EPDC_GDSP__GPIO_3_17;
- struct pad_desc epdc_gdoe = MX50_PAD_EPDC_GDOE__GPIO_3_18;
- struct pad_desc epdc_gdrl = MX50_PAD_EPDC_GDRL__GPIO_3_19;
- struct pad_desc epdc_sdclk = MX50_PAD_EPDC_SDCLK__GPIO_3_20;
- struct pad_desc epdc_sdoe = MX50_PAD_EPDC_SDOE__GPIO_3_23;
- struct pad_desc epdc_sdle = MX50_PAD_EPDC_SDLE__GPIO_3_24;
- struct pad_desc epdc_sdshr = MX50_PAD_EPDC_SDSHR__GPIO_3_26;
- struct pad_desc epdc_bdr0 = MX50_PAD_EPDC_BDR0__GPIO_4_23;
- struct pad_desc epdc_sdce0 = MX50_PAD_EPDC_SDCE0__GPIO_4_25;
- struct pad_desc epdc_sdce1 = MX50_PAD_EPDC_SDCE1__GPIO_4_26;
- struct pad_desc epdc_sdce2 = MX50_PAD_EPDC_SDCE2__GPIO_4_27;
-
- /* Configure MUX settings for EPDC pins to
- * GPIO and drive to 0. */
- mxc_iomux_v3_setup_pad(&epdc_d0);
- mxc_iomux_v3_setup_pad(&epdc_d1);
- mxc_iomux_v3_setup_pad(&epdc_d2);
- mxc_iomux_v3_setup_pad(&epdc_d3);
- mxc_iomux_v3_setup_pad(&epdc_d4);
- mxc_iomux_v3_setup_pad(&epdc_d5);
- mxc_iomux_v3_setup_pad(&epdc_d6);
- mxc_iomux_v3_setup_pad(&epdc_d7);
- mxc_iomux_v3_setup_pad(&epdc_gdclk);
- mxc_iomux_v3_setup_pad(&epdc_gdsp);
- mxc_iomux_v3_setup_pad(&epdc_gdoe);
- mxc_iomux_v3_setup_pad(&epdc_gdrl);
- mxc_iomux_v3_setup_pad(&epdc_sdclk);
- mxc_iomux_v3_setup_pad(&epdc_sdoe);
- mxc_iomux_v3_setup_pad(&epdc_sdle);
- mxc_iomux_v3_setup_pad(&epdc_sdshr);
- mxc_iomux_v3_setup_pad(&epdc_bdr0);
- mxc_iomux_v3_setup_pad(&epdc_sdce0);
- mxc_iomux_v3_setup_pad(&epdc_sdce1);
- mxc_iomux_v3_setup_pad(&epdc_sdce2);
-
- gpio_direction_output(EPDC_D0, 0);
- gpio_direction_output(EPDC_D1, 0);
- gpio_direction_output(EPDC_D2, 0);
- gpio_direction_output(EPDC_D3, 0);
- gpio_direction_output(EPDC_D4, 0);
- gpio_direction_output(EPDC_D5, 0);
- gpio_direction_output(EPDC_D6, 0);
- gpio_direction_output(EPDC_D7, 0);
- gpio_direction_output(EPDC_GDCLK, 0);
- gpio_direction_output(EPDC_GDSP, 0);
- gpio_direction_output(EPDC_GDOE, 0);
- gpio_direction_output(EPDC_GDRL, 0);
- gpio_direction_output(EPDC_SDCLK, 0);
- gpio_direction_output(EPDC_SDOE, 0);
- gpio_direction_output(EPDC_SDLE, 0);
- gpio_direction_output(EPDC_SDSHR, 0);
- gpio_direction_output(EPDC_BDR0, 0);
- gpio_direction_output(EPDC_SDCE0, 0);
- gpio_direction_output(EPDC_SDCE1, 0);
- gpio_direction_output(EPDC_SDCE2, 0);
-}
-
-static struct fb_videomode e60_mode = {
- .name = "E60",
- .refresh = 50,
- .xres = 800,
- .yres = 600,
- .pixclock = 20000000,
- .left_margin = 10,
- .right_margin = 217,
- .upper_margin = 4,
- .lower_margin = 10,
- .hsync_len = 20,
- .vsync_len = 4,
- .sync = 0,
- .vmode = FB_VMODE_NONINTERLACED,
- .flag = 0,
-};
-
-static struct fb_videomode e97_mode = {
- .name = "E97",
- .refresh = 50,
- .xres = 1200,
- .yres = 825,
- .pixclock = 32000000,
- .left_margin = 8,
- .right_margin = 125,
- .upper_margin = 4,
- .lower_margin = 17,
- .hsync_len = 20,
- .vsync_len = 4,
- .sync = 0,
- .vmode = FB_VMODE_NONINTERLACED,
- .flag = 0,
-};
-
-static struct mxc_epdc_fb_mode panel_modes[] = {
- {
- &e60_mode,
- 4, 10, 20, 10, 20, 480, 20, 0, 1, 1,
- },
- {
- &e97_mode,
- 8, 10, 20, 10, 20, 580, 20, 0, 1, 3,
- },
-};
-
-static struct mxc_epdc_fb_platform_data epdc_data = {
- .epdc_mode = panel_modes,
- .num_modes = ARRAY_SIZE(panel_modes),
- .get_pins = epdc_get_pins,
- .put_pins = epdc_put_pins,
- .enable_pins = epdc_enable_pins,
- .disable_pins = epdc_disable_pins,
-};
-
-
-static struct max17135_platform_data max17135_pdata __initdata = {
+static struct max17135_platform_data max17135_pdata = {
.vneg_pwrup = 1,
.gvee_pwrup = 1,
.vpos_pwrup = 2,
@@ -743,43 +209,13 @@ static struct max17135_platform_data max17135_pdata __initdata = {
.vpos_pwrdn = 2,
.gvee_pwrdn = 1,
.vneg_pwrdn = 1,
- .gpio_pmic_pwrgood = EPDC_PWRSTAT,
- .gpio_pmic_vcom_ctrl = EPDC_VCOM,
- .gpio_pmic_wakeup = EPDC_PMIC_WAKE,
- .gpio_pmic_intr = EPDC_PMIC_INT,
+ .gpio_pmic_pwrgood = IOMUX_TO_GPIO(MX50_PIN_EPDC_PWRSTAT),
+ .gpio_pmic_vcom_ctrl = IOMUX_TO_GPIO(MX50_PIN_EPDC_VCOM0),
+ .gpio_pmic_wakeup = IOMUX_TO_GPIO(MX50_PIN_UART4_TXD),
+ .gpio_pmic_intr = IOMUX_TO_GPIO(MX50_PIN_UART4_RXD),
.regulator_init = max17135_init_data,
};
-static int __initdata max17135_pass_num = { 1 };
-static int __initdata max17135_vcom = { -1250000 };
-/*
- * Parse user specified options (`max17135:')
- * example:
- * max17135:pass=2,vcom=-1250000
- */
-static int __init max17135_setup(char *options)
-{
- char *opt;
- while ((opt = strsep(&options, ",")) != NULL) {
- if (!*opt)
- continue;
- if (!strncmp(opt, "pass=", 5))
- max17135_pass_num =
- simple_strtoul(opt + 5, NULL, 0);
- if (!strncmp(opt, "vcom=", 5)) {
- int offs = 5;
- if (opt[5] == '-')
- offs = 6;
- max17135_vcom =
- simple_strtoul(opt + offs, NULL, 0);
- max17135_vcom = -max17135_vcom;
- }
- }
- return 1;
-}
-
-__setup("max17135:", max17135_setup);
-
static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
{
.type = "sgtl5000-i2c",
@@ -836,24 +272,24 @@ static int sdhc_write_protect(struct device *dev)
unsigned short rc = 0;
if (to_platform_device(dev)->id == 0)
- rc = gpio_get_value(SD1_WP);
+ rc = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_ECSPI2_SS0));
else if (to_platform_device(dev)->id == 1)
- rc = gpio_get_value(SD2_WP);
+ rc = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_SD2_WP));
else if (to_platform_device(dev)->id == 2)
- rc = gpio_get_value(SD3_WP);
+ rc = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_SD3_WP));
return rc;
}
static unsigned int sdhc_get_card_det_status(struct device *dev)
{
- int ret = 0;
+ int ret;
if (to_platform_device(dev)->id == 0)
- ret = gpio_get_value(SD1_CD);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_EIM_CRE));
else if (to_platform_device(dev)->id == 1)
- ret = gpio_get_value(SD2_CD);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_SD2_CD));
else if (to_platform_device(dev)->id == 2)
- ret = gpio_get_value(SD3_CD);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_KEY_COL2));
return ret;
}
@@ -886,16 +322,13 @@ static struct mxc_mmc_platform_data mmc2_data = {
static struct mxc_mmc_platform_data mmc3_data = {
.ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29 | MMC_VDD_29_30
| MMC_VDD_31_32,
- .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA | MMC_CAP_DATA_DDR,
+ .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
.min_clk = 400000,
- .max_clk = 40000000,
- .dll_override_en = 1,
- .dll_delay_cells = 0xc,
+ .max_clk = 50000000,
.card_inserted_state = 0,
.status = sdhc_get_card_det_status,
.wp_status = sdhc_write_protect,
.clock_mmc = "esdhc_clk",
- .clk_always_on = 1,
};
static int mxc_sgtl5000_amp_enable(int enable)
@@ -906,14 +339,14 @@ static int mxc_sgtl5000_amp_enable(int enable)
static int headphone_det_status(void)
{
- return (gpio_get_value(HP_DETECT) != 0);
+ return (gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_ECSPI1_SS0)) != 0);
}
static struct mxc_audio_platform_data sgtl5000_data = {
.ssi_num = 1,
.src_port = 2,
.ext_port = 3,
- .hp_irq = IOMUX_TO_IRQ_V3(HP_DETECT),
+ .hp_irq = IOMUX_TO_IRQ(MX50_PIN_ECSPI1_SS0),
.hp_status = headphone_det_status,
.amp_enable = mxc_sgtl5000_amp_enable,
.sysclk = 12288000,
@@ -923,21 +356,64 @@ static struct platform_device mxc_sgtl5000_device = {
.name = "imx-3stack-sgtl5000",
};
-static struct pad_desc armadillo2_wvga_pads[] = {
- MX50_PAD_DISP_D0__DISP_D0,
- MX50_PAD_DISP_D1__DISP_D1,
- MX50_PAD_DISP_D2__DISP_D2,
- MX50_PAD_DISP_D3__DISP_D3,
- MX50_PAD_DISP_D4__DISP_D4,
- MX50_PAD_DISP_D5__DISP_D5,
- MX50_PAD_DISP_D6__DISP_D6,
- MX50_PAD_DISP_D7__DISP_D7,
-};
-
static void wvga_reset(void)
{
- mxc_iomux_v3_setup_multiple_pads(armadillo2_wvga_pads, \
- ARRAY_SIZE(armadillo2_wvga_pads));
+ /* ELCDIF D0 */
+ mxc_free_iomux(MX50_PIN_DISP_D0, IOMUX_CONFIG_ALT2);
+ mxc_request_iomux(MX50_PIN_DISP_D0, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_DISP_D0, PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE |
+ PAD_CTL_DRV_HIGH);
+ /* ELCDIF D1 */
+ mxc_free_iomux(MX50_PIN_DISP_D1, IOMUX_CONFIG_ALT2);
+ mxc_request_iomux(MX50_PIN_DISP_D1, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_DISP_D1, PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE |
+ PAD_CTL_DRV_HIGH);
+ /* ELCDIF D2 */
+ mxc_free_iomux(MX50_PIN_DISP_D2, IOMUX_CONFIG_ALT2);
+ mxc_request_iomux(MX50_PIN_DISP_D2, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_DISP_D2, PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE |
+ PAD_CTL_DRV_HIGH);
+ /* ELCDIF D3 */
+ mxc_free_iomux(MX50_PIN_DISP_D3, IOMUX_CONFIG_ALT2);
+ mxc_request_iomux(MX50_PIN_DISP_D3, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_DISP_D3, PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE |
+ PAD_CTL_DRV_HIGH);
+ /* ELCDIF D4 */
+ mxc_free_iomux(MX50_PIN_DISP_D4, IOMUX_CONFIG_ALT2);
+ mxc_request_iomux(MX50_PIN_DISP_D4, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_DISP_D4, PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE |
+ PAD_CTL_DRV_HIGH);
+ /* ELCDIF D5 */
+ mxc_free_iomux(MX50_PIN_DISP_D5, IOMUX_CONFIG_ALT2);
+ mxc_request_iomux(MX50_PIN_DISP_D5, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_DISP_D5, PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE |
+ PAD_CTL_DRV_HIGH);
+ /* ELCDIF D6 */
+ mxc_free_iomux(MX50_PIN_DISP_D6, IOMUX_CONFIG_ALT2);
+ mxc_request_iomux(MX50_PIN_DISP_D6, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_DISP_D6, PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE |
+ PAD_CTL_DRV_HIGH);
+ /* ELCDIF D7 */
+ mxc_free_iomux(MX50_PIN_DISP_D7, IOMUX_CONFIG_ALT2);
+ mxc_request_iomux(MX50_PIN_DISP_D7, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_DISP_D7, PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE |
+ PAD_CTL_DRV_HIGH);
return;
}
@@ -970,107 +446,6 @@ static struct mxc_fb_platform_data fb_data[] = {
},
};
-static int __initdata enable_w1 = { 0 };
-static int __init w1_setup(char *__unused)
-{
- enable_w1 = 1;
- return cpu_is_mx50();
-}
-
-__setup("w1", w1_setup);
-
-int enable_gpmi_nand = { 0 };
-static int __init gpmi_nand_setup(char *__unused)
-{
- enable_gpmi_nand = 1;
- return 1;
-}
-
-__setup("gpmi:nand", gpmi_nand_setup);
-
-static struct mxs_dma_plat_data dma_apbh_data = {
- .chan_base = MXS_DMA_CHANNEL_AHB_APBH,
- .chan_num = MXS_MAX_DMA_CHANNELS,
-};
-
-static int gpmi_nfc_platform_init(unsigned int max_chip_count)
-{
- return !enable_gpmi_nand;
-}
-
-static void gpmi_nfc_platform_exit(unsigned int max_chip_count)
-{
-}
-
-static const char *gpmi_nfc_partition_source_types[] = { "cmdlinepart", 0 };
-
-static struct gpmi_nfc_platform_data gpmi_nfc_platform_data = {
- .nfc_version = 2,
- .boot_rom_version = 1,
- .clock_name = "gpmi-nfc",
- .platform_init = gpmi_nfc_platform_init,
- .platform_exit = gpmi_nfc_platform_exit,
- .min_prop_delay_in_ns = 5,
- .max_prop_delay_in_ns = 9,
- .max_chip_count = 2,
- .boot_area_size_in_bytes = 20 * SZ_1M,
- .partition_source_types = gpmi_nfc_partition_source_types,
- .partitions = 0,
- .partition_count = 0,
-};
-
-static struct android_pmem_platform_data android_pmem_pdata = {
- .name = "pmem_adsp",
- .start = 0,
- .size = SZ_4M,
- .no_allocator = 0,
- .cached = PMEM_NONCACHE_NORMAL,
-};
-
-static struct android_pmem_platform_data android_pmem_gpu_pdata = {
- .name = "pmem_gpu",
- .start = 0,
- .size = SZ_32M,
- .no_allocator = 0,
- .cached = PMEM_CACHE_ENABLE,
-};
-
-static struct android_usb_platform_data android_usb_pdata = {
- .vendor_id = 0x0bb4,
- .product_id = 0x0c01,
- .adb_product_id = 0x0c02,
- .version = 0x0100,
- .product_name = "Android Phone",
- .manufacturer_name = "Freescale",
- .nluns = 3,
-};
-
-/* OTP data */
-/* Building up eight registers's names of a bank */
-#define BANK(a, b, c, d, e, f, g, h) \
- {\
- ("HW_OCOTP_"#a), ("HW_OCOTP_"#b), ("HW_OCOTP_"#c), ("HW_OCOTP_"#d), \
- ("HW_OCOTP_"#e), ("HW_OCOTP_"#f), ("HW_OCOTP_"#g), ("HW_OCOTP_"#h) \
- }
-
-#define BANKS (5)
-#define BANK_ITEMS (8)
-static const char *bank_reg_desc[BANKS][BANK_ITEMS] = {
- BANK(LOCK, CFG0, CFG1, CFG2, CFG3, CFG4, CFG5, CFG6),
- BANK(MEM0, MEM1, MEM2, MEM3, MEM4, MEM5, GP0, GP1),
- BANK(SCC0, SCC1, SCC2, SCC3, SCC4, SCC5, SCC6, SCC7),
- BANK(SRK0, SRK1, SRK2, SRK3, SRK4, SRK5, SRK6, SRK7),
- BANK(SJC0, SJC1, MAC0, MAC1, HWCAP0, HWCAP1, HWCAP2, SWCAP),
-};
-
-static struct fsl_otp_data otp_data = {
- .fuse_name = (char **)bank_reg_desc,
- .fuse_num = BANKS * BANK_ITEMS,
-};
-#undef BANK
-#undef BANKS
-#undef BANK_ITEMS
-
/*!
* Board specific fixup function. It is called by \b setup_arch() in
* setup.c file very early on during kernel starts. It allows the user to
@@ -1085,89 +460,10 @@ static struct fsl_otp_data otp_data = {
static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
char **cmdline, struct meminfo *mi)
{
- struct tag *t;
- int size;
-
mxc_set_cpu_type(MXC_CPU_MX50);
get_cpu_wp = mx50_arm2_get_cpu_wp;
set_num_cpu_wp = mx50_arm2_set_num_cpu_wp;
-
- for_each_tag(t, tags) {
- if (t->hdr.tag != ATAG_MEM)
- continue;
- size = t->u.mem.size;
-
- android_pmem_pdata.start =
- PHYS_OFFSET + size - android_pmem_pdata.size;
- android_pmem_gpu_pdata.start =
- android_pmem_pdata.start - android_pmem_gpu_pdata.size;
-#if 0
- gpu_device.resource[5].start =
- android_pmem_gpu_pdata.start - SZ_16M;
- gpu_device.resource[5].end =
- gpu_device.resource[5].start + SZ_16M - 1;
-#endif
- size -= android_pmem_pdata.size;
- size -= android_pmem_gpu_pdata.size;
- //size -= SZ_16M;
- t->u.mem.size = size;
- }
-}
-
-static void __init mx50_arm2_io_init(void)
-{
- mxc_iomux_v3_setup_multiple_pads(mx50_armadillo2, \
- ARRAY_SIZE(mx50_armadillo2));
-
- gpio_request(SD1_WP, "sdhc1-wp");
- gpio_direction_input(SD1_WP);
-
- gpio_request(SD1_CD, "sdhc1-cd");
- gpio_direction_input(SD1_CD);
-
- gpio_request(SD2_WP, "sdhc2-wp");
- gpio_direction_input(SD2_WP);
-
- gpio_request(SD2_CD, "sdhc2-cd");
- gpio_direction_input(SD2_CD);
-
- gpio_request(SD3_WP, "sdhc3-wp");
- gpio_direction_input(SD3_WP);
-
- gpio_request(SD3_CD, "sdhc3-cd");
- gpio_direction_input(SD3_CD);
-
- gpio_request(HP_DETECT, "hp-det");
- gpio_direction_input(HP_DETECT);
-
- gpio_request(PWR_INT, "pwr-int");
- gpio_direction_input(PWR_INT);
-
- gpio_request(EPDC_PMIC_WAKE, "epdc-pmic-wake");
- gpio_direction_output(EPDC_PMIC_WAKE, 0);
-
- gpio_request(EPDC_VCOM, "epdc-vcom");
- gpio_direction_output(EPDC_VCOM, 0);
-
- gpio_request(EPDC_PMIC_INT, "epdc-pmic-int");
- gpio_direction_input(EPDC_PMIC_INT);
-
- gpio_request(EPDC_PWRSTAT, "epdc-pwrstat");
- gpio_direction_input(EPDC_PWRSTAT);
-
- /* ELCDIF backlight */
- gpio_request(EPDC_ELCDIF_BACKLIGHT, "elcdif-backlight");
- gpio_direction_output(EPDC_ELCDIF_BACKLIGHT, 1);
-
- if (enable_w1) {
- struct pad_desc one_wire = MX50_PAD_OWIRE__OWIRE;
- mxc_iomux_v3_setup_pad(&one_wire);
- }
-
- if (enable_gpmi_nand)
- mxc_iomux_v3_setup_multiple_pads(mx50_gpmi_nand, \
- ARRAY_SIZE(mx50_gpmi_nand));
}
/*!
@@ -1176,19 +472,18 @@ static void __init mx50_arm2_io_init(void)
static void __init mxc_board_init(void)
{
/* SD card detect irqs */
- mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ_V3(SD1_CD);
- mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ_V3(SD1_CD);
- mxcsdhc2_device.resource[2].start = IOMUX_TO_IRQ_V3(SD2_CD);
- mxcsdhc2_device.resource[2].end = IOMUX_TO_IRQ_V3(SD2_CD);
- mxcsdhc3_device.resource[2].start = IOMUX_TO_IRQ_V3(SD3_CD);
- mxcsdhc3_device.resource[2].end = IOMUX_TO_IRQ_V3(SD3_CD);
+ mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ(MX50_PIN_EIM_CRE);
+ mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ(MX50_PIN_EIM_CRE);
+ mxcsdhc2_device.resource[2].start = IOMUX_TO_IRQ(MX50_PIN_SD2_CD);
+ mxcsdhc2_device.resource[2].end = IOMUX_TO_IRQ(MX50_PIN_SD2_CD);
+ mxcsdhc3_device.resource[2].start = IOMUX_TO_IRQ(MX50_PIN_KEY_COL2);
+ mxcsdhc3_device.resource[2].end = IOMUX_TO_IRQ(MX50_PIN_KEY_COL2);
mxc_cpu_common_init();
mxc_register_gpios();
mx50_arm2_io_init();
mxc_register_device(&mxc_dma_device, NULL);
- //mxc_register_device(&mxs_dma_apbh_device, &dma_apbh_data);
mxc_register_device(&mxc_wdt_device, NULL);
mxc_register_device(&mxcspi1_device, &mxcspi1_data);
mxc_register_device(&mxcspi3_device, &mxcspi3_data);
@@ -1198,15 +493,13 @@ static void __init mxc_board_init(void)
mxc_register_device(&mxc_rtc_device, &srtc_data);
mxc_register_device(&mxc_w1_master_device, &mxc_w1_data);
- mxc_register_device(&gpu_device, &z160_version);
+ mxc_register_device(&gpu_device, NULL);
mxc_register_device(&mxc_pxp_device, NULL);
mxc_register_device(&mxc_pxp_client_device, NULL);
- mxc_register_device(&mxc_pxp_v4l2, NULL);
- mxc_register_device(&mxc_dvfs_core_device, &dvfs_core_data);
- mxc_register_device(&busfreq_device, NULL);
-
/*
mxc_register_device(&mx53_lpmode_device, NULL);
+ mxc_register_device(&busfreq_device, NULL);
+ mxc_register_device(&mxc_dvfs_core_device, &dvfs_core_data);
mxc_register_device(&mxc_dvfs_per_device, &dvfs_per_data);
*/
@@ -1222,32 +515,20 @@ static void __init mxc_board_init(void)
ARRAY_SIZE(mxc_dataflash_device));
i2c_register_board_info(1, mxc_i2c1_board_info,
ARRAY_SIZE(mxc_i2c1_board_info));
- max17135_pdata.pass_num = max17135_pass_num;
- max17135_pdata.vcom_uV = max17135_vcom;
i2c_register_board_info(2, mxc_i2c2_board_info,
ARRAY_SIZE(mxc_i2c2_board_info));
- mxc_register_device(&epdc_device, &epdc_data);
+ mxc_register_device(&epdc_device, NULL);
mxc_register_device(&lcd_wvga_device, &lcd_wvga_data);
mxc_register_device(&elcdif_device, &fb_data[0]);
- mxc_register_device(&mxs_viim, NULL);
-
- mxc_register_device(&mxc_android_pmem_device, &android_pmem_pdata);
- mxc_register_device(&mxc_android_pmem_gpu_device, &android_pmem_gpu_pdata);
- mxc_register_device(&android_usb_device, &android_usb_pdata);
mx50_arm2_init_mc13892();
/*
pm_power_off = mxc_power_off;
*/
mxc_register_device(&mxc_sgtl5000_device, &sgtl5000_data);
- mxc_register_device(&gpmi_nfc_device, &gpmi_nfc_platform_data);
mx5_usb_dr_init();
mx5_usbh1_init();
-
- mxc_register_device(&mxc_rngb_device, NULL);
- mxc_register_device(&dcp_device, NULL);
- mxc_register_device(&fsl_otp_device, &otp_data);
}
static void __init mx50_arm2_timer_init(void)
diff --git a/arch/arm/mach-mx5/mx50_arm2_gpio.c b/arch/arm/mach-mx5/mx50_arm2_gpio.c
new file mode 100644
index 000000000000..8b37784ef9b5
--- /dev/null
+++ b/arch/arm/mach-mx5/mx50_arm2_gpio.c
@@ -0,0 +1,658 @@
+/*
+ * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <mach/hardware.h>
+#include <mach/gpio.h>
+
+#include "iomux.h"
+#include "mx50_pins.h"
+
+/*!
+ * @file mach-mx5/mx50_arm2_gpio.c
+ *
+ * @brief This file contains all the GPIO setup functions for the board.
+ *
+ * @ingroup GPIO
+ */
+
+static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
+ { /* SD1 WP */
+ MX50_PIN_ECSPI2_SS0, IOMUX_CONFIG_GPIO,
+ },
+ { /* SD1 CD */
+ MX50_PIN_EIM_CRE, IOMUX_CONFIG_GPIO,
+ },
+ { /* SD1 CMD */
+ MX50_PIN_SD1_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD1 CLK */
+ MX50_PIN_SD1_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD1 D0 */
+ MX50_PIN_SD1_D0, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD1 D1 */
+ MX50_PIN_SD1_D1, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD1 D2 */
+ MX50_PIN_SD1_D2, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD1 D3 */
+ MX50_PIN_SD1_D3, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 CD */
+ MX50_PIN_SD2_CD, IOMUX_CONFIG_GPIO,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 WP */
+ MX50_PIN_SD2_WP, IOMUX_CONFIG_GPIO,
+ },
+ { /* SD2 CMD */
+ MX50_PIN_SD2_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 CLK */
+ MX50_PIN_SD2_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 D0 */
+ MX50_PIN_SD2_D0, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 D1 */
+ MX50_PIN_SD2_D1, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 D2 */
+ MX50_PIN_SD2_D2, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 D3 */
+ MX50_PIN_SD2_D3, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 D4 */
+ MX50_PIN_SD2_D4, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 D5 */
+ MX50_PIN_SD2_D5, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 D6 */
+ MX50_PIN_SD2_D6, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD2 D7 */
+ MX50_PIN_SD2_D7, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD3 CD */
+ MX50_PIN_KEY_COL2, IOMUX_CONFIG_GPIO,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ },
+ { /* SD3 WP */
+ MX50_PIN_SD3_WP, IOMUX_CONFIG_GPIO,
+ },
+ { /* SD3 CMD */
+ MX50_PIN_SD3_CMD, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 CLK */
+ MX50_PIN_SD3_CLK, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU |
+ PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 D0 */
+ MX50_PIN_SD3_D0, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 D1 */
+ MX50_PIN_SD3_D1, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 D2 */
+ MX50_PIN_SD3_D2, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 D3 */
+ MX50_PIN_SD3_D3, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 D4 */
+ MX50_PIN_SD3_D4, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 D5 */
+ MX50_PIN_SD3_D5, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 D6 */
+ MX50_PIN_SD3_D6, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH),
+ },
+ { /* SD3 D7 */
+ MX50_PIN_SD3_D7, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH),
+ },
+
+ {
+ MX50_PIN_SSI_TXD, IOMUX_CONFIG_ALT0,
+ },
+ {
+ MX50_PIN_SSI_RXD, IOMUX_CONFIG_ALT0,
+ },
+ {
+ MX50_PIN_SSI_TXC, IOMUX_CONFIG_ALT0,
+ },
+ {
+ MX50_PIN_SSI_TXFS, IOMUX_CONFIG_ALT0,
+ },
+ /* LINE1_DETECT (headphone detect) */
+ {
+ MX50_PIN_ECSPI1_SS0, IOMUX_CONFIG_GPIO, PAD_CTL_100K_PU,
+ },
+ {
+ MX50_PIN_ECSPI2_MISO, IOMUX_CONFIG_GPIO, PAD_CTL_100K_PU,
+ },
+ /* UART pad setting */
+ {
+ MX50_PIN_UART1_TXD, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE),
+ },
+ {
+ MX50_PIN_UART1_RXD, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE),
+ MUX_IN_UART1_IPP_UART_RXD_MUX_SELECT_INPUT,
+ INPUT_CTL_PATH1,
+ },
+ {
+ MX50_PIN_UART1_CTS, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE),
+ },
+ {
+ MX50_PIN_UART1_RTS, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE),
+ MUX_IN_UART1_IPP_UART_RTS_B_SELECT_INPUT,
+ INPUT_CTL_PATH1,
+ },
+ {
+ MX50_PIN_UART2_TXD, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE),
+ },
+ {
+ MX50_PIN_UART2_RXD, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE),
+ MUX_IN_UART2_IPP_UART_RXD_MUX_SELECT_INPUT,
+ INPUT_CTL_PATH1,
+ },
+ {
+ MX50_PIN_UART2_CTS, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE),
+ },
+ {
+ MX50_PIN_UART2_RTS, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE),
+ MUX_IN_UART2_IPP_UART_RTS_B_SELECT_INPUT,
+ INPUT_CTL_PATH1,
+ },
+ { /* I2C1 SDA */
+ MX50_PIN_I2C1_SDA, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ },
+ { /* I2C1 SCL */
+ MX50_PIN_I2C1_SCL, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ },
+ { /* I2C2 SDA */
+ MX50_PIN_I2C2_SDA, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ },
+ { /* I2C2 SCL */
+ MX50_PIN_I2C2_SCL, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ },
+ { /* I2C3 SDA */
+ MX50_PIN_I2C3_SDA, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ },
+ { /* I2C3 SCL */
+ MX50_PIN_I2C3_SCL, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ },
+ /* EPDC pins */
+ { /* EPDC D0 */
+ MX50_PIN_EPDC_D0, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC D1 */
+ MX50_PIN_EPDC_D1, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC D2 */
+ MX50_PIN_EPDC_D2, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC D3 */
+ MX50_PIN_EPDC_D3, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC D4 */
+ MX50_PIN_EPDC_D4, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC D5 */
+ MX50_PIN_EPDC_D5, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC D6 */
+ MX50_PIN_EPDC_D6, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC D7 */
+ MX50_PIN_EPDC_D7, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC GDCLK */
+ MX50_PIN_EPDC_GDCLK, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC GDSP */
+ MX50_PIN_EPDC_GDSP, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC GDOE */
+ MX50_PIN_EPDC_GDOE, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC GDRL */
+ MX50_PIN_EPDC_GDRL, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC SDCLK */
+ MX50_PIN_EPDC_SDCLK, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC SDOE */
+ MX50_PIN_EPDC_SDOE, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC SDLE */
+ MX50_PIN_EPDC_SDLE, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC SDSHR */
+ MX50_PIN_EPDC_SDSHR, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC BDR0 */
+ MX50_PIN_EPDC_BDR0, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC SDCE0 */
+ MX50_PIN_EPDC_SDCE0, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC SDCE1 */
+ MX50_PIN_EPDC_SDCE1, IOMUX_CONFIG_ALT0,
+ },
+ { /* EPDC SDCE2 */
+ MX50_PIN_EPDC_SDCE2, IOMUX_CONFIG_ALT0,
+ },
+ /* EPD PMIC pins */
+ { /* EPDC PWRSTAT - GPIO3[28] for PWR_GOOD status */
+ MX50_PIN_EPDC_PWRSTAT, IOMUX_CONFIG_ALT1,
+ },
+ { /* EPDC VCOM0 - GPIO4[21] for VCOM control */
+ MX50_PIN_EPDC_VCOM0, IOMUX_CONFIG_ALT1,
+ },
+ { /* ELCDIF D8 */
+ MX50_PIN_DISP_D8, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF D9 */
+ MX50_PIN_DISP_D9, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF D10 */
+ MX50_PIN_DISP_D10, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF D11 */
+ MX50_PIN_DISP_D11, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF D12 */
+ MX50_PIN_DISP_D12, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF D13 */
+ MX50_PIN_DISP_D13, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF D14 */
+ MX50_PIN_DISP_D14, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF D15 */
+ MX50_PIN_DISP_D15, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF VSYNC */
+ MX50_PIN_DISP_RS, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF contrast */
+ MX50_PIN_DISP_BUSY, IOMUX_CONFIG_ALT1,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF HSYNC */
+ MX50_PIN_DISP_CS, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF DRDY */
+ MX50_PIN_DISP_RD, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* ELCDIF PIXCLK */
+ MX50_PIN_DISP_WR, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
+ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH),
+ },
+ { /* UART4 TXD - GPIO6[16] for EPD PMIC WAKEUP */
+ MX50_PIN_UART4_TXD, IOMUX_CONFIG_ALT1,
+ },
+ { /* UART4 RXD - GPIO6[17] for EPD PMIC intr */
+ MX50_PIN_UART4_RXD, IOMUX_CONFIG_ALT1,
+ },
+ /* USB_H1_PWR */
+ {
+ MX50_PIN_EPITO, IOMUX_CONFIG_ALT2,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_DRV_HIGH,
+ },
+ /* FIXME: USB_H1_OC, need to comment below line if
+ * one needs to debug owire.
+ */
+ {
+ MX50_PIN_OWIRE, IOMUX_CONFIG_ALT2,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_47K_PU,
+ },
+ /* USB_OTG_PWR */
+ {
+ MX50_PIN_PWM2, IOMUX_CONFIG_ALT2,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_DRV_HIGH,
+ },
+ /*
+ * Set USB_OTG_OC, the pad value is the default value
+ * according to IC suggestion.
+ */
+ {
+ MX50_PIN_PWM1, IOMUX_CONFIG_ALT2,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_47K_PU,
+ MUX_IN_USBOH1_IPP_IND_OTG_OC_SELECT_INPUT, INPUT_CTL_PATH1,
+ },
+ { /* FEC_MDIO */
+ MX50_PIN_SSI_RXC, IOMUX_CONFIG_ALT6,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_22K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE | PAD_CTL_DRV_HIGH),
+ MUX_IN_FEC_FEC_MDI_SELECT_INPUT,
+ INPUT_CTL_PATH1,
+ },
+ { /* FEC_TX_CLK */
+ MX50_PIN_DISP_D0, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE),
+ },
+ { /* FEC_RX_ER */
+ MX50_PIN_DISP_D1, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE),
+ MUX_IN_FEC_FEC_RX_ER_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* FEC_CRS_DV */
+ MX50_PIN_DISP_D2, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE),
+ MUX_IN_FEC_FEC_RX_DV_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* FEC_RXD1 */
+ MX50_PIN_DISP_D3, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE),
+ MUX_IN_FEC_FEC_RDATA_1_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* FEC_RXD0 */
+ MX50_PIN_DISP_D4, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE),
+ MUX_IN_FEC_FEC_RDATA_0_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* FEC_TX_EN */
+ MX50_PIN_DISP_D5, IOMUX_CONFIG_ALT2,
+ PAD_CTL_DRV_HIGH,
+ },
+ { /* FEC_TXD1 */
+ MX50_PIN_DISP_D6, IOMUX_CONFIG_ALT2,
+ PAD_CTL_DRV_HIGH,
+ },
+ { /* FEC_TXD0 */
+ MX50_PIN_DISP_D7, IOMUX_CONFIG_ALT2,
+ PAD_CTL_DRV_HIGH,
+ },
+ { /* FEC_MDC */
+ MX50_PIN_SSI_RXFS, IOMUX_CONFIG_ALT6,
+ PAD_CTL_DRV_HIGH,
+ },
+ { /* CSPI SS0 */
+ MX50_PIN_CSPI_SS0, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH),
+ },
+ { /* CSPI SS1 */
+ MX50_PIN_ECSPI1_MOSI, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_22K_PU | PAD_CTL_DRV_HIGH),
+ },
+ {
+ MX50_PIN_CSPI_MOSI, IOMUX_CONFIG_ALT0,
+ },
+ {
+ MX50_PIN_CSPI_MISO, IOMUX_CONFIG_ALT0,
+ },
+ {
+ MX50_PIN_CSPI_SCLK, IOMUX_CONFIG_ALT0,
+ },
+};
+
+static int __initdata enable_w1 = { 0 };
+static int __init w1_setup(char *__unused)
+{
+ enable_w1 = 1;
+ return cpu_is_mx50();
+}
+
+__setup("w1", w1_setup);
+
+void __init mx50_arm2_io_init(void)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(mxc_iomux_pins); i++) {
+ mxc_request_iomux(mxc_iomux_pins[i].pin,
+ mxc_iomux_pins[i].mux_mode);
+ if (mxc_iomux_pins[i].pad_cfg)
+ mxc_iomux_set_pad(mxc_iomux_pins[i].pin,
+ mxc_iomux_pins[i].pad_cfg);
+ if (mxc_iomux_pins[i].in_select)
+ mxc_iomux_set_input(mxc_iomux_pins[i].in_select,
+ mxc_iomux_pins[i].in_mode);
+ }
+
+ /* SD1 WP */
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_ECSPI2_SS0), "ecspi2_ss0");
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_ECSPI2_SS0));
+
+ /* SD1 CD */
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_EIM_CRE), "eim_cre");
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_EIM_CRE));
+
+ /* SD2 WP */
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_SD2_WP), "sd2_wp");
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_SD2_WP));
+
+ /* SD2 CD */
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_SD2_CD), "sd2_cd");
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_SD2_CD));
+
+ /* SD3 WP */
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_SD3_WP), "sd3_wp");
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_SD2_WP));
+
+ /* SD3 CD */
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_KEY_COL2), "key_col2");
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_KEY_COL2));
+
+ /* LINE1_DETECT (headphone detect) */
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_ECSPI1_SS0));
+
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_ECSPI2_MISO));
+
+ /* EPDC PMIC */
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_UART4_TXD), "uart4_txd");
+ gpio_direction_output(IOMUX_TO_GPIO(MX50_PIN_UART4_TXD), 0);
+
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_EPDC_VCOM0), "epdc_vcom");
+ gpio_direction_output(IOMUX_TO_GPIO(MX50_PIN_EPDC_VCOM0), 0);
+
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_UART4_RXD), "uart4_rxd");
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_UART4_RXD));
+
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_EPDC_PWRSTAT), "epdc_pwrstat");
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_EPDC_PWRSTAT));
+
+ /* ELCDIF backlight */
+ gpio_request(IOMUX_TO_GPIO(MX50_PIN_DISP_BUSY), "gp2_18");
+ gpio_direction_output(IOMUX_TO_GPIO(MX50_PIN_DISP_BUSY), 1);
+
+ if (enable_w1) {
+ /* OneWire */
+ mxc_request_iomux(MX50_PIN_OWIRE, IOMUX_CONFIG_ALT0);
+ mxc_iomux_set_pad(MX50_PIN_OWIRE, PAD_CTL_HYS_ENABLE |
+ PAD_CTL_PKE_ENABLE |
+ PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH |
+ PAD_CTL_SRE_FAST |
+ PAD_CTL_100K_PU |
+ PAD_CTL_PUE_PULL);
+ }
+}
+
+/* workaround for cspi chipselect pin may not keep correct level when idle */
+void mx50_arm2_gpio_spi_chipselect_active(int cspi_mode, int status,
+ int chipselect)
+{
+ switch (cspi_mode) {
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ switch (chipselect) {
+ case 0x1:
+ /* enable ss0 */
+ mxc_request_iomux(MX50_PIN_CSPI_SS0, IOMUX_CONFIG_ALT0);
+ /*disable other ss */
+ mxc_request_iomux(MX50_PIN_ECSPI1_MOSI, IOMUX_CONFIG_GPIO);
+ /* pull up/down deassert it */
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_ECSPI1_MOSI));
+ break;
+ case 0x2:
+ /* enable ss1 */
+ mxc_request_iomux(MX50_PIN_ECSPI1_MOSI, IOMUX_CONFIG_ALT2);
+ /*disable other ss */
+ mxc_request_iomux(MX50_PIN_CSPI_SS0, IOMUX_CONFIG_GPIO);
+ /* pull up/down deassert it */
+ gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_CSPI_SS0));
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void mx50_arm2_gpio_spi_chipselect_inactive(int cspi_mode, int status,
+ int chipselect)
+{
+ switch (cspi_mode) {
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ switch (chipselect) {
+ case 0x1:
+ mxc_free_iomux(MX50_PIN_ECSPI1_MOSI, IOMUX_CONFIG_GPIO);
+ break;
+ case 0x2:
+ mxc_free_iomux(MX50_PIN_CSPI_SS0, IOMUX_CONFIG_GPIO);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+}
diff --git a/arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c b/arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c
index 05b8462ade40..d852fb0e016b 100644
--- a/arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c
+++ b/arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c
@@ -27,8 +27,8 @@
#include <linux/regulator/machine.h>
#include <linux/mfd/mc13892/core.h>
#include <mach/irqs.h>
-
-#include <mach/iomux-mx50.h>
+#include "iomux.h"
+#include "mx50_pins.h"
/*
* Convenience conversion.
@@ -74,7 +74,11 @@
#define AUDIO_STBY_MASK (1 << 16)
#define SD_STBY_MASK (1 << 19)
-#define REG_MODE_0_ALL_MASK (DIG_STBY_MASK | GEN1_STBY_MASK)
+/* 0x92412 */
+#define REG_MODE_0_ALL_MASK (GEN1_STBY_MASK |\
+ DIG_STBY_MASK | GEN2_STBY_MASK |\
+ PLL_STBY_MASK)
+/* 0x92082 */
#define REG_MODE_1_ALL_MASK (CAM_STBY_MASK | VIDEO_STBY_MASK |\
AUDIO_STBY_MASK | SD_STBY_MASK)
@@ -149,17 +153,11 @@ static struct regulator_init_data sw2_init = {
static struct regulator_init_data sw3_init = {
.constraints = {
.name = "SW3",
- .min_uV = mV_to_uV(900),
+ .min_uV = mV_to_uV(1100),
.max_uV = mV_to_uV(1850),
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
.always_on = 1,
.boot_on = 1,
- .initial_state = PM_SUSPEND_MEM,
- .state_mem = {
- .uV = 950000,
- .mode = REGULATOR_MODE_NORMAL,
- .enabled = 1,
- },
}
};
@@ -330,6 +328,8 @@ static int mc13892_regulator_init(struct mc13892 *mc13892)
{
unsigned int value, register_mask;
printk("Initializing regulators for mx50 arm2.\n");
+ sw2_init.constraints.state_mem.uV = 1200000;
+ sw1_init.constraints.state_mem.uV = 1000000;
/* enable standby controll for all regulators */
pmic_read_reg(REG_MODE_0, &value, 0xffffff);
@@ -360,6 +360,7 @@ static int mc13892_regulator_init(struct mc13892 *mc13892)
(SWMODE_AUTO << SW4MODE_LSB);
pmic_write_reg(REG_SW_5, value, 0xffffff);
}
+
/* Enable coin cell charger */
value = BITFVAL(COINCHEN, 1) | BITFVAL(VCOIN, VCOIN_3_0V);
register_mask = BITFMASK(COINCHEN) | BITFMASK(VCOIN);
@@ -404,7 +405,7 @@ static struct mc13892_platform_data mc13892_plat = {
static struct spi_board_info __initdata mc13892_spi_device = {
.modalias = "pmic_spi",
- .irq = IOMUX_TO_IRQ_V3(114),
+ .irq = IOMUX_TO_IRQ(MX50_PIN_ECSPI2_MISO),
.max_speed_hz = 6000000, /* max spi SCK clock speed in HZ */
.bus_num = 3,
.chip_select = 0,
diff --git a/arch/arm/mach-mx5/mx50_pins.h b/arch/arm/mach-mx5/mx50_pins.h
new file mode 100644
index 000000000000..75d654442429
--- /dev/null
+++ b/arch/arm/mach-mx5/mx50_pins.h
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+#ifndef __ASM_ARCH_MXC_MX50_PINS_H__
+#define __ASM_ARCH_MXC_MX50_PINS_H__
+#include "iomux.h"
+
+/*!
+ * @file mach-mx5/mx50_pins.h
+ *
+ * @brief MX50 I/O Pin List
+ *
+ * @ingroup GPIO_MX50
+ */
+
+#ifndef __ASSEMBLY__
+
+#define PAD_I_START_MX50 0x2CC
+
+#define _MXC_BUILD_PIN_MX50(gp, gi, ga, mi, pi) \
+ (((gp) << MUX_IO_P) | ((gi) << MUX_IO_I) | \
+ ((mi) << MUX_I) | \
+ ((pi - PAD_I_START_MX50) << PAD_I) | \
+ ((ga) << GPIO_I))
+
+#define _MXC_BUILD_GPIO_PIN_MX50(gp, gi, ga, mi, pi) \
+ _MXC_BUILD_PIN_MX50(gp, gi, ga, mi, pi)
+
+#define _MXC_BUILD_NON_GPIO_PIN_MX50(mi, pi) \
+ _MXC_BUILD_PIN_MX50(NON_GPIO_PORT, 0, 0, mi, pi)
+/*!
+ * This enumeration is constructed based on the Section
+ * "sw_pad_ctl & sw_mux_ctl details" of the MX50 IC Spec. Each enumerated
+ * value is constructed based on the rules described above.
+ */
+enum iomux_pins {
+ MX50_PIN_KEY_COL0 = _MXC_BUILD_GPIO_PIN_MX50(3, 0, 1, 0x20, 0x2CC),
+ MX50_PIN_KEY_ROW0 = _MXC_BUILD_GPIO_PIN_MX50(3, 1, 1, 0x24, 0x2D0),
+ MX50_PIN_KEY_COL1 = _MXC_BUILD_GPIO_PIN_MX50(3, 2, 1, 0x28, 0x2D4),
+ MX50_PIN_KEY_ROW1 = _MXC_BUILD_GPIO_PIN_MX50(3, 3, 1, 0x2C, 0x2D8),
+ MX50_PIN_KEY_COL2 = _MXC_BUILD_GPIO_PIN_MX50(3, 4, 1, 0x30, 0x2DC),
+ MX50_PIN_KEY_ROW2 = _MXC_BUILD_GPIO_PIN_MX50(3, 5, 1, 0x34, 0x2E0),
+ MX50_PIN_KEY_COL3 = _MXC_BUILD_GPIO_PIN_MX50(3, 6, 1, 0x38, 0x2E4),
+ MX50_PIN_KEY_ROW3 = _MXC_BUILD_GPIO_PIN_MX50(3, 7, 1, 0x3C, 0x2E8),
+ MX50_PIN_I2C1_SCL = _MXC_BUILD_GPIO_PIN_MX50(5, 18, 1, 0x40, 0x2EC),
+ MX50_PIN_I2C1_SDA = _MXC_BUILD_GPIO_PIN_MX50(5, 19, 1, 0x44, 0x2F0),
+ MX50_PIN_I2C2_SCL = _MXC_BUILD_GPIO_PIN_MX50(5, 20, 1, 0x48, 0x2F4),
+ MX50_PIN_I2C2_SDA = _MXC_BUILD_GPIO_PIN_MX50(5, 21, 1, 0x4C, 0x2F8),
+ MX50_PIN_I2C3_SCL = _MXC_BUILD_GPIO_PIN_MX50(5, 22, 1, 0x50, 0x2FC),
+ MX50_PIN_I2C3_SDA = _MXC_BUILD_GPIO_PIN_MX50(5, 23, 1, 0x54, 0x300),
+ MX50_PIN_PWM1 = _MXC_BUILD_GPIO_PIN_MX50(5, 24, 1, 0x58, 0x304),
+ MX50_PIN_PWM2 = _MXC_BUILD_GPIO_PIN_MX50(5, 25, 1, 0x5C, 0x308),
+ MX50_PIN_OWIRE = _MXC_BUILD_GPIO_PIN_MX50(5, 26, 1, 0x60, 0x30C),
+ MX50_PIN_EPITO = _MXC_BUILD_GPIO_PIN_MX50(5, 27, 1, 0x64, 0x310),
+ MX50_PIN_WDOG = _MXC_BUILD_GPIO_PIN_MX50(5, 28, 1, 0x68, 0x314),
+ MX50_PIN_SSI_TXFS = _MXC_BUILD_GPIO_PIN_MX50(5, 0, 1, 0x6C, 0x318),
+ MX50_PIN_SSI_TXC = _MXC_BUILD_GPIO_PIN_MX50(5, 1, 1, 0x70, 0x31C),
+ MX50_PIN_SSI_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 2, 1, 0x74, 0x320),
+ MX50_PIN_SSI_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 3, 1, 0x78, 0x324),
+ MX50_PIN_SSI_RXFS = _MXC_BUILD_GPIO_PIN_MX50(5, 4, 1, 0x7C, 0x328),
+ MX50_PIN_SSI_RXC = _MXC_BUILD_GPIO_PIN_MX50(5, 5, 1, 0x80, 0x32C),
+ MX50_PIN_UART1_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 6, 1, 0x84, 0x330),
+ MX50_PIN_UART1_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 7, 1, 0x88, 0x334),
+ MX50_PIN_UART1_CTS = _MXC_BUILD_GPIO_PIN_MX50(5, 8, 1, 0x8C, 0x338),
+ MX50_PIN_UART1_RTS = _MXC_BUILD_GPIO_PIN_MX50(5, 9, 1, 0x90, 0x33C),
+ MX50_PIN_UART2_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 10, 1, 0x94, 0x340),
+ MX50_PIN_UART2_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 11, 1, 0x98, 0x344),
+ MX50_PIN_UART2_CTS = _MXC_BUILD_GPIO_PIN_MX50(5, 12, 1, 0x9C, 0x348),
+ MX50_PIN_UART2_RTS = _MXC_BUILD_GPIO_PIN_MX50(5, 13, 1, 0xA0, 0x34C),
+ MX50_PIN_UART3_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 14, 1, 0xA4, 0x350),
+ MX50_PIN_UART3_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 15, 1, 0xA8, 0x354),
+ MX50_PIN_UART4_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 16, 1, 0xAC, 0x358),
+ MX50_PIN_UART4_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 17, 1, 0xB0, 0x35C),
+ MX50_PIN_CSPI_SCLK = _MXC_BUILD_GPIO_PIN_MX50(3, 8, 1, 0xB4, 0x360),
+ MX50_PIN_CSPI_MOSI = _MXC_BUILD_GPIO_PIN_MX50(3, 9, 1, 0xB8, 0x364),
+ MX50_PIN_CSPI_MISO = _MXC_BUILD_GPIO_PIN_MX50(3, 10, 1, 0xBC, 0x368),
+ MX50_PIN_CSPI_SS0 = _MXC_BUILD_GPIO_PIN_MX50(3, 11, 1, 0xC0, 0x36C),
+ MX50_PIN_ECSPI1_SCLK = _MXC_BUILD_GPIO_PIN_MX50(3, 12, 1, 0xC4, 0x370),
+ MX50_PIN_ECSPI1_MOSI = _MXC_BUILD_GPIO_PIN_MX50(3, 13, 1, 0xC8, 0x374),
+ MX50_PIN_ECSPI1_MISO = _MXC_BUILD_GPIO_PIN_MX50(3, 14, 1, 0xCC, 0x378),
+ MX50_PIN_ECSPI1_SS0 = _MXC_BUILD_GPIO_PIN_MX50(3, 15, 1, 0xD0, 0x37C),
+ MX50_PIN_ECSPI2_SCLK = _MXC_BUILD_GPIO_PIN_MX50(3, 16, 1, 0xD4, 0x380),
+ MX50_PIN_ECSPI2_MOSI = _MXC_BUILD_GPIO_PIN_MX50(3, 17, 1, 0xD8, 0x384),
+ MX50_PIN_ECSPI2_MISO = _MXC_BUILD_GPIO_PIN_MX50(3, 18, 1, 0xDC, 0x388),
+ MX50_PIN_ECSPI2_SS0 = _MXC_BUILD_GPIO_PIN_MX50(3, 19, 1, 0xE0, 0x38C),
+ MX50_PIN_SD1_CLK = _MXC_BUILD_GPIO_PIN_MX50(4, 0, 1, 0xE4, 0x390),
+ MX50_PIN_SD1_CMD = _MXC_BUILD_GPIO_PIN_MX50(4, 1, 1, 0xE8, 0x394),
+ MX50_PIN_SD1_D0 = _MXC_BUILD_GPIO_PIN_MX50(4, 2, 1, 0xEC, 0x398),
+ MX50_PIN_SD1_D1 = _MXC_BUILD_GPIO_PIN_MX50(4, 3, 1, 0xF0, 0x39C),
+ MX50_PIN_SD1_D2 = _MXC_BUILD_GPIO_PIN_MX50(4, 4, 1, 0xF4, 0x3A0),
+ MX50_PIN_SD1_D3 = _MXC_BUILD_GPIO_PIN_MX50(4, 5, 1, 0xF8, 0x3A4),
+ MX50_PIN_SD2_CLK = _MXC_BUILD_GPIO_PIN_MX50(4, 6, 1, 0xFC, 0x3A8),
+ MX50_PIN_SD2_CMD = _MXC_BUILD_GPIO_PIN_MX50(4, 7, 1, 0x100, 0x3AC),
+ MX50_PIN_SD2_D0 = _MXC_BUILD_GPIO_PIN_MX50(4, 8, 1, 0x104, 0x3B0),
+ MX50_PIN_SD2_D1 = _MXC_BUILD_GPIO_PIN_MX50(4, 9, 1, 0x108, 0x3B4),
+ MX50_PIN_SD2_D2 = _MXC_BUILD_GPIO_PIN_MX50(4, 10, 1, 0x10C, 0x3B8),
+ MX50_PIN_SD2_D3 = _MXC_BUILD_GPIO_PIN_MX50(4, 11, 1, 0x110, 0x3BC),
+ MX50_PIN_SD2_D4 = _MXC_BUILD_GPIO_PIN_MX50(4, 12, 1, 0x114, 0x3C0),
+ MX50_PIN_SD2_D5 = _MXC_BUILD_GPIO_PIN_MX50(4, 13, 1, 0x118, 0x3C4),
+ MX50_PIN_SD2_D6 = _MXC_BUILD_GPIO_PIN_MX50(4, 14, 1, 0x11C, 0x3C8),
+ MX50_PIN_SD2_D7 = _MXC_BUILD_GPIO_PIN_MX50(4, 15, 1, 0x120, 0x3CC),
+ MX50_PIN_SD2_WP = _MXC_BUILD_GPIO_PIN_MX50(4, 16, 1, 0x124, 0x3D0),
+ MX50_PIN_SD2_CD = _MXC_BUILD_GPIO_PIN_MX50(4, 17, 1, 0x128, 0x3D4),
+
+ MX50_PIN_PMIC_ON_REQ = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3D8),
+ MX50_PIN_PMIC_STBY_REQ = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3DC),
+ MX50_PIN_PMIC_PORT_B = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3E0),
+ MX50_PIN_PMIC_BOOT_MODE1 = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3E4),
+ MX50_PIN_PMIC_RESET_IN_B = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3E8),
+ MX50_PIN_PMIC_BOOT_MODE0 = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3EC),
+ MX50_PIN_PMIC_TEST_MODE = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3F0),
+ MX50_PIN_PMIC_JTAG_TMS = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3F4),
+ MX50_PIN_PMIC_JTAG_MOD = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3F8),
+ MX50_PIN_PMIC_JTAG_TRSTB = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3FC),
+ MX50_PIN_PMIC_JTAG_TDI = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x400),
+ MX50_PIN_PMIC_JTAG_TCK = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x404),
+ MX50_PIN_PMIC_JTAG_TDO = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x408),
+
+ MX50_PIN_DISP_D0 = _MXC_BUILD_GPIO_PIN_MX50(1, 0, 1, 0x12C, 0x40C),
+ MX50_PIN_DISP_D1 = _MXC_BUILD_GPIO_PIN_MX50(1, 1, 1, 0x130, 0x410),
+ MX50_PIN_DISP_D2 = _MXC_BUILD_GPIO_PIN_MX50(1, 2, 1, 0x134, 0x414),
+ MX50_PIN_DISP_D3 = _MXC_BUILD_GPIO_PIN_MX50(1, 3, 1, 0x138, 0x418),
+ MX50_PIN_DISP_D4 = _MXC_BUILD_GPIO_PIN_MX50(1, 4, 1, 0x13C, 0x41C),
+ MX50_PIN_DISP_D5 = _MXC_BUILD_GPIO_PIN_MX50(1, 5, 1, 0x140, 0x420),
+ MX50_PIN_DISP_D6 = _MXC_BUILD_GPIO_PIN_MX50(1, 6, 1, 0x144, 0x424),
+ MX50_PIN_DISP_D7 = _MXC_BUILD_GPIO_PIN_MX50(1, 7, 1, 0x148, 0x428),
+ MX50_PIN_DISP_WR = _MXC_BUILD_GPIO_PIN_MX50(1, 16, 1, 0x14C, 0x42C),
+ MX50_PIN_DISP_RD = _MXC_BUILD_GPIO_PIN_MX50(1, 19, 1, 0x150, 0x430),
+ MX50_PIN_DISP_RS = _MXC_BUILD_GPIO_PIN_MX50(1, 17, 1, 0x154, 0x434),
+ MX50_PIN_DISP_CS = _MXC_BUILD_GPIO_PIN_MX50(1, 21, 1, 0x158, 0x438),
+ MX50_PIN_DISP_BUSY = _MXC_BUILD_GPIO_PIN_MX50(1, 18, 1, 0x15C, 0x43C),
+ MX50_PIN_DISP_RESET = _MXC_BUILD_GPIO_PIN_MX50(1, 20, 1, 0x160, 0x440),
+ MX50_PIN_SD3_CMD = _MXC_BUILD_GPIO_PIN_MX50(4, 18, 1, 0x164, 0x444),
+ MX50_PIN_SD3_CLK = _MXC_BUILD_GPIO_PIN_MX50(4, 19, 1, 0x168, 0x448),
+ MX50_PIN_SD3_D0 = _MXC_BUILD_GPIO_PIN_MX50(4, 20, 1, 0x16C, 0x44C),
+ MX50_PIN_SD3_D1 = _MXC_BUILD_GPIO_PIN_MX50(4, 21, 1, 0x170, 0x450),
+ MX50_PIN_SD3_D2 = _MXC_BUILD_GPIO_PIN_MX50(4, 22, 1, 0x174, 0x454),
+ MX50_PIN_SD3_D3 = _MXC_BUILD_GPIO_PIN_MX50(4, 23, 1, 0x178, 0x458),
+ MX50_PIN_SD3_D4 = _MXC_BUILD_GPIO_PIN_MX50(4, 24, 1, 0x17C, 0x45C),
+ MX50_PIN_SD3_D5 = _MXC_BUILD_GPIO_PIN_MX50(4, 25, 1, 0x180, 0x460),
+ MX50_PIN_SD3_D6 = _MXC_BUILD_GPIO_PIN_MX50(4, 26, 1, 0x184, 0x464),
+ MX50_PIN_SD3_D7 = _MXC_BUILD_GPIO_PIN_MX50(4, 27, 1, 0x188, 0x468),
+ MX50_PIN_SD3_WP = _MXC_BUILD_GPIO_PIN_MX50(4, 28, 1, 0x18C, 0x46C),
+ MX50_PIN_DISP_D8 = _MXC_BUILD_GPIO_PIN_MX50(1, 8, 1, 0x190, 0x470),
+ MX50_PIN_DISP_D9 = _MXC_BUILD_GPIO_PIN_MX50(1, 9, 1, 0x194, 0x474),
+ MX50_PIN_DISP_D10 = _MXC_BUILD_GPIO_PIN_MX50(1, 10, 1, 0x198, 0x478),
+ MX50_PIN_DISP_D11 = _MXC_BUILD_GPIO_PIN_MX50(1, 11, 1, 0x19C, 0x47C),
+ MX50_PIN_DISP_D12 = _MXC_BUILD_GPIO_PIN_MX50(1, 12, 1, 0x1A0, 0x480),
+ MX50_PIN_DISP_D13 = _MXC_BUILD_GPIO_PIN_MX50(1, 13, 1, 0x1A4, 0x484),
+ MX50_PIN_DISP_D14 = _MXC_BUILD_GPIO_PIN_MX50(1, 14, 1, 0x1A8, 0x488),
+ MX50_PIN_DISP_D15 = _MXC_BUILD_GPIO_PIN_MX50(1, 15, 1, 0x1AC, 0x48C),
+
+ MX50_PIN_EPDC_D0 = _MXC_BUILD_GPIO_PIN_MX50(2, 0, 1, 0x1B0, 0x54C),
+ MX50_PIN_EPDC_D1 = _MXC_BUILD_GPIO_PIN_MX50(2, 1, 1, 0x1B4, 0x550),
+ MX50_PIN_EPDC_D2 = _MXC_BUILD_GPIO_PIN_MX50(2, 2, 1, 0x1B8, 0x554),
+ MX50_PIN_EPDC_D3 = _MXC_BUILD_GPIO_PIN_MX50(2, 3, 1, 0x1BC, 0x558),
+ MX50_PIN_EPDC_D4 = _MXC_BUILD_GPIO_PIN_MX50(2, 4, 1, 0x1C0, 0x55C),
+ MX50_PIN_EPDC_D5 = _MXC_BUILD_GPIO_PIN_MX50(2, 5, 1, 0x1C4, 0x560),
+ MX50_PIN_EPDC_D6 = _MXC_BUILD_GPIO_PIN_MX50(2, 6, 1, 0x1C8, 0x564),
+ MX50_PIN_EPDC_D7 = _MXC_BUILD_GPIO_PIN_MX50(2, 7, 1, 0x1CC, 0x568),
+ MX50_PIN_EPDC_D8 = _MXC_BUILD_GPIO_PIN_MX50(2, 8, 1, 0x1D0, 0x56C),
+ MX50_PIN_EPDC_D9 = _MXC_BUILD_GPIO_PIN_MX50(2, 9, 1, 0x1D4, 0x570),
+ MX50_PIN_EPDC_D10 = _MXC_BUILD_GPIO_PIN_MX50(2, 10, 1, 0x1D8, 0x574),
+ MX50_PIN_EPDC_D11 = _MXC_BUILD_GPIO_PIN_MX50(2, 11, 1, 0x1DC, 0x578),
+ MX50_PIN_EPDC_D12 = _MXC_BUILD_GPIO_PIN_MX50(2, 12, 1, 0x1E0, 0x57C),
+ MX50_PIN_EPDC_D13 = _MXC_BUILD_GPIO_PIN_MX50(2, 13, 1, 0x1E4, 0x580),
+ MX50_PIN_EPDC_D14 = _MXC_BUILD_GPIO_PIN_MX50(2, 14, 1, 0x1E8, 0x584),
+ MX50_PIN_EPDC_D15 = _MXC_BUILD_GPIO_PIN_MX50(2, 15, 1, 0x1EC, 0x588),
+ MX50_PIN_EPDC_GDCLK = _MXC_BUILD_GPIO_PIN_MX50(2, 16, 1, 0x1F0, 0x58C),
+ MX50_PIN_EPDC_GDSP = _MXC_BUILD_GPIO_PIN_MX50(2, 17, 1, 0x1F4, 0x590),
+ MX50_PIN_EPDC_GDOE = _MXC_BUILD_GPIO_PIN_MX50(2, 18, 1, 0x1F8, 0x594),
+ MX50_PIN_EPDC_GDRL = _MXC_BUILD_GPIO_PIN_MX50(2, 19, 1, 0x1FC, 0x598),
+ MX50_PIN_EPDC_SDCLK = _MXC_BUILD_GPIO_PIN_MX50(2, 20, 1, 0x200, 0x59C),
+ MX50_PIN_EPDC_SDOEZ = _MXC_BUILD_GPIO_PIN_MX50(2, 21, 1, 0x204, 0x5A0),
+ MX50_PIN_EPDC_SDOED = _MXC_BUILD_GPIO_PIN_MX50(2, 22, 1, 0x208, 0x5A4),
+ MX50_PIN_EPDC_SDOE = _MXC_BUILD_GPIO_PIN_MX50(2, 23, 1, 0x20C, 0x5A8),
+ MX50_PIN_EPDC_SDLE = _MXC_BUILD_GPIO_PIN_MX50(2, 24, 1, 0x210, 0x5AC),
+ MX50_PIN_EPDC_SDCLKN = _MXC_BUILD_GPIO_PIN_MX50(2, 25, 1, 0x214, 0x5B0),
+ MX50_PIN_EPDC_SDSHR = _MXC_BUILD_GPIO_PIN_MX50(2, 26, 1, 0x218, 0x5B4),
+ MX50_PIN_EPDC_PWRCOM = _MXC_BUILD_GPIO_PIN_MX50(2, 27, 1, 0x21C, 0x5B8),
+ MX50_PIN_EPDC_PWRSTAT = _MXC_BUILD_GPIO_PIN_MX50(2, 28, 1, 0x220, 0x5BC),
+ MX50_PIN_EPDC_PWRCTRL0 = _MXC_BUILD_GPIO_PIN_MX50(2, 29, 1, 0x224, 0x5C0),
+ MX50_PIN_EPDC_PWRCTRL1 = _MXC_BUILD_GPIO_PIN_MX50(2, 30, 1, 0x228, 0x5C4),
+ MX50_PIN_EPDC_PWRCTRL2 = _MXC_BUILD_GPIO_PIN_MX50(2, 31, 1, 0x22C, 0x5C8),
+ MX50_PIN_EPDC_PWRCTRL3 = _MXC_BUILD_GPIO_PIN_MX50(3, 20, 1, 0x230, 0x5CC),
+ MX50_PIN_EPDC_VCOM0 = _MXC_BUILD_GPIO_PIN_MX50(3, 21, 1, 0x234, 0x5D0),
+ MX50_PIN_EPDC_VCOM1 = _MXC_BUILD_GPIO_PIN_MX50(3, 22, 1, 0x238, 0x5D4),
+ MX50_PIN_EPDC_BDR0 = _MXC_BUILD_GPIO_PIN_MX50(3, 23, 1, 0x23C, 0x5D8),
+ MX50_PIN_EPDC_BDR1 = _MXC_BUILD_GPIO_PIN_MX50(3, 24, 1, 0x240, 0x5DC),
+ MX50_PIN_EPDC_SDCE0 = _MXC_BUILD_GPIO_PIN_MX50(3, 25, 1, 0x244, 0x5E0),
+ MX50_PIN_EPDC_SDCE1 = _MXC_BUILD_GPIO_PIN_MX50(3, 26, 1, 0x248, 0x5E4),
+ MX50_PIN_EPDC_SDCE2 = _MXC_BUILD_GPIO_PIN_MX50(3, 27, 1, 0x24C, 0x5E8),
+ MX50_PIN_EPDC_SDCE3 = _MXC_BUILD_GPIO_PIN_MX50(3, 28, 1, 0x250, 0x5EC),
+ MX50_PIN_EPDC_SDCE4 = _MXC_BUILD_GPIO_PIN_MX50(3, 29, 1, 0x254, 0x5F0),
+ MX50_PIN_EPDC_SDCE5 = _MXC_BUILD_GPIO_PIN_MX50(3, 30, 1, 0x258, 0x5F4),
+ MX50_PIN_EIM_DA0 = _MXC_BUILD_GPIO_PIN_MX50(0, 0, 1, 0x25C, 0x5F8),
+ MX50_PIN_EIM_DA1 = _MXC_BUILD_GPIO_PIN_MX50(0, 1, 1, 0x260, 0x5FC),
+ MX50_PIN_EIM_DA2 = _MXC_BUILD_GPIO_PIN_MX50(0, 2, 1, 0x264, 0x600),
+ MX50_PIN_EIM_DA3 = _MXC_BUILD_GPIO_PIN_MX50(0, 3, 1, 0x268, 0x604),
+ MX50_PIN_EIM_DA4 = _MXC_BUILD_GPIO_PIN_MX50(0, 4, 1, 0x26C, 0x608),
+ MX50_PIN_EIM_DA5 = _MXC_BUILD_GPIO_PIN_MX50(0, 5, 1, 0x270, 0x60C),
+ MX50_PIN_EIM_DA6 = _MXC_BUILD_GPIO_PIN_MX50(0, 6, 1, 0x274, 0x610),
+ MX50_PIN_EIM_DA7 = _MXC_BUILD_GPIO_PIN_MX50(0, 7, 1, 0x278, 0x614),
+ MX50_PIN_EIM_DA8 = _MXC_BUILD_GPIO_PIN_MX50(0, 8, 1, 0x27C, 0x618),
+ MX50_PIN_EIM_DA9 = _MXC_BUILD_GPIO_PIN_MX50(0, 9, 1, 0x280, 0x61C),
+ MX50_PIN_EIM_DA10 = _MXC_BUILD_GPIO_PIN_MX50(0, 10, 1, 0x284, 0x620),
+ MX50_PIN_EIM_DA11 = _MXC_BUILD_GPIO_PIN_MX50(0, 11, 1, 0x288, 0x624),
+ MX50_PIN_EIM_DA12 = _MXC_BUILD_GPIO_PIN_MX50(0, 12, 1, 0x28C, 0x628),
+ MX50_PIN_EIM_DA13 = _MXC_BUILD_GPIO_PIN_MX50(0, 13, 1, 0x290, 0x62C),
+ MX50_PIN_EIM_DA14 = _MXC_BUILD_GPIO_PIN_MX50(0, 14, 1, 0x294, 0x630),
+ MX50_PIN_EIM_DA15 = _MXC_BUILD_GPIO_PIN_MX50(0, 15, 1, 0x298, 0x634),
+ MX50_PIN_EIM_CS2 = _MXC_BUILD_GPIO_PIN_MX50(0, 16, 1, 0x29C, 0x638),
+ MX50_PIN_EIM_CS1 = _MXC_BUILD_GPIO_PIN_MX50(0, 17, 1, 0x2A0, 0x63C),
+ MX50_PIN_EIM_CS0 = _MXC_BUILD_GPIO_PIN_MX50(0, 18, 1, 0x2A4, 0x640),
+ MX50_PIN_EIM_EB0 = _MXC_BUILD_GPIO_PIN_MX50(0, 19, 1, 0x2A8, 0x644),
+ MX50_PIN_EIM_EB1 = _MXC_BUILD_GPIO_PIN_MX50(0, 20, 1, 0x2AC, 0x648),
+ MX50_PIN_EIM_WAIT = _MXC_BUILD_GPIO_PIN_MX50(0, 21, 1, 0x2B0, 0x64C),
+ MX50_PIN_EIM_BCLK = _MXC_BUILD_GPIO_PIN_MX50(0, 22, 1, 0x2B4, 0x650),
+ MX50_PIN_EIM_RDY = _MXC_BUILD_GPIO_PIN_MX50(0, 23, 1, 0x2B8, 0x654),
+ MX50_PIN_EIM_OE = _MXC_BUILD_GPIO_PIN_MX50(0, 24, 1, 0x2BC, 0x658),
+ MX50_PIN_EIM_RW = _MXC_BUILD_GPIO_PIN_MX50(0, 25, 1, 0x2C0, 0x65C),
+ MX50_PIN_EIM_LBA = _MXC_BUILD_GPIO_PIN_MX50(0, 26, 1, 0x2C4, 0x660),
+ MX50_PIN_EIM_CRE = _MXC_BUILD_GPIO_PIN_MX50(0, 27, 1, 0x2C8, 0x664),
+
+};
+
+/*!
+ * various IOMUX input select register index
+ */
+enum iomux_input_select_mx50 {
+ MUX_IN_AUDMUX_P4_INPUT_DA_AMX_SELECT_I = 0,
+ MUX_IN_AUDMUX_P4_INPUT_DB_AMX_SELECT_I,
+ MUX_IN_AUDMUX_P4_INPUT_RXCLK_AMX_SELECT_INPUT,
+ MUX_IN_AUDMUX_P4_INPUT_RXFS_AMX_SELECT_INPUT,
+ MUX_IN_AUDMUX_P4_INPUT_TXCLK_AMX_SELECT_INPUT,
+ MUX_IN_AUDMUX_P4_INPUT_TXFS_AMX_SELECT_INPUT,
+ MUX_IN_CCM_PLL1_BYPASS_CLK_SELECT_INPUT,
+ MUX_IN_CCM_PLL2_BYPASS_CLK_SELECT_INPUT,
+ MUX_IN_CCM_PLL3_BYPASS_CLK_SELECT_INPUT,
+ MUX_IN_CSPI_IPP_IND_DATAREADY_B_SELECT_INPUT,
+ MUX_IN_CSPI_IPP_IND_SS1_B_SELECT_INPUT,
+ MUX_IN_CSPI_IPP_IND_SS2_B_SELECT_INPUT,
+ MUX_IN_CSPI_IPP_IND_SS3_B_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_BUSY_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_0_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_1_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_2_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_3_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_4_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_5_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_6_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_7_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_8_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_9_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_10_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_11_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_12_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_13_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_14_SELECT_INPUT,
+ MUX_IN_ELCDIF_LCDIF_RXDATA_15_SELECT_INPUT,
+ MUX_IN_ELCDIF_VSYNC_I_SELECT_INPUT,
+ MUX_IN_ESDHC2_IPP_CARD_DET_SELECT_INPUT,
+ MUX_IN_ESDHC2_IPP_WP_ON_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_CARD_CLK_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_CMD_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_DAT0_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_DAT1_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_DAT2_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_DAT3_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_DAT4_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_DAT5_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_DAT6_IN_SELECT_INPUT,
+ MUX_IN_ESDHC4_IPP_DAT7_IN_SELECT_INPUT,
+ MUX_IN_FEC_FEC_COL_SELECT_INPUT,
+ MUX_IN_FEC_FEC_MDI_SELECT_INPUT,
+ MUX_IN_FEC_FEC_RDATA_0_SELECT_INPUT,
+ MUX_IN_FEC_FEC_RDATA_1_SELECT_INPUT,
+ MUX_IN_FEC_FEC_RX_CLK_SELECT_INPUT,
+ MUX_IN_FEC_FEC_RX_DV_SELECT_INPUT,
+ MUX_IN_FEC_FEC_RX_ER_SELECT_INPUT,
+ MUX_IN_FEC_FEC_TX_CLK_SELECT_INPUT,
+ MUX_IN_KPP_IPP_IND_COL_4_SELECT_INPUT,
+ MUX_IN_KPP_IPP_IND_COL_5_SELECT_INPUT,
+ MUX_IN_KPP_IPP_IND_COL_6_SELECT_INPUT,
+ MUX_IN_KPP_IPP_IND_COL_7_SELECT_INPUT,
+ MUX_IN_KPP_IPP_IND_ROW_4_SELECT_INPUT,
+ MUX_IN_KPP_IPP_IND_ROW_5_SELECT_INPUT,
+ MUX_IN_KPP_IPP_IND_ROW_6_SELECT_INPUT,
+ MUX_IN_KPP_IPP_IND_ROW_7_SELECT_INPUT,
+ MUX_IN_RAWNAND_U_GPMI_INPUT_GPMI_DQS_IN_SELECT_INPUT,
+ MUX_IN_RAWNAND_U_GPMI_INPUT_GPMI_RDY0_IN_SELECT_INPUT,
+ MUX_IN_SDMA_EVENTS_14_SELECT_INPUT,
+ MUX_IN_SDMA_EVENTS_15_SELECT_INPUT,
+ MUX_IN_UART1_IPP_UART_RTS_B_SELECT_INPUT,
+ MUX_IN_UART1_IPP_UART_RXD_MUX_SELECT_INPUT,
+ MUX_IN_UART2_IPP_UART_RTS_B_SELECT_INPUT,
+ MUX_IN_UART2_IPP_UART_RXD_MUX_SELECT_INPUT,
+ MUX_IN_UART3_IPP_UART_RTS_B_SELECT_INPUT,
+ MUX_IN_UART3_IPP_UART_RXD_MUX_SELECT_INPUT,
+ MUX_IN_UART4_IPP_UART_RTS_B_SELECT_INPUT,
+ MUX_IN_UART4_IPP_UART_RXD_MUX_SELECT_INPUT,
+ MUX_IN_UART5_IPP_UART_RTS_B_SELECT_INPUT,
+ MUX_IN_UART5_IPP_UART_RXD_MUX_SELECT_INPUT,
+ MUX_IN_USBOH1_IPP_IND_OTG_OC_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_0_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_1_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_2_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_3_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_4_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_5_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_6_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_7_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_8_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_9_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_10_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_11_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_12_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_13_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_14_SELECT_INPUT,
+ MUX_IN_WEIMV2_IPP_IND_READ_DATA_15_SELECT_INPUT,
+
+ MUX_INPUT_NUM_MUX,
+};
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ASM_ARCH_MXC_MX50_PINS_H__ */
diff --git a/arch/arm/mach-mx5/mx51_3stack.c b/arch/arm/mach-mx5/mx51_3stack.c
index cc5a205d594d..4fade5a37ac2 100644
--- a/arch/arm/mach-mx5/mx51_3stack.c
+++ b/arch/arm/mach-mx5/mx51_3stack.c
@@ -184,77 +184,15 @@ static struct mxc_vpu_platform_data mxc_vpu_data = {
.reset = mx5_vpu_reset,
};
-/* workaround for ecspi chipselect pin may not keep correct level when idle */
-static void mx51_3ds_gpio_spi_chipselect_active(int cspi_mode, int status,
- int chipselect)
-{
- u32 gpio;
-
- switch (cspi_mode) {
- case 1:
- switch (chipselect) {
- case 0x1:
- mxc_request_iomux(MX51_PIN_CSPI1_SS0,
- IOMUX_CONFIG_ALT0);
- mxc_iomux_set_pad(MX51_PIN_CSPI1_SS0,
- PAD_CTL_HYS_ENABLE |
- PAD_CTL_PKE_ENABLE |
- PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
- break;
- case 0x2:
- gpio = IOMUX_TO_GPIO(MX51_PIN_CSPI1_SS0);
- mxc_request_iomux(MX51_PIN_CSPI1_SS0,
- IOMUX_CONFIG_GPIO);
- gpio_request(gpio, "cspi1_ss0");
- gpio_direction_output(gpio, 0);
- gpio_set_value(gpio, 1 & (~status));
- break;
- default:
- break;
- }
- break;
- case 2:
- break;
- case 3:
- break;
- default:
- break;
- }
-}
-
-static void mx51_3ds_gpio_spi_chipselect_inactive(int cspi_mode, int status,
- int chipselect)
-{
- switch (cspi_mode) {
- case 1:
- switch (chipselect) {
- case 0x1:
- mxc_free_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT0);
- mxc_request_iomux(MX51_PIN_CSPI1_SS0,
- IOMUX_CONFIG_GPIO);
- mxc_free_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_GPIO);
- break;
- case 0x2:
- mxc_free_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_GPIO);
- break;
- default:
- break;
- }
- break;
- case 2:
- break;
- case 3:
- break;
- default:
- break;
- }
-}
-
+extern void mx51_babbage_gpio_spi_chipselect_active(int cspi_mode, int status,
+ int chipselect);
+extern void mx51_babbage_gpio_spi_chipselect_inactive(int cspi_mode, int status,
+ int chipselect);
static struct mxc_spi_master mxcspi1_data = {
.maxchipselect = 4,
.spi_version = 23,
- .chipselect_active = mx51_3ds_gpio_spi_chipselect_active,
- .chipselect_inactive = mx51_3ds_gpio_spi_chipselect_inactive,
+ .chipselect_active = mx51_babbage_gpio_spi_chipselect_active,
+ .chipselect_inactive = mx51_babbage_gpio_spi_chipselect_inactive,
};
static struct mxc_i2c_platform_data mxci2c_data = {
@@ -278,11 +216,11 @@ static struct mxc_dvfs_platform_data dvfs_core_data = {
.reg_id = "SW1",
.clk1_id = "cpu_clk",
.clk2_id = "gpc_dvfs_clk",
- .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET,
- .gpc_vcr_offset = MXC_GPC_VCR_OFFSET,
- .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET,
- .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET,
- .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET,
+ .gpc_cntr_reg_addr = MXC_GPC_CNTR,
+ .gpc_vcr_reg_addr = MXC_GPC_VCR,
+ .ccm_cdcr_reg_addr = MXC_CCM_CDCR,
+ .ccm_cacrr_reg_addr = MXC_CCM_CACRR,
+ .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR,
.prediv_mask = 0x1F800,
.prediv_offset = 11,
.prediv_val = 3,
@@ -950,8 +888,6 @@ static void __init mxc_board_init(void)
mxc_ipu_data.di_clk[0] = clk_get(NULL, "ipu_di0_clk");
mxc_ipu_data.di_clk[1] = clk_get(NULL, "ipu_di1_clk");
- mxc_ipu_data.csi_clk[0] = clk_get(NULL, "csi_mclk1");
- mxc_ipu_data.csi_clk[1] = clk_get(NULL, "csi_mclk2");
mxc_spdif_data.spdif_core_clk = clk_get(NULL, "spdif_xtal_clk");
clk_put(mxc_spdif_data.spdif_core_clk);
@@ -1020,8 +956,6 @@ static void __init mxc_board_init(void)
mxc_register_device(&mxc_sgtl5000_device, &sgtl5000_data);
mxc_register_device(&mxc_bt_device, &mxc_bt_data);
mxc_register_device(&mxc_gps_device, &gps_data);
- mxc_register_device(&mxc_v4l2_device, NULL);
- mxc_register_device(&mxc_v4l2out_device, NULL);
mx5_usb_dr_init();
mx5_usbh1_init();
diff --git a/arch/arm/mach-mx5/mx51_babbage.c b/arch/arm/mach-mx5/mx51_babbage.c
index 1acc44937e65..6658a99e1d2e 100644
--- a/arch/arm/mach-mx5/mx51_babbage.c
+++ b/arch/arm/mach-mx5/mx51_babbage.c
@@ -31,7 +31,6 @@
#include <linux/ipu.h>
#include <linux/mxcfb.h>
#include <linux/pwm_backlight.h>
-#include <linux/fec.h>
#include <mach/common.h>
#include <mach/hardware.h>
#include <asm/setup.h>
@@ -44,16 +43,12 @@
#include <mach/mmc.h>
#include <mach/mxc_dvfs.h>
#include <mach/mxc_edid.h>
-#include <mach/iomux-mx51.h>
-#include <mach/gpio.h>
#include "devices.h"
+#include "iomux.h"
+#include "mx51_pins.h"
#include "crm_regs.h"
#include "usb.h"
-#include <mach/mxc_edid.h>
-#include <linux/android_pmem.h>
-#include <linux/usb/android.h>
-#include <linux/switch.h>
/*!
* @file mach-mx51/mx51_babbage.c
@@ -62,181 +57,12 @@
*
* @ingroup MSL_MX51
*/
-
-#define BABBAGE_SD1_CD (0*32 + 0) /* GPIO_1_0 */
-#define BABBAGE_SD1_WP (0*32 + 1) /* GPIO_1_1 */
-#define BABBAGE_SD2_CD_2_0 (0*32 + 4) /* GPIO_1_4 */
-#define BABBAGE_SD2_WP (0*32 + 5) /* GPIO_1_5 */
-#define BABBAGE_SD2_CD_2_5 (0*32 + 6) /* GPIO_1_6 */
-#define BABBAGE_USBH1_HUB_RST (0*32 + 7) /* GPIO_1_7 */
-#define BABBAGE_PMIC_INT (0*32 + 8) /* GPIO_1_8 */
-
-#define BABBAGE_USB_CLK_EN_B (1*32 + 1) /* GPIO_2_1 */
-#define BABBAGE_OSC_EN_B (1*32 + 2) /* GPIO_2_2 */
-#define BABBAGE_PHY_RESET (1*32 + 5) /* GPIO_2_5 */
-#define BABBAGE_CAM_RESET (1*32 + 7) /* GPIO_2_7 */
-#define BABBAGE_FM_PWR (1*32 + 12) /* GPIO_2_12 */
-#define BABBAGE_VGA_RESET (1*32 + 13) /* GPIO_2_13 */
-#define BABBAGE_FEC_PHY_RESET (1*32 + 14) /* GPIO_2_14 */
-#define BABBAGE_FM_RESET (1*32 + 15) /* GPIO_2_15 */
-#define BABBAGE_AUDAMP_STBY (1*32 + 17) /* GPIO_2_17 */
-#define BABBAGE_POWER_KEY (1*32 + 21) /* GPIO_2_21 */
-
-#define BABBAGE_26M_OSC_EN (2*32 + 1) /* GPIO_3_1 */
-#define BABBAGE_LVDS_POWER_DOWN (2*32 + 3) /* GPIO_3_3 */
-#define BABBAGE_DISP_BRIGHTNESS_CTL (2*32 + 4) /* GPIO_3_4 */
-#define BABBAGE_DVI_RESET (2*32 + 5) /* GPIO_3_5 */
-#define BABBAGE_DVI_POWER (2*32 + 6) /* GPIO_3_6 */
-#define BABBAGE_HEADPHONE_DET (2*32 + 26) /* GPIO_3_26 */
-#define BABBAGE_DVI_DET (2*32 + 28) /* GPIO_3_28 */
-
-#define BABBAGE_LCD_3V3_ON (3*32 + 9) /* GPIO_4_9 */
-#define BABBAGE_LCD_5V_ON (3*32 + 10) /* GPIO_4_10 */
-#define BABBAGE_CAM_LOW_POWER (3*32 + 10) /* GPIO_4_12 */
-#define BABBAGE_DVI_I2C_EN (3*32 + 14) /* GPIO_4_14 */
-#define BABBAGE_CSP1_SS0_GPIO (3*32 + 24) /* GPIO_4_24 */
-#define BABBAGE_AUDIO_CLK_EN (3*32 + 26) /* GPIO_4_26 */
-
extern int __init mx51_babbage_init_mc13892(void);
+extern void __init mx51_babbage_io_init(void);
extern struct cpu_wp *(*get_cpu_wp)(int *wp);
extern void (*set_num_cpu_wp)(int num);
static int num_cpu_wp = 3;
-static struct pad_desc mx51babbage_pads[] = {
- /* UART1 */
- MX51_PAD_UART1_RXD__UART1_RXD,
- MX51_PAD_UART1_TXD__UART1_TXD,
- MX51_PAD_UART1_RTS__UART1_RTS,
- MX51_PAD_UART1_CTS__UART1_CTS,
-
- /* USB HOST1 */
- MX51_PAD_USBH1_STP__USBH1_STP,
- MX51_PAD_USBH1_CLK__USBH1_CLK,
- MX51_PAD_USBH1_DIR__USBH1_DIR,
- MX51_PAD_USBH1_NXT__USBH1_NXT,
- MX51_PAD_USBH1_DATA0__USBH1_DATA0,
- MX51_PAD_USBH1_DATA1__USBH1_DATA1,
- MX51_PAD_USBH1_DATA2__USBH1_DATA2,
- MX51_PAD_USBH1_DATA3__USBH1_DATA3,
- MX51_PAD_USBH1_DATA4__USBH1_DATA4,
- MX51_PAD_USBH1_DATA5__USBH1_DATA5,
- MX51_PAD_USBH1_DATA6__USBH1_DATA6,
- MX51_PAD_USBH1_DATA7__USBH1_DATA7,
-
- MX51_PAD_GPIO_1_0__GPIO_1_0,
- MX51_PAD_GPIO_1_1__GPIO_1_1,
- MX51_PAD_GPIO_1_4__GPIO_1_4,
- MX51_PAD_GPIO_1_5__GPIO_1_5,
- MX51_PAD_GPIO_1_6__GPIO_1_6,
- MX51_PAD_GPIO_1_7__GPIO_1_7,
- MX51_PAD_GPIO_1_8__GPIO_1_8,
- MX51_PAD_UART3_RXD__GPIO_1_22,
-
- MX51_PAD_EIM_D17__GPIO_2_1,
- MX51_PAD_EIM_D18__GPIO_2_2,
- MX51_PAD_EIM_D21__GPIO_2_5,
- MX51_PAD_EIM_D23__GPIO_2_7,
- MX51_PAD_EIM_A16__GPIO_2_10,
- MX51_PAD_EIM_A17__GPIO_2_11,
- MX51_PAD_EIM_A18__GPIO_2_12,
- MX51_PAD_EIM_A19__GPIO_2_13,
- MX51_PAD_EIM_A20__GPIO_2_14,
- MX51_PAD_EIM_A21__GPIO_2_15,
- MX51_PAD_EIM_A22__GPIO_2_16,
- MX51_PAD_EIM_A23__GPIO_2_17,
- MX51_PAD_EIM_A27__GPIO_2_21,
- MX51_PAD_EIM_DTACK__GPIO_2_31,
-
- MX51_PAD_EIM_LBA__GPIO_3_1,
- MX51_PAD_DI1_D0_CS__GPIO_3_3,
- MX51_PAD_DISPB2_SER_DIN__GPIO_3_5,
- MX51_PAD_DISPB2_SER_DIO__GPIO_3_6,
- MX51_PAD_NANDF_CS0__GPIO_3_16,
- MX51_PAD_NANDF_CS1__GPIO_3_17,
- MX51_PAD_NANDF_D14__GPIO_3_26,
- MX51_PAD_NANDF_D12__GPIO_3_28,
-
- MX51_PAD_CSI2_D12__GPIO_4_9,
- MX51_PAD_CSI2_D13__GPIO_4_10,
- MX51_PAD_CSI2_D19__GPIO_4_12,
- MX51_PAD_CSI2_HSYNC__GPIO_4_14,
- MX51_PAD_CSPI1_RDY__GPIO_4_26,
-
- MX51_PAD_EIM_EB2__FEC_MDIO,
- MX51_PAD_EIM_EB3__FEC_RDAT1,
- MX51_PAD_EIM_CS2__FEC_RDAT2,
- MX51_PAD_EIM_CS3__FEC_RDAT3,
- MX51_PAD_EIM_CS4__FEC_RX_ER,
- MX51_PAD_EIM_CS5__FEC_CRS,
- MX51_PAD_NANDF_RB2__FEC_COL,
- MX51_PAD_NANDF_RB3__FEC_RXCLK,
- MX51_PAD_NANDF_RB6__FEC_RDAT0,
- MX51_PAD_NANDF_RB7__FEC_TDAT0,
- MX51_PAD_NANDF_CS2__FEC_TX_ER,
- MX51_PAD_NANDF_CS3__FEC_MDC,
- MX51_PAD_NANDF_CS4__FEC_TDAT1,
- MX51_PAD_NANDF_CS5__FEC_TDAT2,
- MX51_PAD_NANDF_CS6__FEC_TDAT3,
- MX51_PAD_NANDF_CS7__FEC_TX_EN,
- MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK,
-
- MX51_PAD_GPIO_NAND__PATA_INTRQ,
-
- MX51_PAD_DI_GP4__DI2_PIN15,
-#ifdef CONFIG_FB_MXC_CLAA_WVGA_SYNC_PANEL
- MX51_PAD_DISP1_DAT22__DISP2_DAT16,
- MX51_PAD_DISP1_DAT23__DISP2_DAT17,
-
- MX51_PAD_DI1_D1_CS__GPIO_3_4,
-#endif
- MX51_PAD_I2C1_CLK__HSI2C_CLK,
- MX51_PAD_I2C1_DAT__HSI2C_DAT,
- MX51_PAD_EIM_D16__I2C1_SDA,
- MX51_PAD_EIM_D19__I2C1_SCL,
-
- MX51_PAD_GPIO_1_2__PWM_PWMO,
-
- MX51_PAD_KEY_COL5__I2C2_SDA,
- MX51_PAD_KEY_COL4__I2C2_SCL,
-
- MX51_PAD_SD1_CMD__SD1_CMD,
- MX51_PAD_SD1_CLK__SD1_CLK,
- MX51_PAD_SD1_DATA0__SD1_DATA0,
- MX51_PAD_SD1_DATA1__SD1_DATA1,
- MX51_PAD_SD1_DATA2__SD1_DATA2,
- MX51_PAD_SD1_DATA3__SD1_DATA3,
-
- MX51_PAD_SD2_CMD__SD2_CMD,
- MX51_PAD_SD2_CLK__SD2_CLK,
- MX51_PAD_SD2_DATA0__SD2_DATA0,
- MX51_PAD_SD2_DATA1__SD2_DATA1,
- MX51_PAD_SD2_DATA2__SD2_DATA2,
- MX51_PAD_SD2_DATA3__SD2_DATA3,
-
- MX51_PAD_AUD3_BB_TXD__AUD3_BB_TXD,
- MX51_PAD_AUD3_BB_RXD__AUD3_BB_RXD,
- MX51_PAD_AUD3_BB_CK__AUD3_BB_CK,
- MX51_PAD_AUD3_BB_FS__AUD3_BB_FS,
-
- MX51_PAD_CSPI1_SS1__CSPI1_SS1,
-
- MX51_PAD_DI_GP3__CSI1_DATA_EN,
- MX51_PAD_CSI1_D10__CSI1_D10,
- MX51_PAD_CSI1_D11__CSI1_D11,
- MX51_PAD_CSI1_D12__CSI1_D12,
- MX51_PAD_CSI1_D13__CSI1_D13,
- MX51_PAD_CSI1_D14__CSI1_D14,
- MX51_PAD_CSI1_D15__CSI1_D15,
- MX51_PAD_CSI1_D16__CSI1_D16,
- MX51_PAD_CSI1_D17__CSI1_D17,
- MX51_PAD_CSI1_D18__CSI1_D18,
- MX51_PAD_CSI1_D19__CSI1_D19,
- MX51_PAD_CSI1_VSYNC__CSI1_VSYNC,
- MX51_PAD_CSI1_HSYNC__CSI1_HSYNC,
-
- MX51_PAD_OWIRE_LINE__SPDIF_OUT1,
-};
-
/* working point(wp): 0 - 800MHz; 1 - 166.25MHz; */
static struct cpu_wp cpu_wp_auto[] = {
{
@@ -298,7 +124,7 @@ static struct fb_videomode video_modes[] = {
FB_VMODE_NONINTERLACED,
0,},
{
- /*MITSUBISHI LVDS panel */
+ /* MITSUBISHI LVDS panel */
"XGA", 60, 1024, 768, 15385,
220, 40,
21, 7,
@@ -364,73 +190,10 @@ static struct mxc_vpu_platform_data mxc_vpu_data = {
.reset = mx5_vpu_reset,
};
-static struct fec_platform_data fec_data = {
- .phy = PHY_INTERFACE_MODE_MII,
- .phy_mask = ~1UL,
-};
-
-/* workaround for ecspi chipselect pin may not keep correct level when idle */
-static void mx51_babbage_gpio_spi_chipselect_active(int cspi_mode, int status,
- int chipselect)
-{
- switch (cspi_mode) {
- case 1:
- switch (chipselect) {
- case 0x1:
- {
- struct pad_desc cspi1_ss0 = MX51_PAD_CSPI1_SS0__CSPI1_SS0;
-
- mxc_iomux_v3_setup_pad(&cspi1_ss0);
- break;
- }
- case 0x2:
- {
- struct pad_desc cspi1_ss0_gpio = MX51_PAD_CSPI1_SS0__GPIO_4_24;
-
- mxc_iomux_v3_setup_pad(&cspi1_ss0_gpio);
- gpio_request(BABBAGE_CSP1_SS0_GPIO, "cspi1-gpio");
- gpio_direction_output(BABBAGE_CSP1_SS0_GPIO, 0);
- gpio_set_value(BABBAGE_CSP1_SS0_GPIO, 1 & (~status));
- break;
- }
- default:
- break;
- }
- break;
- case 2:
- break;
- case 3:
- break;
- default:
- break;
- }
-}
-
-static void mx51_babbage_gpio_spi_chipselect_inactive(int cspi_mode, int status,
- int chipselect)
-{
- switch (cspi_mode) {
- case 1:
- switch (chipselect) {
- case 0x1:
- break;
- case 0x2:
- gpio_free(BABBAGE_CSP1_SS0_GPIO);
- break;
-
- default:
- break;
- }
- break;
- case 2:
- break;
- case 3:
- break;
- default:
- break;
- }
-}
-
+extern void mx51_babbage_gpio_spi_chipselect_active(int cspi_mode, int status,
+ int chipselect);
+extern void mx51_babbage_gpio_spi_chipselect_inactive(int cspi_mode, int status,
+ int chipselect);
static struct mxc_spi_master mxcspi1_data = {
.maxchipselect = 4,
.spi_version = 23,
@@ -458,11 +221,11 @@ static struct mxc_dvfs_platform_data dvfs_core_data = {
.reg_id = "SW1",
.clk1_id = "cpu_clk",
.clk2_id = "gpc_dvfs_clk",
- .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET,
- .gpc_vcr_offset = MXC_GPC_VCR_OFFSET,
- .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET,
- .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET,
- .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET,
+ .gpc_cntr_reg_addr = MXC_GPC_CNTR,
+ .gpc_vcr_reg_addr = MXC_GPC_VCR,
+ .ccm_cdcr_reg_addr = MXC_CCM_CDCR,
+ .ccm_cacrr_reg_addr = MXC_CCM_CACRR,
+ .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR,
.prediv_mask = 0x1F800,
.prediv_offset = 11,
.prediv_val = 3,
@@ -533,24 +296,26 @@ static int __init mxc_init_fb(void)
return 0;
/* DI0-LVDS */
- gpio_set_value(BABBAGE_LVDS_POWER_DOWN, 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DI1_D0_CS), 0);
msleep(1);
- gpio_set_value(BABBAGE_LVDS_POWER_DOWN, 1);
- gpio_set_value(BABBAGE_LCD_3V3_ON, 1);
- gpio_set_value(BABBAGE_LCD_5V_ON, 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DI1_D0_CS), 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_CSI2_D12), 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_CSI2_D13), 1);
/* DVI Detect */
- gpio_request(BABBAGE_DVI_DET, "dvi-detect");
- gpio_direction_input(BABBAGE_DVI_DET);
+ gpio_request(IOMUX_TO_GPIO(MX51_PIN_NANDF_D12), "nandf_d12");
+ gpio_direction_input(IOMUX_TO_GPIO(MX51_PIN_NANDF_D12));
/* DVI Reset - Assert for i2c disabled mode */
- gpio_request(BABBAGE_DVI_RESET, "dvi-reset");
- gpio_direction_output(BABBAGE_DVI_RESET, 0);
+ gpio_request(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), "dispb2_ser_din");
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
+ gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
/* DVI Power-down */
- gpio_request(BABBAGE_DVI_POWER, "dvi-power");
- gpio_direction_output(BABBAGE_DVI_POWER, 1);
+ gpio_request(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIO), "dispb2_ser_di0");
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIO), 1);
+ gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIO), 0);
/* WVGA Reset */
- gpio_set_value(BABBAGE_DISP_BRIGHTNESS_CTL, 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DI1_D1_CS), 1);
if (primary_di) {
printk(KERN_INFO "DI1 is primary\n");
@@ -672,15 +437,15 @@ static int handle_edid(int *pixclk)
static void dvi_reset(void)
{
- gpio_direction_output(BABBAGE_DVI_RESET, 0);
- gpio_set_value(BABBAGE_DVI_RESET, 0);
+ gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
msleep(50);
/* do reset */
- gpio_set_value(BABBAGE_DVI_RESET, 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 1);
msleep(20); /* tRES >= 50us */
- gpio_set_value(BABBAGE_DVI_RESET, 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
}
static struct mxc_lcd_platform_data dvi_data = {
@@ -691,13 +456,14 @@ static struct mxc_lcd_platform_data dvi_data = {
static void vga_reset(void)
{
-
- gpio_set_value(BABBAGE_VGA_RESET, 0);
+ gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), "eim_a19");
+ gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), 0);
msleep(50);
/* do reset */
- gpio_set_value(BABBAGE_VGA_RESET, 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), 1);
msleep(10); /* tRES >= 50us */
- gpio_set_value(BABBAGE_VGA_RESET, 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), 0);
}
static struct mxc_lcd_platform_data vga_data = {
@@ -710,23 +476,22 @@ static struct mxc_lcd_platform_data vga_data = {
static void si4702_reset(void)
{
return;
-
- gpio_set_value(BABBAGE_FM_RESET, 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A21), 0);
msleep(100);
- gpio_set_value(BABBAGE_FM_RESET, 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A21), 1);
msleep(100);
}
static void si4702_clock_ctl(int flag)
{
- gpio_set_value(BABBAGE_FM_PWR, flag);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A18), flag);
msleep(100);
}
static void si4702_gpio_get(void)
{
- gpio_request(BABBAGE_FM_PWR, "fm-power");
- gpio_direction_output(BABBAGE_FM_PWR, 0);
+ gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A18), "eim_a18");
+ gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A18), 0);
}
static void si4702_gpio_put(void)
@@ -852,9 +617,9 @@ static int sdhc_write_protect(struct device *dev)
unsigned short rc = 0;
if (to_platform_device(dev)->id == 0)
- rc = gpio_get_value(BABBAGE_SD1_WP);
+ rc = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_1));
else
- rc = gpio_get_value(BABBAGE_SD2_WP);
+ rc = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5));
return rc;
}
@@ -864,15 +629,15 @@ static unsigned int sdhc_get_card_det_status(struct device *dev)
int ret;
if (to_platform_device(dev)->id == 0) {
- ret = gpio_get_value(BABBAGE_SD1_CD);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_0));
return ret;
} else { /* config the det pin for SDHC2 */
if (board_is_rev(BOARD_REV_2))
/* BB2.5 */
- ret = gpio_get_value(BABBAGE_SD2_CD_2_5);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_6));
else
/* BB2.0 */
- ret = gpio_get_value(BABBAGE_SD2_CD_2_0);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_4));
return ret;
}
}
@@ -900,25 +665,27 @@ static struct mxc_mmc_platform_data mmc2_data = {
.status = sdhc_get_card_det_status,
.wp_status = sdhc_write_protect,
.clock_mmc = "esdhc_clk",
- .clk_always_on = 1,
};
static int mxc_sgtl5000_amp_enable(int enable)
{
- gpio_set_value(BABBAGE_AUDAMP_STBY, enable ? 1 : 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A23), enable ? 1 : 0);
return 0;
}
static int headphone_det_status(void)
{
- return (gpio_get_value(BABBAGE_HEADPHONE_DET) == 0);
+ if (cpu_is_mx51_rev(CHIP_REV_1_1) == 2)
+ return (gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_NANDF_D14)) == 0);
+
+ return gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_NANDF_CS0));
}
static struct mxc_audio_platform_data sgtl5000_data = {
.ssi_num = 1,
.src_port = 2,
.ext_port = 3,
- .hp_irq = IOMUX_TO_IRQ_V3(BABBAGE_HEADPHONE_DET),
+ .hp_irq = IOMUX_TO_IRQ(MX51_PIN_NANDF_D14),
.hp_status = headphone_det_status,
.amp_enable = mxc_sgtl5000_amp_enable,
.sysclk = 12288000,
@@ -928,41 +695,6 @@ static struct platform_device mxc_sgtl5000_device = {
.name = "imx-3stack-sgtl5000",
};
-static int __initdata enable_w1 = { 0 };
-static int __init w1_setup(char *__unused)
-{
- enable_w1 = 1;
- return cpu_is_mx51();
-}
-
-__setup("w1", w1_setup);
-
-static struct android_pmem_platform_data android_pmem_pdata = {
- .name = "pmem_adsp",
- .start = 0,
- .size = SZ_32M,
- .no_allocator = 0,
- .cached = PMEM_NONCACHE_NORMAL,
-};
-
-static struct android_pmem_platform_data android_pmem_gpu_pdata = {
- .name = "pmem_gpu",
- .start = 0,
- .size = SZ_32M,
- .no_allocator = 0,
- .cached = PMEM_CACHE_ENABLE,
-};
-
-static struct android_usb_platform_data android_usb_pdata = {
- .vendor_id = 0x0bb4,
- .product_id = 0x0c01,
- .adb_product_id = 0x0c02,
- .version = 0x0100,
- .product_name = "Android Phone",
- .manufacturer_name = "Freescale",
- .nluns = 3,
-};
-
/*!
* Board specific fixup function. It is called by \b setup_arch() in
* setup.c file very early on during kernel starts. It allows the user to
@@ -984,32 +716,12 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
int left_mem = 0;
int gpu_mem = SZ_64M;
int fb_mem = SZ_32M;
- int size;
mxc_set_cpu_type(MXC_CPU_MX51);
get_cpu_wp = mx51_babbage_get_cpu_wp;
set_num_cpu_wp = mx51_babbage_set_num_cpu_wp;
- for_each_tag(t, tags) {
- if (t->hdr.tag != ATAG_MEM)
- continue;
- size = t->u.mem.size;
-
- android_pmem_pdata.start =
- PHYS_OFFSET + size - android_pmem_pdata.size;
- android_pmem_gpu_pdata.start =
- android_pmem_pdata.start - android_pmem_gpu_pdata.size;
- gpu_device.resource[5].start =
- android_pmem_gpu_pdata.start - SZ_16M;
- gpu_device.resource[5].end =
- gpu_device.resource[5].start + SZ_16M - 1;
- size -= android_pmem_pdata.size;
- size -= android_pmem_gpu_pdata.size;
- size -= SZ_16M;
- t->u.mem.size = size;
- }
-#if 0
for_each_tag(mem_tag, tags) {
if (mem_tag->hdr.tag == ATAG_MEM) {
total_mem = mem_tag->u.mem.size;
@@ -1066,83 +778,8 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
}
#endif
}
-#endif
-}
-
-static struct switch_dev dvi_sdev;
-static int state;
-static struct delayed_work dvi_det_work;
-static void dvi_update_detect_status(void)
-{
- int level;
-
- level = gpio_get_value(BABBAGE_DVI_DET);
- if (level == 1) {
- pr_info(KERN_INFO "DVI device plug-in\n");
- state = 1;
- } else {
- pr_info(KERN_INFO "DVI device plug-out\n");
- state = 0;
- }
- switch_set_state(&dvi_sdev, state);
-}
-
-static void dvi_work_func(struct work_struct *work)
-{
- dvi_update_detect_status();
-}
-
-static irqreturn_t dvi_det_int(int irq, void *dev_id)
-{
- schedule_delayed_work(&dvi_det_work, msecs_to_jiffies(10));
- return 0;
}
-static ssize_t print_switch_name(struct switch_dev *sdev, char *buf)
-{
- return sprintf(buf, "dvi_det\n");
-}
-
-static ssize_t print_switch_state(struct switch_dev *sdev, char *buf)
-{
- return sprintf(buf, "%s\n", (state ? "online" : "offline"));
-}
-
-static int __init mxc_init_dvi_det(void)
-{
- int irq, level, ret;
-
- if (!machine_is_mx51_babbage())
- return 0;
-
- dvi_sdev.name = "dvi_det";
- dvi_sdev.print_name = print_switch_name;
- dvi_sdev.print_state = print_switch_state;
- switch_dev_register(&dvi_sdev);
-
- level = gpio_get_value(BABBAGE_DVI_DET);
- if (level == 1) {
- pr_info(KERN_INFO "DVI device plug-in\n");
- state = 1;
- } else {
- pr_info(KERN_INFO "DVI device plug-out\n");
- state = 0;
- }
-
- INIT_DELAYED_WORK(&dvi_det_work, dvi_work_func);
-
- irq = IOMUX_TO_IRQ_V3(BABBAGE_DVI_DET);
- set_irq_type(irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING);
- ret = request_irq(irq, dvi_det_int, 0, "dvi_det", 0);
- if (ret) {
- pr_info("register DVI detect interrupt failed\n");
- return -1;
- }
- return 0;
-}
-late_initcall(mxc_init_dvi_det);
-
-
#define PWGT1SPIEN (1<<15)
#define PWGT2SPIEN (1<<16)
#define USEROFFSPI (1<<3)
@@ -1174,7 +811,7 @@ static int __init mxc_init_power_key(void)
{
/* Set power key as wakeup resource */
int irq, ret;
- irq = IOMUX_TO_IRQ_V3(BABBAGE_POWER_KEY);
+ irq = IOMUX_TO_IRQ(MX51_PIN_EIM_A27);
set_irq_type(irq, IRQF_TRIGGER_RISING);
ret = request_irq(irq, power_key_int, 0, "power_key", 0);
if (ret)
@@ -1185,113 +822,6 @@ static int __init mxc_init_power_key(void)
}
late_initcall(mxc_init_power_key);
-static void __init mx51_babbage_io_init(void)
-{
- mxc_iomux_v3_setup_multiple_pads(mx51babbage_pads,
- ARRAY_SIZE(mx51babbage_pads));
-
- gpio_request(BABBAGE_PMIC_INT, "pmic-int");
- gpio_request(BABBAGE_SD1_CD, "sdhc1-detect");
- gpio_request(BABBAGE_SD1_WP, "sdhc1-wp");
-
- gpio_direction_input(BABBAGE_PMIC_INT);
- gpio_direction_input(BABBAGE_SD1_CD);
- gpio_direction_input(BABBAGE_SD1_WP);
-
- if (board_is_rev(BOARD_REV_2)) {
- /* SD2 CD for BB2.5 */
- gpio_request(BABBAGE_SD2_CD_2_5, "sdhc2-detect");
- gpio_direction_input(BABBAGE_SD2_CD_2_5);
- } else {
- /* SD2 CD for BB2.0 */
- gpio_request(BABBAGE_SD2_CD_2_0, "sdhc2-detect");
- gpio_direction_input(BABBAGE_SD2_CD_2_0);
- }
- gpio_request(BABBAGE_SD2_WP, "sdhc2-wp");
- gpio_direction_input(BABBAGE_SD2_WP);
-
- /* reset usbh1 hub */
- gpio_request(BABBAGE_USBH1_HUB_RST, "hub-rst");
- gpio_direction_output(BABBAGE_USBH1_HUB_RST, 0);
- gpio_set_value(BABBAGE_USBH1_HUB_RST, 0);
- msleep(1);
- gpio_set_value(BABBAGE_USBH1_HUB_RST, 1);
-
- /* reset FEC PHY */
- gpio_request(BABBAGE_FEC_PHY_RESET, "fec-phy-reset");
- gpio_direction_output(BABBAGE_FEC_PHY_RESET, 0);
- msleep(10);
- gpio_set_value(BABBAGE_FEC_PHY_RESET, 1);
-
- /* reset FM */
- gpio_request(BABBAGE_FM_RESET, "fm-reset");
- gpio_direction_output(BABBAGE_FM_RESET, 0);
- msleep(10);
- gpio_set_value(BABBAGE_FM_RESET, 1);
-
- /* Drive 26M_OSC_EN line high */
- gpio_request(BABBAGE_26M_OSC_EN, "26m-osc-en");
- gpio_direction_output(BABBAGE_26M_OSC_EN, 1);
-
- /* Drive USB_CLK_EN_B line low */
- gpio_request(BABBAGE_USB_CLK_EN_B, "usb-clk_en_b");
- gpio_direction_output(BABBAGE_USB_CLK_EN_B, 0);
-
- /* De-assert USB PHY RESETB */
- gpio_request(BABBAGE_PHY_RESET, "usb-phy-reset");
- gpio_direction_output(BABBAGE_PHY_RESET, 1);
-
- /* hphone_det_b */
- gpio_request(BABBAGE_HEADPHONE_DET, "hphone-det");
- gpio_direction_input(BABBAGE_HEADPHONE_DET);
-
- /* audio_clk_en_b */
- gpio_request(BABBAGE_AUDIO_CLK_EN, "audio-clk-en");
- gpio_direction_output(BABBAGE_AUDIO_CLK_EN, 0);
-
- /* power key */
- gpio_request(BABBAGE_POWER_KEY, "power-key");
- gpio_direction_input(BABBAGE_POWER_KEY);
-
- if (cpu_is_mx51_rev(CHIP_REV_3_0) > 0) {
- /* DVI_I2C_ENB = 0 tristates the DVI I2C level shifter */
- gpio_request(BABBAGE_DVI_I2C_EN, "dvi-i2c-en");
- gpio_direction_output(BABBAGE_DVI_I2C_EN, 0);
- }
-
- /* Deassert VGA reset to free i2c bus */
- gpio_request(BABBAGE_VGA_RESET, "vga-reset");
- gpio_direction_output(BABBAGE_VGA_RESET, 1);
-
- /* LCD related gpio */
- gpio_request(BABBAGE_DISP_BRIGHTNESS_CTL, "disp-brightness-ctl");
- gpio_request(BABBAGE_LVDS_POWER_DOWN, "lvds-power-down");
- gpio_request(BABBAGE_LCD_3V3_ON, "lcd-3v3-on");
- gpio_request(BABBAGE_LCD_5V_ON, "lcd-5v-on");
- gpio_direction_output(BABBAGE_DISP_BRIGHTNESS_CTL, 0);
- gpio_direction_output(BABBAGE_LVDS_POWER_DOWN, 0);
- gpio_direction_output(BABBAGE_LCD_3V3_ON, 0);
- gpio_direction_output(BABBAGE_LCD_5V_ON, 0);
-
- /* Camera reset */
- gpio_request(BABBAGE_CAM_RESET, "cam-reset");
- gpio_direction_output(BABBAGE_CAM_RESET, 1);
-
- /* Camera low power */
- gpio_request(BABBAGE_CAM_LOW_POWER, "cam-low-power");
- gpio_direction_output(BABBAGE_CAM_LOW_POWER, 0);
-
- /* OSC_EN */
- gpio_request(BABBAGE_OSC_EN_B, "osc-en");
- gpio_direction_output(BABBAGE_OSC_EN_B, 1);
-
- if (enable_w1) {
- /* OneWire */
- struct pad_desc onewire = MX51_PAD_OWIRE_LINE__OWIRE_LINE;
- mxc_iomux_v3_setup_pad(&onewire);
- }
-}
-
/*!
* Board specific initialization.
*/
@@ -1299,16 +829,14 @@ static void __init mxc_board_init(void)
{
mxc_ipu_data.di_clk[0] = clk_get(NULL, "ipu_di0_clk");
mxc_ipu_data.di_clk[1] = clk_get(NULL, "ipu_di1_clk");
- mxc_ipu_data.csi_clk[0] = clk_get(NULL, "csi_mclk1");
- mxc_ipu_data.csi_clk[1] = clk_get(NULL, "csi_mclk2");
mxc_spdif_data.spdif_core_clk = clk_get(NULL, "spdif_xtal_clk");
clk_put(mxc_spdif_data.spdif_core_clk);
/* SD card detect irqs */
- mxcsdhc2_device.resource[2].start = IOMUX_TO_IRQ_V3(BABBAGE_SD2_CD_2_5);
- mxcsdhc2_device.resource[2].end = IOMUX_TO_IRQ_V3(BABBAGE_SD2_CD_2_5);
- mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ_V3(BABBAGE_SD1_CD);
- mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ_V3(BABBAGE_SD1_CD);
+ mxcsdhc2_device.resource[2].start = IOMUX_TO_IRQ(MX51_PIN_GPIO1_6);
+ mxcsdhc2_device.resource[2].end = IOMUX_TO_IRQ(MX51_PIN_GPIO1_6);
+ mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ(MX51_PIN_GPIO1_0);
+ mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ(MX51_PIN_GPIO1_0);
mxc_cpu_common_init();
mxc_register_gpios();
@@ -1341,12 +869,7 @@ static void __init mxc_board_init(void)
mxc_register_device(&mxc_ssi1_device, NULL);
mxc_register_device(&mxc_ssi2_device, NULL);
mxc_register_device(&mxc_alsa_spdif_device, &mxc_spdif_data);
- mxc_register_device(&mxc_fec_device, &fec_data);
- mxc_register_device(&mxc_v4l2_device, NULL);
- mxc_register_device(&mxc_v4l2out_device, NULL);
- mxc_register_device(&mxc_android_pmem_device, &android_pmem_pdata);
- mxc_register_device(&mxc_android_pmem_gpu_device, &android_pmem_gpu_pdata);
- mxc_register_device(&android_usb_device, &android_usb_pdata);
+ mxc_register_device(&mxc_fec_device, NULL);
mx51_babbage_init_mc13892();
@@ -1377,8 +900,8 @@ static void __init mxc_board_init(void)
if (cpu_is_mx51_rev(CHIP_REV_1_1) == 2) {
sgtl5000_data.sysclk = 26000000;
}
- gpio_request(BABBAGE_AUDAMP_STBY, "audioamp-stdby");
- gpio_direction_output(BABBAGE_AUDAMP_STBY, 0);
+ gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A23), "eim_a23");
+ gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A23), 0);
mxc_register_device(&mxc_sgtl5000_device, &sgtl5000_data);
mx5_usb_dr_init();
diff --git a/arch/arm/mach-mx5/mx51_babbage_gpio.c b/arch/arm/mach-mx5/mx51_babbage_gpio.c
index 4b3e2ee73faf..5d484b78832b 100644
--- a/arch/arm/mach-mx5/mx51_babbage_gpio.c
+++ b/arch/arm/mach-mx5/mx51_babbage_gpio.c
@@ -270,59 +270,83 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
},
{
MX51_PIN_SD1_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX51_PIN_SD1_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX51_PIN_SD1_DATA0, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX51_PIN_SD1_DATA1, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX51_PIN_SD1_DATA2, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX51_PIN_SD1_DATA3, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX51_PIN_GPIO1_0, IOMUX_CONFIG_GPIO | IOMUX_CONFIG_SION,
(PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU),
},
{
- MX51_PIN_GPIO1_1, IOMUX_CONFIG_GPIO | IOMUX_CONFIG_SION,
+ MX51_PIN_GPIO1_1, IOMUX_CONFIG_GPIO,
(PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU),
},
{
MX51_PIN_SD2_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX51_PIN_SD2_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
- MX51_PIN_SD2_DATA0, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ MX51_PIN_SD2_DATA0, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
- MX51_PIN_SD2_DATA1, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ MX51_PIN_SD2_DATA1, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
- MX51_PIN_SD2_DATA2, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ MX51_PIN_SD2_DATA2, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
- MX51_PIN_SD2_DATA3, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST),
+ MX51_PIN_SD2_DATA3, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX51_PIN_GPIO1_4, IOMUX_CONFIG_GPIO | IOMUX_CONFIG_SION,
@@ -461,7 +485,7 @@ static int __initdata enable_w1 = { 0 };
static int __init w1_setup(char *__unused)
{
enable_w1 = 1;
- return 1;
+ return cpu_is_mx51();
}
__setup("w1", w1_setup);
diff --git a/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c b/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c
index 1626c95d54d2..c97d2191b94b 100644
--- a/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c
+++ b/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c
@@ -23,8 +23,8 @@
#include <linux/regulator/machine.h>
#include <linux/mfd/mc13892/core.h>
#include <mach/irqs.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx51.h>
+#include "iomux.h"
+#include "mx51_pins.h"
/*
* Convenience conversion.
@@ -406,7 +406,7 @@ static struct mc13892_platform_data mc13892_plat = {
static struct spi_board_info __initdata mc13892_spi_device = {
.modalias = "pmic_spi",
- .irq = IOMUX_TO_IRQ_V3(8),
+ .irq = IOMUX_TO_IRQ(MX51_PIN_GPIO1_8),
.max_speed_hz = 6000000, /* max spi SCK clock speed in HZ */
.bus_num = 1,
.chip_select = 0,
diff --git a/arch/arm/mach-mx5/mx51_ccwmx51js.c b/arch/arm/mach-mx5/mx51_ccwmx51js.c
index bbacfc981d73..0ac060056f35 100644
--- a/arch/arm/mach-mx5/mx51_ccwmx51js.c
+++ b/arch/arm/mach-mx5/mx51_ccwmx51js.c
@@ -51,8 +51,6 @@
#include "mx51_pins.h"
#include "devices_ccwmx51.h"
#include "usb.h"
-#include "linux/android_pmem.h"
-#include "linux/usb/android.h"
extern struct cpu_wp *(*get_cpu_wp)(int *wp);
extern void (*set_num_cpu_wp)(int num);
@@ -145,36 +143,6 @@ void mx51_set_num_cpu_wp(int num)
return;
}
-#if defined CONFIG_ANDROID_PMEM
-static struct android_pmem_platform_data android_pmem_pdata = {
- .name = "pmem_adsp",
- .start = 0,
- .size = SZ_32M,
- .no_allocator = 0,
- .cached = PMEM_NONCACHE_NORMAL,
-};
-
-static struct android_pmem_platform_data android_pmem_gpu_pdata = {
- .name = "pmem_gpu",
- .start = 0,
- .size = SZ_32M,
- .no_allocator = 0,
- .cached = PMEM_CACHE_ENABLE,
-};
-#endif
-
-#ifdef CONFIG_USB_ANDROID
-static struct android_usb_platform_data android_usb_pdata = {
- .vendor_id = 0x0bb4,
- .product_id = 0x0c01,
- .adb_product_id = 0x0c02,
- .version = 0x0100,
- .product_name = "Android Phone",
- .manufacturer_name = "Freescale",
- .nluns = 3,
-};
-#endif
-
/*!
* Board specific fixup function. It is called by \b setup_arch() in
* setup.c file very early on during kernel starts. It allows the user to
@@ -189,48 +157,19 @@ static struct android_usb_platform_data android_usb_pdata = {
static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
char **cmdline, struct meminfo *mi)
{
- struct tag *t;
-#ifdef CONFIG_ANDROID
- int size;
-#else
char *str;
+ struct tag *t;
struct tag *mem_tag = 0;
int total_mem = SZ_512M;
int left_mem = 0;
int gpu_mem = SZ_64M;
int fb_mem = FB_MEM_SIZE;
-#endif
mxc_set_cpu_type(MXC_CPU_MX51);
get_cpu_wp = mx51_get_cpu_wp;
set_num_cpu_wp = mx51_set_num_cpu_wp;
-#ifdef CONFIG_ANDROID
- // TODO: Dual head support for Android.
- // See commit 358e938e78b3380357f8f0c6dd54fa9fe4cc84c5
- // This commit removes Digi's dual display customizations
-
- for_each_tag(t, tags) {
- if (t->hdr.tag != ATAG_MEM)
- continue;
- size = t->u.mem.size;
-
- android_pmem_pdata.start =
- PHYS_OFFSET + size - android_pmem_pdata.size;
- android_pmem_gpu_pdata.start =
- android_pmem_pdata.start - android_pmem_gpu_pdata.size;
- gpu_device.resource[5].start =
- android_pmem_gpu_pdata.start - SZ_16M;
- gpu_device.resource[5].end =
- gpu_device.resource[5].start + SZ_16M - 1;
- size -= android_pmem_pdata.size;
- size -= android_pmem_gpu_pdata.size;
- size -= SZ_16M;
- t->u.mem.size = size;
- }
-
-#else
for_each_tag(mem_tag, tags) {
if (mem_tag->hdr.tag == ATAG_MEM) {
total_mem = mem_tag->u.mem.size;
@@ -268,7 +207,6 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
fb_mem = 0;
}
mem_tag->u.mem.size = left_mem;
-
#if defined(CONFIG_CCWMX51_DISP1) && defined(CONFIG_CCWMX51_DISP2)
fb_mem = fb_mem / 2; /* Divide the mem for between the displays */
#endif
@@ -298,9 +236,6 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
}
#endif
}
-#endif
-
-
}
#define PWGT1SPIEN (1<<15)
@@ -376,13 +311,6 @@ static void __init mxc_board_init(void)
#endif
mxc_register_device(&mxc_pwm1_device, NULL);
mxc_register_device(&mxc_pwm_backlight_device, &mxc_pwm_backlight_data);
-#ifdef CONFIG_ANDROID_PMEM
- mxc_register_device(&mxc_android_pmem_device, &android_pmem_pdata);
- mxc_register_device(&mxc_android_pmem_gpu_device, &android_pmem_gpu_pdata);
-#endif
-#ifdef CONFIG_USB_ANDROID
- mxc_register_device(&android_usb_device, &android_usb_pdata);
-#endif
#ifdef CONFIG_ESDHCI_MXC_SELECT1
ccwmx51_register_sdio(0); /* SDHC1 */
@@ -393,7 +321,7 @@ static void __init mxc_board_init(void)
#endif /* CONFIG_ESDHCI_MXC_SELECT3 && !CONFIG_PATA_FSL && !CONFIG_PATA_FSL_MODULE */
#if defined(CONFIG_FEC) || defined(CONFIG_FEC_MODULE)
- mxc_register_device(&mxc_fec_device, &fec_data);
+ mxc_register_device(&mxc_fec_device, NULL);
#endif
#if defined(CONFIG_MTD_NAND_MXC) \
|| defined(CONFIG_MTD_NAND_MXC_MODULE) \
@@ -435,9 +363,6 @@ static void __init mxc_board_init(void)
#ifdef CONFIG_CCWMX51_SECOND_TOUCH
ccwmx51_init_2nd_touch();
#endif
-#if defined(CONFIG_KEYBOARD_GPIO)
- mxc_register_device(&ccwmx51js_keys_gpio, &ccwmx51js_gpio_key_info);
-#endif
pm_power_off = mxc_power_off;
}
diff --git a/arch/arm/mach-mx5/mx53_evk.c b/arch/arm/mach-mx5/mx53_evk.c
index 702d7d8912d0..443857c76a84 100644
--- a/arch/arm/mach-mx5/mx53_evk.c
+++ b/arch/arm/mach-mx5/mx53_evk.c
@@ -57,47 +57,11 @@
#include <mach/gpio.h>
#include <mach/mmc.h>
#include <mach/mxc_dvfs.h>
-#include <mach/iomux-mx53.h>
-
+#include "iomux.h"
+#include "mx53_pins.h"
#include "crm_regs.h"
#include "devices.h"
#include "usb.h"
-#include <linux/android_pmem.h>
-#include <linux/usb/android.h>
-
-#define ARM2_SD1_CD (0*32 + 1) /* GPIO_1_1 */
-
-#define MX53_HP_DETECT (1*32 + 5) /* GPIO_2_5 */
-
-#define EVK_SD3_CD (2*32 + 11) /* GPIO_3_11 */
-#define EVK_SD3_WP (2*32 + 12) /* GPIO_3_12 */
-#define EVK_SD1_CD (2*32 + 13) /* GPIO_3_13 */
-#define EVK_SD1_WP (2*32 + 14) /* GPIO_3_14 */
-#define ARM2_OTG_VBUS (2*32 + 22) /* GPIO_3_22 */
-#define MX53_DVI_PD (2*32 + 24) /* GPIO_3_24 */
-#define EVK_TS_INT (2*32 + 26) /* GPIO_3_26 */
-#define MX53_DVI_I2C (2*32 + 28) /* GPIO_3_28 */
-#define MX53_DVI_DETECT (2*32 + 31) /* GPIO_3_31 */
-
-#define MX53_CAM_RESET (3*32 + 0) /* GPIO_4_0 */
-#define MX53_ESAI_RESET (3*32 + 2) /* GPIO_4_2 */
-#define MX53_CAN2_EN2 (3*32 + 4) /* GPIO_4_4 */
-#define MX53_12V_EN (3*32 + 5) /* GPIO_4_5 */
-#define ARM2_LCD_CONTRAST (3*32 + 20) /* GPIO_4_20 */
-
-#define MX53_DVI_RESET (4*32 + 0) /* GPIO_5_0 */
-#define EVK_USB_HUB_RESET (4*32 + 20) /* GPIO_5_20 */
-#define MX53_TVIN_PWR (4*32 + 23) /* GPIO_5_23 */
-#define MX53_CAN2_EN1 (4*32 + 24) /* GPIO_5_24 */
-#define MX53_TVIN_RESET (4*32 + 25) /* GPIO_5_25 */
-
-#define EVK_OTG_VBUS (5*32 + 6) /* GPIO_6_6 */
-
-#define EVK_FEC_PHY_RESET (6*32 + 6) /* GPIO_7_6 */
-#define EVK_USBH1_VBUS (6*32 + 8) /* GPIO_7_8 */
-#define MX53_PMIC_INT (6*32 + 11) /* GPIO_7_11 */
-#define MX53_CAN1_EN1 (6*32 + 12) /* GPIO_7_12 */
-#define MX53_CAN1_EN2 (6*32 + 13) /* GPIO_7_13 */
/*!
* @file mach-mx53/mx53_evk.c
@@ -107,297 +71,11 @@
* @ingroup MSL_MX53
*/
extern int __init mx53_evk_init_mc13892(void);
+extern void __init mx53_evk_io_init(void);
extern struct cpu_wp *(*get_cpu_wp)(int *wp);
extern void (*set_num_cpu_wp)(int num);
static int num_cpu_wp = 3;
-static struct pad_desc mx53common_pads[] = {
- MX53_PAD_EIM_WAIT__GPIO_5_0,
-
- MX53_PAD_EIM_OE__DI1_PIN7,
- MX53_PAD_EIM_RW__DI1_PIN8,
-
- MX53_PAD_EIM_A25__DI0_D1_CS,
-
- MX53_PAD_EIM_D16__CSPI1_SCLK,
- MX53_PAD_EIM_D17__CSPI1_MISO,
- MX53_PAD_EIM_D18__CSPI1_MOSI,
-
- MX53_PAD_EIM_D20__SER_DISP0_CS,
-
- MX53_PAD_EIM_D23__DI0_D0_CS,
-
- MX53_PAD_EIM_D24__GPIO_3_24,
- MX53_PAD_EIM_D26__GPIO_3_26,
-
- MX53_PAD_EIM_D29__DISPB0_SER_RS,
-
- MX53_PAD_EIM_D30__DI0_PIN11,
- MX53_PAD_EIM_D31__DI0_PIN12,
-
- MX53_PAD_ATA_DA_1__GPIO_7_7,
- MX53_PAD_ATA_DATA4__GPIO_2_4,
- MX53_PAD_ATA_DATA5__GPIO_2_5,
- MX53_PAD_ATA_DATA6__GPIO_2_6,
-
- MX53_PAD_SD2_CLK__SD2_CLK,
- MX53_PAD_SD2_CMD__SD2_CMD,
- MX53_PAD_SD2_DATA0__SD2_DAT0,
- MX53_PAD_SD2_DATA1__SD2_DAT1,
- MX53_PAD_SD2_DATA2__SD2_DAT2,
- MX53_PAD_SD2_DATA3__SD2_DAT3,
- MX53_PAD_ATA_DATA12__SD2_DAT4,
- MX53_PAD_ATA_DATA13__SD2_DAT5,
- MX53_PAD_ATA_DATA14__SD2_DAT6,
- MX53_PAD_ATA_DATA15__SD2_DAT7,
-
- MX53_PAD_CSI0_D10__UART1_TXD,
- MX53_PAD_CSI0_D11__UART1_RXD,
-
- MX53_PAD_ATA_BUFFER_EN__UART2_RXD,
- MX53_PAD_ATA_DMARQ__UART2_TXD,
- MX53_PAD_ATA_DIOR__UART2_RTS,
- MX53_PAD_ATA_INTRQ__UART2_CTS,
-
- MX53_PAD_ATA_CS_0__UART3_TXD,
- MX53_PAD_ATA_CS_1__UART3_RXD,
-
- MX53_PAD_KEY_COL0__AUD5_TXC,
- MX53_PAD_KEY_ROW0__AUD5_TXD,
- MX53_PAD_KEY_COL1__AUD5_TXFS,
- MX53_PAD_KEY_ROW1__AUD5_RXD,
-
- MX53_PAD_CSI0_D7__GPIO_5_25,
-
- MX53_PAD_GPIO_2__MLBDAT,
- MX53_PAD_GPIO_3__MLBCLK,
-
- MX53_PAD_GPIO_6__MLBSIG,
-
- MX53_PAD_GPIO_4__GPIO_1_4,
- MX53_PAD_GPIO_7__GPIO_1_7,
- MX53_PAD_GPIO_8__GPIO_1_8,
-
- MX53_PAD_GPIO_10__GPIO_4_0,
-
- MX53_PAD_KEY_COL2__TXCAN1,
- MX53_PAD_KEY_ROW2__RXCAN1,
-
- /* CAN1 -- EN */
- MX53_PAD_GPIO_18__GPIO_7_13,
- /* CAN1 -- STBY */
- MX53_PAD_GPIO_17__GPIO_7_12,
- /* CAN1 -- NERR */
- MX53_PAD_GPIO_5__GPIO_1_5,
-
- MX53_PAD_KEY_COL4__TXCAN2,
- MX53_PAD_KEY_ROW4__RXCAN2,
-
- /* CAN2 -- EN */
- MX53_PAD_CSI0_D6__GPIO_5_24,
- /* CAN2 -- STBY */
- MX53_PAD_GPIO_14__GPIO_4_4,
- /* CAN2 -- NERR */
- MX53_PAD_CSI0_D4__GPIO_5_22,
-
- MX53_PAD_GPIO_11__GPIO_4_1,
- MX53_PAD_GPIO_12__GPIO_4_2,
- MX53_PAD_GPIO_13__GPIO_4_3,
- MX53_PAD_GPIO_16__GPIO_7_11,
- MX53_PAD_GPIO_19__GPIO_4_5,
-
- /* DI0 display clock */
- MX53_PAD_DI0_DISP_CLK__DI0_DISP_CLK,
-
- /* DI0 data enable */
- MX53_PAD_DI0_PIN15__DI0_PIN15,
- /* DI0 HSYNC */
- MX53_PAD_DI0_PIN2__DI0_PIN2,
- /* DI0 VSYNC */
- MX53_PAD_DI0_PIN3__DI0_PIN3,
-
- MX53_PAD_DISP0_DAT0__DISP0_DAT0,
- MX53_PAD_DISP0_DAT1__DISP0_DAT1,
- MX53_PAD_DISP0_DAT2__DISP0_DAT2,
- MX53_PAD_DISP0_DAT3__DISP0_DAT3,
- MX53_PAD_DISP0_DAT4__DISP0_DAT4,
- MX53_PAD_DISP0_DAT5__DISP0_DAT5,
- MX53_PAD_DISP0_DAT6__DISP0_DAT6,
- MX53_PAD_DISP0_DAT7__DISP0_DAT7,
- MX53_PAD_DISP0_DAT8__DISP0_DAT8,
- MX53_PAD_DISP0_DAT9__DISP0_DAT9,
- MX53_PAD_DISP0_DAT10__DISP0_DAT10,
- MX53_PAD_DISP0_DAT11__DISP0_DAT11,
- MX53_PAD_DISP0_DAT12__DISP0_DAT12,
- MX53_PAD_DISP0_DAT13__DISP0_DAT13,
- MX53_PAD_DISP0_DAT14__DISP0_DAT14,
- MX53_PAD_DISP0_DAT15__DISP0_DAT15,
- MX53_PAD_DISP0_DAT16__DISP0_DAT16,
- MX53_PAD_DISP0_DAT17__DISP0_DAT17,
- MX53_PAD_DISP0_DAT18__DISP0_DAT18,
- MX53_PAD_DISP0_DAT19__DISP0_DAT19,
- MX53_PAD_DISP0_DAT20__DISP0_DAT20,
- MX53_PAD_DISP0_DAT21__DISP0_DAT21,
- MX53_PAD_DISP0_DAT22__DISP0_DAT22,
- MX53_PAD_DISP0_DAT23__DISP0_DAT23,
-
- MX53_PAD_LVDS0_TX3_P__LVDS0_TX3,
- MX53_PAD_LVDS0_CLK_P__LVDS0_CLK,
- MX53_PAD_LVDS0_TX2_P__LVDS0_TX2,
- MX53_PAD_LVDS0_TX1_P__LVDS0_TX1,
- MX53_PAD_LVDS0_TX0_P__LVDS0_TX0,
-
- MX53_PAD_LVDS1_TX3_P__LVDS1_TX3,
- MX53_PAD_LVDS1_CLK_P__LVDS1_CLK,
- MX53_PAD_LVDS1_TX2_P__LVDS1_TX2,
- MX53_PAD_LVDS1_TX1_P__LVDS1_TX1,
- MX53_PAD_LVDS1_TX0_P__LVDS1_TX0,
-
- /* audio and CSI clock out */
- MX53_PAD_GPIO_0__SSI_EXT1_CLK,
-
- MX53_PAD_CSI0_D12__CSI0_D12,
- MX53_PAD_CSI0_D13__CSI0_D13,
- MX53_PAD_CSI0_D14__CSI0_D14,
- MX53_PAD_CSI0_D15__CSI0_D15,
- MX53_PAD_CSI0_D16__CSI0_D16,
- MX53_PAD_CSI0_D17__CSI0_D17,
- MX53_PAD_CSI0_D18__CSI0_D18,
- MX53_PAD_CSI0_D19__CSI0_D19,
-
- MX53_PAD_CSI0_VSYNC__CSI0_VSYNC,
- MX53_PAD_CSI0_MCLK__CSI0_HSYNC,
- MX53_PAD_CSI0_PIXCLK__CSI0_PIXCLK,
- /* Camera low power */
- MX53_PAD_CSI0_D5__GPIO_5_23,
-
- /* esdhc1 */
- MX53_PAD_SD1_CMD__SD1_CMD,
- MX53_PAD_SD1_CLK__SD1_CLK,
- MX53_PAD_SD1_DATA0__SD1_DATA0,
- MX53_PAD_SD1_DATA1__SD1_DATA1,
- MX53_PAD_SD1_DATA2__SD1_DATA2,
- MX53_PAD_SD1_DATA3__SD1_DATA3,
-
- /* esdhc3 */
- MX53_PAD_ATA_DATA8__SD3_DAT0,
- MX53_PAD_ATA_DATA9__SD3_DAT1,
- MX53_PAD_ATA_DATA10__SD3_DAT2,
- MX53_PAD_ATA_DATA11__SD3_DAT3,
- MX53_PAD_ATA_DATA0__SD3_DAT4,
- MX53_PAD_ATA_DATA1__SD3_DAT5,
- MX53_PAD_ATA_DATA2__SD3_DAT6,
- MX53_PAD_ATA_DATA3__SD3_DAT7,
- MX53_PAD_ATA_RESET_B__SD3_CMD,
- MX53_PAD_ATA_IORDY__SD3_CLK,
-
- /* FEC pins */
- MX53_PAD_FEC_MDIO__FEC_MDIO,
- MX53_PAD_FEC_REF_CLK__FEC_REF_CLK,
- MX53_PAD_FEC_RX_ER__FEC_RX_ER,
- MX53_PAD_FEC_CRS_DV__FEC_CRS_DV,
- MX53_PAD_FEC_RXD1__FEC_RXD1,
- MX53_PAD_FEC_RXD0__FEC_RXD0,
- MX53_PAD_FEC_TX_EN__FEC_TX_EN,
- MX53_PAD_FEC_TXD1__FEC_TXD1,
- MX53_PAD_FEC_TXD0__FEC_TXD0,
- MX53_PAD_FEC_MDC__FEC_MDC,
-
- MX53_PAD_CSI0_D8__I2C1_SDA,
- MX53_PAD_CSI0_D9__I2C1_SCL,
-
- MX53_PAD_KEY_COL3__I2C2_SCL,
- MX53_PAD_KEY_ROW3__I2C2_SDA,
-};
-
-static struct pad_desc mx53evk_pads[] = {
- /* USB OTG USB_OC */
- MX53_PAD_EIM_A24__GPIO_5_4,
-
- /* USB OTG USB_PWR */
- MX53_PAD_EIM_A23__GPIO_6_6,
-
- /* DISPB0_SER_CLK */
- MX53_PAD_EIM_D21__DISPB0_SER_CLK,
-
- /* DI0_PIN1 */
- MX53_PAD_EIM_D22__DISPB0_SER_DIN,
-
- /* DVI I2C ENABLE */
- MX53_PAD_EIM_D28__GPIO_3_28,
-
- /* DVI DET */
- MX53_PAD_EIM_D31__GPIO_3_31,
-
- /* SDHC1 SD_CD */
- MX53_PAD_EIM_DA13__GPIO_3_13,
-
- /* SDHC1 SD_WP */
- MX53_PAD_EIM_DA14__GPIO_3_14,
-
- /* SDHC3 SD_CD */
- MX53_PAD_EIM_DA11__GPIO_3_11,
-
- /* SDHC3 SD_WP */
- MX53_PAD_EIM_DA12__GPIO_3_12,
-
- /* PWM backlight */
- MX53_PAD_GPIO_1__PWMO,
-
- /* USB HOST USB_PWR */
- MX53_PAD_ATA_DA_2__GPIO_7_8,
-
- /* USB HOST USB_RST */
- MX53_PAD_CSI0_DATA_EN__GPIO_5_20,
-
- /* USB HOST CARD_ON */
- MX53_PAD_EIM_DA15__GPIO_3_15,
-
- /* USB HOST CARD_RST */
- MX53_PAD_ATA_DATA7__GPIO_2_7,
-
- /* USB HOST WAN_WAKE */
- MX53_PAD_EIM_D25__GPIO_3_25,
-
- /* FEC_RST */
- MX53_PAD_ATA_DA_0__GPIO_7_6,
-};
-
-static struct pad_desc mx53arm2_pads[] = {
- /* USB OTG USB_OC */
- MX53_PAD_EIM_D21__GPIO_3_21,
-
- /* USB OTG USB_PWR */
- MX53_PAD_EIM_D22__GPIO_3_22,
-
- /* SDHC1 SD_CD */
- MX53_PAD_GPIO_1__GPIO_1_1,
-
- /* gpio backlight */
- MX53_PAD_DI0_PIN4__GPIO_4_20,
-};
-
-static struct pad_desc mx53_nand_pads[] = {
- MX53_PAD_NANDF_CLE__NANDF_CLE,
- MX53_PAD_NANDF_ALE__NANDF_ALE,
- MX53_PAD_NANDF_WP_B__NANDF_WP_B,
- MX53_PAD_NANDF_WE_B__NANDF_WE_B,
- MX53_PAD_NANDF_RE_B__NANDF_RE_B,
- MX53_PAD_NANDF_RB0__NANDF_RB0,
- MX53_PAD_NANDF_CS0__NANDF_CS0,
- MX53_PAD_NANDF_CS1__NANDF_CS1 ,
- MX53_PAD_NANDF_CS2__NANDF_CS2,
- MX53_PAD_NANDF_CS3__NANDF_CS3 ,
- MX53_PAD_EIM_DA0__EIM_DA0,
- MX53_PAD_EIM_DA1__EIM_DA1,
- MX53_PAD_EIM_DA2__EIM_DA2,
- MX53_PAD_EIM_DA3__EIM_DA3,
- MX53_PAD_EIM_DA4__EIM_DA4,
- MX53_PAD_EIM_DA5__EIM_DA5,
- MX53_PAD_EIM_DA6__EIM_DA6,
- MX53_PAD_EIM_DA7__EIM_DA7,
-};
-
/* working point(wp): 0 - 800MHz; 1 - 166.25MHz; */
static struct cpu_wp cpu_wp_auto[] = {
{
@@ -511,40 +189,10 @@ static struct platform_pwm_backlight_data mxc_pwm_backlight_data = {
.pwm_id = 1,
.max_brightness = 255,
.dft_brightness = 128,
- .pwm_period_ns = 50000,
+ .pwm_period_ns = 78770,
};
-static void flexcan_xcvr_enable(int id, int en)
-{
- static int pwdn;
- if (id < 0 || id > 1)
- return;
-
- if (en) {
- if (!(pwdn++))
- gpio_set_value(MX53_12V_EN, 1);
-
- if (id == 0) {
- gpio_set_value(MX53_CAN1_EN1, 1);
- gpio_set_value(MX53_CAN1_EN2, 1);
- } else {
- gpio_set_value(MX53_CAN2_EN1, 1);
- gpio_set_value(MX53_CAN2_EN2, 1);
- }
-
- } else {
- if (!(--pwdn))
- gpio_set_value(MX53_12V_EN, 0);
-
- if (id == 0) {
- gpio_set_value(MX53_CAN1_EN1, 0);
- gpio_set_value(MX53_CAN1_EN2, 0);
- } else {
- gpio_set_value(MX53_CAN2_EN1, 0);
- gpio_set_value(MX53_CAN2_EN2, 0);
- }
- }
-}
+extern void flexcan_xcvr_enable(int id, int en);
static struct flexcan_platform_data flexcan0_data = {
.core_reg = NULL,
@@ -594,72 +242,12 @@ static struct mxc_vpu_platform_data mxc_vpu_data = {
static struct fec_platform_data fec_data = {
.phy = PHY_INTERFACE_MODE_RMII,
- .phy_mask = ~1UL,
};
-/* workaround for ecspi chipselect pin may not keep correct level when idle */
-static void mx53_evk_gpio_spi_chipselect_active(int cspi_mode, int status,
- int chipselect)
-{
- switch (cspi_mode) {
- case 1:
- switch (chipselect) {
- case 0x1:
- {
- struct pad_desc eim_d19_gpio = MX53_PAD_EIM_D19__GPIO_3_19;
- struct pad_desc cspi_ss0 = MX53_PAD_EIM_EB2__CSPI_SS0;
-
- /* de-select SS1 of instance: ecspi1. */
- mxc_iomux_v3_setup_pad(&eim_d19_gpio);
- mxc_iomux_v3_setup_pad(&cspi_ss0);
- }
- break;
- case 0x2:
- {
- struct pad_desc eim_eb2_gpio = MX53_PAD_EIM_EB2__GPIO_2_30;
- struct pad_desc cspi_ss1 = MX53_PAD_EIM_D19__CSPI_SS1;
-
- /* de-select SS0 of instance: ecspi1. */
- mxc_iomux_v3_setup_pad(&eim_eb2_gpio);
- mxc_iomux_v3_setup_pad(&cspi_ss1);
- }
- break;
- default:
- break;
- }
- break;
- case 2:
- break;
- case 3:
- break;
- default:
- break;
- }
-}
-
-static void mx53_evk_gpio_spi_chipselect_inactive(int cspi_mode, int status,
- int chipselect)
-{
- switch (cspi_mode) {
- case 1:
- switch (chipselect) {
- case 0x1:
- break;
- case 0x2:
- break;
- default:
- break;
- }
- break;
- case 2:
- break;
- case 3:
- break;
- default:
- break;
- }
-}
-
+extern void mx53_evk_gpio_spi_chipselect_active(int cspi_mode, int status,
+ int chipselect);
+extern void mx53_evk_gpio_spi_chipselect_inactive(int cspi_mode, int status,
+ int chipselect);
static struct mxc_spi_master mxcspi1_data = {
.maxchipselect = 4,
.spi_version = 23,
@@ -679,11 +267,11 @@ static struct mxc_dvfs_platform_data dvfs_core_data = {
.reg_id = "SW1",
.clk1_id = "cpu_clk",
.clk2_id = "gpc_dvfs_clk",
- .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET,
- .gpc_vcr_offset = MXC_GPC_VCR_OFFSET,
- .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET,
- .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET,
- .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET,
+ .gpc_cntr_reg_addr = MXC_GPC_CNTR,
+ .gpc_vcr_reg_addr = MXC_GPC_VCR,
+ .ccm_cdcr_reg_addr = MXC_CCM_CDCR,
+ .ccm_cacrr_reg_addr = MXC_CCM_CACRR,
+ .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR,
.prediv_mask = 0x1F800,
.prediv_offset = 11,
.prediv_val = 3,
@@ -709,98 +297,18 @@ static struct ldb_platform_data ldb_data = {
.ext_ref = 1,
};
-static struct pad_desc mx53esai_pads[] = {
- MX53_PAD_FEC_MDIO__ESAI_SCKR,
- MX53_PAD_FEC_REF_CLK__ESAI_FSR,
- MX53_PAD_FEC_RX_ER__ESAI_HCKR,
- MX53_PAD_FEC_CRS_DV__ESAI_SCKT,
- MX53_PAD_FEC_RXD1__ESAI_FST,
- MX53_PAD_FEC_RXD0__ESAI_HCKT,
- MX53_PAD_FEC_TX_EN__ESAI_TX3_RX2,
- MX53_PAD_FEC_TXD1__ESAI_TX2_RX3,
- MX53_PAD_FEC_TXD0__ESAI_TX4_RX1,
- MX53_PAD_FEC_MDC__ESAI_TX5_RX0,
- MX53_PAD_NANDF_CS2__ESAI_TX0,
- MX53_PAD_NANDF_CS3__ESAI_TX1,
-};
-
-void gpio_activate_esai_ports(void)
-{
- mxc_iomux_v3_setup_multiple_pads(mx53esai_pads,
- ARRAY_SIZE(mx53esai_pads));
-}
-
static struct mxc_esai_platform_data esai_data = {
.activate_esai_ports = gpio_activate_esai_ports,
};
-void gpio_cs42888_pdwn(int pdwn)
-{
- if (pdwn)
- gpio_set_value(MX53_ESAI_RESET, 0);
- else
- gpio_set_value(MX53_ESAI_RESET, 1);
-}
-EXPORT_SYMBOL(gpio_cs42888_pdwn);
-
-static void gpio_usbotg_vbus_active(void)
-{
- if (board_is_mx53_arm2()) {
- /* MX53 ARM2 CPU board */
- /* Enable OTG VBus with GPIO low */
- gpio_set_value(ARM2_OTG_VBUS, 0);
- } else if (board_is_mx53_evk_a()) {
- /* MX53 EVK board ver A*/
- /* Enable OTG VBus with GPIO low */
- gpio_set_value(EVK_OTG_VBUS, 0);
- } else if (board_is_mx53_evk_b()) {
- /* MX53 EVK board ver B*/
- /* Enable OTG VBus with GPIO high */
- gpio_set_value(EVK_OTG_VBUS, 1);
- }
-}
-
-static void gpio_usbotg_vbus_inactive(void)
-{
- if (board_is_mx53_arm2()) {
- /* MX53 ARM2 CPU board */
- /* Disable OTG VBus with GPIO high */
- gpio_set_value(ARM2_OTG_VBUS, 1);
- } else if (board_is_mx53_evk_a()) {
- /* MX53 EVK board ver A*/
- /* Disable OTG VBus with GPIO high */
- gpio_set_value(EVK_OTG_VBUS, 1);
- } else if (board_is_mx53_evk_b()) {
- /* MX53 EVK board ver B*/
- /* Disable OTG VBus with GPIO low */
- gpio_set_value(EVK_OTG_VBUS, 0);
- }
-}
-
-static void mx53_gpio_usbotg_driver_vbus(bool on)
-{
- if (on)
- gpio_usbotg_vbus_active();
- else
- gpio_usbotg_vbus_inactive();
-}
-
-static void mx53_gpio_host1_driver_vbus(bool on)
-{
- if (on)
- gpio_set_value(EVK_USBH1_VBUS, 1);
- else
- gpio_set_value(EVK_USBH1_VBUS, 0);
-}
-
static void adv7180_pwdn(int pwdn)
{
- gpio_request(MX53_TVIN_PWR, "tvin-pwr");
- gpio_direction_output(MX53_TVIN_PWR, 0);
+ gpio_request(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), "gpio5_23");
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0);
if (pwdn)
- gpio_set_value(MX53_TVIN_PWR, 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0);
else
- gpio_set_value(MX53_TVIN_PWR, 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 1);
}
static struct mxc_tvin_platform_data adv7180_data = {
@@ -871,14 +379,13 @@ device_initcall(mxc_init_fb);
static void camera_pwdn(int pwdn)
{
- gpio_request(MX53_TVIN_PWR, "tvin-pwr");
- gpio_direction_output(MX53_TVIN_PWR, 0);
- gpio_set_value(MX53_TVIN_PWR, pwdn);
+ gpio_request(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), "gpio5_23");
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), pwdn);
}
static struct mxc_camera_platform_data camera_data = {
.analog_regulator = "VSD",
- .gpo_regulator = "VVIDEO",
.mclk = 24000000,
.csi = 0,
.pwdn = camera_pwdn,
@@ -901,18 +408,6 @@ static struct i2c_board_info mxc_i2c0_board_info[] __initdata = {
},
};
-static void sii9022_hdmi_reset(void)
-{
- gpio_set_value(MX53_DVI_RESET, 0);
- msleep(10);
- gpio_set_value(MX53_DVI_RESET, 1);
- msleep(10);
-}
-
-static struct mxc_lcd_platform_data sii9022_hdmi_data = {
- .reset = sii9022_hdmi_reset,
-};
-
/* TO DO add platform data */
static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
{
@@ -922,7 +417,7 @@ static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
{
.type = "tsc2007",
.addr = 0x48,
- .irq = IOMUX_TO_IRQ_V3(EVK_TS_INT),
+ .irq = IOMUX_TO_IRQ(MX53_PIN_EIM_A25),
},
{
.type = "backlight-i2c",
@@ -936,11 +431,6 @@ static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
.type = "eeprom",
.addr = 0x50,
},
- {
- .type = "sii9022",
- .addr = 0x39,
- .platform_data = &sii9022_hdmi_data,
- },
};
static struct mtd_partition mxc_dataflash_partitions[] = {
@@ -978,9 +468,9 @@ static int sdhc_write_protect(struct device *dev)
if (!board_is_mx53_arm2()) {
if (to_platform_device(dev)->id == 0)
- rc = gpio_get_value(EVK_SD1_WP);
+ rc = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_EIM_DA14));
else
- rc = gpio_get_value(EVK_SD3_WP);
+ rc = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_EIM_DA12));
}
return rc;
@@ -991,14 +481,14 @@ static unsigned int sdhc_get_card_det_status(struct device *dev)
int ret;
if (board_is_mx53_arm2()) {
if (to_platform_device(dev)->id == 0)
- ret = gpio_get_value(ARM2_SD1_CD);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_1));
else
ret = 1;
} else {
if (to_platform_device(dev)->id == 0) {
- ret = gpio_get_value(EVK_SD1_CD);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_EIM_DA13));
} else{ /* config the det pin for SDHC3 */
- ret = gpio_get_value(EVK_SD3_CD);
+ ret = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_EIM_DA11));
}
}
@@ -1029,7 +519,6 @@ static struct mxc_mmc_platform_data mmc3_data = {
.status = sdhc_get_card_det_status,
.wp_status = sdhc_write_protect,
.clock_mmc = "esdhc_clk",
- .clk_always_on = 1,
};
/* return value 1 failure, 0 success */
@@ -1195,7 +684,7 @@ return 0;
static int headphone_det_status(void)
{
- return (gpio_get_value(MX53_HP_DETECT) == 0);
+ return (gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DATA5)) == 0);
}
static int mxc_sgtl5000_init(void);
@@ -1204,7 +693,7 @@ static struct mxc_audio_platform_data sgtl5000_data = {
.ssi_num = 1,
.src_port = 2,
.ext_port = 5,
- .hp_irq = IOMUX_TO_IRQ(MX53_HP_DETECT),
+ .hp_irq = IOMUX_TO_IRQ(MX53_PIN_ATA_DATA5),
.hp_status = headphone_det_status,
.amp_enable = mxc_sgtl5000_amp_enable,
.init = mxc_sgtl5000_init,
@@ -1251,19 +740,23 @@ static struct mxc_mlb_platform_data mlb_data = {
#ifdef CONFIG_MTD_PARTITIONS
static struct mtd_partition nand_flash_partitions[] = {
{
- .name = "BOOT",
+ .name = "bootloader",
.offset = 0,
- .size = 7 * 1024 * 1024},
+ .size = 3 * 1024 * 1024},
{
- .name = "MISC",
+ .name = "nand.kernel",
.offset = MTDPART_OFS_APPEND,
- .size = 1 * 1024 * 1024},
+ .size = 5 * 1024 * 1024},
{
- .name = "RECOVERY",
+ .name = "nand.rootfs",
.offset = MTDPART_OFS_APPEND,
- .size = 20 * 1024 * 1024},
+ .size = 256 * 1024 * 1024},
{
- .name = "ROOT",
+ .name = "nand.userfs1",
+ .offset = MTDPART_OFS_APPEND,
+ .size = 256 * 1024 * 1024},
+ {
+ .name = "nand.userfs2",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL},
};
@@ -1324,6 +817,7 @@ static struct platform_device mxc_alsa_surround_device = {
};
static int __initdata mxc_apc_on = { 0 }; /* OFF: 0 (default), ON: 1 */
+
static int __init apc_setup(char *__unused)
{
mxc_apc_on = 1;
@@ -1332,48 +826,6 @@ static int __init apc_setup(char *__unused)
}
__setup("apc", apc_setup);
-static int __initdata enable_w1 = { 0 };
-static int __init w1_setup(char *__unused)
-{
- enable_w1 = 1;
- return cpu_is_mx53();
-}
-__setup("w1", w1_setup);
-
-
-static int __initdata enable_spdif = { 0 };
-static int __init spdif_setup(char *__unused)
-{
- enable_spdif = 1;
- return 1;
-}
-__setup("spdif", spdif_setup);
-
-static struct android_pmem_platform_data android_pmem_pdata = {
- .name = "pmem_adsp",
- .start = 0,
- .size = SZ_64M,
- .no_allocator = 0,
- .cached = PMEM_NONCACHE_NORMAL,
-};
-
-static struct android_pmem_platform_data android_pmem_gpu_pdata = {
- .name = "pmem_gpu",
- .start = 0,
- .size = SZ_32M,
- .no_allocator = 0,
- .cached = PMEM_CACHE_ENABLE,
-};
-
-static struct android_usb_platform_data android_usb_pdata = {
- .vendor_id = 0x0bb4,
- .product_id = 0x0c01,
- .adb_product_id = 0x0c02,
- .version = 0x0100,
- .product_name = "Android Phone",
- .manufacturer_name = "Freescale",
- .nluns = 3,
-};
/*!
* Board specific fixup function. It is called by \b setup_arch() in
@@ -1396,38 +848,17 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
int gpu_mem = SZ_128M;
int fb_mem = SZ_32M;
char *str;
- int size;
mxc_set_cpu_type(MXC_CPU_MX53);
get_cpu_wp = mx53_evk_get_cpu_wp;
set_num_cpu_wp = mx53_evk_set_num_cpu_wp;
- for_each_tag(t, tags) {
- if (t->hdr.tag != ATAG_MEM)
- continue;
- size = t->u.mem.size;
-
- android_pmem_pdata.start =
- PHYS_OFFSET + size - android_pmem_pdata.size;
- android_pmem_gpu_pdata.start =
- android_pmem_pdata.start - android_pmem_gpu_pdata.size;
- gpu_device.resource[5].start =
- android_pmem_gpu_pdata.start - SZ_16M;
- gpu_device.resource[5].end =
- gpu_device.resource[5].start + SZ_16M - 1;
- size -= android_pmem_pdata.size;
- size -= android_pmem_gpu_pdata.size;
- size -= SZ_16M;
- t->u.mem.size = size;
- }
-#if 0
for_each_tag(mem_tag, tags) {
if (mem_tag->hdr.tag == ATAG_MEM) {
total_mem = mem_tag->u.mem.size;
left_mem = total_mem - gpu_mem - fb_mem;
break;
-
}
}
@@ -1479,142 +910,9 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
}
#endif
}
-#endif
-}
-
-static void __init mx53_evk_io_init(void)
-{
- mxc_iomux_v3_setup_multiple_pads(mx53common_pads,
- ARRAY_SIZE(mx53common_pads));
-
- if (board_is_mx53_arm2()) {
- /* MX53 ARM2 CPU board */
- pr_info("MX53 ARM2 board \n");
- mxc_iomux_v3_setup_multiple_pads(mx53arm2_pads,
- ARRAY_SIZE(mx53arm2_pads));
-
- /* Config GPIO for OTG VBus */
- gpio_request(ARM2_OTG_VBUS, "otg-vbus");
- gpio_direction_output(ARM2_OTG_VBUS, 1);
-
- gpio_request(ARM2_SD1_CD, "sdhc1-cd");
- gpio_direction_input(ARM2_SD1_CD); /* SD1 CD */
-
- gpio_request(ARM2_LCD_CONTRAST, "lcd-contrast");
- gpio_direction_output(ARM2_LCD_CONTRAST, 1);
- } else {
- /* MX53 EVK board */
- pr_info("MX53 EVK board \n");
- mxc_iomux_v3_setup_multiple_pads(mx53evk_pads,
- ARRAY_SIZE(mx53evk_pads));
-
- /* Host1 Vbus with GPIO high */
- gpio_request(EVK_USBH1_VBUS, "usbh1-vbus");
- gpio_direction_output(EVK_USBH1_VBUS, 1);
- /* shutdown the Host1 Vbus when system bring up,
- * Vbus will be opened in Host1 driver's probe function */
- gpio_set_value(EVK_USBH1_VBUS, 0);
-
- /* USB HUB RESET - De-assert USB HUB RESET_N */
- gpio_request(EVK_USB_HUB_RESET, "usb-hub-reset");
- gpio_direction_output(EVK_USB_HUB_RESET, 0);
- msleep(1);
- gpio_set_value(EVK_USB_HUB_RESET, 1);
-
- /* Config GPIO for OTG VBus */
- gpio_request(EVK_OTG_VBUS, "otg-vbus");
- gpio_direction_output(EVK_OTG_VBUS, 0);
- if (board_is_mx53_evk_a()) /*rev A,"1" disable, "0" enable vbus*/
- gpio_set_value(EVK_OTG_VBUS, 1);
- else if (board_is_mx53_evk_b()) /* rev B,"0" disable,"1" enable Vbus*/
- gpio_set_value(EVK_OTG_VBUS, 0);
-
- gpio_request(EVK_SD1_CD, "sdhc1-cd");
- gpio_direction_input(EVK_SD1_CD); /* SD1 CD */
- gpio_request(EVK_SD1_WP, "sdhc1-wp");
- gpio_direction_input(EVK_SD1_WP); /* SD1 WP */
-
- /* SD3 CD */
- gpio_request(EVK_SD3_CD, "sdhc3-cd");
- gpio_direction_input(EVK_SD3_CD);
-
- /* SD3 WP */
- gpio_request(EVK_SD3_WP, "sdhc3-wp");
- gpio_direction_input(EVK_SD3_WP);
-
- /* reset FEC PHY */
- gpio_request(EVK_FEC_PHY_RESET, "fec-phy-reset");
- gpio_direction_output(EVK_FEC_PHY_RESET, 0);
- msleep(1);
- gpio_set_value(EVK_FEC_PHY_RESET, 1);
-
- gpio_request(MX53_ESAI_RESET, "fesai-reset");
- gpio_direction_output(MX53_ESAI_RESET, 0);
- }
-
- /* DVI Detect */
- gpio_request(MX53_DVI_DETECT, "dvi-detect");
- gpio_direction_input(MX53_DVI_DETECT);
- /* DVI Reset - Assert for i2c disabled mode */
- gpio_request(MX53_DVI_RESET, "dvi-reset");
- gpio_set_value(MX53_DVI_RESET, 0);
-
- /* DVI Power-down */
- gpio_request(MX53_DVI_PD, "dvi-pd");
- gpio_direction_output(MX53_DVI_PD, 1);
-
- /* DVI I2C enable */
- gpio_request(MX53_DVI_I2C, "dvi-i2c");
- gpio_direction_output(MX53_DVI_I2C, 0);
-
- mxc_iomux_v3_setup_multiple_pads(mx53_nand_pads,
- ARRAY_SIZE(mx53_nand_pads));
-
- gpio_request(MX53_PMIC_INT, "pmic-int");
- gpio_direction_input(MX53_PMIC_INT); /*PMIC_INT*/
-
- /* headphone_det_b */
- gpio_request(MX53_HP_DETECT, "hp-detect");
- gpio_direction_input(MX53_HP_DETECT);
-
- /* power key */
-
- /* LCD related gpio */
-
- /* Camera reset */
- gpio_request(MX53_CAM_RESET, "cam-reset");
- gpio_direction_output(MX53_CAM_RESET, 1);
-
- /* TVIN reset */
- gpio_request(MX53_TVIN_RESET, "tvin-reset");
- gpio_direction_output(MX53_TVIN_RESET, 0);
- msleep(5);
- gpio_set_value(MX53_TVIN_RESET, 1);
-
- /* CAN1 enable GPIO*/
- gpio_request(MX53_CAN1_EN1, "can1-en1");
- gpio_direction_output(MX53_CAN1_EN1, 0);
-
- gpio_request(MX53_CAN1_EN2, "can1-en2");
- gpio_direction_output(MX53_CAN1_EN2, 0);
-
- /* CAN2 enable GPIO*/
- gpio_request(MX53_CAN2_EN1, "can2-en1");
- gpio_direction_output(MX53_CAN2_EN1, 0);
-
- gpio_request(MX53_CAN2_EN2, "can2-en2");
- gpio_direction_output(MX53_CAN2_EN2, 0);
-
- if (enable_spdif) {
- struct pad_desc spdif_pin = MX53_PAD_GPIO_19__SPDIF_TX1;
- mxc_iomux_v3_setup_pad(&spdif_pin);
- } else {
- /* GPIO for 12V */
- gpio_request(MX53_12V_EN, "12v-en");
- gpio_direction_output(MX53_12V_EN, 0);
- }
}
-
+extern void mx53_gpio_usbotg_driver_vbus(bool on);
+extern void mx53_gpio_host1_driver_vbus(bool on);
/*!
* Board specific initialization.
*/
@@ -1627,17 +925,17 @@ static void __init mxc_board_init(void)
/* SD card detect irqs */
if (board_is_mx53_arm2()) {
- mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ_V3(ARM2_SD1_CD);
- mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ_V3(ARM2_SD1_CD);
+ mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ(MX53_PIN_GPIO_1);
+ mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ(MX53_PIN_GPIO_1);
mmc3_data.card_inserted_state = 1;
mmc3_data.status = NULL;
mmc3_data.wp_status = NULL;
mmc1_data.wp_status = NULL;
} else {
- mxcsdhc3_device.resource[2].start = IOMUX_TO_IRQ_V3(EVK_SD3_CD);
- mxcsdhc3_device.resource[2].end = IOMUX_TO_IRQ_V3(EVK_SD3_CD);
- mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ_V3(EVK_SD1_CD);
- mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ_V3(EVK_SD1_CD);
+ mxcsdhc3_device.resource[2].start = IOMUX_TO_IRQ(MX53_PIN_EIM_DA11);
+ mxcsdhc3_device.resource[2].end = IOMUX_TO_IRQ(MX53_PIN_EIM_DA11);
+ mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ(MX53_PIN_EIM_DA13);
+ mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ(MX53_PIN_EIM_DA13);
}
mxc_cpu_common_init();
@@ -1695,10 +993,7 @@ static void __init mxc_board_init(void)
ARRAY_SIZE(mxc_i2c0_board_info));
i2c_register_board_info(1, mxc_i2c1_board_info,
ARRAY_SIZE(mxc_i2c1_board_info));
- mxc_register_device(&mxc_android_pmem_device, &android_pmem_pdata);
- mxc_register_device(&mxc_android_pmem_gpu_device, &android_pmem_gpu_pdata);
- mxc_register_device(&android_usb_device, &android_usb_pdata);
- mxc_register_device(&mxc_powerkey_device, NULL);
+
mx53_evk_init_mc13892();
/*
pm_power_off = mxc_power_off;
@@ -1715,8 +1010,6 @@ static void __init mxc_board_init(void)
mxc_register_device(&mxc_alsa_surround_device,
&mxc_surround_audio_data);
}
- mxc_register_device(&mxc_v4l2_device, NULL);
- mxc_register_device(&mxc_v4l2out_device, NULL);
}
static void __init mx53_evk_timer_init(void)
diff --git a/arch/arm/mach-mx5/mx53_evk_gpio.c b/arch/arm/mach-mx5/mx53_evk_gpio.c
index 450280e2d96a..caeee73ea414 100644
--- a/arch/arm/mach-mx5/mx53_evk_gpio.c
+++ b/arch/arm/mach-mx5/mx53_evk_gpio.c
@@ -50,15 +50,21 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
},
{
MX53_PIN_EIM_D16, IOMUX_CONFIG_ALT4,
+ PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH,
+ MUX_IN_ECSPI1_IPP_CSPI_CLK_IN_SELECT_INPUT,
+ INPUT_CTL_PATH3,
},
{
MX53_PIN_EIM_D17, IOMUX_CONFIG_ALT4,
+ PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH,
+ MUX_IN_ECSPI1_IPP_IND_MISO_SELECT_INPUT,
+ INPUT_CTL_PATH3,
},
{
- MX53_PIN_EIM_D18, IOMUX_CONFIG_ALT2,
- },
- {
- MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT2,
+ MX53_PIN_EIM_D18, IOMUX_CONFIG_ALT4,
+ PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH,
+ MUX_IN_ECSPI1_IPP_IND_MOSI_SELECT_INPUT,
+ INPUT_CTL_PATH3,
},
{
MX53_PIN_EIM_D20, IOMUX_CONFIG_ALT3,
@@ -73,9 +79,6 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
MX53_PIN_EIM_D26, IOMUX_CONFIG_GPIO,
},
{
- MX53_PIN_EIM_D28, IOMUX_CONFIG_ALT3,
- },
- {
MX53_PIN_EIM_D29, IOMUX_CONFIG_ALT3,
},
{
@@ -85,12 +88,6 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
MX53_PIN_EIM_D31, IOMUX_CONFIG_ALT4,
},
{
- MX53_PIN_NANDF_CS2, IOMUX_CONFIG_ALT3,
- },
- {
- MX53_PIN_NANDF_CS3, IOMUX_CONFIG_ALT3,
- },
- {
MX53_PIN_ATA_BUFFER_EN, IOMUX_CONFIG_ALT3,
(PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST),
@@ -166,31 +163,7 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
MX53_PIN_KEY_ROW1, IOMUX_CONFIG_ALT2,
},
{
- MX53_PIN_KEY_COL2, IOMUX_CONFIG_ALT2,
- },
- {
- MX53_PIN_KEY_ROW2, IOMUX_CONFIG_ALT2,
- },
- {
- MX53_PIN_KEY_COL3, IOMUX_CONFIG_ALT4,
- },
- {
- MX53_PIN_KEY_COL4, IOMUX_CONFIG_ALT2,
- },
- {
- MX53_PIN_KEY_ROW4, IOMUX_CONFIG_ALT2,
- },
- {
- MX53_PIN_CSI0_D4, IOMUX_CONFIG_ALT5,
- },
- {
- MX53_PIN_CSI0_D6, IOMUX_CONFIG_ALT5,
- },
- {
- MX53_PIN_CSI0_D7, IOMUX_CONFIG_ALT5,
- },
- {
- MX53_PIN_CSI0_D9, IOMUX_CONFIG_ALT5,
+ MX53_PIN_CSI0_D7, IOMUX_CONFIG_ALT1,
},
{ /* UART1 Tx */
MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT2,
@@ -205,19 +178,31 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
INPUT_CTL_PATH1,
},
{
- MX53_PIN_GPIO_2, IOMUX_CONFIG_GPIO,
+ MX53_PIN_GPIO_2, IOMUX_CONFIG_ALT7,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE |
+ PAD_CTL_360K_PD),
+ MUX_IN_MLB_MLBDAT_IN_SELECT_INPUT,
+ INPUT_CTL_PATH2,
},
{
- MX53_PIN_GPIO_3, IOMUX_CONFIG_GPIO,
+ MX53_PIN_GPIO_3, IOMUX_CONFIG_ALT7,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE |
+ PAD_CTL_360K_PD),
+ MUX_IN_MLB_MLBCLK_IN_SELECT_INPUT,
+ INPUT_CTL_PATH2,
},
{
MX53_PIN_GPIO_4, IOMUX_CONFIG_GPIO,
},
{
- MX53_PIN_GPIO_5, IOMUX_CONFIG_GPIO,
- },
- {
- MX53_PIN_GPIO_6, IOMUX_CONFIG_GPIO,
+ MX53_PIN_GPIO_6, IOMUX_CONFIG_ALT7,
+ (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE |
+ PAD_CTL_360K_PD),
+ MUX_IN_MLB_MLBSIG_IN_SELECT_INPUT,
+ INPUT_CTL_PATH2,
},
{
MX53_PIN_GPIO_7, IOMUX_CONFIG_GPIO,
@@ -228,29 +213,79 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
{
MX53_PIN_GPIO_10, IOMUX_CONFIG_GPIO,
},
- {
- MX53_PIN_GPIO_11, IOMUX_CONFIG_GPIO,
+ { /* CAN1-TX */
+ MX53_PIN_KEY_COL2, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE),
},
- {
- MX53_PIN_GPIO_12, IOMUX_CONFIG_GPIO,
+ { /* CAN1-RX */
+ MX53_PIN_KEY_ROW2, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE),
+ MUX_IN_CAN1_IPP_IND_CANRX_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* CAN1 -- EN */
+ MX53_PIN_GPIO_18, IOMUX_CONFIG_ALT1,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE),
+ },
+ { /* CAN1 -- STBY */
+ MX53_PIN_GPIO_17, IOMUX_CONFIG_ALT1,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE),
+ },
+ { /* CAN1 -- NERR */
+ MX53_PIN_GPIO_5, IOMUX_CONFIG_ALT1,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE),
+ MUX_IN_CAN2_IPP_IND_CANRX_SELECT_INPUT,
+ INPUT_CTL_PATH1,
},
- {
- MX53_PIN_GPIO_13, IOMUX_CONFIG_GPIO,
+ { /* CAN2-TX */
+ MX53_PIN_KEY_COL4, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE),
},
- {
- MX53_PIN_GPIO_14, IOMUX_CONFIG_GPIO,
+ { /* CAN2-RX */
+ MX53_PIN_KEY_ROW4, IOMUX_CONFIG_ALT2,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE),
+ MUX_IN_CAN2_IPP_IND_CANRX_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* CAN2 -- EN */
+ MX53_PIN_CSI0_D6, IOMUX_CONFIG_ALT1,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE),
+ },
+ { /* CAN2 -- STBY */
+ MX53_PIN_GPIO_14, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE),
+ },
+ { /* CAN2 -- NERR */
+ MX53_PIN_CSI0_D4, IOMUX_CONFIG_ALT1,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE),
},
{
- MX53_PIN_GPIO_16, IOMUX_CONFIG_ALT1,
+ MX53_PIN_GPIO_11, IOMUX_CONFIG_GPIO,
+ },
+ { /* ESAI reset */
+ MX53_PIN_GPIO_12, IOMUX_CONFIG_ALT0,
+ (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_SRE_FAST),
},
{
- MX53_PIN_GPIO_17, IOMUX_CONFIG_GPIO,
+ MX53_PIN_GPIO_13, IOMUX_CONFIG_GPIO,
},
{
- MX53_PIN_GPIO_18, IOMUX_CONFIG_GPIO,
+ MX53_PIN_GPIO_16, IOMUX_CONFIG_ALT1,
},
{
- MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT3,
+ MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT1,
},
{ /* DI0 display clock */
MX53_PIN_DI0_DISP_CLK, IOMUX_CONFIG_ALT0,
@@ -392,6 +427,36 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
(PAD_CTL_HYS_NONE | PAD_CTL_PKE_NONE | PAD_CTL_ODE_OPENDRAIN_NONE |
PAD_CTL_DRV_HIGH | PAD_CTL_SRE_SLOW),
},
+ {
+ MX53_PIN_LVDS0_TX3_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS0_CLK_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS0_TX2_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS0_TX1_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS0_TX0_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS1_TX3_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS1_CLK_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS1_TX2_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS1_TX1_P, IOMUX_CONFIG_ALT1,
+ },
+ {
+ MX53_PIN_LVDS1_TX0_P, IOMUX_CONFIG_ALT1,
+ },
{ /* audio and CSI clock out */
MX53_PIN_GPIO_0, IOMUX_CONFIG_ALT3,
},
@@ -450,68 +515,100 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
/* esdhc1 */
{
MX53_PIN_SD1_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_SD1_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_SD1_DATA0, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_SD1_DATA1, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_SD1_DATA2, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_SD1_DATA3, IOMUX_CONFIG_ALT0,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
/* esdhc3 */
{
MX53_PIN_ATA_DATA0, IOMUX_CONFIG_ALT4,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_DATA1, IOMUX_CONFIG_ALT4,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_DATA2, IOMUX_CONFIG_ALT4,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_DATA3, IOMUX_CONFIG_ALT4,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_DATA8, IOMUX_CONFIG_ALT4,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_DATA9, IOMUX_CONFIG_ALT4,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_DATA10, IOMUX_CONFIG_ALT4,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_DATA11, IOMUX_CONFIG_ALT4,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_IORDY, IOMUX_CONFIG_ALT2,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{
MX53_PIN_ATA_RESET_B, IOMUX_CONFIG_ALT2,
- (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST),
+ (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH
+ | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE
+ | PAD_CTL_SRE_FAST),
},
{ /* FEC pins */
MX53_PIN_FEC_MDIO, IOMUX_CONFIG_ALT0,
@@ -556,6 +653,38 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
MX53_PIN_FEC_MDC, IOMUX_CONFIG_ALT0,
PAD_CTL_DRV_HIGH,
},
+ { /* I2C1 SDA */
+ MX53_PIN_CSI0_D8, IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ MUX_IN_I2C1_IPP_SDA_IN_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* I2C1 SCL */
+ MX53_PIN_CSI0_D9, IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ MUX_IN_I2C1_IPP_SCL_IN_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* I2C2 SDA */
+ MX53_PIN_KEY_ROW3, IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ MUX_IN_I2C2_IPP_SDA_IN_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
+ { /* I2C1 SCL */
+ MX53_PIN_KEY_COL3, IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION,
+ (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE |
+ PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
+ PAD_CTL_HYS_ENABLE),
+ MUX_IN_I2C2_IPP_SCL_IN_SELECT_INPUT,
+ INPUT_CTL_PATH0,
+ },
};
static struct mxc_iomux_pin_cfg __initdata mx53_evk_iomux_pins[] = {
@@ -631,11 +760,87 @@ static int __initdata enable_w1 = { 0 };
static int __init w1_setup(char *__unused)
{
enable_w1 = 1;
- return 1;
+ return cpu_is_mx53();
}
__setup("w1", w1_setup);
+static struct mxc_iomux_pin_cfg __initdata nand_iomux_pins[] = {
+ {
+ MX53_PIN_NANDF_CS0, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_NANDF_CS1, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_NANDF_CS2, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_NANDF_CS3, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_NANDF_RB0, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_100K_PU,
+ },
+ {
+ MX53_PIN_NANDF_CLE, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_NANDF_ALE, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_NANDF_WP_B, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_100K_PU,
+ },
+ {
+ MX53_PIN_NANDF_RE_B, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_NANDF_WE_B, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_EIM_DA0, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_EIM_DA1, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_EIM_DA2, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_EIM_DA3, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_EIM_DA4, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_EIM_DA5, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_EIM_DA6, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH,
+ },
+ {
+ MX53_PIN_EIM_DA7, IOMUX_CONFIG_ALT0,
+ PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH,
+ },
+};
+
+static int __initdata enable_spdif = { 0 };
+static int __init spdif_setup(char *__unused)
+{
+ enable_spdif = 1;
+ return 1;
+}
+
+__setup("spdif", spdif_setup);
+
void __init mx53_evk_io_init(void)
{
int i;
@@ -665,12 +870,12 @@ void __init mx53_evk_io_init(void)
mx53_arm2_iomux_pins[i].in_mode);
}
- /* Enable OTG VBus with GPIO low */
+ /* Config GPIO for OTG VBus */
mxc_iomux_set_pad(MX53_PIN_EIM_D22, PAD_CTL_DRV_HIGH |
PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), "gpio3_22");
gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 0);
- gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 1);
gpio_request(IOMUX_TO_GPIO(MX53_PIN_GPIO_1), "gpio1_1");
gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_GPIO_1)); /* SD1 CD */
@@ -696,6 +901,9 @@ void __init mx53_evk_io_init(void)
PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
gpio_request(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), "gpio7_8");
gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 1);
+ /* shutdown the Host1 Vbus when system bring up,
+ * Vbus will be opened in Host1 driver's probe function */
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 0);
/* USB HUB RESET - De-assert USB HUB RESET_N */
mxc_iomux_set_pad(MX53_PIN_CSI0_DATA_EN, PAD_CTL_DRV_HIGH |
@@ -708,12 +916,16 @@ void __init mx53_evk_io_init(void)
msleep(1);
gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_DATA_EN), 1);
- /* Enable OTG VBus with GPIO low */
+ /* Config GPIO for OTG VBus */
mxc_iomux_set_pad(MX53_PIN_EIM_A23, PAD_CTL_DRV_HIGH |
PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), "gpio6_6");
gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0);
- gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0);
+
+ if (board_is_mx53_evk_a()) /*rev A,"1" disable, "0" enable vbus*/
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 1);
+ else if (board_is_mx53_evk_b()) /* rev B,"0" disable,"1" enable Vbus*/
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0);
gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_DA13), "gpio3_13");
gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_EIM_DA13)); /* SD1 CD */
@@ -735,70 +947,42 @@ void __init mx53_evk_io_init(void)
msleep(1);
gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_0), 1);
- /* DVI Detect */
- gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D31), "gpio3_31");
- gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_EIM_D31));
- /* DVI Reset - Assert for i2c disabled mode */
- gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), "gpio5_0");
- gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), 0);
- gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), 0);
- /* DVI Power-down */
- gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), "gpio3_24");
- gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), 0);
- gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), 1);
- /* DVI I2C enable */
- gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), "gpio3_28");
- gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), 0);
- gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), 0);
+ /* CS42888 reset GPIO */
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_12), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_12), 0);
+
}
+ /* DVI Detect */
+ gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D31), "gpio3_31");
+ gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_EIM_D31));
+ /* DVI Reset - Assert for i2c disabled mode */
+ gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), "gpio5_0");
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), 0);
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), 0);
+ /* DVI Power-down */
+ gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), "gpio3_24");
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), 1);
+ /* DVI I2C enable */
+ gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), "gpio3_28");
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), 0);
+
+ for (i = 0; i < ARRAY_SIZE(nand_iomux_pins); i++) {
+ mxc_request_iomux(nand_iomux_pins[i].pin,
+ nand_iomux_pins[i].mux_mode);
+ if (nand_iomux_pins[i].pad_cfg)
+ mxc_iomux_set_pad(nand_iomux_pins[i].pin,
+ nand_iomux_pins[i].pad_cfg);
+ if (nand_iomux_pins[i].in_select)
+ mxc_iomux_set_input(nand_iomux_pins[i].in_select,
+ nand_iomux_pins[i].in_mode);
+ }
gpio_request(IOMUX_TO_GPIO(MX53_PIN_GPIO_16), "gpio7_11");
gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_GPIO_16)); /*PMIC_INT*/
-
- /* i2c1 SDA */
- mxc_request_iomux(MX53_PIN_CSI0_D8,
- IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION);
- mxc_iomux_set_input(MUX_IN_I2C1_IPP_SDA_IN_SELECT_INPUT,
- INPUT_CTL_PATH0);
- mxc_iomux_set_pad(MX53_PIN_CSI0_D8, PAD_CTL_SRE_FAST |
- PAD_CTL_ODE_OPENDRAIN_ENABLE |
- PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
- PAD_CTL_HYS_ENABLE);
-
- /* i2c1 SCL */
- mxc_request_iomux(MX53_PIN_CSI0_D9,
- IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION);
- mxc_iomux_set_input(MUX_IN_I2C1_IPP_SCL_IN_SELECT_INPUT,
- INPUT_CTL_PATH0);
- mxc_iomux_set_pad(MX53_PIN_CSI0_D9, PAD_CTL_SRE_FAST |
- PAD_CTL_ODE_OPENDRAIN_ENABLE |
- PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
- PAD_CTL_HYS_ENABLE);
-
- /* i2c2 SDA */
- mxc_request_iomux(MX53_PIN_KEY_ROW3,
- IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION);
- mxc_iomux_set_input(MUX_IN_I2C2_IPP_SDA_IN_SELECT_INPUT,
- INPUT_CTL_PATH0);
- mxc_iomux_set_pad(MX53_PIN_KEY_ROW3,
- PAD_CTL_SRE_FAST |
- PAD_CTL_ODE_OPENDRAIN_ENABLE |
- PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
- PAD_CTL_HYS_ENABLE);
-
- /* i2c2 SCL */
- mxc_request_iomux(MX53_PIN_KEY_COL3,
- IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION);
- mxc_iomux_set_input(MUX_IN_I2C2_IPP_SCL_IN_SELECT_INPUT,
- INPUT_CTL_PATH0);
- mxc_iomux_set_pad(MX53_PIN_KEY_COL3,
- PAD_CTL_SRE_FAST |
- PAD_CTL_ODE_OPENDRAIN_ENABLE |
- PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
- PAD_CTL_HYS_ENABLE);
-
/* headphone_det_b */
mxc_request_iomux(MX53_PIN_ATA_DATA5, IOMUX_CONFIG_GPIO);
mxc_iomux_set_pad(MX53_PIN_ATA_DATA5, PAD_CTL_100K_PU);
@@ -814,36 +998,82 @@ void __init mx53_evk_io_init(void)
gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_10), 0);
gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_10), 1);
- /* Camera low power */
- gpio_request(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), "gpio5_23");
- gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0);
- gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0);
+ /* TVIN reset */
+ gpio_request(IOMUX_TO_GPIO(MX53_PIN_CSI0_D7), "gpio5_25");
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D7), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D7), 0);
+ msleep(5);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D7), 1);
+
+ /* CAN1 enable GPIO*/
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_18), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_18), 0);
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_17), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_17), 0);
+
+ /* CAN2 enable GPIO*/
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D6), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D6), 0);
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_14), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_14), 0);
+
+ if (enable_spdif) {
+ mxc_free_iomux(MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT1);
+ mxc_request_iomux(MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT3);
+ mxc_iomux_set_pad(MX53_PIN_GPIO_19,
+ PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE |
+ PAD_CTL_PUE_PULL | PAD_CTL_100K_PU |
+ PAD_CTL_PKE_ENABLE);
+ } else {
+ /* GPIO for CAN 12V */
+ gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_19), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_19), 0);
+ }
}
/* workaround for ecspi chipselect pin may not keep correct level when idle */
void mx53_evk_gpio_spi_chipselect_active(int cspi_mode, int status,
int chipselect)
{
- u32 gpio;
-
switch (cspi_mode) {
case 1:
switch (chipselect) {
case 0x1:
- mxc_request_iomux(MX53_PIN_EIM_D19,
- IOMUX_CONFIG_ALT4);
+ /* de-select SS1 of instance: ecspi1. */
+ mxc_request_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT1);
mxc_iomux_set_pad(MX53_PIN_EIM_D19,
PAD_CTL_HYS_ENABLE |
PAD_CTL_PKE_ENABLE |
- PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
+ PAD_CTL_PUE_PULL |
+ PAD_CTL_100K_PU |
+ PAD_CTL_DRV_HIGH);
+
+ /* mux mode: ALT4 mux port: SS0 of instance: ecspi1. */
+ mxc_request_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT4);
+ mxc_iomux_set_pad(MX53_PIN_EIM_EB2,
+ PAD_CTL_HYS_ENABLE |
+ PAD_CTL_DRV_HIGH);
+ mxc_iomux_set_input(
+ MUX_IN_ECSPI1_IPP_IND_SS_B_1_SELECT_INPUT,
+ INPUT_CTL_PATH3);
break;
case 0x2:
- gpio = IOMUX_TO_GPIO(MX53_PIN_EIM_D19);
- mxc_request_iomux(MX53_PIN_EIM_D19,
- IOMUX_CONFIG_GPIO);
- gpio_request(gpio, "cspi1_ss1");
- gpio_direction_output(gpio, 0);
- gpio_set_value(gpio, 1 & (~status));
+ /* de-select SS0 of instance: ecspi1. */
+ mxc_request_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT1);
+ mxc_iomux_set_pad(MX53_PIN_EIM_EB2,
+ PAD_CTL_HYS_ENABLE |
+ PAD_CTL_PKE_ENABLE |
+ PAD_CTL_PUE_PULL |
+ PAD_CTL_100K_PU |
+ PAD_CTL_DRV_HIGH);
+ mxc_request_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT4);
+ mxc_iomux_set_pad(MX53_PIN_EIM_D19,
+ PAD_CTL_HYS_ENABLE |
+ PAD_CTL_DRV_HIGH);
+ mxc_iomux_set_input(
+ MUX_IN_ECSPI1_IPP_IND_SS_B_1_SELECT_INPUT,
+ INPUT_CTL_PATH3);
+
break;
default:
break;
@@ -870,9 +1100,14 @@ void mx53_evk_gpio_spi_chipselect_inactive(int cspi_mode, int status,
mxc_request_iomux(MX53_PIN_EIM_D19,
IOMUX_CONFIG_GPIO);
mxc_free_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_GPIO);
+ mxc_free_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT4);
break;
case 0x2:
- mxc_free_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_GPIO);
+ mxc_free_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT4);
+ mxc_request_iomux(MX53_PIN_EIM_EB2,
+ IOMUX_CONFIG_GPIO);
+ mxc_free_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_GPIO);
+ mxc_free_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT4);
break;
default:
break;
@@ -888,8 +1123,201 @@ void mx53_evk_gpio_spi_chipselect_inactive(int cspi_mode, int status,
}
EXPORT_SYMBOL(mx53_evk_gpio_spi_chipselect_inactive);
+void flexcan_xcvr_enable(int id, int en)
+{
+ static int pwdn;
+ if (id < 0 || id > 1)
+ return;
+
+ if (en) {
+ if (!(pwdn++))
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_19), 1);
+
+ if (id == 0) {
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_18), 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_17), 1);
+ } else {
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D6), 1);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_14), 1);
+ }
+
+ } else {
+ if (!(--pwdn))
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_19), 0);
+
+ if (id == 0) {
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_18), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_17), 0);
+ } else {
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D6), 0);
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_14), 0);
+ }
+ }
+}
+EXPORT_SYMBOL(flexcan_xcvr_enable);
+
void gpio_lcd_active(void)
{
/* TO DO */
}
EXPORT_SYMBOL(gpio_lcd_active);
+
+void gpio_activate_esai_ports(void)
+{
+ unsigned int pad_val;
+
+ /* ESAI1-HCKR */
+ mxc_request_iomux(MX53_PIN_FEC_RX_ER, IOMUX_CONFIG_ALT2);
+ /* ESAI1-SCKR */
+ mxc_request_iomux(MX53_PIN_FEC_MDIO, IOMUX_CONFIG_ALT2);
+ /* ESAI1-FSR */
+ mxc_request_iomux(MX53_PIN_FEC_REF_CLK, IOMUX_CONFIG_ALT2);
+ /* ESAI1-HCKT */
+ mxc_request_iomux(MX53_PIN_FEC_RXD0, IOMUX_CONFIG_ALT2);
+ /* ESAI1-SCKT */
+ mxc_request_iomux(MX53_PIN_FEC_CRS_DV, IOMUX_CONFIG_ALT2);
+ /* ESAI1-FST */
+ mxc_request_iomux(MX53_PIN_FEC_RXD1, IOMUX_CONFIG_ALT2);
+ /* ESAI1-TX5-RX0 */
+ mxc_request_iomux(MX53_PIN_FEC_MDC, IOMUX_CONFIG_ALT2);
+ /* ESAI1-TX4-RX1 */
+ mxc_request_iomux(MX53_PIN_FEC_TXD0, IOMUX_CONFIG_ALT2);
+ /* ESAI1-TX3-RX2 */
+ mxc_request_iomux(MX53_PIN_FEC_TX_EN, IOMUX_CONFIG_ALT2);
+ /* ESAI1-TX2-RX3 */
+ mxc_request_iomux(MX53_PIN_FEC_TXD1, IOMUX_CONFIG_ALT2);
+ /* ESAI1-TX1 */
+ mxc_request_iomux(MX53_PIN_NANDF_CS3, IOMUX_CONFIG_ALT3);
+ /* ESAI1-TX0 */
+ mxc_request_iomux(MX53_PIN_NANDF_CS2, IOMUX_CONFIG_ALT3);
+
+ pad_val = PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE |
+ PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
+ PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE;
+
+ /* ESAI1-HCKR */
+ mxc_iomux_set_pad(MX53_PIN_FEC_RX_ER, pad_val);
+ /* ESAI1-SCKR */
+ mxc_iomux_set_pad(MX53_PIN_FEC_MDIO, pad_val);
+ /* ESAI1-FSR */
+ mxc_iomux_set_pad(MX53_PIN_FEC_REF_CLK, pad_val);
+ /* ESAI1-HCKT */
+ mxc_iomux_set_pad(MX53_PIN_FEC_RXD0, pad_val);
+ /* ESAI1-SCKT */
+ mxc_iomux_set_pad(MX53_PIN_FEC_CRS_DV, pad_val);
+ /* ESAI1-FST */
+ mxc_iomux_set_pad(MX53_PIN_FEC_RXD1, pad_val);
+ /* ESAI1-TX5-RX0 */
+ mxc_iomux_set_pad(MX53_PIN_FEC_MDC, pad_val);
+ /* ESAI1-TX4-RX1 */
+ mxc_iomux_set_pad(MX53_PIN_FEC_TXD0, pad_val);
+ /* ESAI1-TX3-RX2 */
+ mxc_iomux_set_pad(MX53_PIN_FEC_TX_EN, pad_val);
+ /* ESAI1-TX2-RX3 */
+ mxc_iomux_set_pad(MX53_PIN_FEC_TXD1, pad_val);
+ /* ESAI1-TX1 */
+ mxc_iomux_set_pad(MX53_PIN_NANDF_CS3, pad_val);
+ /* ESAI1-TX0 */
+ mxc_iomux_set_pad(MX53_PIN_NANDF_CS2, pad_val);
+
+ /* ESAI1-HCKR */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_HCKR_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-SCKR */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SCKR_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-FSR */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_FSR_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-HCKT */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_HCKT_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-SCKT */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SCKT_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-FST */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_FST_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-TX5-RX0 */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO5_SDI0_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-TX4-RX1 */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO4_SDI1_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-TX3-RX2 */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO3_SDI2_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-TX2-RX3 */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO2_SDI3_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-TX1 */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO1_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+ /* ESAI1-TX0 */
+ mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO0_SELECT_INPUT,
+ INPUT_CTL_PATH0);
+
+}
+EXPORT_SYMBOL(gpio_activate_esai_ports);
+
+void gpio_cs42888_pdwn(int pdwn)
+{
+ if (pdwn)
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_12), 0);
+ else
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_12), 1);
+}
+EXPORT_SYMBOL(gpio_cs42888_pdwn);
+
+static void gpio_usbotg_vbus_active(void)
+{
+ if (board_is_mx53_arm2()) {
+ /* MX53 ARM2 CPU board */
+ /* Enable OTG VBus with GPIO low */
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 0);
+ } else if (board_is_mx53_evk_a()) {
+ /* MX53 EVK board ver A*/
+ /* Enable OTG VBus with GPIO low */
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0);
+ } else if (board_is_mx53_evk_b()) {
+ /* MX53 EVK board ver B*/
+ /* Enable OTG VBus with GPIO high */
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 1);
+ }
+}
+
+static void gpio_usbotg_vbus_inactive(void)
+{
+ if (board_is_mx53_arm2()) {
+ /* MX53 ARM2 CPU board */
+ /* Disable OTG VBus with GPIO high */
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 1);
+ } else if (board_is_mx53_evk_a()) {
+ /* MX53 EVK board ver A*/
+ /* Disable OTG VBus with GPIO high */
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 1);
+ } else if (board_is_mx53_evk_b()) {
+ /* MX53 EVK board ver B*/
+ /* Disable OTG VBus with GPIO low */
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0);
+ }
+}
+
+
+void mx53_gpio_usbotg_driver_vbus(bool on)
+{
+ if (on)
+ gpio_usbotg_vbus_active();
+ else
+ gpio_usbotg_vbus_inactive();
+}
+EXPORT_SYMBOL(mx53_gpio_usbotg_driver_vbus);
+
+void mx53_gpio_host1_driver_vbus(bool on)
+{
+ if (on)
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 1);
+ else
+ gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 0);
+}
+EXPORT_SYMBOL(mx53_gpio_host1_driver_vbus);
diff --git a/arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c b/arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c
index be5f850fcf97..f8ec651cd459 100644
--- a/arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c
+++ b/arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c
@@ -23,8 +23,8 @@
#include <linux/regulator/machine.h>
#include <linux/mfd/mc13892/core.h>
#include <mach/irqs.h>
-
-#include <mach/iomux-mx53.h>
+#include "iomux.h"
+#include "mx53_pins.h"
/*
* Convenience conversion.
@@ -183,8 +183,6 @@ static struct regulator_init_data vvideo_init = {
.min_uV = mV_to_uV(2500),
.max_uV = mV_to_uV(2775),
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
- .always_on = 1,
- .boot_on = 1,
}
};
@@ -268,7 +266,7 @@ static struct regulator_init_data gpo4_init = {
.name = "GPO4",
}
};
-#if 0
+
/*!
* the event handler for power on event
*/
@@ -276,20 +274,20 @@ static void power_on_evt_handler(void)
{
pr_info("pwr on event1 is received \n");
}
-#endif
+
static int mc13892_regulator_init(struct mc13892 *mc13892)
{
unsigned int value;
-// pmic_event_callback_t power_key_event;
+ pmic_event_callback_t power_key_event;
int register_mask;
pr_info("Initializing regulators for MX53 EVK \n");
-#if 0
+
/* subscribe PWRON1 event to enable ON_OFF key */
power_key_event.param = NULL;
power_key_event.func = (void *)power_on_evt_handler;
pmic_event_subscribe(EVENT_PWRONI, power_key_event);
-#endif
+
/* Bit 4 DRM: keep VSRTC and CLK32KMCU on for all states */
#if defined(CONFIG_RTC_DRV_MXC_V2) || defined(CONFIG_RTC_DRV_MXC_V2_MODULE)
value = BITFVAL(DRM, 1);
@@ -339,7 +337,7 @@ static struct mc13892_platform_data mc13892_plat = {
static struct i2c_board_info __initdata mc13892_i2c_device = {
I2C_BOARD_INFO("mc13892", 0x08),
- .irq = IOMUX_TO_IRQ_V3(203),
+ .irq = IOMUX_TO_IRQ(MX53_PIN_GPIO_16),
.platform_data = &mc13892_plat,
};
diff --git a/arch/arm/mach-mx5/pm.c b/arch/arm/mach-mx5/pm.c
index b2bf2f8355fd..2839bffeda62 100644
--- a/arch/arm/mach-mx5/pm.c
+++ b/arch/arm/mach-mx5/pm.c
@@ -29,10 +29,6 @@
#define MXC_SRPG_EMPGC0_SRPGCR (IO_ADDRESS(GPC_BASE_ADDR) + 0x2C0)
#define MXC_SRPG_EMPGC1_SRPGCR (IO_ADDRESS(GPC_BASE_ADDR) + 0x2D0)
-#define DATABAHN_CTL_REG0 0
-#define DATABAHN_CTL_REG19 0x4c
-#define DATABAHN_CTL_REG79 0x13c
-#define DATABAHN_PHY_REG25 0x264
static struct cpu_wp *cpu_wp_tbl;
static struct clk *cpu_clk;
@@ -47,17 +43,16 @@ extern int set_cpu_freq(int wp);
static struct device *pm_dev;
struct clk *gpc_dvfs_clk;
extern void cpu_do_suspend_workaround(u32 sdclk_iomux_addr);
-extern void mx50_suspend(u32 databahn_addr);
+extern void cpu_cortexa8_do_idle(void *);
extern struct cpu_wp *(*get_cpu_wp)(int *wp);
-extern void __iomem *databahn_base;
extern int iram_ready;
void *suspend_iram_base;
void (*suspend_in_iram)(void *sdclk_iomux_addr) = NULL;
-void __iomem *suspend_param1;
-static int mx5_suspend_enter(suspend_state_t state)
+static int mx51_suspend_enter(suspend_state_t state)
{
+ void __iomem *sdclk_iomux_addr = IO_ADDRESS(IOMUXC_BASE_ADDR + 0x4b8);
u32 * wake_src;
/* Check that we have a wake up source. We don't want to suspend if not.*/
@@ -89,15 +84,12 @@ static int mx5_suspend_enter(suspend_state_t state)
local_flush_tlb_all();
flush_cache_all();
- if (cpu_is_mx51() || cpu_is_mx53()) {
- /* Run the suspend code from iRAM. */
- suspend_in_iram(suspend_param1);
+ /* Run the suspend code from iRAM. */
+ suspend_in_iram(sdclk_iomux_addr);
- /*clear the EMPGC0/1 bits */
- __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR);
- __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR);
- } else
- suspend_in_iram(databahn_base);
+ /*clear the EMPGC0/1 bits */
+ __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR);
+ __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR);
} else {
cpu_do_idle();
}
@@ -109,7 +101,7 @@ static int mx5_suspend_enter(suspend_state_t state)
/*
* Called after processes are frozen, but before we shut down devices.
*/
-static int mx5_suspend_prepare(void)
+static int mx51_suspend_prepare(void)
{
#if defined(CONFIG_CPU_FREQ)
struct cpufreq_freqs freqs;
@@ -132,7 +124,7 @@ static int mx5_suspend_prepare(void)
/*
* Called before devices are re-setup.
*/
-static void mx5_suspend_finish(void)
+static void mx51_suspend_finish(void)
{
#if defined(CONFIG_CPU_FREQ)
struct cpufreq_freqs freqs;
@@ -155,35 +147,35 @@ static void mx5_suspend_finish(void)
/*
* Called after devices are re-setup, but before processes are thawed.
*/
-static void mx5_suspend_end(void)
+static void mx51_suspend_end(void)
{
}
-static int mx5_pm_valid(suspend_state_t state)
+static int mx51_pm_valid(suspend_state_t state)
{
return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX);
}
-struct platform_suspend_ops mx5_suspend_ops = {
- .valid = mx5_pm_valid,
- .prepare = mx5_suspend_prepare,
- .enter = mx5_suspend_enter,
- .finish = mx5_suspend_finish,
- .end = mx5_suspend_end,
+struct platform_suspend_ops mx51_suspend_ops = {
+ .valid = mx51_pm_valid,
+ .prepare = mx51_suspend_prepare,
+ .enter = mx51_suspend_enter,
+ .finish = mx51_suspend_finish,
+ .end = mx51_suspend_end,
};
-static int __devinit mx5_pm_probe(struct platform_device *pdev)
+static int __devinit mx51_pm_probe(struct platform_device *pdev)
{
pm_dev = &pdev->dev;
return 0;
}
-static struct platform_driver mx5_pm_driver = {
+static struct platform_driver mx51_pm_driver = {
.driver = {
- .name = "mx5_pm",
+ .name = "mx51_pm",
},
- .probe = mx5_pm_probe,
+ .probe = mx51_pm_probe,
};
static int __init pm_init(void)
@@ -191,32 +183,19 @@ static int __init pm_init(void)
int cpu_wp_nr;
unsigned long iram_paddr;
- pr_info("Static Power Management for Freescale i.MX5\n");
- if (platform_driver_register(&mx5_pm_driver) != 0) {
- printk(KERN_ERR "mx5_pm_driver register failed\n");
+ pr_info("Static Power Management for Freescale i.MX51\n");
+ if (platform_driver_register(&mx51_pm_driver) != 0) {
+ printk(KERN_ERR "mx51_pm_driver register failed\n");
return -ENODEV;
}
- suspend_set_ops(&mx5_suspend_ops);
+ suspend_set_ops(&mx51_suspend_ops);
/* Move suspend routine into iRAM */
iram_alloc(SZ_4K, &iram_paddr);
/* Need to remap the area here since we want the memory region
to be executable. */
suspend_iram_base = __arm_ioremap(iram_paddr, SZ_4K,
MT_HIGH_VECTORS);
-
- if (cpu_is_mx51() || cpu_is_mx53()) {
- suspend_param1 = IO_ADDRESS(IOMUXC_BASE_ADDR + 0x4b8);
- memcpy(suspend_iram_base, cpu_do_suspend_workaround,
- SZ_4K);
- } else if (cpu_is_mx50()) {
- /*
- * Need to run the suspend code from IRAM as the DDR needs
- * to be put into self refresh mode manually.
- */
- memcpy(suspend_iram_base, mx50_suspend, SZ_4K);
-
- suspend_param1 = databahn_base;
- }
+ memcpy(suspend_iram_base, cpu_do_suspend_workaround, SZ_4K);
suspend_in_iram = (void *)suspend_iram_base;
cpu_wp_tbl = get_cpu_wp(&cpu_wp_nr);
@@ -235,7 +214,7 @@ static int __init pm_init(void)
static void __exit pm_cleanup(void)
{
/* Unregister the device structure */
- platform_driver_unregister(&mx5_pm_driver);
+ platform_driver_unregister(&mx51_pm_driver);
}
module_init(pm_init);
diff --git a/arch/arm/mach-mx5/system.c b/arch/arm/mach-mx5/system.c
index 199c30e26947..da27fc4605a3 100644
--- a/arch/arm/mach-mx5/system.c
+++ b/arch/arm/mach-mx5/system.c
@@ -16,7 +16,6 @@
#include <linux/platform_device.h>
#include <asm/io.h>
#include <mach/hardware.h>
-#include <mach/clock.h>
#include <asm/proc-fns.h>
#include <asm/system.h>
#include "crm_regs.h"
@@ -34,14 +33,11 @@
extern int mxc_jtag_enabled;
extern int iram_ready;
-extern void __iomem *ccm_base;
-extern void __iomem *databahn_base;
-extern void (*wait_in_iram)(void *ccm_addr, void *databahn_addr);
-extern void *wait_in_iram_base;
-extern void mx50_wait(u32 ccm_base, u32 databahn_addr);
-
static struct clk *gpc_dvfs_clk;
+extern void cpu_cortexa8_do_idle(void *addr);
+
+
/* set cpu low power mode before WFI instruction */
void mxc_cpu_lp_set(enum mxc_cpu_pwr_mode mode)
{
@@ -70,7 +66,6 @@ void mxc_cpu_lp_set(enum mxc_cpu_pwr_mode mode)
if (mode == WAIT_UNCLOCKED_POWER_OFF) {
ccm_clpcr |= (0x1 << MXC_CCM_CLPCR_LPM_OFFSET);
ccm_clpcr &= ~MXC_CCM_CLPCR_VSTBY;
- ccm_clpcr &= ~MXC_CCM_CLPCR_SBYOS;
stop_mode = 0;
} else {
ccm_clpcr |= (0x2 << MXC_CCM_CLPCR_LPM_OFFSET);
@@ -101,8 +96,7 @@ void mxc_cpu_lp_set(enum mxc_cpu_pwr_mode mode)
__raw_writel(ccm_clpcr, MXC_CCM_CLPCR);
if (cpu_is_mx51())
__raw_writel(arm_srpgcr, MXC_SRPG_ARM_SRPGCR);
- if (!cpu_is_mx50())
- __raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR);
+ __raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR);
if (stop_mode) {
__raw_writel(empgc0, MXC_SRPG_EMPGC0_SRPGCR);
__raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR);
@@ -156,21 +150,14 @@ static int arch_idle_mode = WAIT_UNCLOCKED_POWER_OFF;
*/
void arch_idle(void)
{
-/* if (likely(!mxc_jtag_enabled)) */{
- struct clk *ddr_clk = clk_get(NULL, "ddr_clk");
+ if (likely(!mxc_jtag_enabled)) {
if (gpc_dvfs_clk == NULL)
gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs_clk");
/* gpc clock is needed for SRPG */
clk_enable(gpc_dvfs_clk);
mxc_cpu_lp_set(arch_idle_mode);
- if (cpu_is_mx50() && (clk_get_usecount(ddr_clk) == 0)) {
- memcpy(wait_in_iram_base, mx50_wait, SZ_4K);
- wait_in_iram = (void *)wait_in_iram_base;
- wait_in_iram(ccm_base, databahn_base);
- } else
- cpu_do_idle();
+ cpu_do_idle();
clk_disable(gpc_dvfs_clk);
- clk_put(ddr_clk);
}
}
@@ -190,93 +177,3 @@ void arch_reset(char mode)
/* Assert SRS signal */
mxc_wd_reset();
}
-
-
-static int __mxs_reset_block(void __iomem *hwreg, int just_enable)
-{
- u32 c;
- int timeout;
-
- /* the process of software reset of IP block is done
- in several steps:
-
- - clear SFTRST and wait for block is enabled;
- - clear clock gating (CLKGATE bit);
- - set the SFTRST again and wait for block is in reset;
- - clear SFTRST and wait for reset completion.
- */
- c = __raw_readl(hwreg);
- c &= ~(1 << 31); /* clear SFTRST */
- __raw_writel(c, hwreg);
- for (timeout = 1000000; timeout > 0; timeout--)
- /* still in SFTRST state ? */
- if ((__raw_readl(hwreg) & (1 << 31)) == 0)
- break;
- if (timeout <= 0) {
- printk(KERN_ERR "%s(%p): timeout when enabling\n",
- __func__, hwreg);
- return -ETIME;
- }
-
- c = __raw_readl(hwreg);
- c &= ~(1 << 30); /* clear CLKGATE */
- __raw_writel(c, hwreg);
-
- if (!just_enable) {
- c = __raw_readl(hwreg);
- c |= (1 << 31); /* now again set SFTRST */
- __raw_writel(c, hwreg);
- for (timeout = 1000000; timeout > 0; timeout--)
- /* poll until CLKGATE set */
- if (__raw_readl(hwreg) & (1 << 30))
- break;
- if (timeout <= 0) {
- printk(KERN_ERR "%s(%p): timeout when resetting\n",
- __func__, hwreg);
- return -ETIME;
- }
-
- c = __raw_readl(hwreg);
- c &= ~(1 << 31); /* clear SFTRST */
- __raw_writel(c, hwreg);
- for (timeout = 1000000; timeout > 0; timeout--)
- /* still in SFTRST state ? */
- if ((__raw_readl(hwreg) & (1 << 31)) == 0)
- break;
- if (timeout <= 0) {
- printk(KERN_ERR "%s(%p): timeout when enabling "
- "after reset\n", __func__, hwreg);
- return -ETIME;
- }
-
- c = __raw_readl(hwreg);
- c &= ~(1 << 30); /* clear CLKGATE */
- __raw_writel(c, hwreg);
- }
- for (timeout = 1000000; timeout > 0; timeout--)
- /* still in SFTRST state ? */
- if ((__raw_readl(hwreg) & (1 << 30)) == 0)
- break;
-
- if (timeout <= 0) {
- printk(KERN_ERR "%s(%p): timeout when unclockgating\n",
- __func__, hwreg);
- return -ETIME;
- }
-
- return 0;
-}
-
-int mxs_reset_block(void __iomem *hwreg, int just_enable)
-{
- int try = 10;
- int r;
-
- while (try--) {
- r = __mxs_reset_block(hwreg, just_enable);
- if (!r)
- break;
- pr_debug("%s: try %d failed\n", __func__, 10 - try);
- }
- return r;
-}
diff --git a/arch/arm/mach-mx5/usb_dr.c b/arch/arm/mach-mx5/usb_dr.c
index 4f36379b8d64..0878fd6e0d38 100644
--- a/arch/arm/mach-mx5/usb_dr.c
+++ b/arch/arm/mach-mx5/usb_dr.c
@@ -18,12 +18,12 @@
#include <linux/fsl_devices.h>
#include <mach/arc_otg.h>
#include <mach/hardware.h>
-#include <asm/delay.h>
#include "usb.h"
#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_EHCI_ARC_OTG) || defined(CONFIG_USB_GADGET_ARC)
static int usbotg_init_ext(struct platform_device *pdev);
static void usbotg_uninit_ext(struct fsl_usb2_platform_data *pdata);
+static void _wake_up_enable(struct fsl_usb2_platform_data *pdata, bool enable);
static void usbotg_clock_gate(bool on);
/*
@@ -40,6 +40,7 @@ static struct fsl_usb2_platform_data dr_utmi_config = {
.gpio_usb_active = gpio_usbotg_hs_active,
.gpio_usb_inactive = gpio_usbotg_hs_inactive,
.usb_clock_for_pm = usbotg_clock_gate,
+ .wake_up_enable = _wake_up_enable,
.transceiver = "utmi",
};
@@ -47,13 +48,6 @@ static struct fsl_usb2_platform_data dr_utmi_config = {
static int usbotg_init_ext(struct platform_device *pdev)
{
struct clk *usb_clk;
- if (cpu_is_mx50()) {
- usb_clk = clk_get(&pdev->dev, "usb_phy1_clk");
- clk_enable(usb_clk);
- clk_put(usb_clk);
-
- return usbotg_init(pdev);
- }
usb_clk = clk_get(NULL, "usboh3_clk");
clk_enable(usb_clk);
@@ -75,15 +69,6 @@ static void usbotg_uninit_ext(struct fsl_usb2_platform_data *pdata)
{
struct clk *usb_clk;
- if (cpu_is_mx50()) {
- usb_clk = clk_get(&pdata->pdev->dev, "usb_phy1_clk");
- clk_disable(usb_clk);
- clk_put(usb_clk);
-
- usbotg_uninit(pdata);
- return;
- }
-
usb_clk = clk_get(NULL, "usboh3_clk");
clk_disable(usb_clk);
clk_put(usb_clk);
@@ -95,149 +80,33 @@ static void usbotg_uninit_ext(struct fsl_usb2_platform_data *pdata)
usbotg_uninit(pdata);
}
-#define ENABLED_BY_HOST (0x1 << 0)
-#define ENABLED_BY_DEVICE (0x1 << 1)
-#if defined(CONFIG_USB_EHCI_ARC_OTG) && defined(CONFIG_USB_GADGET_ARC)
-/* Below two macros are used at otg mode to indicate usb mode*/
-static u32 wakeup_irq_enable_src = 0;
-static void __wakeup_irq_enable(bool on, int source)
+static void _wake_up_enable(struct fsl_usb2_platform_data *pdata, bool enable)
{
- /* otg host and device share the OWIE bit, only when host and device
- * all enable the wakeup irq, we can enable the OWIE bit
- */
- if (on) {
- wakeup_irq_enable_src |= source;
- if (wakeup_irq_enable_src == (ENABLED_BY_HOST | ENABLED_BY_DEVICE)) {
+ if (get_usb_mode(pdata) == FSL_USB_DR_DEVICE) {
+ if (enable) {
USBCTRL |= UCTRL_OWIE;
+ USBCTRL_HOST2 |= UCTRL_H2OVBWK_EN;
USB_PHY_CTR_FUNC |= USB_UTMI_PHYCTRL_CONF2;
- printk("OTG wakeup irq is enabled\n");
+ } else {
+ USBCTRL &= ~UCTRL_OWIE;
+ USBCTRL_HOST2 &= ~UCTRL_H2OVBWK_EN;
+ USB_PHY_CTR_FUNC &= ~USB_UTMI_PHYCTRL_CONF2;
}
- }else {
- printk("OTG wakeup irq disable\n");
- USB_PHY_CTR_FUNC &= ~USB_UTMI_PHYCTRL_CONF2;
- USBCTRL &= ~UCTRL_OWIE;
- wakeup_irq_enable_src &= ~source;
- /* The interrupt must be disabled for at least 3 clock
- * cycles of the standby clock(32k Hz) , that is 0.094 ms*/
- udelay(100);
- }
-}
-#else
-static void __wakeup_irq_enable(bool on, int source)
-{
- if (on) {
- USBCTRL |= UCTRL_OWIE;
- USB_PHY_CTR_FUNC |= USB_UTMI_PHYCTRL_CONF2;
- }else {
- USBCTRL &= ~UCTRL_OWIE;
- USB_PHY_CTR_FUNC &= ~USB_UTMI_PHYCTRL_CONF2;
- /* The interrupt must be disabled for at least 3 clock
- * cycles of the standby clock(32k Hz) , that is 0.094 ms*/
- udelay(100);
- }
-}
-#endif
-
-#ifdef CONFIG_USB_EHCI_ARC_OTG
-static void _host_wakeup_enable(struct fsl_usb2_platform_data *pdata, bool enable)
-{
- __wakeup_irq_enable(enable, ENABLED_BY_HOST);
- /* host only care the ID change wakeup event */
- if (enable) {
- USBCTRL_HOST2 |= UCTRL_H2OIDWK_EN;
- }else {
- USBCTRL_HOST2 &= ~UCTRL_H2OIDWK_EN;
- /* The interrupt must be disabled for at least 2 clock
- * cycles of the standby clock(32k Hz) , that is 0.0625 ms*/
- udelay(100);
- }
-}
-#endif
-
-#ifdef CONFIG_USB_GADGET_ARC
-static void _device_wakeup_enable(struct fsl_usb2_platform_data *pdata, bool enable)
-{
- __wakeup_irq_enable(enable, ENABLED_BY_DEVICE);
- /* if udc is not used by any gadget, we can not enable the vbus wakeup */
- if (!pdata->port_enables)
- {
- USBCTRL_HOST2 &= ~UCTRL_H2OVBWK_EN;
- return;
- }
- if (enable) {
- USBCTRL_HOST2 |= UCTRL_H2OVBWK_EN;
- }else {
- USBCTRL_HOST2 &= ~UCTRL_H2OVBWK_EN;
- }
-}
-#endif
-
-#if defined(CONFIG_USB_EHCI_ARC_OTG) && defined(CONFIG_USB_GADGET_ARC)
-static u32 low_power_enable_src = 0;
-static void __phy_lowpower_suspend(bool enable, int source)
-{
- if (enable) {
- low_power_enable_src |= source;
- if (low_power_enable_src == (ENABLED_BY_HOST | ENABLED_BY_DEVICE)) {
- UOG_PORTSC1 |= PORTSC_PHCD;
- printk("OTG phy lowpower enable\n");
+ } else {
+ if (enable) {
+ USBCTRL |= UCTRL_OWIE;
+ USBCTRL_HOST2 |= (1 << 5);
+ } else {
+ USBCTRL &= ~UCTRL_OWIE;
+ USBCTRL_HOST2 &= ~(1 << 5);
}
- }else {
- printk("OTG phy lowpower disable\n");
- UOG_PORTSC1 &= ~PORTSC_PHCD;
- low_power_enable_src &= ~source;
- }
-}
-#else
-static void __phy_lowpower_suspend(bool enable, int source)
-{
- if (enable) {
- UOG_PORTSC1 |= PORTSC_PHCD;
- }else {
- UOG_PORTSC1 &= ~PORTSC_PHCD;
}
}
-#endif
-
-#ifdef CONFIG_USB_EHCI_ARC_OTG
-static void _host_phy_lowpower_suspend(bool enable)
-{
- __phy_lowpower_suspend(enable, ENABLED_BY_HOST);
-}
-#endif
-
-#ifdef CONFIG_USB_GADGET_ARC
-static void _device_phy_lowpower_suspend(bool enable)
-{
- __phy_lowpower_suspend(enable, ENABLED_BY_DEVICE);
-}
-#endif
static void usbotg_clock_gate(bool on)
{
struct clk *usb_clk;
- if (cpu_is_mx50()) {
- if (on) {
- usb_clk = clk_get(NULL, "usb_ahb_clk");
- clk_enable(usb_clk);
- clk_put(usb_clk);
-
- usb_clk = clk_get(NULL, "usb_phy1_clk");
- clk_enable(usb_clk);
- clk_put(usb_clk);
- } else {
- usb_clk = clk_get(NULL, "usb_phy1_clk");
- clk_disable(usb_clk);
- clk_put(usb_clk);
-
- usb_clk = clk_get(NULL, "usb_ahb_clk");
- clk_disable(usb_clk);
- clk_put(usb_clk);
- }
- return;
- }
-
if (on) {
usb_clk = clk_get(NULL, "usb_ahb_clk");
clk_enable(usb_clk);
@@ -287,15 +156,11 @@ void __init mx5_usb_dr_init(void)
#endif
#ifdef CONFIG_USB_EHCI_ARC_OTG
dr_utmi_config.operating_mode = DR_HOST_MODE;
- dr_utmi_config.wake_up_enable = _host_wakeup_enable;
- dr_utmi_config.phy_lowpower_suspend = _host_phy_lowpower_suspend;
platform_device_add_data(&mxc_usbdr_host_device, &dr_utmi_config, sizeof(dr_utmi_config));
platform_device_register(&mxc_usbdr_host_device);
#endif
#ifdef CONFIG_USB_GADGET_ARC
dr_utmi_config.operating_mode = DR_UDC_MODE;
- dr_utmi_config.wake_up_enable = _device_wakeup_enable;
- dr_utmi_config.phy_lowpower_suspend = _device_phy_lowpower_suspend;
platform_device_add_data(&mxc_usbdr_udc_device, &dr_utmi_config, sizeof(dr_utmi_config));
platform_device_register(&mxc_usbdr_udc_device);
#endif
diff --git a/arch/arm/mach-mx5/usb_h1.c b/arch/arm/mach-mx5/usb_h1.c
index 3c53ed8901ae..52a2bcafd765 100644
--- a/arch/arm/mach-mx5/usb_h1.c
+++ b/arch/arm/mach-mx5/usb_h1.c
@@ -17,15 +17,13 @@
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/fsl_devices.h>
-#include <asm/delay.h>
#include <mach/arc_otg.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include "usb.h"
#include "iomux.h"
#include "mx51_pins.h"
-//#undef pr_debug
-//#define pr_debug printk
+
/*
* USB Host1 HS port
*/
@@ -71,49 +69,13 @@ static void _wake_up_enable(struct fsl_usb2_platform_data *pdata, bool enable)
{
if (enable)
USBCTRL |= UCTRL_H1WIE;
- else {
+ else
USBCTRL &= ~UCTRL_H1WIE;
- /* The interrupt must be disabled for at least 3
- * cycles of the standby clock(32k Hz) , that is 0.094 ms*/
- udelay(100);
- }
-}
-
-static void _phy_lowpower_suspend(bool enable)
-{
- if (enable) {
- UH1_PORTSC1 |= PORTSC_PHCD;
- }else {
- UH1_PORTSC1 &= ~PORTSC_PHCD;
- }
}
static void usbotg_clock_gate(bool on)
{
struct clk *usb_clk;
- if (cpu_is_mx50()) {
- if (on) {
- usb_clk = clk_get(NULL, "usb_ahb_clk");
- clk_enable(usb_clk);
- clk_put(usb_clk);
-
- } else {
- usb_clk = clk_get(NULL, "usb_ahb_clk");
- clk_disable(usb_clk);
- clk_put(usb_clk);
- }
- return;
- }
- if (cpu_is_mx53()) {
- usb_clk = clk_get(NULL, "usb_phy2_clk");
- if (on) {
- clk_enable(usb_clk);
- } else {
- clk_disable(usb_clk);
- }
- clk_put(usb_clk);
- }
-
if (on) {
usb_clk = clk_get(NULL, "usb_ahb_clk");
clk_enable(usb_clk);
@@ -153,7 +115,7 @@ static int fsl_usb_host_init_ext(struct platform_device *pdev)
clk_disable(usb_clk);
clk_put(usb_clk);
} else if (cpu_is_mx50()) {
- usb_clk = clk_get(NULL, "usb_phy2_clk");
+ usb_clk = clk_get(&pdev->dev, "usb_phy2_clk");
clk_enable(usb_clk);
clk_put(usb_clk);
}
@@ -191,7 +153,7 @@ static void fsl_usb_host_uninit_ext(struct fsl_usb2_platform_data *pdata)
clk_disable(usb_clk);
clk_put(usb_clk);
} else if (cpu_is_mx50()) {
- usb_clk = clk_get(NULL, "usb_phy2_clk");
+ usb_clk = clk_get(&pdata->pdev->dev, "usb_phy2_clk");
clk_disable(usb_clk);
clk_put(usb_clk);
}
@@ -208,7 +170,6 @@ static struct fsl_usb2_platform_data usbh1_config = {
.power_budget = 500, /* 500 mA max power */
.wake_up_enable = _wake_up_enable,
.usb_clock_for_pm = usbotg_clock_gate,
- .phy_lowpower_suspend = _phy_lowpower_suspend,
.transceiver = "utmi",
};
diff --git a/arch/arm/mach-pxa/cpufreq-pxa2xx.c b/arch/arm/mach-pxa/cpufreq-pxa2xx.c
index 3a8ee2272add..983cc8c20081 100644
--- a/arch/arm/mach-pxa/cpufreq-pxa2xx.c
+++ b/arch/arm/mach-pxa/cpufreq-pxa2xx.c
@@ -155,7 +155,7 @@ MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table
static pxa_freqs_t pxa27x_freqs[] = {
{104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 },
- {156000, 104000, PXA27x_CCCR(1, 8, 6), 0, CCLKCFG2(1, 1, 1), 1000000, 1705000 },
+ {156000, 104000, PXA27x_CCCR(1, 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 },
{208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 },
{312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 },
{416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 },
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index 9cd09465a0e8..110e1f174f25 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -497,16 +497,15 @@ static int em_x270_usb_hub_init(void)
goto err_free_vbus_gpio;
/* USB Hub power-on and reset */
- gpio_direction_output(usb_hub_reset, 0);
+ gpio_direction_output(usb_hub_reset, 1);
+ gpio_direction_output(GPIO9_USB_VBUS_EN, 0);
regulator_enable(em_x270_usb_ldo);
- gpio_set_value(usb_hub_reset, 1);
gpio_set_value(usb_hub_reset, 0);
+ gpio_set_value(usb_hub_reset, 1);
regulator_disable(em_x270_usb_ldo);
regulator_enable(em_x270_usb_ldo);
- gpio_set_value(usb_hub_reset, 1);
-
- /* enable VBUS */
- gpio_direction_output(GPIO9_USB_VBUS_EN, 1);
+ gpio_set_value(usb_hub_reset, 0);
+ gpio_set_value(GPIO9_USB_VBUS_EN, 1);
return 0;
diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c
index 2546c066cd6e..629e05d1196e 100644
--- a/arch/arm/mach-pxa/sharpsl_pm.c
+++ b/arch/arm/mach-pxa/sharpsl_pm.c
@@ -678,8 +678,8 @@ static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enab
dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n");
}
- if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) || (sharpsl_fatal_check() < 0) )
- {
+ if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) ||
+ (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_FATAL))) {
dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n");
corgi_goto_sleep(alarm_time, alarm_enable, state);
return 1;
diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c
index a34954d9df7d..73cae57fa707 100644
--- a/arch/arm/mm/highmem.c
+++ b/arch/arm/mm/highmem.c
@@ -40,11 +40,16 @@ void *kmap_atomic(struct page *page, enum km_type type)
{
unsigned int idx;
unsigned long vaddr;
+ void *kmap;
pagefault_disable();
if (!PageHighMem(page))
return page_address(page);
+ kmap = kmap_high_get(page);
+ if (kmap)
+ return kmap;
+
idx = type + KM_TYPE_NR * smp_processor_id();
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
#ifdef CONFIG_DEBUG_HIGHMEM
@@ -80,6 +85,9 @@ void kunmap_atomic(void *kvaddr, enum km_type type)
#else
(void) idx; /* to kill a warning */
#endif
+ } else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) {
+ /* this address was obtained through kmap_high_get() */
+ kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)]));
}
pagefault_enable();
}
diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c
index d2b51a1357c1..911908164efb 100644
--- a/arch/arm/plat-mxc/clock.c
+++ b/arch/arm/plat-mxc/clock.c
@@ -4,7 +4,7 @@
* Copyright (C) 2004 - 2005 Nokia corporation
* Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
* Modified for omap shared clock framework by Tony Lindgren <tony@atomide.com>
- * Copyright 2007-2010 Freescale Semiconductor, Inc.
+ * Copyright 2007-2010 Freescale Semiconductor, Inc. All Rights Reserved.
* Copyright 2008 Juergen Beisert, kernel@pengutronix.de
*
* This program is free software; you can redistribute it and/or
@@ -173,8 +173,14 @@ int clk_enable(struct clk *clk)
if (clk == NULL || IS_ERR(clk))
return -EINVAL;
+ spin_lock_irqsave(&clockfw_lock, flags);
+
+ ret = __clk_enable(clk);
+
+ spin_unlock_irqrestore(&clockfw_lock, flags);
+
if ((clk->flags & CPU_FREQ_TRIG_UPDATE)
- && (clk_get_usecount(clk) == 0)) {
+ && (clk_get_usecount(clk) == 1)) {
#if (defined(CONFIG_ARCH_MX5) || defined(CONFIG_ARCH_MX37))
if (low_freq_bus_used() && !low_bus_freq_mode)
set_low_bus_freq();
@@ -194,13 +200,6 @@ int clk_enable(struct clk *clk)
#endif
}
-
- spin_lock_irqsave(&clockfw_lock, flags);
-
- ret = __clk_enable(clk);
-
- spin_unlock_irqrestore(&clockfw_lock, flags);
-
return ret;
}
EXPORT_SYMBOL(clk_enable);
@@ -229,12 +228,12 @@ void clk_disable(struct clk *clk)
set_low_bus_freq();
else {
if (!high_bus_freq_mode) {
- /* Currently at low or medium set point,
+ /* Currently at ow or medium set point,
* need to set to high setpoint
*/
set_high_bus_freq(0);
} else if (high_bus_freq_mode || low_bus_freq_mode) {
- /* Currently at low or high set point,
+ /* Currently at ow or high set point,
* need to set to medium setpoint
*/
set_high_bus_freq(0);
diff --git a/arch/arm/plat-mxc/dvfs_core.c b/arch/arm/plat-mxc/dvfs_core.c
index 143bc07834ed..adb2b1803fc4 100644
--- a/arch/arm/plat-mxc/dvfs_core.c
+++ b/arch/arm/plat-mxc/dvfs_core.c
@@ -188,14 +188,14 @@ static int set_cpu_freq(int wp)
}
spin_lock_irqsave(&mxc_dvfs_core_lock, flags);
/* PLL_RELOCK, set ARM_FREQ_SHIFT_DIVIDER */
- reg = __raw_readl(ccm_base + dvfs_data->ccm_cdcr_offset);
+ reg = __raw_readl(dvfs_data->ccm_cdcr_reg_addr);
reg &= 0xFFFFFFFB;
- __raw_writel(reg, ccm_base + dvfs_data->ccm_cdcr_offset);
+ __raw_writel(reg, dvfs_data->ccm_cdcr_reg_addr);
setup_pll();
/* START the GPC main control FSM */
/* set VINC */
- reg = __raw_readl(gpc_base + dvfs_data->gpc_vcr_offset);
+ reg = __raw_readl(dvfs_data->gpc_vcr_reg_addr);
reg &= ~(MXC_GPCVCR_VINC_MASK | MXC_GPCVCR_VCNTU_MASK |
MXC_GPCVCR_VCNT_MASK);
@@ -204,18 +204,17 @@ static int set_cpu_freq(int wp)
reg |= (1 << MXC_GPCVCR_VCNTU_OFFSET) |
(1 << MXC_GPCVCR_VCNT_OFFSET);
- __raw_writel(reg, gpc_base + dvfs_data->gpc_vcr_offset);
+ __raw_writel(reg, dvfs_data->gpc_vcr_reg_addr);
- reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset);
+ reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr);
reg &= ~(MXC_GPCCNTR_ADU_MASK | MXC_GPCCNTR_FUPD_MASK);
reg |= MXC_GPCCNTR_FUPD;
reg |= MXC_GPCCNTR_ADU;
- __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset);
+ __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr);
reg |= MXC_GPCCNTR_STRT;
- __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset);
- while (__raw_readl(gpc_base + dvfs_data->gpc_cntr_offset)
- & 0x4000)
+ __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr);
+ while (__raw_readl(dvfs_data->gpc_cntr_reg_addr) & 0x4000)
udelay(10);
spin_unlock_irqrestore(&mxc_dvfs_core_lock, flags);
@@ -236,13 +235,13 @@ static int set_cpu_freq(int wp)
/* Change arm_podf only */
/* set ARM_FREQ_SHIFT_DIVIDER */
- reg = __raw_readl(ccm_base + dvfs_data->ccm_cdcr_offset);
+ reg = __raw_readl(dvfs_data->ccm_cdcr_reg_addr);
reg &= 0xFFFFFFFB;
reg |= 1 << 2;
- __raw_writel(reg, ccm_base + dvfs_data->ccm_cdcr_offset);
+ __raw_writel(reg, dvfs_data->ccm_cdcr_reg_addr);
/* Get ARM_PODF */
- reg = __raw_readl(ccm_base + dvfs_data->ccm_cacrr_offset);
+ reg = __raw_readl(dvfs_data->ccm_cacrr_reg_addr);
arm_podf = reg & 0x07;
if (podf == arm_podf) {
printk(KERN_DEBUG
@@ -270,38 +269,37 @@ static int set_cpu_freq(int wp)
reg &= 0xFFFFFFF8;
reg |= arm_podf;
- reg1 = __raw_readl(ccm_base + dvfs_data->ccm_cdhipr_offset);
+ reg1 = __raw_readl(dvfs_data->ccm_cdhipr_reg_addr);
if ((reg1 & 0x00010000) == 0)
- __raw_writel(reg,
- ccm_base + dvfs_data->ccm_cacrr_offset);
+ __raw_writel(reg, dvfs_data->ccm_cacrr_reg_addr);
else {
printk(KERN_DEBUG "ARM_PODF still in busy!!!!\n");
return 0;
}
/* START the GPC main control FSM */
- reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset);
+ reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr);
reg |= MXC_GPCCNTR_FUPD;
/* ADU=1, select ARM domain */
reg |= MXC_GPCCNTR_ADU;
- __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset);
+ __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr);
/* set VINC */
- reg = __raw_readl(gpc_base + dvfs_data->gpc_vcr_offset);
+ reg = __raw_readl(dvfs_data->gpc_vcr_reg_addr);
reg &=
~(MXC_GPCVCR_VINC_MASK | MXC_GPCVCR_VCNTU_MASK |
MXC_GPCVCR_VCNT_MASK);
reg |= (1 << MXC_GPCVCR_VCNTU_OFFSET) |
(100 << MXC_GPCVCR_VCNT_OFFSET) |
(vinc << MXC_GPCVCR_VINC_OFFSET);
- __raw_writel(reg, gpc_base + dvfs_data->gpc_vcr_offset);
+ __raw_writel(reg, dvfs_data->gpc_vcr_reg_addr);
- reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset);
+ reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr);
reg &= (~(MXC_GPCCNTR_ADU | MXC_GPCCNTR_FUPD));
reg |= MXC_GPCCNTR_ADU | MXC_GPCCNTR_FUPD | MXC_GPCCNTR_STRT;
- __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset);
+ __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr);
/* Wait for arm podf Enable */
- while ((__raw_readl(gpc_base + dvfs_data->gpc_cntr_offset) &
+ while ((__raw_readl(dvfs_data->gpc_cntr_reg_addr) &
MXC_GPCCNTR_STRT) == MXC_GPCCNTR_STRT) {
printk(KERN_DEBUG "Waiting arm_podf enabled!\n");
udelay(10);
@@ -320,9 +318,9 @@ static int set_cpu_freq(int wp)
propagate_rate(pll1_sw_clk);
/* Clear the ARM_FREQ_SHIFT_DIVIDER */
- reg = __raw_readl(ccm_base + dvfs_data->ccm_cdcr_offset);
+ reg = __raw_readl(dvfs_data->ccm_cdcr_reg_addr);
reg &= 0xFFFFFFFB;
- __raw_writel(reg, ccm_base + dvfs_data->ccm_cdcr_offset);
+ __raw_writel(reg, dvfs_data->ccm_cdcr_reg_addr);
}
#if defined(CONFIG_CPU_FREQ_IMX)
cpufreq_trig_needed = 1;
@@ -347,14 +345,14 @@ static int start_dvfs(void)
dvfs_load_config(0);
/* config reg GPC_CNTR */
- reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset);
+ reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr);
reg &= ~MXC_GPCCNTR_GPCIRQM;
/* GPCIRQ=1, select ARM IRQ */
reg |= MXC_GPCCNTR_GPCIRQ_ARM;
/* ADU=1, select ARM domain */
reg |= MXC_GPCCNTR_ADU;
- __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset);
+ __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr);
/* Set PREDIV bits */
reg = __raw_readl(dvfs_data->membase + MXC_DVFSCORE_CNTR);
@@ -419,8 +417,8 @@ static irqreturn_t dvfs_irq(int irq, void *dev_id)
u32 reg;
/* Check if DVFS0 (ARM) id requesting for freqency/voltage update */
- if ((__raw_readl(gpc_base + dvfs_data->gpc_cntr_offset)
- & MXC_GPCCNTR_DVFS0CR) == 0)
+ if ((__raw_readl(dvfs_data->gpc_cntr_reg_addr) & MXC_GPCCNTR_DVFS0CR) ==
+ 0)
return IRQ_NONE;
/* Mask DVFS irq */
@@ -430,9 +428,9 @@ static irqreturn_t dvfs_irq(int irq, void *dev_id)
__raw_writel(reg, dvfs_data->membase + MXC_DVFSCORE_CNTR);
/* Mask GPC1 irq */
- reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset);
+ reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr);
reg |= MXC_GPCCNTR_GPCIRQM | 0x1000000;
- __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset);
+ __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr);
schedule_delayed_work(&dvfs_core_handler, 0);
return IRQ_HANDLED;
@@ -537,9 +535,9 @@ END: /* Set MAXF, MINF */
reg |= MXC_DVFSCNTR_LBFL;
__raw_writel(reg, dvfs_data->membase + MXC_DVFSCORE_CNTR);
/*Unmask GPC1 IRQ */
- reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset);
+ reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr);
reg &= ~MXC_GPCCNTR_GPCIRQM;
- __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset);
+ __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr);
#if defined(CONFIG_CPU_FREQ_IMX)
if (cpufreq_trig_needed == 1) {
@@ -804,6 +802,7 @@ static int __devinit mxc_dvfs_core_probe(struct platform_device *pdev)
goto err1;
}
dvfs_data->membase = ioremap(res->start, res->end - res->start + 1);
+
/*
* Request the DVFS interrupt
*/
@@ -950,7 +949,6 @@ static void __exit dvfs_cleanup(void)
/* Unregister the device structure */
platform_driver_unregister(&mxc_dvfs_core_driver);
- iounmap(ccm_base);
iounmap(dvfs_data->membase);
clk_put(cpu_clk);
clk_put(dvfs_clk);
diff --git a/arch/arm/plat-mxc/include/mach/iomux-v3.h b/arch/arm/plat-mxc/include/mach/iomux-v3.h
index 6beaf8cd69b5..7cd84547658f 100644
--- a/arch/arm/plat-mxc/include/mach/iomux-v3.h
+++ b/arch/arm/plat-mxc/include/mach/iomux-v3.h
@@ -68,31 +68,33 @@ struct pad_desc {
/*
* Use to set PAD control
*/
+#define PAD_CTL_DRIVE_VOLTAGE_3_3_V 0
+#define PAD_CTL_DRIVE_VOLTAGE_1_8_V 1
-#define PAD_CTL_DVS (1 << 13)
-#define PAD_CTL_HYS (1 << 8)
+#define PAD_CTL_NO_HYSTERESIS 0
+#define PAD_CTL_HYSTERESIS 1
-#define PAD_CTL_PKE (1 << 7)
-#define PAD_CTL_PUE (1 << 6)
-#define PAD_CTL_PUS_100K_DOWN (0 << 4)
-#define PAD_CTL_PUS_360K_DOWN (0 << 4)
-#define PAD_CTL_PUS_47K_UP (1 << 4)
-#define PAD_CTL_PUS_75K_UP (1 << 4)
-#define PAD_CTL_PUS_100K_UP (2 << 4)
-#define PAD_CTL_PUS_22K_UP (3 << 4)
+#define PAD_CTL_PULL_DISABLED 0x0
+#define PAD_CTL_PULL_KEEPER 0xa
+#define PAD_CTL_PULL_DOWN_100K 0xc
+#define PAD_CTL_PULL_UP_47K 0xd
+#define PAD_CTL_PULL_UP_100K 0xe
+#define PAD_CTL_PULL_UP_22K 0xf
-#define PAD_CTL_ODE (1 << 3)
+#define PAD_CTL_OUTPUT_CMOS 0
+#define PAD_CTL_OUTPUT_OPEN_DRAIN 1
-#define PAD_CTL_DSE_LOW (0 << 1)
-#define PAD_CTL_DSE_MED (1 << 1)
-#define PAD_CTL_DSE_HIGH (2 << 1)
-#define PAD_CTL_DSE_MAX (3 << 1)
+#define PAD_CTL_DRIVE_STRENGTH_NORM 0
+#define PAD_CTL_DRIVE_STRENGTH_HIGH 1
+#define PAD_CTL_DRIVE_STRENGTH_MAX 2
-#define PAD_CTL_SRE_FAST (1 << 0)
-#define PAD_CTL_SRE_SLOW (0 << 0)
+#define PAD_CTL_SLEW_RATE_SLOW 0
+#define PAD_CTL_SLEW_RATE_FAST 1
/*
- * setups a single pad in the iomuxer
+ * setups a single pad:
+ * - reserves the pad so that it is not claimed by another driver
+ * - setups the iomux according to the configuration
*/
int mxc_iomux_v3_setup_pad(struct pad_desc *pad);
@@ -103,9 +105,17 @@ int mxc_iomux_v3_setup_pad(struct pad_desc *pad);
int mxc_iomux_v3_setup_multiple_pads(struct pad_desc *pad_list, unsigned count);
/*
- * Initialise the iomux controller
+ * releases a single pad:
+ * - make it available for a future use by another driver
+ * - DOES NOT reconfigure the IOMUX in its reset state
*/
-void mxc_iomux_v3_init(void __iomem *iomux_v3_base);
+void mxc_iomux_v3_release_pad(struct pad_desc *pad);
+
+/*
+ * releases multiple pads
+ * convenvient way to call the above function with tables
+ */
+void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count);
#endif /* __MACH_IOMUX_V3_H__*/
diff --git a/arch/arm/plat-mxc/include/mach/mmc.h b/arch/arm/plat-mxc/include/mach/mmc.h
index 7be75bd5756e..d563c157bad7 100644
--- a/arch/arm/plat-mxc/include/mach/mmc.h
+++ b/arch/arm/plat-mxc/include/mach/mmc.h
@@ -40,9 +40,6 @@ struct mxc_mmc_platform_data {
unsigned int min_clk;
unsigned int max_clk;
unsigned int clk_flg; /* 1 clock enable, 0 not */
- unsigned int clk_always_on; /* Needed by SDIO cards and etc */
- unsigned int dll_override_en; /* Enable dll override delay line */
- unsigned int dll_delay_cells; /* The number of delay cells (0-0x3f) */
unsigned int reserved:16;
unsigned int card_fixed:1;
unsigned int card_inserted_state:1;
diff --git a/arch/arm/plat-mxc/include/mach/mx5x.h b/arch/arm/plat-mxc/include/mach/mx5x.h
index 0e25133736d2..fd3bbefdd292 100644
--- a/arch/arm/plat-mxc/include/mach/mx5x.h
+++ b/arch/arm/plat-mxc/include/mach/mx5x.h
@@ -134,31 +134,6 @@
*/
#define MX53_SATA_BASE_ADDR 0x10000000
-/*
- * Databahn MX50
- */
-#define MX50_DATABAHN_BASE_ADDR 0x14000000
-#define DATABAHN_CTL_REG19 0x4c
-#define DATABAHN_CTL_REG20 0x50
-#define DATABAHN_CTL_REG21 0x54
-#define DATABAHN_CTL_REG22 0x58
-#define DATABAHN_CTL_REG23 0x5c
-#define DATABAHN_CTL_REG42 0xa8
-#define DATABAHN_CTL_REG43 0xac
-#define DATABAHN_CTL_REG55 0xdc
-#define DATABAHN_CTL_REG63 0xFC
-#define LOWPOWER_CONTROL_MASK 0x1F
-#define LOWPOWER_AUTOENABLE_MASK 0x1F
-#define LOWPOWER_EXTERNAL_CNT_MASK (0xFFFF << 16)
-#define LOWPOWER_EXTERNAL_CNT_OFFSET 16
-#define LOWPOWER_INTERNAL_CNT_MASK (0xFFFF << 8)
-#define LOWPOWER_INTERNAL_CNT_OFFSET 8
-#define LOWPOWER_REFRESH_ENABLE_MASK (3 << 16)
-#define LOWPOWER_REFRESH_ENABLE_OFFSET 16
-#define LOWPOWER_REFRESH_HOLD_MASK 0xFFFF
-#define LOWPOWER_REFRESH_HOLD_OFFSET 0
-
-
#define DEBUG_BASE_ADDR 0x40000000
/*MX53 + 0x2000000 */
#define DEBUG_SIZE SZ_1M
@@ -171,7 +146,7 @@
#define CTI3_BASE_ADDR (DEBUG_BASE_ADDR + 0x00007000)
#define CORTEX_DBG_BASE_ADDR (DEBUG_BASE_ADDR + 0x00008000)
-#define APBHDMA_BASE_ADDR (DEBUG_BASE_ADDR + 0x01000000)
+#define ABPHDMA_BASE_ADDR (DEBUG_BASE_ADDR + 0x01000000)
#define OCOTP_CTRL_BASE_ADDR (DEBUG_BASE_ADDR + 0x01002000)
#define DIGCTL_BASE_ADDR (DEBUG_BASE_ADDR + 0x01004000)
#define GPMI_BASE_ADDR (DEBUG_BASE_ADDR + 0x01006000)
@@ -262,7 +237,6 @@
#define MX53_ATA_BASE_ADDR (AIPS1_BASE_ADDR + 0x000E8000)
#define I2C3_BASE_ADDR (AIPS1_BASE_ADDR + 0x000EC000)
#define UART4_BASE_ADDR (AIPS1_BASE_ADDR + 0x000F0000)
-#define RNGB_BASE_ADDR (AIPS1_BASE_ADDR + 0x000F8000) /* MX50 */
#define DVFSCORE_BASE_ADDR (GPC_BASE_ADDR + 0x180)
#define DVFSPER_BASE_ADDR (GPC_BASE_ADDR + 0x1C4)
diff --git a/arch/arm/plat-mxc/include/mach/mxc.h b/arch/arm/plat-mxc/include/mach/mxc.h
index 808adf67552d..fc466b1c76c3 100644
--- a/arch/arm/plat-mxc/include/mach/mxc.h
+++ b/arch/arm/plat-mxc/include/mach/mxc.h
@@ -235,7 +235,6 @@ struct mxc_ipu_config {
int rev;
void (*reset) (void);
struct clk *di_clk[2];
- struct clk *csi_clk[2];
};
struct mxc_ir_platform_data {
@@ -326,29 +325,6 @@ struct ccwmx51_lcd_pdata {
void (*bl_enable) (int, int);
};
-struct mxc_epdc_fb_mode {
- struct fb_videomode *vmode;
- int vscan_holdoff;
- int sdoed_width;
- int sdoed_delay;
- int sdoez_width;
- int sdoez_delay;
- int gdclk_hp_offs;
- int gdsp_offs;
- int gdoe_offs;
- int gdclk_offs;
- int num_ce;
-};
-
-struct mxc_epdc_fb_platform_data {
- struct mxc_epdc_fb_mode *epdc_mode;
- int num_modes;
- void (*get_pins) (void);
- void (*put_pins) (void);
- void (*enable_pins) (void);
- void (*disable_pins) (void);
-};
-
struct mxc_tsc_platform_data {
char *vdd_reg;
int penup_threshold;
@@ -634,18 +610,6 @@ struct mxc_sim_platform_data {
unsigned int detect; /* 1 have detect pin, 0 not */
};
-struct fsl_otp_data {
- char **fuse_name;
- char *regulator_name;
- unsigned int fuse_num;
-};
-
-struct mxs_dma_plat_data {
- unsigned int burst8:1;
- unsigned int burst:1;
- unsigned int chan_base;
- unsigned int chan_num;
-};
#endif /* __ASSEMBLY__ */
#define MUX_IO_P 29
diff --git a/arch/arm/plat-mxc/include/mach/mxc_dvfs.h b/arch/arm/plat-mxc/include/mach/mxc_dvfs.h
index 05c6ea4bda77..43bcd2f7043a 100644
--- a/arch/arm/plat-mxc/include/mach/mxc_dvfs.h
+++ b/arch/arm/plat-mxc/include/mach/mxc_dvfs.h
@@ -35,7 +35,6 @@
#include <linux/device.h>
extern void __iomem *gpc_base;
-extern void __iomem *ccm_base;
#define MXC_GPCCNTR_GPCIRQ2M (1 << 25)
#define MXC_GPCCNTR_GPCIRQ2 (1 << 24)
@@ -144,16 +143,16 @@ struct mxc_dvfs_platform_data {
void __iomem *membase;
/* The interrupt number used by the DVFS core */
int irq;
- /* GPC control reg offset */
- int gpc_cntr_offset;
- /* GPC voltage counter reg offset */
- int gpc_vcr_offset;
- /* CCM DVFS control reg offset */
- int ccm_cdcr_offset;
- /* CCM ARM clock root reg offset */
- int ccm_cacrr_offset;
- /* CCM divider handshake in-progress reg offset */
- int ccm_cdhipr_offset;
+ /* GPC control reg address */
+ void __iomem *gpc_cntr_reg_addr;
+ /* GPC voltage counter reg address */
+ void __iomem *gpc_vcr_reg_addr;
+ /* CCM DVFS control reg address */
+ void __iomem *ccm_cdcr_reg_addr;
+ /* CCM ARM clock root reg address */
+ void __iomem *ccm_cacrr_reg_addr;
+ /* CCM divider handshake in-progree reg address */
+ void __iomem *ccm_cdhipr_reg_addr;
/* PREDIV mask */
u32 prediv_mask;
/* PREDIV offset */
diff --git a/arch/arm/plat-mxc/include/mach/system.h b/arch/arm/plat-mxc/include/mach/system.h
index 604abbc77da0..126bc8713159 100644
--- a/arch/arm/plat-mxc/include/mach/system.h
+++ b/arch/arm/plat-mxc/include/mach/system.h
@@ -1,7 +1,7 @@
/*
* Copyright (C) 1999 ARM Limited
* Copyright (C) 2000 Deep Blue Solutions Ltd
- * Copyright 2004-2010 Freescale Semiconductor, Inc.
+ * Copyright 2004-2008 Freescale Semiconductor, Inc. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,6 +24,5 @@
extern void arch_idle(void);
void arch_reset(char mode, const char *cmd);
-int mxs_reset_block(void __iomem *hwreg, int just_enable);
#endif /* __ASM_ARCH_MXC_SYSTEM_H__ */
diff --git a/arch/arm/plat-mxc/iomux-v3.c b/arch/arm/plat-mxc/iomux-v3.c
index b318c6a222d5..77a078f9513f 100644
--- a/arch/arm/plat-mxc/iomux-v3.c
+++ b/arch/arm/plat-mxc/iomux-v3.c
@@ -29,22 +29,30 @@
#include <asm/mach/map.h>
#include <mach/iomux-v3.h>
-static void __iomem *base;
+#define IOMUX_BASE IO_ADDRESS(IOMUXC_BASE_ADDR)
+
+static unsigned long iomux_v3_pad_alloc_map[0x200 / BITS_PER_LONG];
/*
- * setups a single pad in the iomuxer
+ * setups a single pin:
+ * - reserves the pin so that it is not claimed by another driver
+ * - setups the iomux according to the configuration
*/
int mxc_iomux_v3_setup_pad(struct pad_desc *pad)
{
+ unsigned int pad_ofs = pad->pad_ctrl_ofs;
+
+ if (test_and_set_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map))
+ return -EBUSY;
if (pad->mux_ctrl_ofs)
- __raw_writel(pad->mux_mode, base + pad->mux_ctrl_ofs);
+ __raw_writel(pad->mux_mode, IOMUX_BASE + pad->mux_ctrl_ofs);
if (pad->select_input_ofs)
__raw_writel(pad->select_input,
- base + pad->select_input_ofs);
+ IOMUX_BASE + pad->select_input_ofs);
- if (!(pad->pad_ctrl & NO_PAD_CTRL) && pad->pad_ctrl_ofs)
- __raw_writel(pad->pad_ctrl, base + pad->pad_ctrl_ofs);
+ if (!(pad->pad_ctrl & NO_PAD_CTRL))
+ __raw_writel(pad->pad_ctrl, IOMUX_BASE + pad->pad_ctrl_ofs);
return 0;
}
EXPORT_SYMBOL(mxc_iomux_v3_setup_pad);
@@ -58,14 +66,33 @@ int mxc_iomux_v3_setup_multiple_pads(struct pad_desc *pad_list, unsigned count)
for (i = 0; i < count; i++) {
ret = mxc_iomux_v3_setup_pad(p);
if (ret)
- return ret;
+ goto setup_error;
p++;
}
return 0;
+
+setup_error:
+ mxc_iomux_v3_release_multiple_pads(pad_list, i);
+ return ret;
}
EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads);
-void mxc_iomux_v3_init(void __iomem *iomux_v3_base)
+void mxc_iomux_v3_release_pad(struct pad_desc *pad)
+{
+ unsigned int pad_ofs = pad->pad_ctrl_ofs;
+
+ clear_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map);
+}
+EXPORT_SYMBOL(mxc_iomux_v3_release_pad);
+
+void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count)
{
- base = iomux_v3_base;
+ struct pad_desc *p = pad_list;
+ int i;
+
+ for (i = 0; i < count; i++) {
+ mxc_iomux_v3_release_pad(p);
+ p++;
+ }
}
+EXPORT_SYMBOL(mxc_iomux_v3_release_multiple_pads);
diff --git a/arch/arm/plat-mxc/usb_common.c b/arch/arm/plat-mxc/usb_common.c
index 71583e465046..af4cf8dc7d98 100644
--- a/arch/arm/plat-mxc/usb_common.c
+++ b/arch/arm/plat-mxc/usb_common.c
@@ -432,7 +432,14 @@ static int usb_register_remote_wakeup(struct platform_device *pdev)
int irq;
pr_debug("%s: pdev=0x%p \n", __func__, pdev);
- if (!(pdata->wake_up_enable))
+ if (!cpu_is_mx51() && !cpu_is_mx25())
+ return -ECANCELED;
+
+ /* The Host2 USB controller On mx25 platform
+ * is no path available from internal USB FS
+ * PHY to FS PHY wake up interrupt, So to
+ * remove the function of USB Remote Wakeup on Host2 */
+ if (cpu_is_mx25() && (!strcmp("Host 2", pdata->name)))
return -ECANCELED;
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
@@ -800,9 +807,9 @@ int usbotg_init(struct platform_device *pdev)
pdata->xcvr_type = xops->xcvr_type;
pdata->pdev = pdev;
- if (fsl_check_usbclk() != 0)
- return -EINVAL;
if (!otg_used) {
+ if (fsl_check_usbclk() != 0)
+ return -EINVAL;
if (cpu_is_mx50())
/* Turn on AHB CLK for OTG*/
USB_CLKONOFF_CTRL &= ~OTG_AHBCLK_OFF;
@@ -881,8 +888,8 @@ int usb_host_wakeup_irq(struct device *wkup_dev)
wakeup_req = USBCTRL & UCTRL_H1WIR;
} else if (!strcmp("DR", pdata->name)) {
wakeup_req = USBCTRL & UCTRL_OWIR;
- /* If not ID wakeup, let udc handle it */
- if (wakeup_req && (UOG_OTGSC & OTGSC_STS_USB_ID))
+ /* If DR is in device mode, let udc handle it */
+ if (wakeup_req && ((UOG_USBMODE & 0x3) == 0x2))
wakeup_req = 0;
}
diff --git a/arch/arm/plat-mxs/device.c b/arch/arm/plat-mxs/device.c
index e3783d3fe87d..027408950382 100644
--- a/arch/arm/plat-mxs/device.c
+++ b/arch/arm/plat-mxs/device.c
@@ -485,16 +485,6 @@ static struct platform_device mxs_persistent = {
};
#endif
-#ifdef CONFIG_FSL_OTP
-static struct platform_device otp_device = {
- .name = "ocotp",
- .id = 0,
- .dev = {
- .release = mxs_nop_release,
- },
-};
-#endif
-
static inline void mxs_init_busfreq(void)
{
(void)platform_device_register(&busfreq_device);
@@ -576,14 +566,6 @@ static struct mxs_dev_lookup dev_lookup[] = {
},
#endif
-#if defined(CONFIG_FSL_OTP)
- {
- .name = "ocotp",
- .size = 1,
- .pdev = &otp_device,
- },
-#endif
-
#if defined(CONFIG_FB_MXS) || defined(CONFIG_FB_MXS_MODULE)
{
.name = "mxs-fb",
diff --git a/arch/arm/plat-mxs/dma-apbx.c b/arch/arm/plat-mxs/dma-apbx.c
index 6d77a6933d98..c27414f8c18d 100644
--- a/arch/arm/plat-mxs/dma-apbx.c
+++ b/arch/arm/plat-mxs/dma-apbx.c
@@ -99,9 +99,6 @@ static void mxs_dma_apbx_info(struct mxs_dma_device *pdev,
reg = __raw_readl(pdev->base + HW_APBX_CTRL2);
info->status = reg >> chan;
info->buf_addr = __raw_readl(pdev->base + HW_APBX_CHn_BAR(chan));
- reg = __raw_readl(pdev->base + HW_APBX_CHn_CMD(chan));
- info->xfer_count = (reg & BM_APBX_CHn_CMD_XFER_COUNT) >> \
- BP_APBX_CHn_CMD_XFER_COUNT;
}
static int
diff --git a/arch/arm/plat-mxs/dmaengine.c b/arch/arm/plat-mxs/dmaengine.c
index 0c2485b18506..52330d3ea9e3 100644
--- a/arch/arm/plat-mxs/dmaengine.c
+++ b/arch/arm/plat-mxs/dmaengine.c
@@ -127,16 +127,14 @@ int mxs_dma_enable(int channel)
if (!(pchan->flags & MXS_DMA_FLAGS_ALLOCATED))
return -EINVAL;
- /*
- * neednot mutex lock, this function will be called in irq context.
- * The mutex may cause process schedule.
- */
pdma = pchan->dma;
+ mutex_lock(&mxs_dma_mutex);
spin_lock_irqsave(&pchan->lock, flags);
if (pchan->pending_num && pdma->enable)
ret = pdma->enable(pchan, channel - pdma->chan_base);
pchan->flags |= MXS_DMA_FLAGS_BUSY;
spin_unlock_irqrestore(&pchan->lock, flags);
+ mutex_unlock(&mxs_dma_mutex);
return ret;
}
EXPORT_SYMBOL(mxs_dma_enable);
@@ -153,11 +151,8 @@ void mxs_dma_disable(int channel)
return;
if (!(pchan->flags & MXS_DMA_FLAGS_BUSY))
return;
- /*
- * neednot mutex lock, this function will be called in irq context.
- * The mutex may cause process schedule.
- */
pdma = pchan->dma;
+ mutex_lock(&mxs_dma_mutex);
spin_lock_irqsave(&pchan->lock, flags);
if (pdma->disable)
pdma->disable(pchan, channel - pdma->chan_base);
@@ -166,6 +161,7 @@ void mxs_dma_disable(int channel)
pchan->pending_num = 0;
list_splice_init(&pchan->active, &pchan->done);
spin_unlock_irqrestore(&pchan->lock, flags);
+ mutex_unlock(&mxs_dma_mutex);
}
EXPORT_SYMBOL(mxs_dma_disable);
diff --git a/arch/arm/plat-mxs/include/mach/device.h b/arch/arm/plat-mxs/include/mach/device.h
index 199ec1e62963..9598ccdaa718 100644
--- a/arch/arm/plat-mxs/include/mach/device.h
+++ b/arch/arm/plat-mxs/include/mach/device.h
@@ -54,12 +54,6 @@ struct mxs_dma_plat_data {
unsigned int chan_num;
};
-struct fsl_otp_data {
- char **fuse_name;
- char *regulator_name;
- unsigned int fuse_num;
-};
-
struct mxs_i2c_plat_data {
unsigned int pioqueue_mode:1;
};
diff --git a/arch/arm/plat-mxs/include/mach/dmaengine.h b/arch/arm/plat-mxs/include/mach/dmaengine.h
index cdf6b1e32a43..eecd260ac5b4 100644
--- a/arch/arm/plat-mxs/include/mach/dmaengine.h
+++ b/arch/arm/plat-mxs/include/mach/dmaengine.h
@@ -106,7 +106,6 @@ struct mxs_dma_info {
#define MXS_DMA_INFO_ERR 0x00000001
#define MXS_DMA_INFO_ERR_STAT 0x00010000
unsigned int buf_addr;
- unsigned int xfer_count;
};
/**
diff --git a/arch/arm/plat-mxs/include/mach/timex.h b/arch/arm/plat-mxs/include/mach/timex.h
index d622dda141f2..9db3d688223a 100644
--- a/arch/arm/plat-mxs/include/mach/timex.h
+++ b/arch/arm/plat-mxs/include/mach/timex.h
@@ -20,4 +20,4 @@
/*
* System time clock is sourced from the 32k clock
*/
-#define CLOCK_TICK_RATE 32000
+#define CLOCK_TICK_RATE 32768
diff --git a/arch/arm/plat-mxs/timer-nomatch.c b/arch/arm/plat-mxs/timer-nomatch.c
index db8906192f16..66c488c99b42 100644
--- a/arch/arm/plat-mxs/timer-nomatch.c
+++ b/arch/arm/plat-mxs/timer-nomatch.c
@@ -21,7 +21,6 @@
#include <linux/clocksource.h>
#include <linux/clockchips.h>
#include <linux/io.h>
-#include <linux/clk.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
@@ -120,9 +119,9 @@ void mxs_nomatch_timer_init(struct mxs_sys_timer *timer)
online_timer = timer;
- cksrc_mxs_nomatch.mult = clocksource_hz2mult(clk_get_rate(timer->clk),
+ cksrc_mxs_nomatch.mult = clocksource_hz2mult(CLOCK_TICK_RATE,
cksrc_mxs_nomatch.shift);
- ckevt_timrot.mult = div_sc(clk_get_rate(timer->clk), NSEC_PER_SEC,
+ ckevt_timrot.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC,
ckevt_timrot.shift);
ckevt_timrot.min_delta_ns = clockevent_delta2ns(2, &ckevt_timrot);
ckevt_timrot.max_delta_ns = clockevent_delta2ns(0xFFF, &ckevt_timrot);
@@ -146,7 +145,7 @@ void mxs_nomatch_timer_init(struct mxs_sys_timer *timer)
BM_TIMROT_TIMCTRLn_IRQ_EN,
online_timer->base + HW_TIMROT_TIMCTRLn(1));
- __raw_writel(clk_get_rate(timer->clk) / HZ - 1,
+ __raw_writel(CLOCK_TICK_RATE / HZ - 1,
online_timer->base + HW_TIMROT_TIMCOUNTn(0));
__raw_writel(0xFFFF, online_timer->base + HW_TIMROT_TIMCOUNTn(1));
@@ -182,7 +181,7 @@ void mxs_nomatch_resume_timer(void)
BM_TIMROT_TIMCTRLn_UPDATE |
BM_TIMROT_TIMCTRLn_IRQ_EN,
online_timer->base + HW_TIMROT_TIMCTRLn(1));
- __raw_writel(clk_get_rate(online_timer->clk) / HZ - 1,
+ __raw_writel(CLOCK_TICK_RATE / HZ - 1,
online_timer->base + HW_TIMROT_TIMCOUNTn(0));
__raw_writel(0xFFFF, online_timer->base + HW_TIMROT_TIMCOUNTn(1));
}
diff --git a/arch/arm/plat-mxs/usb_common.c b/arch/arm/plat-mxs/usb_common.c
index 23134489472e..5d8d0b6d9285 100644
--- a/arch/arm/plat-mxs/usb_common.c
+++ b/arch/arm/plat-mxs/usb_common.c
@@ -264,16 +264,13 @@ int usbotg_init(struct platform_device *pdev)
pdata->xcvr_type = xops->xcvr_type;
pdata->pdev = pdev;
+ otg_used = 0;
if (!otg_used) {
pr_debug("%s: grab pins\n", __func__);
if (xops->init)
xops->init(xops);
usb_phy_enable(pdata);
}
- /* Enable internal Phy clock */
- tmp = __raw_readl(pdata->regs + UOG_PORTSC1);
- tmp &= ~PORTSC_PHCD;
- __raw_writel(tmp, pdata->regs + UOG_PORTSC1);
if (pdata->operating_mode == FSL_USB2_DR_HOST) {
/* enable FS/LS device */
@@ -291,22 +288,11 @@ EXPORT_SYMBOL(usbotg_init);
void usbotg_uninit(struct fsl_usb2_platform_data *pdata)
{
- int tmp;
- struct clk *usb_clk;
pr_debug("%s\n", __func__);
if (pdata->xcvr_ops && pdata->xcvr_ops->uninit)
pdata->xcvr_ops->uninit(pdata->xcvr_ops);
- /* Disable internal Phy clock */
- tmp = __raw_readl(pdata->regs + UOG_PORTSC1);
- tmp |= PORTSC_PHCD;
- __raw_writel(tmp, pdata->regs + UOG_PORTSC1);
-
- usb_clk = clk_get(NULL, "usb_clk0");
- clk_disable(usb_clk);
- clk_put(usb_clk);
-
pdata->regs = NULL;
otg_used--;
}
@@ -345,16 +331,11 @@ EXPORT_SYMBOL(fsl_usb_host_init);
void fsl_usb_host_uninit(struct fsl_usb2_platform_data *pdata)
{
- struct clk *usb_clk;
pr_debug("%s\n", __func__);
if (pdata->xcvr_ops && pdata->xcvr_ops->uninit)
pdata->xcvr_ops->uninit(pdata->xcvr_ops);
- usb_clk = clk_get(NULL, "usb_clk1");
- clk_disable(usb_clk);
- clk_put(usb_clk);
-
pdata->regs = NULL;
}
EXPORT_SYMBOL(fsl_usb_host_uninit);
diff --git a/arch/arm/plat-mxs/utmixc.c b/arch/arm/plat-mxs/utmixc.c
index 8e842840e87a..8ad6bd4f3654 100644
--- a/arch/arm/plat-mxs/utmixc.c
+++ b/arch/arm/plat-mxs/utmixc.c
@@ -80,7 +80,7 @@ static void __exit utmixc_exit(void)
#ifdef CONFIG_MXS_VBUS_CURRENT_DRAW
fs_initcall(utmixc_init);
#else
- subsys_initcall(utmixc_init);
+ module_init(utmixc_init);
#endif
module_exit(utmixc_exit);
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types
index 817425c8e732..0fa7f761dd1d 100644
--- a/arch/arm/tools/mach-types
+++ b/arch/arm/tools/mach-types
@@ -2594,7 +2594,6 @@ spacecom1 MACH_SPACECOM1 SPACECOM1 2604
pingu920 MACH_PINGU920 PINGU920 2605
bravoc MACH_BRAVOC BRAVOC 2606
cybo2440 MACH_CYBO2440 CYBO2440 2607
-mx50_arm2 MACH_MX50_ARM2 MX50_ARM2 2955
-mx50_rdp MACH_MX50_RDP MX50_RDP 2988
+mx50_arm2 MACH_MX50_ARM2 MX50_ARM2 2955
diff --git a/arch/cris/Makefile b/arch/cris/Makefile
index 71e17d3eeddb..29c2ceb38a76 100644
--- a/arch/cris/Makefile
+++ b/arch/cris/Makefile
@@ -42,8 +42,6 @@ LD = $(CROSS_COMPILE)ld -mcrislinux
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
-CPPFLAGS_vmlinux.lds = -DDRAM_VIRTUAL_BASE=0x$(CONFIG_ETRAX_DRAM_VIRTUAL_BASE)
-
KBUILD_AFLAGS += -mlinux -march=$(arch-y) $(inc)
KBUILD_CFLAGS += -mlinux -march=$(arch-y) -pipe $(inc)
KBUILD_CPPFLAGS += $(inc)
diff --git a/arch/cris/kernel/Makefile b/arch/cris/kernel/Makefile
index ee7bcd4d20b2..b45640b3e600 100644
--- a/arch/cris/kernel/Makefile
+++ b/arch/cris/kernel/Makefile
@@ -3,6 +3,7 @@
# Makefile for the linux kernel.
#
+CPPFLAGS_vmlinux.lds := -DDRAM_VIRTUAL_BASE=0x$(CONFIG_ETRAX_DRAM_VIRTUAL_BASE)
extra-y := vmlinux.lds
obj-y := process.o traps.o irq.o ptrace.o setup.o time.o sys_cris.o
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index fb87c08c6b57..2de41c051147 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -555,7 +555,7 @@ config HPAPCI
config MVME147_SCC
bool "SCC support for MVME147 serial ports"
- depends on MVME147
+ depends on MVME147 && BROKEN
help
This is the driver for the serial ports on the Motorola MVME147
boards. Everyone using one of these boards should say Y here.
@@ -570,14 +570,14 @@ config SERIAL167
config MVME162_SCC
bool "SCC support for MVME162 serial ports"
- depends on MVME16x
+ depends on MVME16x && BROKEN
help
This is the driver for the serial ports on the Motorola MVME162 and
172 boards. Everyone using one of these boards should say Y here.
config BVME6000_SCC
bool "SCC support for BVME6000 serial ports"
- depends on BVME6000
+ depends on BVME6000 && BROKEN
help
This is the driver for the serial ports on the BVME4000 and BVME6000
boards from BVM Ltd. Everyone using one of these boards should say
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 861da514a468..7d651d582007 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -615,16 +615,6 @@ endif
cflags-y += -I$(srctree)/arch/mips/include/asm/mach-generic
drivers-$(CONFIG_PCI) += arch/mips/pci/
-ifdef CONFIG_32BIT
-ifdef CONFIG_CPU_LITTLE_ENDIAN
-JIFFIES = jiffies_64
-else
-JIFFIES = jiffies_64 + 4
-endif
-else
-JIFFIES = jiffies_64
-endif
-
#
# Automatically detect the build format. By default we choose
# the elf format according to the load address.
@@ -648,8 +638,9 @@ ifdef CONFIG_64BIT
endif
KBUILD_AFLAGS += $(cflags-y)
-KBUILD_CFLAGS += $(cflags-y) \
- -D"VMLINUX_LOAD_ADDRESS=$(load-y)"
+KBUILD_CFLAGS += $(cflags-y)
+KBUILD_CPPFLAGS += -D"VMLINUX_LOAD_ADDRESS=$(load-y)"
+KBUILD_CPPFLAGS += -D"DATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)"
LDFLAGS += -m $(ld-emul)
@@ -664,18 +655,6 @@ endif
OBJCOPYFLAGS += --remove-section=.reginfo
-#
-# Choosing incompatible machines durings configuration will result in
-# error messages during linking. Select a default linkscript if
-# none has been choosen above.
-#
-
-CPPFLAGS_vmlinux.lds := \
- $(KBUILD_CFLAGS) \
- -D"LOADADDR=$(load-y)" \
- -D"JIFFIES=$(JIFFIES)" \
- -D"DATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)"
-
head-y := arch/mips/kernel/head.o arch/mips/kernel/init_task.o
libs-y += arch/mips/lib/
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
index e96122159928..eecd2a9f155c 100644
--- a/arch/mips/kernel/Makefile
+++ b/arch/mips/kernel/Makefile
@@ -2,6 +2,8 @@
# Makefile for the Linux/MIPS kernel.
#
+CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS)
+
extra-y := head.o init_task.o vmlinux.lds
obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
index 58738c8d754f..b245f4663fa1 100644
--- a/arch/mips/kernel/vmlinux.lds.S
+++ b/arch/mips/kernel/vmlinux.lds.S
@@ -9,7 +9,16 @@ PHDRS {
text PT_LOAD FLAGS(7); /* RWX */
note PT_NOTE FLAGS(4); /* R__ */
}
-jiffies = JIFFIES;
+
+#ifdef CONFIG_32BIT
+ #ifdef CONFIG_CPU_LITTLE_ENDIAN
+ jiffies = jiffies_64;
+ #else
+ jiffies = jiffies_64 + 4;
+ #endif
+#else
+ jiffies = jiffies_64;
+#endif
SECTIONS
{
@@ -28,7 +37,7 @@ SECTIONS
/* . = 0xa800000000300000; */
. = 0xffffffff80300000;
#endif
- . = LOADADDR;
+ . = VMLINUX_LOAD_ADDRESS;
/* read-only */
_text = .; /* Text and read-only data */
.text : {
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index bc35f4e2b81c..39d44f7ff390 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -158,8 +158,6 @@ drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/
# Default to zImage, override when needed
all: zImage
-CPPFLAGS_vmlinux.lds := -Upowerpc
-
BOOT_TARGETS = zImage zImage.initrd uImage zImage% dtbImage% treeImage.% cuImage.% simpleImage.%
PHONY += $(BOOT_TARGETS)
diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h
index 014a624f4c8e..56985023a47d 100644
--- a/arch/powerpc/include/asm/elf.h
+++ b/arch/powerpc/include/asm/elf.h
@@ -236,14 +236,10 @@ typedef elf_vrregset_t elf_fpxregset_t;
#ifdef __powerpc64__
# define SET_PERSONALITY(ex) \
do { \
- unsigned long new_flags = 0; \
if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
- new_flags = _TIF_32BIT; \
- if ((current_thread_info()->flags & _TIF_32BIT) \
- != new_flags) \
- set_thread_flag(TIF_ABI_PENDING); \
+ set_thread_flag(TIF_32BIT); \
else \
- clear_thread_flag(TIF_ABI_PENDING); \
+ clear_thread_flag(TIF_32BIT); \
if (personality(current->personality) != PER_LINUX32) \
set_personality(PER_LINUX | \
(current->personality & (~PER_MASK))); \
diff --git a/arch/powerpc/include/asm/kmap_types.h b/arch/powerpc/include/asm/kmap_types.h
index b6bac6f61c16..916369575c97 100644
--- a/arch/powerpc/include/asm/kmap_types.h
+++ b/arch/powerpc/include/asm/kmap_types.h
@@ -29,5 +29,16 @@ enum km_type {
KM_TYPE_NR
};
+/*
+ * This is a temporary build fix that (so they say on lkml....) should no longer
+ * be required after 2.6.33, because of changes planned to the kmap code.
+ * Let's try to remove this cruft then.
+ */
+#ifdef CONFIG_DEBUG_HIGHMEM
+#define KM_NMI (-1)
+#define KM_NMI_PTE (-1)
+#define KM_IRQ_PTE (-1)
+#endif
+
#endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_KMAP_TYPES_H */
diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h
index 98c104a09961..edab67ee8e53 100644
--- a/arch/powerpc/include/asm/mmu-hash64.h
+++ b/arch/powerpc/include/asm/mmu-hash64.h
@@ -41,6 +41,7 @@ extern char initial_stab[];
#define SLB_NUM_BOLTED 3
#define SLB_CACHE_ENTRIES 8
+#define SLB_MIN_SIZE 32
/* Bits in the SLB ESID word */
#define SLB_ESID_V ASM_CONST(0x0000000008000000) /* valid */
@@ -296,6 +297,7 @@ extern void slb_flush_and_rebolt(void);
extern void stab_initialize(unsigned long stab);
extern void slb_vmalloc_update(void);
+extern void slb_set_size(u16 size);
#endif /* __ASSEMBLY__ */
/*
diff --git a/arch/powerpc/include/asm/pmc.h b/arch/powerpc/include/asm/pmc.h
index d6a616a1b3ea..ccc68b50d05d 100644
--- a/arch/powerpc/include/asm/pmc.h
+++ b/arch/powerpc/include/asm/pmc.h
@@ -27,10 +27,22 @@ extern perf_irq_t perf_irq;
int reserve_pmc_hardware(perf_irq_t new_perf_irq);
void release_pmc_hardware(void);
+void ppc_enable_pmcs(void);
#ifdef CONFIG_PPC64
-void power4_enable_pmcs(void);
-void pasemi_enable_pmcs(void);
+#include <asm/lppaca.h>
+
+static inline void ppc_set_pmu_inuse(int inuse)
+{
+ get_lppaca()->pmcregs_in_use = inuse;
+}
+
+extern void power4_enable_pmcs(void);
+
+#else /* CONFIG_PPC64 */
+
+static inline void ppc_set_pmu_inuse(int inuse) { }
+
#endif
#endif /* __KERNEL__ */
diff --git a/arch/powerpc/include/asm/pte-common.h b/arch/powerpc/include/asm/pte-common.h
index a7e210b6b48c..0cd2e3433e1c 100644
--- a/arch/powerpc/include/asm/pte-common.h
+++ b/arch/powerpc/include/asm/pte-common.h
@@ -176,7 +176,7 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void);
#define HAVE_PAGE_AGP
/* Advertise support for _PAGE_SPECIAL */
-#ifdef _PAGE_SPECIAL
+#if _PAGE_SPECIAL != 0
#define __HAVE_ARCH_PTE_SPECIAL
#endif
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index c8b329255678..aa9d383a1c09 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -111,7 +111,6 @@ static inline struct thread_info *current_thread_info(void)
#define TIF_NOTIFY_RESUME 13 /* callback before returning to user */
#define TIF_FREEZE 14 /* Freezing for suspend */
#define TIF_RUNLATCH 15 /* Is the runlatch enabled? */
-#define TIF_ABI_PENDING 16 /* 32/64 bit switch needed */
/* as above, but as bit values */
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
@@ -129,7 +128,6 @@ static inline struct thread_info *current_thread_info(void)
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
#define _TIF_FREEZE (1<<TIF_FREEZE)
#define _TIF_RUNLATCH (1<<TIF_RUNLATCH)
-#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP)
#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c
index 2419cc706ff1..ed0ac4e4b8d8 100644
--- a/arch/powerpc/kernel/lparcfg.c
+++ b/arch/powerpc/kernel/lparcfg.c
@@ -35,6 +35,7 @@
#include <asm/prom.h>
#include <asm/vdso_datapage.h>
#include <asm/vio.h>
+#include <asm/mmu.h>
#define MODULE_VERS "1.8"
#define MODULE_NAME "lparcfg"
@@ -537,6 +538,8 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
seq_printf(m, "shared_processor_mode=%d\n", lppaca[0].shared_proc);
+ seq_printf(m, "slb_size=%d\n", mmu_slb_size);
+
return 0;
}
diff --git a/arch/powerpc/kernel/perf_counter.c b/arch/powerpc/kernel/perf_counter.c
index 70e1f57f7dd8..7ceefaf3a7f5 100644
--- a/arch/powerpc/kernel/perf_counter.c
+++ b/arch/powerpc/kernel/perf_counter.c
@@ -32,6 +32,9 @@ struct cpu_hw_counters {
unsigned long mmcr[3];
struct perf_counter *limited_counter[MAX_LIMITED_HWCOUNTERS];
u8 limited_hwidx[MAX_LIMITED_HWCOUNTERS];
+ u64 alternatives[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES];
+ unsigned long amasks[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES];
+ unsigned long avalues[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES];
};
DEFINE_PER_CPU(struct cpu_hw_counters, cpu_hw_counters);
@@ -62,7 +65,6 @@ static inline unsigned long perf_ip_adjust(struct pt_regs *regs)
{
return 0;
}
-static inline void perf_set_pmu_inuse(int inuse) { }
static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp) { }
static inline u32 perf_get_misc_flags(struct pt_regs *regs)
{
@@ -93,11 +95,6 @@ static inline unsigned long perf_ip_adjust(struct pt_regs *regs)
return 0;
}
-static inline void perf_set_pmu_inuse(int inuse)
-{
- get_lppaca()->pmcregs_in_use = inuse;
-}
-
/*
* The user wants a data address recorded.
* If we're not doing instruction sampling, give them the SDAR
@@ -245,13 +242,11 @@ static void write_pmc(int idx, unsigned long val)
* and see if any combination of alternative codes is feasible.
* The feasible set is returned in event[].
*/
-static int power_check_constraints(u64 event[], unsigned int cflags[],
+static int power_check_constraints(struct cpu_hw_counters *cpuhw,
+ u64 event[], unsigned int cflags[],
int n_ev)
{
unsigned long mask, value, nv;
- u64 alternatives[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES];
- unsigned long amasks[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES];
- unsigned long avalues[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES];
unsigned long smasks[MAX_HWCOUNTERS], svalues[MAX_HWCOUNTERS];
int n_alt[MAX_HWCOUNTERS], choice[MAX_HWCOUNTERS];
int i, j;
@@ -266,21 +261,23 @@ static int power_check_constraints(u64 event[], unsigned int cflags[],
if ((cflags[i] & PPMU_LIMITED_PMC_REQD)
&& !ppmu->limited_pmc_event(event[i])) {
ppmu->get_alternatives(event[i], cflags[i],
- alternatives[i]);
- event[i] = alternatives[i][0];
+ cpuhw->alternatives[i]);
+ event[i] = cpuhw->alternatives[i][0];
}
- if (ppmu->get_constraint(event[i], &amasks[i][0],
- &avalues[i][0]))
+ if (ppmu->get_constraint(event[i], &cpuhw->amasks[i][0],
+ &cpuhw->avalues[i][0]))
return -1;
}
value = mask = 0;
for (i = 0; i < n_ev; ++i) {
- nv = (value | avalues[i][0]) + (value & avalues[i][0] & addf);
+ nv = (value | cpuhw->avalues[i][0]) +
+ (value & cpuhw->avalues[i][0] & addf);
if ((((nv + tadd) ^ value) & mask) != 0 ||
- (((nv + tadd) ^ avalues[i][0]) & amasks[i][0]) != 0)
+ (((nv + tadd) ^ cpuhw->avalues[i][0]) &
+ cpuhw->amasks[i][0]) != 0)
break;
value = nv;
- mask |= amasks[i][0];
+ mask |= cpuhw->amasks[i][0];
}
if (i == n_ev)
return 0; /* all OK */
@@ -291,10 +288,11 @@ static int power_check_constraints(u64 event[], unsigned int cflags[],
for (i = 0; i < n_ev; ++i) {
choice[i] = 0;
n_alt[i] = ppmu->get_alternatives(event[i], cflags[i],
- alternatives[i]);
+ cpuhw->alternatives[i]);
for (j = 1; j < n_alt[i]; ++j)
- ppmu->get_constraint(alternatives[i][j],
- &amasks[i][j], &avalues[i][j]);
+ ppmu->get_constraint(cpuhw->alternatives[i][j],
+ &cpuhw->amasks[i][j],
+ &cpuhw->avalues[i][j]);
}
/* enumerate all possibilities and see if any will work */
@@ -313,11 +311,11 @@ static int power_check_constraints(u64 event[], unsigned int cflags[],
* where k > j, will satisfy the constraints.
*/
while (++j < n_alt[i]) {
- nv = (value | avalues[i][j]) +
- (value & avalues[i][j] & addf);
+ nv = (value | cpuhw->avalues[i][j]) +
+ (value & cpuhw->avalues[i][j] & addf);
if ((((nv + tadd) ^ value) & mask) == 0 &&
- (((nv + tadd) ^ avalues[i][j])
- & amasks[i][j]) == 0)
+ (((nv + tadd) ^ cpuhw->avalues[i][j])
+ & cpuhw->amasks[i][j]) == 0)
break;
}
if (j >= n_alt[i]) {
@@ -339,7 +337,7 @@ static int power_check_constraints(u64 event[], unsigned int cflags[],
svalues[i] = value;
smasks[i] = mask;
value = nv;
- mask |= amasks[i][j];
+ mask |= cpuhw->amasks[i][j];
++i;
j = -1;
}
@@ -347,7 +345,7 @@ static int power_check_constraints(u64 event[], unsigned int cflags[],
/* OK, we have a feasible combination, tell the caller the solution */
for (i = 0; i < n_ev; ++i)
- event[i] = alternatives[i][choice[i]];
+ event[i] = cpuhw->alternatives[i][choice[i]];
return 0;
}
@@ -531,8 +529,7 @@ void hw_perf_disable(void)
* Check if we ever enabled the PMU on this cpu.
*/
if (!cpuhw->pmcs_enabled) {
- if (ppc_md.enable_pmcs)
- ppc_md.enable_pmcs();
+ ppc_enable_pmcs();
cpuhw->pmcs_enabled = 1;
}
@@ -594,7 +591,7 @@ void hw_perf_enable(void)
mtspr(SPRN_MMCRA, cpuhw->mmcr[2] & ~MMCRA_SAMPLE_ENABLE);
mtspr(SPRN_MMCR1, cpuhw->mmcr[1]);
if (cpuhw->n_counters == 0)
- perf_set_pmu_inuse(0);
+ ppc_set_pmu_inuse(0);
goto out_enable;
}
@@ -627,7 +624,7 @@ void hw_perf_enable(void)
* bit set and set the hardware counters to their initial values.
* Then unfreeze the counters.
*/
- perf_set_pmu_inuse(1);
+ ppc_set_pmu_inuse(1);
mtspr(SPRN_MMCRA, cpuhw->mmcr[2] & ~MMCRA_SAMPLE_ENABLE);
mtspr(SPRN_MMCR1, cpuhw->mmcr[1]);
mtspr(SPRN_MMCR0, (cpuhw->mmcr[0] & ~(MMCR0_PMC1CE | MMCR0_PMCjCE))
@@ -752,7 +749,7 @@ int hw_perf_group_sched_in(struct perf_counter *group_leader,
return -EAGAIN;
if (check_excludes(cpuhw->counter, cpuhw->flags, n0, n))
return -EAGAIN;
- i = power_check_constraints(cpuhw->events, cpuhw->flags, n + n0);
+ i = power_check_constraints(cpuhw, cpuhw->events, cpuhw->flags, n + n0);
if (i < 0)
return -EAGAIN;
cpuhw->n_counters = n0 + n;
@@ -807,7 +804,7 @@ static int power_pmu_enable(struct perf_counter *counter)
cpuhw->flags[n0] = counter->hw.counter_base;
if (check_excludes(cpuhw->counter, cpuhw->flags, n0, 1))
goto out;
- if (power_check_constraints(cpuhw->events, cpuhw->flags, n0 + 1))
+ if (power_check_constraints(cpuhw, cpuhw->events, cpuhw->flags, n0 + 1))
goto out;
counter->hw.config = cpuhw->events[n0];
@@ -1012,6 +1009,7 @@ const struct pmu *hw_perf_counter_init(struct perf_counter *counter)
unsigned int cflags[MAX_HWCOUNTERS];
int n;
int err;
+ struct cpu_hw_counters *cpuhw;
if (!ppmu)
return ERR_PTR(-ENXIO);
@@ -1090,7 +1088,11 @@ const struct pmu *hw_perf_counter_init(struct perf_counter *counter)
cflags[n] = flags;
if (check_excludes(ctrs, cflags, n, 1))
return ERR_PTR(-EINVAL);
- if (power_check_constraints(events, cflags, n + 1))
+
+ cpuhw = &get_cpu_var(cpu_hw_counters);
+ err = power_check_constraints(cpuhw, events, cflags, n + 1);
+ put_cpu_var(cpu_hw_counters);
+ if (err)
return ERR_PTR(-EINVAL);
counter->hw.config = events[n];
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 892a9f2e6d76..1ea56fdccef4 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -554,18 +554,6 @@ void exit_thread(void)
void flush_thread(void)
{
-#ifdef CONFIG_PPC64
- struct thread_info *t = current_thread_info();
-
- if (test_ti_thread_flag(t, TIF_ABI_PENDING)) {
- clear_ti_thread_flag(t, TIF_ABI_PENDING);
- if (test_ti_thread_flag(t, TIF_32BIT))
- clear_ti_thread_flag(t, TIF_32BIT);
- else
- set_ti_thread_flag(t, TIF_32BIT);
- }
-#endif
-
discard_lazy_cpu_state();
if (current->thread.dabr) {
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index c434823b8c83..bf90361bb70f 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -39,6 +39,7 @@
#include <asm/smp.h>
#include <asm/atomic.h>
#include <asm/time.h>
+#include <asm/mmu.h>
struct rtas_t rtas = {
.lock = __RAW_SPIN_LOCK_UNLOCKED
@@ -713,6 +714,7 @@ static void rtas_percpu_suspend_me(void *info)
{
long rc = H_SUCCESS;
unsigned long msr_save;
+ u16 slb_size = mmu_slb_size;
int cpu;
struct rtas_suspend_me_data *data =
(struct rtas_suspend_me_data *)info;
@@ -735,13 +737,16 @@ static void rtas_percpu_suspend_me(void *info)
/* All other cpus are in H_JOIN, this cpu does
* the suspend.
*/
+ slb_set_size(SLB_MIN_SIZE);
printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n",
smp_processor_id());
data->error = rtas_call(data->token, 0, 1, NULL);
- if (data->error)
+ if (data->error) {
printk(KERN_DEBUG "ibm,suspend-me returned %d\n",
data->error);
+ slb_set_size(slb_size);
+ }
} else {
printk(KERN_ERR "H_JOIN on cpu %i failed with rc = %ld\n",
smp_processor_id(), rc);
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c
index f41aec85aa49..956ab33fd73f 100644
--- a/arch/powerpc/kernel/sysfs.c
+++ b/arch/powerpc/kernel/sysfs.c
@@ -17,6 +17,7 @@
#include <asm/prom.h>
#include <asm/machdep.h>
#include <asm/smp.h>
+#include <asm/pmc.h>
#include "cacheinfo.h"
@@ -123,6 +124,8 @@ static DEFINE_PER_CPU(char, pmcs_enabled);
void ppc_enable_pmcs(void)
{
+ ppc_set_pmu_inuse(1);
+
/* Only need to enable them once */
if (__get_cpu_var(pmcs_enabled))
return;
diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S
index ea4d64644d02..419f492cb586 100644
--- a/arch/powerpc/kernel/vector.S
+++ b/arch/powerpc/kernel/vector.S
@@ -58,7 +58,7 @@ _GLOBAL(load_up_altivec)
* all 1's
*/
mfspr r4,SPRN_VRSAVE
- cmpdi 0,r4,0
+ cmpwi 0,r4,0
bne+ 1f
li r4,-1
mtspr SPRN_VRSAVE,r4
diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c
index 627767d6169b..d8e672567f7e 100644
--- a/arch/powerpc/mm/pgtable.c
+++ b/arch/powerpc/mm/pgtable.c
@@ -30,6 +30,8 @@
#include <asm/tlbflush.h>
#include <asm/tlb.h>
+#include "mmu_decl.h"
+
static DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur);
static unsigned long pte_freelist_forced_free;
@@ -119,7 +121,7 @@ void pte_free_finish(void)
/*
* Handle i/d cache flushing, called from set_pte_at() or ptep_set_access_flags()
*/
-static pte_t do_dcache_icache_coherency(pte_t pte)
+static pte_t do_dcache_icache_coherency(pte_t pte, unsigned long addr)
{
unsigned long pfn = pte_pfn(pte);
struct page *page;
@@ -128,6 +130,17 @@ static pte_t do_dcache_icache_coherency(pte_t pte)
return pte;
page = pfn_to_page(pfn);
+#ifdef CONFIG_8xx
+ /* On 8xx, cache control instructions (particularly
+ * "dcbst" from flush_dcache_icache) fault as write
+ * operation if there is an unpopulated TLB entry
+ * for the address in question. To workaround that,
+ * we invalidate the TLB here, thus avoiding dcbst
+ * misbehaviour.
+ */
+ _tlbil_va(addr, 0 /* 8xx doesn't care about PID */);
+#endif
+
if (!PageReserved(page) && !test_bit(PG_arch_1, &page->flags)) {
pr_devel("do_dcache_icache_coherency... flushing\n");
flush_dcache_icache_page(page);
@@ -198,7 +211,7 @@ void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte
*/
pte = __pte(pte_val(pte) & ~_PAGE_HPTEFLAGS);
if (pte_need_exec_flush(pte, 1))
- pte = do_dcache_icache_coherency(pte);
+ pte = do_dcache_icache_coherency(pte, addr);
/* Perform the setting of the PTE */
__set_pte_at(mm, addr, ptep, pte, 0);
@@ -216,7 +229,7 @@ int ptep_set_access_flags(struct vm_area_struct *vma, unsigned long address,
{
int changed;
if (!dirty && pte_need_exec_flush(entry, 0))
- entry = do_dcache_icache_coherency(entry);
+ entry = do_dcache_icache_coherency(entry, address);
changed = !pte_same(*(ptep), entry);
if (changed) {
if (!(vma->vm_flags & VM_HUGETLB))
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
index 5b7038f248b6..deb619323f84 100644
--- a/arch/powerpc/mm/slb.c
+++ b/arch/powerpc/mm/slb.c
@@ -240,14 +240,22 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
static inline void patch_slb_encoding(unsigned int *insn_addr,
unsigned int immed)
{
- /* Assume the instruction had a "0" immediate value, just
- * "or" in the new value
- */
- *insn_addr |= immed;
+ *insn_addr = (*insn_addr & 0xffff0000) | immed;
flush_icache_range((unsigned long)insn_addr, 4+
(unsigned long)insn_addr);
}
+void slb_set_size(u16 size)
+{
+ extern unsigned int *slb_compare_rr_to_size;
+
+ if (mmu_slb_size == size)
+ return;
+
+ mmu_slb_size = size;
+ patch_slb_encoding(slb_compare_rr_to_size, mmu_slb_size);
+}
+
void slb_initialize(void)
{
unsigned long linear_llp, vmalloc_llp, io_llp;
diff --git a/arch/powerpc/platforms/powermac/cpufreq_32.c b/arch/powerpc/platforms/powermac/cpufreq_32.c
index 65c585b8b00d..08d94e4cedd3 100644
--- a/arch/powerpc/platforms/powermac/cpufreq_32.c
+++ b/arch/powerpc/platforms/powermac/cpufreq_32.c
@@ -44,14 +44,6 @@
*/
#undef DEBUG_FREQ
-/*
- * There is a problem with the core cpufreq code on SMP kernels,
- * it won't recalculate the Bogomips properly
- */
-#ifdef CONFIG_SMP
-#warning "WARNING, CPUFREQ not recommended on SMP kernels"
-#endif
-
extern void low_choose_7447a_dfs(int dfs);
extern void low_choose_750fx_pll(int pll);
extern void low_sleep_handler(void);
diff --git a/arch/powerpc/platforms/powermac/low_i2c.c b/arch/powerpc/platforms/powermac/low_i2c.c
index 21226b74c9b2..414ca9849f23 100644
--- a/arch/powerpc/platforms/powermac/low_i2c.c
+++ b/arch/powerpc/platforms/powermac/low_i2c.c
@@ -540,8 +540,11 @@ static struct pmac_i2c_host_kw *__init kw_i2c_host_init(struct device_node *np)
/* Make sure IRQ is disabled */
kw_write_reg(reg_ier, 0);
- /* Request chip interrupt */
- if (request_irq(host->irq, kw_i2c_irq, 0, "keywest i2c", host))
+ /* Request chip interrupt. We set IRQF_TIMER because we don't
+ * want that interrupt disabled between the 2 passes of driver
+ * suspend or we'll have issues running the pfuncs
+ */
+ if (request_irq(host->irq, kw_i2c_irq, IRQF_TIMER, "keywest i2c", host))
host->irq = NO_IRQ;
printk(KERN_INFO "KeyWest i2c @0x%08x irq %d %s\n",
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c
index 04cdd32624d4..e81403b245b5 100644
--- a/arch/powerpc/platforms/powermac/pci.c
+++ b/arch/powerpc/platforms/powermac/pci.c
@@ -1286,3 +1286,64 @@ static void fixup_k2_sata(struct pci_dev* dev)
}
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS, 0x0240, fixup_k2_sata);
+/*
+ * On U4 (aka CPC945) the PCIe root complex "P2P" bridge resource ranges aren't
+ * configured by the firmware. The bridge itself seems to ignore them but it
+ * causes problems with Linux which then re-assigns devices below the bridge,
+ * thus changing addresses of those devices from what was in the device-tree,
+ * which sucks when those are video cards using offb
+ *
+ * We could just mark it transparent but I prefer fixing up the resources to
+ * properly show what's going on here, as I have some doubts about having them
+ * badly configured potentially being an issue for DMA.
+ *
+ * We leave PIO alone, it seems to be fine
+ *
+ * Oh and there's another funny bug. The OF properties advertize the region
+ * 0xf1000000..0xf1ffffff as being forwarded as memory space. But that's
+ * actually not true, this region is the memory mapped config space. So we
+ * also need to filter it out or we'll map things in the wrong place.
+ */
+static void fixup_u4_pcie(struct pci_dev* dev)
+{
+ struct pci_controller *host = pci_bus_to_host(dev->bus);
+ struct resource *region = NULL;
+ u32 reg;
+ int i;
+
+ /* Only do that on PowerMac */
+ if (!machine_is(powermac))
+ return;
+
+ /* Find the largest MMIO region */
+ for (i = 0; i < 3; i++) {
+ struct resource *r = &host->mem_resources[i];
+ if (!(r->flags & IORESOURCE_MEM))
+ continue;
+ /* Skip the 0xf0xxxxxx..f2xxxxxx regions, we know they
+ * are reserved by HW for other things
+ */
+ if (r->start >= 0xf0000000 && r->start < 0xf3000000)
+ continue;
+ if (!region || (r->end - r->start) >
+ (region->end - region->start))
+ region = r;
+ }
+ /* Nothing found, bail */
+ if (region == 0)
+ return;
+
+ /* Print things out */
+ printk(KERN_INFO "PCI: Fixup U4 PCIe bridge range: %pR\n", region);
+
+ /* Fixup bridge config space. We know it's a Mac, resource aren't
+ * offset so let's just blast them as-is. We also know that they
+ * fit in 32 bits
+ */
+ reg = ((region->start >> 16) & 0xfff0) | (region->end & 0xfff00000);
+ pci_write_config_dword(dev, PCI_MEMORY_BASE, reg);
+ pci_write_config_dword(dev, PCI_PREF_BASE_UPPER32, 0);
+ pci_write_config_dword(dev, PCI_PREF_LIMIT_UPPER32, 0);
+ pci_write_config_dword(dev, PCI_PREF_MEMORY_BASE, 0);
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_U4_PCIE, fixup_u4_pcie);
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c
index 6d4da7b46b41..937a38e73178 100644
--- a/arch/powerpc/platforms/powermac/smp.c
+++ b/arch/powerpc/platforms/powermac/smp.c
@@ -408,7 +408,7 @@ static void __init smp_psurge_setup_cpu(int cpu_nr)
/* reset the entry point so if we get another intr we won't
* try to startup again */
out_be32(psurge_start, 0x100);
- if (setup_irq(30, &psurge_irqaction))
+ if (setup_irq(irq_create_mapping(NULL, 30), &psurge_irqaction))
printk(KERN_ERR "Couldn't get primary IPI interrupt");
}
diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
index bf2e1ac41308..1164c3430f2c 100644
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -432,8 +432,6 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
/* Read config space back so we can restore after reset */
read_msi_msg(virq, &msg);
entry->msg = msg;
-
- unmask_msi_irq(virq);
}
return 0;
diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c
index b6f1b137d427..2e2bbe120b90 100644
--- a/arch/powerpc/platforms/pseries/reconfig.c
+++ b/arch/powerpc/platforms/pseries/reconfig.c
@@ -20,6 +20,7 @@
#include <asm/machdep.h>
#include <asm/uaccess.h>
#include <asm/pSeries_reconfig.h>
+#include <asm/mmu.h>
@@ -439,9 +440,15 @@ static int do_update_property(char *buf, size_t bufsize)
if (!newprop)
return -ENOMEM;
+ if (!strcmp(name, "slb-size") || !strcmp(name, "ibm,slb-size"))
+ slb_set_size(*(int *)value);
+
oldprop = of_find_property(np, name,NULL);
- if (!oldprop)
+ if (!oldprop) {
+ if (strlen(name))
+ return prom_add_property(np, newprop);
return -ENODEV;
+ }
rc = prom_update_property(np, newprop, oldprop);
if (rc)
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 8d75ea21296f..ca5f2e10972c 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -223,10 +223,6 @@ static void pseries_lpar_enable_pmcs(void)
set = 1UL << 63;
reset = 0;
plpar_hcall_norets(H_PERFMON, set, reset);
-
- /* instruct hypervisor to maintain PMCs */
- if (firmware_has_feature(FW_FEATURE_SPLPAR))
- get_lppaca()->pmcregs_in_use = 1;
}
static void __init pseries_discover_pic(void)
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c
index 419f8a637ffe..b9bf0eedccf2 100644
--- a/arch/powerpc/platforms/pseries/xics.c
+++ b/arch/powerpc/platforms/pseries/xics.c
@@ -18,6 +18,7 @@
#include <linux/init.h>
#include <linux/radix-tree.h>
#include <linux/cpu.h>
+#include <linux/msi.h>
#include <linux/of.h>
#include <asm/firmware.h>
@@ -219,6 +220,14 @@ static void xics_unmask_irq(unsigned int virq)
static unsigned int xics_startup(unsigned int virq)
{
+ /*
+ * The generic MSI code returns with the interrupt disabled on the
+ * card, using the MSI mask bits. Firmware doesn't appear to unmask
+ * at that level, so we do it here by hand.
+ */
+ if (irq_to_desc(virq)->msi_desc)
+ unmask_msi_irq(virq);
+
/* unmask it */
xics_unmask_irq(virq);
return 0;
diff --git a/arch/s390/include/asm/kvm.h b/arch/s390/include/asm/kvm.h
index 0b2f829f6d50..1e313567d1ee 100644
--- a/arch/s390/include/asm/kvm.h
+++ b/arch/s390/include/asm/kvm.h
@@ -1,6 +1,5 @@
#ifndef __LINUX_KVM_S390_H
#define __LINUX_KVM_S390_H
-
/*
* asm-s390/kvm.h - KVM s390 specific structures and definitions
*
@@ -24,6 +23,8 @@ struct kvm_ioapic_state {
/* no IOAPIC for s390 */
};
+#define __KVM_S390
+
/* for KVM_GET_REGS and KVM_SET_REGS */
struct kvm_regs {
/* general purpose regs for s390 */
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 90d9d1ba258b..475fc2986a46 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -115,10 +115,16 @@ long kvm_arch_dev_ioctl(struct file *filp,
int kvm_dev_ioctl_check_extension(long ext)
{
+ int r;
+
switch (ext) {
+ case KVM_CAP_S390_PSW:
+ r = 1;
+ break;
default:
- return 0;
+ r = 0;
}
+ return r;
}
/* Section: vm related */
@@ -422,8 +428,10 @@ static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
vcpu_load(vcpu);
if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
rc = -EBUSY;
- else
- vcpu->arch.sie_block->gpsw = psw;
+ else {
+ vcpu->run->psw_mask = psw.mask;
+ vcpu->run->psw_addr = psw.addr;
+ }
vcpu_put(vcpu);
return rc;
}
@@ -505,9 +513,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
switch (kvm_run->exit_reason) {
case KVM_EXIT_S390_SIEIC:
- vcpu->arch.sie_block->gpsw.mask = kvm_run->s390_sieic.mask;
- vcpu->arch.sie_block->gpsw.addr = kvm_run->s390_sieic.addr;
- break;
case KVM_EXIT_UNKNOWN:
case KVM_EXIT_S390_RESET:
break;
@@ -515,6 +520,9 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
BUG();
}
+ vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
+ vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
+
might_fault();
do {
@@ -529,8 +537,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
/* intercept cannot be handled in-kernel, prepare kvm-run */
kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
- kvm_run->s390_sieic.mask = vcpu->arch.sie_block->gpsw.mask;
- kvm_run->s390_sieic.addr = vcpu->arch.sie_block->gpsw.addr;
kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa;
kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
rc = 0;
@@ -542,6 +548,9 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
rc = 0;
}
+ kvm_run->psw_mask = vcpu->arch.sie_block->gpsw.mask;
+ kvm_run->psw_addr = vcpu->arch.sie_block->gpsw.addr;
+
if (vcpu->sigset_active)
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
diff --git a/arch/sh/kernel/process_64.c b/arch/sh/kernel/process_64.c
index 24de74214940..54a5abf123f3 100644
--- a/arch/sh/kernel/process_64.c
+++ b/arch/sh/kernel/process_64.c
@@ -367,7 +367,7 @@ void exit_thread(void)
void flush_thread(void)
{
- /* Called by fs/exec.c (flush_old_exec) to remove traces of a
+ /* Called by fs/exec.c (setup_new_exec) to remove traces of a
* previously running executable. */
#ifdef CONFIG_SH_FPU
if (last_task_used_math == current) {
diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile
index 2003ded054c2..ef9a6b02235f 100644
--- a/arch/sparc/Makefile
+++ b/arch/sparc/Makefile
@@ -27,11 +27,11 @@ AS := $(AS) -32
LDFLAGS := -m elf32_sparc
CHECKFLAGS += -D__sparc__
export BITS := 32
+UTS_MACHINE := sparc
#KBUILD_CFLAGS += -g -pipe -fcall-used-g5 -fcall-used-g7
KBUILD_CFLAGS += -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7
KBUILD_AFLAGS += -m32
-CPPFLAGS_vmlinux.lds += -m32
#LDFLAGS_vmlinux = -N -Ttext 0xf0004000
# Since 2.5.40, the first stage is left not btfix-ed.
@@ -49,11 +49,9 @@ else
CHECKFLAGS += -D__sparc__ -D__sparc_v9__ -D__arch64__ -m64
-# Undefine sparc when processing vmlinux.lds - it is used
-# And teach CPP we are doing 64 bit builds (for this case)
-CPPFLAGS_vmlinux.lds += -m64 -Usparc
LDFLAGS := -m elf64_sparc
export BITS := 64
+UTS_MACHINE := sparc64
KBUILD_CFLAGS += -m64 -pipe -mno-fpu -mcpu=ultrasparc -mcmodel=medlow \
-ffixed-g4 -ffixed-g5 -fcall-used-g7 -Wno-sign-compare \
diff --git a/arch/sparc/include/asm/elf_64.h b/arch/sparc/include/asm/elf_64.h
index d42e393078c4..996808587914 100644
--- a/arch/sparc/include/asm/elf_64.h
+++ b/arch/sparc/include/asm/elf_64.h
@@ -196,17 +196,10 @@ static inline unsigned int sparc64_elf_hwcap(void)
#define ELF_PLATFORM (NULL)
#define SET_PERSONALITY(ex) \
-do { unsigned long new_flags = current_thread_info()->flags; \
- new_flags &= _TIF_32BIT; \
- if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
- new_flags |= _TIF_32BIT; \
+do { if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
+ set_thread_flag(TIF_32BIT); \
else \
- new_flags &= ~_TIF_32BIT; \
- if ((current_thread_info()->flags & _TIF_32BIT) \
- != new_flags) \
- set_thread_flag(TIF_ABI_PENDING); \
- else \
- clear_thread_flag(TIF_ABI_PENDING); \
+ clear_thread_flag(TIF_32BIT); \
/* flush_thread will update pgd cache */ \
if (personality(current->personality) != PER_LINUX32) \
set_personality(PER_LINUX | \
diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h
index 1b45a7bbe407..f78ad9a1b497 100644
--- a/arch/sparc/include/asm/thread_info_64.h
+++ b/arch/sparc/include/asm/thread_info_64.h
@@ -227,12 +227,11 @@ register struct thread_info *current_thread_info_reg asm("g6");
/* flag bit 8 is available */
#define TIF_SECCOMP 9 /* secure computing */
#define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */
-/* flag bit 11 is available */
/* NOTE: Thread flags >= 12 should be ones we have no interest
* in using in assembly, else we can't use the mask as
* an immediate value in instructions such as andcc.
*/
-#define TIF_ABI_PENDING 12
+/* flag bit 12 is available */
#define TIF_MEMDIE 13
#define TIF_POLLING_NRFLAG 14
#define TIF_FREEZE 15 /* is freezing for suspend */
@@ -246,7 +245,6 @@ register struct thread_info *current_thread_info_reg asm("g6");
#define _TIF_32BIT (1<<TIF_32BIT)
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
-#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
#define _TIF_FREEZE (1<<TIF_FREEZE)
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile
index 475ce4696acd..cbf5d0b541dd 100644
--- a/arch/sparc/kernel/Makefile
+++ b/arch/sparc/kernel/Makefile
@@ -7,7 +7,11 @@ ccflags-y := -Werror
extra-y := head_$(BITS).o
extra-y += init_task.o
-extra-y += vmlinux.lds
+
+# Undefine sparc when processing vmlinux.lds - it is used
+# And teach CPP we are doing $(BITS) builds (for this case)
+CPPFLAGS_vmlinux.lds := -Usparc -m$(BITS)
+extra-y += vmlinux.lds
obj-$(CONFIG_SPARC32) += entry.o wof.o wuf.o
obj-$(CONFIG_SPARC32) += etrap_32.o
diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c
index adf5f273868a..e0ba898e30cf 100644
--- a/arch/sparc/kernel/ldc.c
+++ b/arch/sparc/kernel/ldc.c
@@ -1242,13 +1242,13 @@ int ldc_bind(struct ldc_channel *lp, const char *name)
snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name);
err = request_irq(lp->cfg.rx_irq, ldc_rx,
- IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+ IRQF_SAMPLE_RANDOM | IRQF_DISABLED,
lp->rx_irq_name, lp);
if (err)
return err;
err = request_irq(lp->cfg.tx_irq, ldc_tx,
- IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+ IRQF_SAMPLE_RANDOM | IRQF_DISABLED,
lp->tx_irq_name, lp);
if (err) {
free_irq(lp->cfg.rx_irq, lp);
diff --git a/arch/sparc/kernel/of_device_64.c b/arch/sparc/kernel/of_device_64.c
index 881947e59e95..0a6f2d1798d1 100644
--- a/arch/sparc/kernel/of_device_64.c
+++ b/arch/sparc/kernel/of_device_64.c
@@ -104,9 +104,19 @@ static int of_bus_pci_map(u32 *addr, const u32 *range,
int i;
/* Check address type match */
- if ((addr[0] ^ range[0]) & 0x03000000)
- return -EINVAL;
+ if (!((addr[0] ^ range[0]) & 0x03000000))
+ goto type_match;
+
+ /* Special exception, we can map a 64-bit address into
+ * a 32-bit range.
+ */
+ if ((addr[0] & 0x03000000) == 0x03000000 &&
+ (range[0] & 0x03000000) == 0x02000000)
+ goto type_match;
+
+ return -EINVAL;
+type_match:
if (of_out_of_range(addr + 1, range + 1, range + na + pna,
na - 1, ns))
return -EINVAL;
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c
index 4041f94e7724..3714fdb5b16b 100644
--- a/arch/sparc/kernel/process_64.c
+++ b/arch/sparc/kernel/process_64.c
@@ -365,14 +365,6 @@ void flush_thread(void)
struct thread_info *t = current_thread_info();
struct mm_struct *mm;
- if (test_ti_thread_flag(t, TIF_ABI_PENDING)) {
- clear_ti_thread_flag(t, TIF_ABI_PENDING);
- if (test_ti_thread_flag(t, TIF_32BIT))
- clear_ti_thread_flag(t, TIF_32BIT);
- else
- set_ti_thread_flag(t, TIF_32BIT);
- }
-
mm = t->task->mm;
if (mm)
tsb_context_switch(mm);
diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c
index 0fb5789d43c8..7b4adbc63b4c 100644
--- a/arch/sparc/kernel/prom_common.c
+++ b/arch/sparc/kernel/prom_common.c
@@ -76,6 +76,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len
err = -ENODEV;
+ mutex_lock(&of_set_property_mutex);
write_lock(&devtree_lock);
prevp = &dp->properties;
while (*prevp) {
@@ -85,9 +86,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len
void *old_val = prop->value;
int ret;
- mutex_lock(&of_set_property_mutex);
ret = prom_setprop(dp->node, name, val, len);
- mutex_unlock(&of_set_property_mutex);
err = -EINVAL;
if (ret >= 0) {
@@ -106,6 +105,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len
prevp = &(*prevp)->next;
}
write_unlock(&devtree_lock);
+ mutex_unlock(&of_set_property_mutex);
/* XXX Upate procfs if necessary... */
diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c
index 998cadb4e7f2..0ace49b6396b 100644
--- a/arch/sparc/kernel/setup_32.c
+++ b/arch/sparc/kernel/setup_32.c
@@ -263,8 +263,6 @@ void __init setup_arch(char **cmdline_p)
#ifdef CONFIG_DUMMY_CONSOLE
conswitchp = &dummy_con;
-#elif defined(CONFIG_PROM_CONSOLE)
- conswitchp = &prom_con;
#endif
boot_flags_init(*cmdline_p);
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c
index f2bcfd2967d7..21180339cb09 100644
--- a/arch/sparc/kernel/setup_64.c
+++ b/arch/sparc/kernel/setup_64.c
@@ -295,8 +295,6 @@ void __init setup_arch(char **cmdline_p)
#ifdef CONFIG_DUMMY_CONSOLE
conswitchp = &dummy_con;
-#elif defined(CONFIG_PROM_CONSOLE)
- conswitchp = &prom_con;
#endif
idprom_init();
diff --git a/arch/sparc/kernel/visemul.c b/arch/sparc/kernel/visemul.c
index b956fd71c131..d231cbd5c526 100644
--- a/arch/sparc/kernel/visemul.c
+++ b/arch/sparc/kernel/visemul.c
@@ -617,7 +617,7 @@ static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf)
rs2 = fps_regval(f, RS2(insn));
rd_val = 0;
- src2 = (rs2 >> (opf == FMUL8x16AU_OPF) ? 16 : 0);
+ src2 = rs2 >> (opf == FMUL8x16AU_OPF ? 16 : 0);
for (byte = 0; byte < 4; byte++) {
u16 src1 = (rs1 >> (byte * 8)) & 0x00ff;
u32 prod = src1 * src2;
diff --git a/arch/sparc/lib/mcount.S b/arch/sparc/lib/mcount.S
index 7ce9c65f3592..24b8b12deed2 100644
--- a/arch/sparc/lib/mcount.S
+++ b/arch/sparc/lib/mcount.S
@@ -64,8 +64,9 @@ mcount:
2: sethi %hi(softirq_stack), %g3
or %g3, %lo(softirq_stack), %g3
ldx [%g3 + %g1], %g7
+ sub %g7, STACK_BIAS, %g7
cmp %sp, %g7
- bleu,pt %xcc, 2f
+ bleu,pt %xcc, 3f
sethi %hi(THREAD_SIZE), %g3
add %g7, %g3, %g7
cmp %sp, %g7
@@ -75,7 +76,7 @@ mcount:
* again, we are already trying to output the stack overflow
* message.
*/
- sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough
+3: sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough
or %g7, %lo(ovstack), %g7
add %g7, OVSTACKSIZE, %g3
sub %g3, STACK_BIAS + 192, %g3
diff --git a/arch/sparc/mm/init_64.h b/arch/sparc/mm/init_64.h
index c2f772dbd556..77d1b313e344 100644
--- a/arch/sparc/mm/init_64.h
+++ b/arch/sparc/mm/init_64.h
@@ -45,7 +45,7 @@ extern void free_initmem(void);
#define VMEMMAP_ALIGN(x) (((x)+VMEMMAP_CHUNK-1UL)&VMEMMAP_CHUNK_MASK)
#define VMEMMAP_SIZE ((((1UL << MAX_PHYSADDR_BITS) >> PAGE_SHIFT) * \
- sizeof(struct page *)) >> VMEMMAP_CHUNK_SHIFT)
+ sizeof(struct page)) >> VMEMMAP_CHUNK_SHIFT)
extern unsigned long vmemmap_table[VMEMMAP_SIZE];
#endif
diff --git a/arch/um/Makefile b/arch/um/Makefile
index 0728def32234..fc633dbacf84 100644
--- a/arch/um/Makefile
+++ b/arch/um/Makefile
@@ -96,11 +96,10 @@ CFLAGS_NO_HARDENING := $(call cc-option, -fno-PIC,) $(call cc-option, -fno-pic,)
$(call cc-option, -fno-stack-protector,) \
$(call cc-option, -fno-stack-protector-all,)
-CONFIG_KERNEL_STACK_ORDER ?= 2
-STACK_SIZE := $(shell echo $$[ 4096 * (1 << $(CONFIG_KERNEL_STACK_ORDER)) ] )
-
-CPPFLAGS_vmlinux.lds = -U$(SUBARCH) -DSTART=$(START) -DELF_ARCH=$(ELF_ARCH) \
- -DELF_FORMAT="$(ELF_FORMAT)" -DKERNEL_STACK_SIZE=$(STACK_SIZE)
+# Options used by linker script
+export LDS_START := $(START)
+export LDS_ELF_ARCH := $(ELF_ARCH)
+export LDS_ELF_FORMAT := $(ELF_FORMAT)
# The wrappers will select whether using "malloc" or the kernel allocator.
LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile
index 388ec0a3ea9b..1119233597a1 100644
--- a/arch/um/kernel/Makefile
+++ b/arch/um/kernel/Makefile
@@ -3,6 +3,9 @@
# Licensed under the GPL
#
+CPPFLAGS_vmlinux.lds := -U$(SUBARCH) -DSTART=$(LDS_START) \
+ -DELF_ARCH=$(LDS_ELF_ARCH) \
+ -DELF_FORMAT=$(LDS_ELF_FORMAT)
extra-y := vmlinux.lds
clean-files :=
diff --git a/arch/um/kernel/vmlinux.lds.S b/arch/um/kernel/vmlinux.lds.S
index f8aeb448aab6..16e49bfa2b42 100644
--- a/arch/um/kernel/vmlinux.lds.S
+++ b/arch/um/kernel/vmlinux.lds.S
@@ -1,3 +1,6 @@
+
+KERNEL_STACK_SIZE = 4096 * (1 << CONFIG_KERNEL_STACK_ORDER);
+
#ifdef CONFIG_LD_SCRIPT_STATIC
#include "uml.lds.S"
#else
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c
index 2a4d073d2cf1..14531abdd0ce 100644
--- a/arch/x86/ia32/ia32_aout.c
+++ b/arch/x86/ia32/ia32_aout.c
@@ -308,14 +308,15 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
if (retval)
return retval;
- regs->cs = __USER32_CS;
- regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 =
- regs->r13 = regs->r14 = regs->r15 = 0;
-
/* OK, This is the point of no return */
set_personality(PER_LINUX);
set_thread_flag(TIF_IA32);
- clear_thread_flag(TIF_ABI_PENDING);
+
+ setup_new_exec(bprm);
+
+ regs->cs = __USER32_CS;
+ regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 =
+ regs->r13 = regs->r14 = regs->r15 = 0;
current->mm->end_code = ex.a_text +
(current->mm->start_code = N_TXTADDR(ex));
@@ -326,7 +327,6 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
current->mm->free_area_cache = TASK_UNMAPPED_BASE;
current->mm->cached_hole_size = 0;
- current->mm->mmap = NULL;
install_exec_creds(bprm);
current->flags &= ~PF_FORKNOEXEC;
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S
index e590261ba059..b09502da8d3f 100644
--- a/arch/x86/ia32/ia32entry.S
+++ b/arch/x86/ia32/ia32entry.S
@@ -21,8 +21,8 @@
#define __AUDIT_ARCH_LE 0x40000000
#ifndef CONFIG_AUDITSYSCALL
-#define sysexit_audit int_ret_from_sys_call
-#define sysretl_audit int_ret_from_sys_call
+#define sysexit_audit ia32_ret_from_sys_call
+#define sysretl_audit ia32_ret_from_sys_call
#endif
#define IA32_NR_syscalls ((ia32_syscall_end - ia32_sys_call_table)/8)
@@ -39,12 +39,12 @@
.endm
/* clobbers %eax */
- .macro CLEAR_RREGS _r9=rax
+ .macro CLEAR_RREGS offset=0, _r9=rax
xorl %eax,%eax
- movq %rax,R11(%rsp)
- movq %rax,R10(%rsp)
- movq %\_r9,R9(%rsp)
- movq %rax,R8(%rsp)
+ movq %rax,\offset+R11(%rsp)
+ movq %rax,\offset+R10(%rsp)
+ movq %\_r9,\offset+R9(%rsp)
+ movq %rax,\offset+R8(%rsp)
.endm
/*
@@ -172,6 +172,10 @@ sysexit_from_sys_call:
movl RIP-R11(%rsp),%edx /* User %eip */
CFI_REGISTER rip,rdx
RESTORE_ARGS 1,24,1,1,1,1
+ xorq %r8,%r8
+ xorq %r9,%r9
+ xorq %r10,%r10
+ xorq %r11,%r11
popfq
CFI_ADJUST_CFA_OFFSET -8
/*CFI_RESTORE rflags*/
@@ -200,9 +204,9 @@ sysexit_from_sys_call:
movl RDI-ARGOFFSET(%rsp),%r8d /* reload 5th syscall arg */
.endm
- .macro auditsys_exit exit,ebpsave=RBP
+ .macro auditsys_exit exit
testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10)
- jnz int_ret_from_sys_call
+ jnz ia32_ret_from_sys_call
TRACE_IRQS_ON
sti
movl %eax,%esi /* second arg, syscall return value */
@@ -213,13 +217,13 @@ sysexit_from_sys_call:
call audit_syscall_exit
GET_THREAD_INFO(%r10)
movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall return value */
- movl \ebpsave-ARGOFFSET(%rsp),%ebp /* reload user register value */
movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
cli
TRACE_IRQS_OFF
testl %edi,TI_flags(%r10)
- jnz int_with_check
- jmp \exit
+ jz \exit
+ CLEAR_RREGS -ARGOFFSET
+ jmp int_with_check
.endm
sysenter_auditsys:
@@ -329,6 +333,9 @@ sysretl_from_sys_call:
CFI_REGISTER rip,rcx
movl EFLAGS-ARGOFFSET(%rsp),%r11d
/*CFI_REGISTER rflags,r11*/
+ xorq %r10,%r10
+ xorq %r9,%r9
+ xorq %r8,%r8
TRACE_IRQS_ON
movl RSP-ARGOFFSET(%rsp),%esp
CFI_RESTORE rsp
@@ -343,7 +350,7 @@ cstar_auditsys:
jmp cstar_dispatch
sysretl_audit:
- auditsys_exit sysretl_from_sys_call, RCX /* user %ebp in RCX slot */
+ auditsys_exit sysretl_from_sys_call
#endif
cstar_tracesys:
@@ -353,7 +360,7 @@ cstar_tracesys:
#endif
xchgl %r9d,%ebp
SAVE_REST
- CLEAR_RREGS r9
+ CLEAR_RREGS 0, r9
movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */
movq %rsp,%rdi /* &pt_regs -> arg1 */
call syscall_trace_enter
@@ -425,6 +432,8 @@ ia32_do_call:
call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
ia32_sysret:
movq %rax,RAX-ARGOFFSET(%rsp)
+ia32_ret_from_sys_call:
+ CLEAR_RREGS -ARGOFFSET
jmp int_ret_from_sys_call
ia32_tracesys:
@@ -442,8 +451,8 @@ END(ia32_syscall)
ia32_badsys:
movq $0,ORIG_RAX-ARGOFFSET(%rsp)
- movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
- jmp int_ret_from_sys_call
+ movq $-ENOSYS,%rax
+ jmp ia32_sysret
quiet_ni_syscall:
movq $-ENOSYS,%rax
diff --git a/arch/x86/include/asm/amd_iommu.h b/arch/x86/include/asm/amd_iommu.h
index bdf96f119f06..9dbd4030f0cd 100644
--- a/arch/x86/include/asm/amd_iommu.h
+++ b/arch/x86/include/asm/amd_iommu.h
@@ -30,6 +30,7 @@ extern irqreturn_t amd_iommu_int_handler(int irq, void *data);
extern void amd_iommu_flush_all_domains(void);
extern void amd_iommu_flush_all_devices(void);
extern void amd_iommu_shutdown(void);
+extern void amd_iommu_apply_erratum_63(u16 devid);
#else
static inline int amd_iommu_init(void) { return -ENODEV; }
static inline void amd_iommu_detect(void) { }
diff --git a/arch/x86/include/asm/checksum_32.h b/arch/x86/include/asm/checksum_32.h
index 7c5ef8b14d92..46fc474fd819 100644
--- a/arch/x86/include/asm/checksum_32.h
+++ b/arch/x86/include/asm/checksum_32.h
@@ -161,7 +161,8 @@ static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
"adcl $0, %0 ;\n"
: "=&r" (sum)
: "r" (saddr), "r" (daddr),
- "r" (htonl(len)), "r" (htonl(proto)), "0" (sum));
+ "r" (htonl(len)), "r" (htonl(proto)), "0" (sum)
+ : "memory");
return csum_fold(sum);
}
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
index 83c1bc8d2e8a..8ac9d9ae129e 100644
--- a/arch/x86/include/asm/elf.h
+++ b/arch/x86/include/asm/elf.h
@@ -197,14 +197,8 @@ do { \
set_fs(USER_DS); \
} while (0)
-#define COMPAT_SET_PERSONALITY(ex) \
-do { \
- if (test_thread_flag(TIF_IA32)) \
- clear_thread_flag(TIF_ABI_PENDING); \
- else \
- set_thread_flag(TIF_ABI_PENDING); \
- current->personality |= force_personality32; \
-} while (0)
+void set_personality_ia32(void);
+#define COMPAT_SET_PERSONALITY(ex) set_personality_ia32()
#define COMPAT_ELF_PLATFORM ("i686")
@@ -299,6 +293,8 @@ do { \
#ifdef CONFIG_X86_32
+#define STACK_RND_MASK (0x7ff)
+
#define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO))
#define ARCH_DLINFO ARCH_DLINFO_IA32(vdso_enabled)
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h
index 7b2d71df39a6..ebd010795555 100644
--- a/arch/x86/include/asm/fixmap.h
+++ b/arch/x86/include/asm/fixmap.h
@@ -82,6 +82,9 @@ enum fixed_addresses {
#endif
FIX_DBGP_BASE,
FIX_EARLYCON_MEM_BASE,
+#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
+ FIX_OHCI1394_BASE,
+#endif
#ifdef CONFIG_X86_LOCAL_APIC
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
#endif
@@ -126,9 +129,6 @@ enum fixed_addresses {
FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 256 -
(__end_of_permanent_fixed_addresses & 255),
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1,
-#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
- FIX_OHCI1394_BASE,
-#endif
#ifdef CONFIG_X86_32
FIX_WP_TEST,
#endif
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index 330ee807f89e..e9e97a371ed4 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -159,6 +159,7 @@ extern int io_apic_get_redir_entries(int ioapic);
struct io_apic_irq_attr;
extern int io_apic_set_pci_routing(struct device *dev, int irq,
struct io_apic_irq_attr *irq_attr);
+void setup_IO_APIC_irq_extra(u32 gsi);
extern int (*ioapic_renumber_irq)(int ioapic, int irq);
extern void ioapic_init_mappings(void);
extern void ioapic_insert_resources(void);
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index eabdc1cfab5c..68d16d2650a2 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -618,6 +618,7 @@ void kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr);
void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code);
void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2,
u32 error_code);
+bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl);
int kvm_pic_set_irq(void *opaque, int irq, int level);
diff --git a/arch/x86/include/asm/kvm_x86_emulate.h b/arch/x86/include/asm/kvm_x86_emulate.h
index b7ed2c423116..7c18e1230f54 100644
--- a/arch/x86/include/asm/kvm_x86_emulate.h
+++ b/arch/x86/include/asm/kvm_x86_emulate.h
@@ -129,7 +129,7 @@ struct decode_cache {
u8 seg_override;
unsigned int d;
unsigned long regs[NR_VCPU_REGS];
- unsigned long eip;
+ unsigned long eip, eip_orig;
/* modrm */
u8 modrm;
u8 modrm_mod;
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 5cdd8d100ec9..1d16c972e2a0 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -214,5 +214,11 @@ void mce_log_therm_throt_event(__u64 status);
static inline void mce_log_therm_throt_event(__u64 status) {}
#endif
+#ifdef CONFIG_X86_THERMAL_VECTOR
+extern void mcheck_intel_therm_init(void);
+#else
+static inline void mcheck_intel_therm_init(void) { }
+#endif
+
#endif /* __KERNEL__ */
#endif /* _ASM_X86_MCE_H */
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 4fb37c8a0832..43b8adba7d41 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -528,10 +528,11 @@ int paravirt_disable_iospace(void);
#define EXTRA_CLOBBERS
#define VEXTRA_CLOBBERS
#else /* CONFIG_X86_64 */
+/* [re]ax isn't an arg, but the return val */
#define PVOP_VCALL_ARGS \
unsigned long __edi = __edi, __esi = __esi, \
- __edx = __edx, __ecx = __ecx
-#define PVOP_CALL_ARGS PVOP_VCALL_ARGS, __eax
+ __edx = __edx, __ecx = __ecx, __eax = __eax
+#define PVOP_CALL_ARGS PVOP_VCALL_ARGS
#define PVOP_CALL_ARG1(x) "D" ((unsigned long)(x))
#define PVOP_CALL_ARG2(x) "S" ((unsigned long)(x))
@@ -543,6 +544,7 @@ int paravirt_disable_iospace(void);
"=c" (__ecx)
#define PVOP_CALL_CLOBBERS PVOP_VCALL_CLOBBERS, "=a" (__eax)
+/* void functions are still allowed [re]ax for scratch */
#define PVOP_VCALLEE_CLOBBERS "=a" (__eax)
#define PVOP_CALLEE_CLOBBERS PVOP_VCALLEE_CLOBBERS
@@ -617,8 +619,8 @@ int paravirt_disable_iospace(void);
VEXTRA_CLOBBERS, \
pre, post, ##__VA_ARGS__)
-#define __PVOP_VCALLEESAVE(rettype, op, pre, post, ...) \
- ____PVOP_CALL(rettype, op.func, CLBR_RET_REG, \
+#define __PVOP_VCALLEESAVE(op, pre, post, ...) \
+ ____PVOP_VCALL(op.func, CLBR_RET_REG, \
PVOP_VCALLEE_CLOBBERS, , \
pre, post, ##__VA_ARGS__)
@@ -1565,42 +1567,22 @@ extern struct paravirt_patch_site __parainstructions[],
static inline unsigned long __raw_local_save_flags(void)
{
- unsigned long f;
-
- asm volatile(paravirt_alt(PARAVIRT_CALL)
- : "=a"(f)
- : paravirt_type(pv_irq_ops.save_fl),
- paravirt_clobber(CLBR_EAX)
- : "memory", "cc");
- return f;
+ return PVOP_CALLEE0(unsigned long, pv_irq_ops.save_fl);
}
static inline void raw_local_irq_restore(unsigned long f)
{
- asm volatile(paravirt_alt(PARAVIRT_CALL)
- : "=a"(f)
- : PV_FLAGS_ARG(f),
- paravirt_type(pv_irq_ops.restore_fl),
- paravirt_clobber(CLBR_EAX)
- : "memory", "cc");
+ PVOP_VCALLEE1(pv_irq_ops.restore_fl, f);
}
static inline void raw_local_irq_disable(void)
{
- asm volatile(paravirt_alt(PARAVIRT_CALL)
- :
- : paravirt_type(pv_irq_ops.irq_disable),
- paravirt_clobber(CLBR_EAX)
- : "memory", "eax", "cc");
+ PVOP_VCALLEE0(pv_irq_ops.irq_disable);
}
static inline void raw_local_irq_enable(void)
{
- asm volatile(paravirt_alt(PARAVIRT_CALL)
- :
- : paravirt_type(pv_irq_ops.irq_enable),
- paravirt_clobber(CLBR_EAX)
- : "memory", "eax", "cc");
+ PVOP_VCALLEE0(pv_irq_ops.irq_enable);
}
static inline unsigned long __raw_local_irq_save(void)
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index c7768269b1cf..70c6a939031b 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -179,7 +179,7 @@ static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
unsigned int *ecx, unsigned int *edx)
{
/* ecx is often an input as well as an output. */
- asm("cpuid"
+ asm volatile("cpuid"
: "=a" (*eax),
"=b" (*ebx),
"=c" (*ecx),
@@ -403,7 +403,17 @@ extern unsigned long kernel_eflags;
extern asmlinkage void ignore_sysret(void);
#else /* X86_64 */
#ifdef CONFIG_CC_STACKPROTECTOR
-DECLARE_PER_CPU(unsigned long, stack_canary);
+/*
+ * Make sure stack canary segment base is cached-aligned:
+ * "For Intel Atom processors, avoid non zero segment base address
+ * that is not aligned to cache line boundary at all cost."
+ * (Optim Ref Manual Assembly/Compiler Coding Rule 15.)
+ */
+struct stack_canary {
+ char __pad[20]; /* canary at %gs:20 */
+ unsigned long canary;
+};
+DECLARE_PER_CPU(struct stack_canary, stack_canary) ____cacheline_aligned;
#endif
#endif /* X86_64 */
diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h
index c2d742c6e15f..decad975e024 100644
--- a/arch/x86/include/asm/stackprotector.h
+++ b/arch/x86/include/asm/stackprotector.h
@@ -78,14 +78,14 @@ static __always_inline void boot_init_stack_canary(void)
#ifdef CONFIG_X86_64
percpu_write(irq_stack_union.stack_canary, canary);
#else
- percpu_write(stack_canary, canary);
+ percpu_write(stack_canary.canary, canary);
#endif
}
static inline void setup_stack_canary_segment(int cpu)
{
#ifdef CONFIG_X86_32
- unsigned long canary = (unsigned long)&per_cpu(stack_canary, cpu) - 20;
+ unsigned long canary = (unsigned long)&per_cpu(stack_canary, cpu);
struct desc_struct *gdt_table = get_cpu_gdt_table(cpu);
struct desc_struct desc;
diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h
index 643c59b4bc6e..5bd119be1142 100644
--- a/arch/x86/include/asm/system.h
+++ b/arch/x86/include/asm/system.h
@@ -31,7 +31,7 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
"movl %P[task_canary](%[next]), %%ebx\n\t" \
"movl %%ebx, "__percpu_arg([stack_canary])"\n\t"
#define __switch_canary_oparam \
- , [stack_canary] "=m" (per_cpu_var(stack_canary))
+ , [stack_canary] "=m" (per_cpu_var(stack_canary.canary))
#define __switch_canary_iparam \
, [task_canary] "i" (offsetof(struct task_struct, stack_canary))
#else /* CC_STACKPROTECTOR */
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h
index fad7d40b75f8..e4bcf0c00268 100644
--- a/arch/x86/include/asm/thread_info.h
+++ b/arch/x86/include/asm/thread_info.h
@@ -86,7 +86,6 @@ struct thread_info {
#define TIF_NOTSC 16 /* TSC is not accessible in userland */
#define TIF_IA32 17 /* 32bit process */
#define TIF_FORK 18 /* ret_from_fork */
-#define TIF_ABI_PENDING 19
#define TIF_MEMDIE 20
#define TIF_DEBUG 21 /* uses debug registers */
#define TIF_IO_BITMAP 22 /* uses I/O bitmap */
@@ -110,7 +109,6 @@ struct thread_info {
#define _TIF_NOTSC (1 << TIF_NOTSC)
#define _TIF_IA32 (1 << TIF_IA32)
#define _TIF_FORK (1 << TIF_FORK)
-#define _TIF_ABI_PENDING (1 << TIF_ABI_PENDING)
#define _TIF_DEBUG (1 << TIF_DEBUG)
#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP)
#define _TIF_FREEZE (1 << TIF_FREEZE)
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h
index 77a68505419a..ca1fe396ec0d 100644
--- a/arch/x86/include/asm/uv/uv_hub.h
+++ b/arch/x86/include/asm/uv/uv_hub.h
@@ -18,6 +18,8 @@
#include <asm/types.h>
#include <asm/percpu.h>
#include <asm/uv/uv_mmrs.h>
+#include <asm/irq_vectors.h>
+#include <asm/io_apic.h>
/*
@@ -420,9 +422,14 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value)
static inline void uv_hub_send_ipi(int pnode, int apicid, int vector)
{
unsigned long val;
+ unsigned long dmode = dest_Fixed;
+
+ if (vector == NMI_VECTOR)
+ dmode = dest_NMI;
val = (1UL << UVH_IPI_INT_SEND_SHFT) |
- ((apicid & 0x3f) << UVH_IPI_INT_APIC_ID_SHFT) |
+ ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) |
+ (dmode << UVH_IPI_INT_DELIVERY_MODE_SHFT) |
(vector << UVH_IPI_INT_VECTOR_SHFT);
uv_write_global_mmr64(pnode, UVH_IPI_INT, val);
}
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 6b8ca3a0285d..36411c325b8c 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -446,6 +446,12 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
{
*irq = gsi;
+
+#ifdef CONFIG_X86_IO_APIC
+ if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC)
+ setup_IO_APIC_irq_extra(gsi);
+#endif
+
return 0;
}
@@ -473,7 +479,8 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity);
}
#endif
- acpi_gsi_to_irq(plat_gsi, &irq);
+ irq = plat_gsi;
+
return irq;
}
diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c
index 8c44c232efcb..2e837f5080fe 100644
--- a/arch/x86/kernel/acpi/cstate.c
+++ b/arch/x86/kernel/acpi/cstate.c
@@ -48,7 +48,7 @@ void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags,
* P4, Core and beyond CPUs
*/
if (c->x86_vendor == X86_VENDOR_INTEL &&
- (c->x86 > 0x6 || (c->x86 == 6 && c->x86_model >= 14)))
+ (c->x86 > 0xf || (c->x86 == 6 && c->x86_model >= 0x0f)))
flags->bm_control = 0;
}
EXPORT_SYMBOL(acpi_processor_power_init_bm_check);
diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c
index d296f4a195c9..d85d1b2432ba 100644
--- a/arch/x86/kernel/acpi/processor.c
+++ b/arch/x86/kernel/acpi/processor.c
@@ -79,7 +79,8 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
struct cpuinfo_x86 *c = &cpu_data(pr->id);
pr->pdc = NULL;
- if (c->x86_vendor == X86_VENDOR_INTEL)
+ if (c->x86_vendor == X86_VENDOR_INTEL ||
+ c->x86_vendor == X86_VENDOR_CENTAUR)
init_intel_pdc(pr, c);
return;
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index 6c99f5037801..d7be38c297b0 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -485,8 +485,6 @@ void amd_iommu_flush_all_devices(void)
int i;
for (i = 0; i <= amd_iommu_last_bdf; ++i) {
- if (amd_iommu_pd_table[i] == NULL)
- continue;
iommu = amd_iommu_rlookup_table[i];
if (!iommu)
@@ -1114,6 +1112,8 @@ static void __detach_device(struct protection_domain *domain, u16 devid)
amd_iommu_dev_table[devid].data[1] = 0;
amd_iommu_dev_table[devid].data[2] = 0;
+ amd_iommu_apply_erratum_63(devid);
+
/* decrease reference counter */
domain->dev_cnt -= 1;
@@ -1873,10 +1873,10 @@ static void prealloc_protection_domains(void)
struct pci_dev *dev = NULL;
struct dma_ops_domain *dma_dom;
struct amd_iommu *iommu;
- u16 devid;
+ u16 devid, __devid;
while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
- devid = calc_devid(dev->bus->number, dev->devfn);
+ __devid = devid = calc_devid(dev->bus->number, dev->devfn);
if (devid > amd_iommu_last_bdf)
continue;
devid = amd_iommu_alias_table[devid];
@@ -1891,6 +1891,10 @@ static void prealloc_protection_domains(void)
init_unity_mappings_for_device(dma_dom, devid);
dma_dom->target_dev = devid;
+ attach_device(iommu, &dma_dom->domain, devid);
+ if (__devid != devid)
+ attach_device(iommu, &dma_dom->domain, __devid);
+
list_add_tail(&dma_dom->list, &iommu_pd_list);
}
}
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
index c1b17e97252e..ecd90502899c 100644
--- a/arch/x86/kernel/amd_iommu_init.c
+++ b/arch/x86/kernel/amd_iommu_init.c
@@ -240,7 +240,7 @@ static void iommu_feature_enable(struct amd_iommu *iommu, u8 bit)
writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET);
}
-static void __init iommu_feature_disable(struct amd_iommu *iommu, u8 bit)
+static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit)
{
u32 ctrl;
@@ -509,6 +509,26 @@ static void set_dev_entry_bit(u16 devid, u8 bit)
amd_iommu_dev_table[devid].data[i] |= (1 << _bit);
}
+static int get_dev_entry_bit(u16 devid, u8 bit)
+{
+ int i = (bit >> 5) & 0x07;
+ int _bit = bit & 0x1f;
+
+ return (amd_iommu_dev_table[devid].data[i] & (1 << _bit)) >> _bit;
+}
+
+
+void amd_iommu_apply_erratum_63(u16 devid)
+{
+ int sysmgt;
+
+ sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) |
+ (get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1);
+
+ if (sysmgt == 0x01)
+ set_dev_entry_bit(devid, DEV_ENTRY_IW);
+}
+
/* Writes the specific IOMMU for a device into the rlookup table */
static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
{
@@ -537,6 +557,8 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,
if (flags & ACPI_DEVFLAG_LINT1)
set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS);
+ amd_iommu_apply_erratum_63(devid);
+
set_iommu_for_device(iommu, devid);
}
@@ -893,7 +915,7 @@ static int __init init_iommu_all(struct acpi_table_header *table)
*
****************************************************************************/
-static int __init iommu_setup_msi(struct amd_iommu *iommu)
+static int iommu_setup_msi(struct amd_iommu *iommu)
{
int r;
diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c
index d0c99abc26c3..873f81f0bbd8 100644
--- a/arch/x86/kernel/apic/apic_flat_64.c
+++ b/arch/x86/kernel/apic/apic_flat_64.c
@@ -240,6 +240,11 @@ static int physflat_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
printk(KERN_DEBUG "system APIC only can use physical flat");
return 1;
}
+
+ if (!strncmp(oem_id, "IBM", 3) && !strncmp(oem_table_id, "EXA", 3)) {
+ printk(KERN_DEBUG "IBM Summit detected, will use apic physical");
+ return 1;
+ }
#endif
return 0;
diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c
index 8952a5890281..89174f847b49 100644
--- a/arch/x86/kernel/apic/es7000_32.c
+++ b/arch/x86/kernel/apic/es7000_32.c
@@ -167,7 +167,7 @@ static int es7000_apic_is_cluster(void)
{
/* MPENTIUMIII */
if (boot_cpu_data.x86 == 6 &&
- (boot_cpu_data.x86_model >= 7 || boot_cpu_data.x86_model <= 11))
+ (boot_cpu_data.x86_model >= 7 && boot_cpu_data.x86_model <= 11))
return 1;
return 0;
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index d2ed6c5ddc80..938b69d54a25 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1558,6 +1558,56 @@ static void __init setup_IO_APIC_irqs(void)
}
/*
+ * for the gsit that is not in first ioapic
+ * but could not use acpi_register_gsi()
+ * like some special sci in IBM x3330
+ */
+void setup_IO_APIC_irq_extra(u32 gsi)
+{
+ int apic_id = 0, pin, idx, irq;
+ int node = cpu_to_node(boot_cpu_id);
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+
+ /*
+ * Convert 'gsi' to 'ioapic.pin'.
+ */
+ apic_id = mp_find_ioapic(gsi);
+ if (apic_id < 0)
+ return;
+
+ pin = mp_find_ioapic_pin(apic_id, gsi);
+ idx = find_irq_entry(apic_id, pin, mp_INT);
+ if (idx == -1)
+ return;
+
+ irq = pin_2_irq(idx, apic_id, pin);
+#ifdef CONFIG_SPARSE_IRQ
+ desc = irq_to_desc(irq);
+ if (desc)
+ return;
+#endif
+ desc = irq_to_desc_alloc_node(irq, node);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", irq);
+ return;
+ }
+
+ cfg = desc->chip_data;
+ add_pin_to_irq_node(cfg, node, apic_id, pin);
+
+ if (test_bit(pin, mp_ioapic_routing[apic_id].pin_programmed)) {
+ pr_debug("Pin %d-%d already programmed\n",
+ mp_ioapics[apic_id].apicid, pin);
+ return;
+ }
+ set_bit(pin, mp_ioapic_routing[apic_id].pin_programmed);
+
+ setup_IO_APIC_irq(apic_id, pin, irq, desc,
+ irq_trigger(idx), irq_polarity(idx));
+}
+
+/*
* Set up the timer pin, possibly with the 8259A-master behind.
*/
static void __init setup_timer_IRQ0_pin(unsigned int apic_id, unsigned int pin,
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
index 601159374e87..055e3947bf28 100644
--- a/arch/x86/kernel/apic/x2apic_uv_x.c
+++ b/arch/x86/kernel/apic/x2apic_uv_x.c
@@ -352,14 +352,14 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size)
for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) {
alias.v = uv_read_local_mmr(redir_addrs[i].alias);
- if (alias.s.base == 0) {
+ if (alias.s.enable && alias.s.base == 0) {
*size = (1UL << alias.s.m_alias);
redirect.v = uv_read_local_mmr(redir_addrs[i].redirect);
*base = (unsigned long)redirect.s.dest_base << DEST_SHIFT;
return;
}
}
- BUG();
+ *base = *size = 0;
}
enum map_type {map_wb, map_uc};
@@ -609,12 +609,12 @@ void __init uv_system_init(void)
uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base;
uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size;
uv_cpu_hub_info(cpu)->m_val = m_val;
- uv_cpu_hub_info(cpu)->n_val = m_val;
+ uv_cpu_hub_info(cpu)->n_val = n_val;
uv_cpu_hub_info(cpu)->numa_blade_id = blade;
uv_cpu_hub_info(cpu)->blade_processor_id = lcpu;
uv_cpu_hub_info(cpu)->pnode = pnode;
uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask;
- uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1;
+ uv_cpu_hub_info(cpu)->gpa_mask = (1UL << (m_val + n_val)) - 1;
uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper;
uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra;
uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base;
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 5ce60a88027b..e338b5cfe0b0 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1043,7 +1043,7 @@ DEFINE_PER_CPU(struct orig_ist, orig_ist);
#else /* CONFIG_X86_64 */
#ifdef CONFIG_CC_STACKPROTECTOR
-DEFINE_PER_CPU(unsigned long, stack_canary);
+DEFINE_PER_CPU(struct stack_canary, stack_canary) ____cacheline_aligned;
#endif
/* Make sure %fs and %gs are initialized properly in idle threads */
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
index 2a50ef891000..8cbfb42cbef2 100644
--- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
+++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
@@ -605,9 +605,10 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst,
return 0;
}
-static void invalidate_entry(struct powernow_k8_data *data, unsigned int entry)
+static void invalidate_entry(struct cpufreq_frequency_table *powernow_table,
+ unsigned int entry)
{
- data->powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID;
+ powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID;
}
static void print_basics(struct powernow_k8_data *data)
@@ -914,13 +915,13 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data,
"bad value %d.\n", i, index);
printk(KERN_ERR PFX "Please report to BIOS "
"manufacturer\n");
- invalidate_entry(data, i);
+ invalidate_entry(powernow_table, i);
continue;
}
rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi);
if (!(hi & HW_PSTATE_VALID_MASK)) {
dprintk("invalid pstate %d, ignoring\n", index);
- invalidate_entry(data, i);
+ invalidate_entry(powernow_table, i);
continue;
}
@@ -970,7 +971,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data,
/* verify frequency is OK */
if ((freq > (MAX_FREQ * 1000)) || (freq < (MIN_FREQ * 1000))) {
dprintk("invalid freq %u kHz, ignoring\n", freq);
- invalidate_entry(data, i);
+ invalidate_entry(powernow_table, i);
continue;
}
@@ -978,7 +979,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data,
* BIOSs are using "off" to indicate invalid */
if (vid == VID_OFF) {
dprintk("invalid vid %u, ignoring\n", vid);
- invalidate_entry(data, i);
+ invalidate_entry(powernow_table, i);
continue;
}
@@ -997,7 +998,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data,
dprintk("double low frequency table entry, "
"ignoring it.\n");
- invalidate_entry(data, i);
+ invalidate_entry(powernow_table, i);
continue;
} else
cntlofreq = i;
@@ -1009,7 +1010,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data,
(unsigned int)
(data->acpi_data.states[i].core_frequency
* 1000));
- invalidate_entry(data, i);
+ invalidate_entry(powernow_table, i);
continue;
}
}
@@ -1371,6 +1372,7 @@ static int __devexit powernowk8_cpu_exit(struct cpufreq_policy *pol)
kfree(data->powernow_table);
kfree(data);
+ per_cpu(powernow_data, pol->cpu) = NULL;
return 0;
}
@@ -1390,7 +1392,7 @@ static unsigned int powernowk8_get(unsigned int cpu)
int err;
if (!data)
- return -EINVAL;
+ return 0;
smp_call_function_single(cpu, query_values_on_cpu, &err, true);
if (err)
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c
index 6911e91fb4f6..3ae5a7a3a500 100644
--- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c
+++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c
@@ -232,28 +232,23 @@ static unsigned int speedstep_detect_chipset(void)
return 0;
}
-struct get_freq_data {
- unsigned int speed;
- unsigned int processor;
-};
-
-static void get_freq_data(void *_data)
+static void get_freq_data(void *_speed)
{
- struct get_freq_data *data = _data;
+ unsigned int *speed = _speed;
- data->speed = speedstep_get_frequency(data->processor);
+ *speed = speedstep_get_frequency(speedstep_processor);
}
static unsigned int speedstep_get(unsigned int cpu)
{
- struct get_freq_data data = { .processor = cpu };
+ unsigned int speed;
/* You're supposed to ensure CPU is online. */
- if (smp_call_function_single(cpu, get_freq_data, &data, 1) != 0)
+ if (smp_call_function_single(cpu, get_freq_data, &speed, 1) != 0)
BUG();
- dprintk("detected %u kHz as current frequency\n", data.speed);
- return data.speed;
+ dprintk("detected %u kHz as current frequency\n", speed);
+ return speed;
}
/**
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c
index 789efe217e1a..781130fd31fc 100644
--- a/arch/x86/kernel/cpu/intel_cacheinfo.c
+++ b/arch/x86/kernel/cpu/intel_cacheinfo.c
@@ -93,7 +93,7 @@ static const struct _cache_table __cpuinitconst cache_table[] =
{ 0xd1, LVL_3, 1024 }, /* 4-way set assoc, 64 byte line size */
{ 0xd2, LVL_3, 2048 }, /* 4-way set assoc, 64 byte line size */
{ 0xd6, LVL_3, 1024 }, /* 8-way set assoc, 64 byte line size */
- { 0xd7, LVL_3, 2038 }, /* 8-way set assoc, 64 byte line size */
+ { 0xd7, LVL_3, 2048 }, /* 8-way set assoc, 64 byte line size */
{ 0xd8, LVL_3, 4096 }, /* 12-way set assoc, 64 byte line size */
{ 0xdc, LVL_3, 2048 }, /* 12-way set assoc, 64 byte line size */
{ 0xdd, LVL_3, 4096 }, /* 12-way set assoc, 64 byte line size */
@@ -101,6 +101,9 @@ static const struct _cache_table __cpuinitconst cache_table[] =
{ 0xe2, LVL_3, 2048 }, /* 16-way set assoc, 64 byte line size */
{ 0xe3, LVL_3, 4096 }, /* 16-way set assoc, 64 byte line size */
{ 0xe4, LVL_3, 8192 }, /* 16-way set assoc, 64 byte line size */
+ { 0xea, LVL_3, 12288 }, /* 24-way set assoc, 64 byte line size */
+ { 0xeb, LVL_3, 18432 }, /* 24-way set assoc, 64 byte line size */
+ { 0xec, LVL_3, 24576 }, /* 24-way set assoc, 64 byte line size */
{ 0x00, 0, 0}
};
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
index 01213048f62f..4192c500317e 100644
--- a/arch/x86/kernel/cpu/mcheck/mce.c
+++ b/arch/x86/kernel/cpu/mcheck/mce.c
@@ -1327,13 +1327,14 @@ static void mce_init_timer(void)
struct timer_list *t = &__get_cpu_var(mce_timer);
int *n = &__get_cpu_var(next_interval);
+ setup_timer(t, mcheck_timer, smp_processor_id());
+
if (mce_ignore_ce)
return;
*n = check_interval * HZ;
if (!*n)
return;
- setup_timer(t, mcheck_timer, smp_processor_id());
t->expires = round_jiffies(jiffies + *n);
add_timer_on(t, smp_processor_id());
}
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c
index 5957a93e5173..a14a45194076 100644
--- a/arch/x86/kernel/cpu/mcheck/therm_throt.c
+++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c
@@ -34,20 +34,33 @@
/* How long to wait between reporting thermal events */
#define CHECK_INTERVAL (300 * HZ)
-static DEFINE_PER_CPU(__u64, next_check) = INITIAL_JIFFIES;
-static DEFINE_PER_CPU(unsigned long, thermal_throttle_count);
-static DEFINE_PER_CPU(bool, thermal_throttle_active);
+/*
+ * Current thermal throttling state:
+ */
+struct thermal_state {
+ bool is_throttled;
+
+ u64 next_check;
+ unsigned long throttle_count;
+ unsigned long last_throttle_count;
+};
+
+static DEFINE_PER_CPU(struct thermal_state, thermal_state);
-static atomic_t therm_throt_en = ATOMIC_INIT(0);
+static atomic_t therm_throt_en = ATOMIC_INIT(0);
+
+static u32 lvtthmr_init __read_mostly;
#ifdef CONFIG_SYSFS
#define define_therm_throt_sysdev_one_ro(_name) \
static SYSDEV_ATTR(_name, 0444, therm_throt_sysdev_show_##_name, NULL)
#define define_therm_throt_sysdev_show_func(name) \
-static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev, \
- struct sysdev_attribute *attr, \
- char *buf) \
+ \
+static ssize_t therm_throt_sysdev_show_##name( \
+ struct sys_device *dev, \
+ struct sysdev_attribute *attr, \
+ char *buf) \
{ \
unsigned int cpu = dev->id; \
ssize_t ret; \
@@ -55,7 +68,7 @@ static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev, \
preempt_disable(); /* CPU hotplug */ \
if (cpu_online(cpu)) \
ret = sprintf(buf, "%lu\n", \
- per_cpu(thermal_throttle_##name, cpu)); \
+ per_cpu(thermal_state, cpu).name); \
else \
ret = 0; \
preempt_enable(); \
@@ -63,11 +76,11 @@ static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev, \
return ret; \
}
-define_therm_throt_sysdev_show_func(count);
-define_therm_throt_sysdev_one_ro(count);
+define_therm_throt_sysdev_show_func(throttle_count);
+define_therm_throt_sysdev_one_ro(throttle_count);
static struct attribute *thermal_throttle_attrs[] = {
- &attr_count.attr,
+ &attr_throttle_count.attr,
NULL
};
@@ -93,33 +106,39 @@ static struct attribute_group thermal_throttle_attr_group = {
* 1 : Event should be logged further, and a message has been
* printed to the syslog.
*/
-static int therm_throt_process(int curr)
+static int therm_throt_process(bool is_throttled)
{
- unsigned int cpu = smp_processor_id();
- __u64 tmp_jiffs = get_jiffies_64();
- bool was_throttled = __get_cpu_var(thermal_throttle_active);
- bool is_throttled = __get_cpu_var(thermal_throttle_active) = curr;
+ struct thermal_state *state;
+ unsigned int this_cpu;
+ bool was_throttled;
+ u64 now;
+
+ this_cpu = smp_processor_id();
+ now = get_jiffies_64();
+ state = &per_cpu(thermal_state, this_cpu);
+
+ was_throttled = state->is_throttled;
+ state->is_throttled = is_throttled;
if (is_throttled)
- __get_cpu_var(thermal_throttle_count)++;
+ state->throttle_count++;
- if (!(was_throttled ^ is_throttled) &&
- time_before64(tmp_jiffs, __get_cpu_var(next_check)))
+ if (time_before64(now, state->next_check) &&
+ state->throttle_count != state->last_throttle_count)
return 0;
- __get_cpu_var(next_check) = tmp_jiffs + CHECK_INTERVAL;
+ state->next_check = now + CHECK_INTERVAL;
+ state->last_throttle_count = state->throttle_count;
/* if we just entered the thermal event */
if (is_throttled) {
- printk(KERN_CRIT "CPU%d: Temperature above threshold, "
- "cpu clock throttled (total events = %lu)\n",
- cpu, __get_cpu_var(thermal_throttle_count));
+ printk(KERN_CRIT "CPU%d: Temperature above threshold, cpu clock throttled (total events = %lu)\n", this_cpu, state->throttle_count);
add_taint(TAINT_MACHINE_CHECK);
return 1;
}
if (was_throttled) {
- printk(KERN_INFO "CPU%d: Temperature/speed normal\n", cpu);
+ printk(KERN_INFO "CPU%d: Temperature/speed normal\n", this_cpu);
return 1;
}
@@ -213,7 +232,7 @@ static void intel_thermal_interrupt(void)
__u64 msr_val;
rdmsrl(MSR_IA32_THERM_STATUS, msr_val);
- if (therm_throt_process(msr_val & THERM_STATUS_PROCHOT))
+ if (therm_throt_process((msr_val & THERM_STATUS_PROCHOT) != 0))
mce_log_therm_throt_event(msr_val);
}
@@ -237,6 +256,18 @@ asmlinkage void smp_thermal_interrupt(struct pt_regs *regs)
ack_APIC_irq();
}
+void __init mcheck_intel_therm_init(void)
+{
+ /*
+ * This function is only called on boot CPU. Save the init thermal
+ * LVT value on BSP and use that value to restore APs' thermal LVT
+ * entry BIOS programmed later
+ */
+ if (cpu_has(&boot_cpu_data, X86_FEATURE_ACPI) &&
+ cpu_has(&boot_cpu_data, X86_FEATURE_ACC))
+ lvtthmr_init = apic_read(APIC_LVTTHMR);
+}
+
void intel_init_thermal(struct cpuinfo_x86 *c)
{
unsigned int cpu = smp_processor_id();
@@ -253,7 +284,20 @@ void intel_init_thermal(struct cpuinfo_x86 *c)
* since it might be delivered via SMI already:
*/
rdmsr(MSR_IA32_MISC_ENABLE, l, h);
- h = apic_read(APIC_LVTTHMR);
+
+ /*
+ * The initial value of thermal LVT entries on all APs always reads
+ * 0x10000 because APs are woken up by BSP issuing INIT-SIPI-SIPI
+ * sequence to them and LVT registers are reset to 0s except for
+ * the mask bits which are set to 1s when APs receive INIT IPI.
+ * Always restore the value that BIOS has programmed on AP based on
+ * BSP's info we saved since BIOS is always setting the same value
+ * for all threads/cores
+ */
+ apic_write(APIC_LVTTHMR, lvtthmr_init);
+
+ h = lvtthmr_init;
+
if ((l & MSR_IA32_MISC_ENABLE_TM1) && (h & APIC_DM_SMI)) {
printk(KERN_DEBUG
"CPU%d: Thermal monitoring handled by SMI\n", cpu);
diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c
index e60ed740d2b3..d23746ec8796 100644
--- a/arch/x86/kernel/cpu/perfctr-watchdog.c
+++ b/arch/x86/kernel/cpu/perfctr-watchdog.c
@@ -711,7 +711,7 @@ static void probe_nmi_watchdog(void)
switch (boot_cpu_data.x86_vendor) {
case X86_VENDOR_AMD:
if (boot_cpu_data.x86 != 6 && boot_cpu_data.x86 != 15 &&
- boot_cpu_data.x86 != 16)
+ boot_cpu_data.x86 != 16 && boot_cpu_data.x86 != 17)
return;
wd_ops = &k7_wd_ops;
break;
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
index 5cb5725b2bae..0bc204d1166b 100644
--- a/arch/x86/kernel/e820.c
+++ b/arch/x86/kernel/e820.c
@@ -1378,8 +1378,8 @@ static unsigned long ram_alignment(resource_size_t pos)
if (mb < 16)
return 1024*1024;
- /* To 32MB for anything above that */
- return 32*1024*1024;
+ /* To 64MB for anything above that */
+ return 64*1024*1024;
}
#define MAX_RESOURCE_SIZE ((resource_size_t)-1)
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index cc827ac9e8d3..7ffec6b3b331 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -439,7 +439,6 @@ is386: movl $2,%ecx # set MP
jne 1f
movl $per_cpu__gdt_page,%eax
movl $per_cpu__stack_canary,%ecx
- subl $20, %ecx
movw %cx, 8 * GDT_ENTRY_STACK_CANARY + 2(%eax)
shrl $16, %ecx
movb %cl, 8 * GDT_ENTRY_STACK_CANARY + 4(%eax)
diff --git a/arch/x86/kernel/i8253.c b/arch/x86/kernel/i8253.c
index 5cf36c053ac4..da890f03d078 100644
--- a/arch/x86/kernel/i8253.c
+++ b/arch/x86/kernel/i8253.c
@@ -21,8 +21,10 @@ EXPORT_SYMBOL(i8253_lock);
#ifdef CONFIG_X86_32
static void pit_disable_clocksource(void);
+static void pit_enable_clocksource(void);
#else
static inline void pit_disable_clocksource(void) { }
+static inline void pit_enable_clocksource(void) { }
#endif
/*
@@ -67,7 +69,7 @@ static void init_pit_timer(enum clock_event_mode mode,
break;
case CLOCK_EVT_MODE_RESUME:
- /* Nothing to do here */
+ pit_enable_clocksource();
break;
}
spin_unlock(&i8253_lock);
@@ -200,19 +202,27 @@ static struct clocksource pit_cs = {
.shift = 20,
};
+int pit_cs_registered;
static void pit_disable_clocksource(void)
{
- /*
- * Use mult to check whether it is registered or not
- */
- if (pit_cs.mult) {
+ if (pit_cs_registered) {
clocksource_unregister(&pit_cs);
- pit_cs.mult = 0;
+ pit_cs_registered = 0;
+ }
+}
+
+static void pit_enable_clocksource(void)
+{
+ if (!pit_cs_registered && !clocksource_register(&pit_cs)) {
+ pit_cs_registered = 1;
}
}
+
+
static int __init init_pit_clocksource(void)
{
+ int ret;
/*
* Several reasons not to register PIT as a clocksource:
*
@@ -226,7 +236,10 @@ static int __init init_pit_clocksource(void)
pit_cs.mult = clocksource_hz2mult(CLOCK_TICK_RATE, pit_cs.shift);
- return clocksource_register(&pit_cs);
+ ret = clocksource_register(&pit_cs);
+ if (!ret)
+ pit_cs_registered = 1;
+ return ret;
}
arch_initcall(init_pit_clocksource);
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index c664d515f613..63b0ec8d3d4a 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -34,7 +34,6 @@
struct kvm_para_state {
u8 mmu_queue[MMU_QUEUE_SIZE];
int mmu_queue_len;
- enum paravirt_lazy_mode mode;
};
static DEFINE_PER_CPU(struct kvm_para_state, para_state);
@@ -77,7 +76,7 @@ static void kvm_deferred_mmu_op(void *buffer, int len)
{
struct kvm_para_state *state = kvm_para_state();
- if (state->mode != PARAVIRT_LAZY_MMU) {
+ if (paravirt_get_lazy_mode() != PARAVIRT_LAZY_MMU) {
kvm_mmu_op(buffer, len);
return;
}
@@ -185,10 +184,7 @@ static void kvm_release_pt(unsigned long pfn)
static void kvm_enter_lazy_mmu(void)
{
- struct kvm_para_state *state = kvm_para_state();
-
paravirt_enter_lazy_mmu();
- state->mode = paravirt_get_lazy_mode();
}
static void kvm_leave_lazy_mmu(void)
@@ -197,7 +193,6 @@ static void kvm_leave_lazy_mmu(void)
mmu_queue_flush(state);
paravirt_leave_lazy_mmu();
- state->mode = paravirt_get_lazy_mode();
}
static void __init paravirt_ops_setup(void)
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
index 223af43f1526..e5efcdcca31b 100644
--- a/arch/x86/kernel/kvmclock.c
+++ b/arch/x86/kernel/kvmclock.c
@@ -50,8 +50,8 @@ static unsigned long kvm_get_wallclock(void)
struct timespec ts;
int low, high;
- low = (int)__pa(&wall_clock);
- high = ((u64)__pa(&wall_clock) >> 32);
+ low = (int)__pa_symbol(&wall_clock);
+ high = ((u64)__pa_symbol(&wall_clock) >> 32);
native_write_msr(MSR_KVM_WALL_CLOCK, low, high);
vcpu_time = &get_cpu_var(hv_clock);
diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c
index 9371448290ac..0511035f3b84 100644
--- a/arch/x86/kernel/microcode_core.c
+++ b/arch/x86/kernel/microcode_core.c
@@ -210,8 +210,8 @@ static ssize_t microcode_write(struct file *file, const char __user *buf,
{
ssize_t ret = -EINVAL;
- if ((len >> PAGE_SHIFT) > num_physpages) {
- pr_err("microcode: too much data (max %ld pages)\n", num_physpages);
+ if ((len >> PAGE_SHIFT) > totalram_pages) {
+ pr_err("microcode: too much data (max %ld pages)\n", totalram_pages);
return ret;
}
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c
index 971a3bec47a8..e6ec8a2df1c3 100644
--- a/arch/x86/kernel/pci-calgary_64.c
+++ b/arch/x86/kernel/pci-calgary_64.c
@@ -318,13 +318,15 @@ static inline struct iommu_table *find_iommu_table(struct device *dev)
pdev = to_pci_dev(dev);
+ /* search up the device tree for an iommu */
pbus = pdev->bus;
-
- /* is the device behind a bridge? Look for the root bus */
- while (pbus->parent)
+ do {
+ tbl = pci_iommu(pbus);
+ if (tbl && tbl->it_busno == pbus->number)
+ break;
+ tbl = NULL;
pbus = pbus->parent;
-
- tbl = pci_iommu(pbus);
+ } while (pbus);
BUG_ON(tbl && (tbl->it_busno != pbus->number));
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
index 1a041bcf506b..953667c7487f 100644
--- a/arch/x86/kernel/pci-dma.c
+++ b/arch/x86/kernel/pci-dma.c
@@ -203,7 +203,7 @@ static __init int iommu_setup(char *p)
if (!strncmp(p, "allowdac", 8))
forbid_dac = 0;
if (!strncmp(p, "nodac", 5))
- forbid_dac = -1;
+ forbid_dac = 1;
if (!strncmp(p, "usedac", 6)) {
forbid_dac = -1;
return 1;
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
index d2e56b8f48e7..6f711b3a84d7 100644
--- a/arch/x86/kernel/pci-gart_64.c
+++ b/arch/x86/kernel/pci-gart_64.c
@@ -856,7 +856,7 @@ void __init gart_parse_options(char *p)
#endif
if (isdigit(*p) && get_option(&p, &arg))
iommu_size = arg;
- if (!strncmp(p, "fullflush", 8))
+ if (!strncmp(p, "fullflush", 9))
iommu_fullflush = 1;
if (!strncmp(p, "nofullflush", 11))
iommu_fullflush = 0;
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 071166a4ba83..a35fcbd9fe38 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -94,18 +94,6 @@ void flush_thread(void)
{
struct task_struct *tsk = current;
-#ifdef CONFIG_X86_64
- if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) {
- clear_tsk_thread_flag(tsk, TIF_ABI_PENDING);
- if (test_tsk_thread_flag(tsk, TIF_IA32)) {
- clear_tsk_thread_flag(tsk, TIF_IA32);
- } else {
- set_tsk_thread_flag(tsk, TIF_IA32);
- current_thread_info()->status |= TS_COMPAT;
- }
- }
-#endif
-
clear_tsk_thread_flag(tsk, TIF_DEBUG);
tsk->thread.debugreg0 = 0;
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index ebefb5407b9d..80c2372ec3cb 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -534,6 +534,17 @@ sys_clone(unsigned long clone_flags, unsigned long newsp,
return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
}
+void set_personality_ia32(void)
+{
+ /* inherit personality from parent */
+
+ /* Make sure to be in 32bit mode */
+ set_thread_flag(TIF_IA32);
+
+ /* Prepare the first "return" to user space */
+ current_thread_info()->status |= TS_COMPAT;
+}
+
unsigned long get_wchan(struct task_struct *p)
{
unsigned long stack;
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index 09ecbde91c13..96e2a86ac86a 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -417,14 +417,14 @@ static int genregs_get(struct task_struct *target,
{
if (kbuf) {
unsigned long *k = kbuf;
- while (count > 0) {
+ while (count >= sizeof(*k)) {
*k++ = getreg(target, pos);
count -= sizeof(*k);
pos += sizeof(*k);
}
} else {
unsigned long __user *u = ubuf;
- while (count > 0) {
+ while (count >= sizeof(*u)) {
if (__put_user(getreg(target, pos), u++))
return -EFAULT;
count -= sizeof(*u);
@@ -443,14 +443,14 @@ static int genregs_set(struct task_struct *target,
int ret = 0;
if (kbuf) {
const unsigned long *k = kbuf;
- while (count > 0 && !ret) {
+ while (count >= sizeof(*k) && !ret) {
ret = putreg(target, pos, *k++);
count -= sizeof(*k);
pos += sizeof(*k);
}
} else {
const unsigned long __user *u = ubuf;
- while (count > 0 && !ret) {
+ while (count >= sizeof(*u) && !ret) {
unsigned long word;
ret = __get_user(word, u++);
if (ret)
@@ -1223,14 +1223,14 @@ static int genregs32_get(struct task_struct *target,
{
if (kbuf) {
compat_ulong_t *k = kbuf;
- while (count > 0) {
+ while (count >= sizeof(*k)) {
getreg32(target, pos, k++);
count -= sizeof(*k);
pos += sizeof(*k);
}
} else {
compat_ulong_t __user *u = ubuf;
- while (count > 0) {
+ while (count >= sizeof(*u)) {
compat_ulong_t word;
getreg32(target, pos, &word);
if (__put_user(word, u++))
@@ -1251,14 +1251,14 @@ static int genregs32_set(struct task_struct *target,
int ret = 0;
if (kbuf) {
const compat_ulong_t *k = kbuf;
- while (count > 0 && !ret) {
+ while (count >= sizeof(*k) && !ret) {
ret = putreg32(target, pos, *k++);
count -= sizeof(*k);
pos += sizeof(*k);
}
} else {
const compat_ulong_t __user *u = ubuf;
- while (count > 0 && !ret) {
+ while (count >= sizeof(*u) && !ret) {
compat_ulong_t word;
ret = __get_user(word, u++);
if (ret)
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index a06e8d101844..df1e1cb8fe4d 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -257,6 +257,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "SBC-FITPC2"),
},
},
+ { /* Handle problems with rebooting on ASUS P4S800 */
+ .callback = set_bios_reboot,
+ .ident = "ASUS P4S800",
+ .matches = {
+ DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+ DMI_MATCH(DMI_BOARD_NAME, "P4S800"),
+ },
+ },
{ }
};
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 63f32d220ef2..860ed56aa4c4 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -107,6 +107,7 @@
#ifdef CONFIG_X86_64
#include <asm/numa_64.h>
#endif
+#include <asm/mce.h>
#ifndef ARCH_SETUP
#define ARCH_SETUP
@@ -1030,6 +1031,8 @@ void __init setup_arch(char **cmdline_p)
conswitchp = &dummy_con;
#endif
#endif
+
+ mcheck_intel_therm_init();
}
#ifdef CONFIG_X86_32
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c
index 77b9689f8edb..9848980dbbc0 100644
--- a/arch/x86/kernel/tlb_uv.c
+++ b/arch/x86/kernel/tlb_uv.c
@@ -843,8 +843,8 @@ static int __init uv_bau_init(void)
GFP_KERNEL, cpu_to_node(cur_cpu));
uv_bau_retry_limit = 1;
- uv_nshift = uv_hub_info->n_val;
- uv_mmask = (1UL << uv_hub_info->n_val) - 1;
+ uv_nshift = uv_hub_info->m_val;
+ uv_mmask = (1UL << uv_hub_info->m_val) - 1;
nblades = uv_num_possible_blades();
uv_bau_table_bases = (struct bau_control **)
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index 21f68e00524f..5c8bffff6bd7 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -116,7 +116,7 @@ static s64 __kpit_elapsed(struct kvm *kvm)
* itself with the initial count and continues counting
* from there.
*/
- remaining = hrtimer_expires_remaining(&ps->pit_timer.timer);
+ remaining = hrtimer_get_remaining(&ps->pit_timer.timer);
elapsed = ps->pit_timer.period - ktime_to_ns(remaining);
elapsed = mod_64(elapsed, ps->pit_timer.period);
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index ae99d83f81a3..9a65123b798e 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -464,7 +464,7 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic)
if (apic_get_reg(apic, APIC_TMICT) == 0)
return 0;
- remaining = hrtimer_expires_remaining(&apic->lapic_timer.timer);
+ remaining = hrtimer_get_remaining(&apic->lapic_timer.timer);
if (ktime_to_ns(remaining) < 0)
remaining = ktime_set(0, 0);
@@ -567,12 +567,21 @@ static void start_apic_timer(struct kvm_lapic *apic)
{
ktime_t now = apic->lapic_timer.timer.base->get_time();
- apic->lapic_timer.period = apic_get_reg(apic, APIC_TMICT) *
+ apic->lapic_timer.period = (u64)apic_get_reg(apic, APIC_TMICT) *
APIC_BUS_CYCLE_NS * apic->divide_count;
atomic_set(&apic->lapic_timer.pending, 0);
if (!apic->lapic_timer.period)
return;
+ /*
+ * Do not allow the guest to program periodic timers with small
+ * interval, since the hrtimers are not throttled by the host
+ * scheduler.
+ */
+ if (apic_lvtt_period(apic)) {
+ if (apic->lapic_timer.period < NSEC_PER_MSEC/2)
+ apic->lapic_timer.period = NSEC_PER_MSEC/2;
+ }
hrtimer_start(&apic->lapic_timer.timer,
ktime_add_ns(now, apic->lapic_timer.period),
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 0ef5bb2b4043..47122930a8bb 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -2633,7 +2633,8 @@ EXPORT_SYMBOL_GPL(kvm_mmu_unprotect_page_virt);
void __kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu)
{
- while (vcpu->kvm->arch.n_free_mmu_pages < KVM_REFILL_PAGES) {
+ while (vcpu->kvm->arch.n_free_mmu_pages < KVM_REFILL_PAGES &&
+ !list_empty(&vcpu->kvm->arch.active_mmu_pages)) {
struct kvm_mmu_page *sp;
sp = container_of(vcpu->kvm->arch.active_mmu_pages.prev,
@@ -2712,12 +2713,6 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu)
ASSERT(vcpu);
- if (vcpu->kvm->arch.n_requested_mmu_pages)
- vcpu->kvm->arch.n_free_mmu_pages =
- vcpu->kvm->arch.n_requested_mmu_pages;
- else
- vcpu->kvm->arch.n_free_mmu_pages =
- vcpu->kvm->arch.n_alloc_mmu_pages;
/*
* When emulating 32-bit mode, cr3 is only 32 bits even on x86_64.
* Therefore we need to allocate shadow page tables in the first
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index b1f658ad2f06..4ac68999c7b0 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -709,6 +709,8 @@ static void svm_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
rdtscll(tsc_this);
delta = vcpu->arch.host_tsc - tsc_this;
svm->vmcb->control.tsc_offset += delta;
+ if (is_nested(svm))
+ svm->hsave->control.tsc_offset += delta;
vcpu->cpu = cpu;
kvm_migrate_timers(vcpu);
svm->asid_generation = 0;
@@ -1954,10 +1956,14 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data)
switch (ecx) {
case MSR_IA32_TIME_STAMP_COUNTER: {
- u64 tsc;
+ u64 tsc_offset;
- rdtscll(tsc);
- *data = svm->vmcb->control.tsc_offset + tsc;
+ if (is_nested(svm))
+ tsc_offset = svm->hsave->control.tsc_offset;
+ else
+ tsc_offset = svm->vmcb->control.tsc_offset;
+
+ *data = tsc_offset + native_read_tsc();
break;
}
case MSR_K6_STAR:
@@ -2044,10 +2050,17 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data)
switch (ecx) {
case MSR_IA32_TIME_STAMP_COUNTER: {
- u64 tsc;
+ u64 tsc_offset = data - native_read_tsc();
+ u64 g_tsc_offset = 0;
+
+ if (is_nested(svm)) {
+ g_tsc_offset = svm->vmcb->control.tsc_offset -
+ svm->hsave->control.tsc_offset;
+ svm->hsave->control.tsc_offset = tsc_offset;
+ }
+
+ svm->vmcb->control.tsc_offset = tsc_offset + g_tsc_offset;
- rdtscll(tsc);
- svm->vmcb->control.tsc_offset = data - tsc;
break;
}
case MSR_K6_STAR:
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 29f912927a58..ff72e4d85696 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -661,7 +661,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
if (vcpu->cpu != cpu) {
vcpu_clear(vmx);
kvm_migrate_timers(vcpu);
- vpid_sync_vcpu_all(vmx);
+ set_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests);
local_irq_disable();
list_add(&vmx->local_vcpus_link,
&per_cpu(vcpus_on_cpu, cpu));
@@ -1217,12 +1217,9 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf)
if (_cpu_based_2nd_exec_control & SECONDARY_EXEC_ENABLE_EPT) {
/* CR3 accesses and invlpg don't need to cause VM Exits when EPT
enabled */
- min &= ~(CPU_BASED_CR3_LOAD_EXITING |
- CPU_BASED_CR3_STORE_EXITING |
- CPU_BASED_INVLPG_EXITING);
- if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_PROCBASED_CTLS,
- &_cpu_based_exec_control) < 0)
- return -EIO;
+ _cpu_based_exec_control &= ~(CPU_BASED_CR3_LOAD_EXITING |
+ CPU_BASED_CR3_STORE_EXITING |
+ CPU_BASED_INVLPG_EXITING);
rdmsr(MSR_IA32_VMX_EPT_VPID_CAP,
vmx_capability.ept, vmx_capability.vpid);
}
@@ -1572,7 +1569,6 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0,
vcpu->arch.cr0 = cr0;
vmx_set_cr4(vcpu, vcpu->arch.cr4);
*hw_cr0 |= X86_CR0_PE | X86_CR0_PG;
- *hw_cr0 &= ~X86_CR0_WP;
} else if (!is_paging(vcpu)) {
/* From nonpaging to paging */
vmcs_write32(CPU_BASED_VM_EXEC_CONTROL,
@@ -1581,9 +1577,10 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0,
CPU_BASED_CR3_STORE_EXITING));
vcpu->arch.cr0 = cr0;
vmx_set_cr4(vcpu, vcpu->arch.cr4);
- if (!(vcpu->arch.cr0 & X86_CR0_WP))
- *hw_cr0 &= ~X86_CR0_WP;
}
+
+ if (!(cr0 & X86_CR0_WP))
+ *hw_cr0 &= ~X86_CR0_WP;
}
static void ept_update_paging_mode_cr4(unsigned long *hw_cr4,
@@ -2841,6 +2838,8 @@ static int handle_dr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
unsigned long val;
int dr, reg;
+ if (!kvm_require_cpl(vcpu, 0))
+ return 1;
dr = vmcs_readl(GUEST_DR7);
if (dr & DR7_GD) {
/*
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 3d4529011828..26e454ccd0a8 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -215,6 +215,19 @@ static void __queue_exception(struct kvm_vcpu *vcpu)
}
/*
+ * Checks if cpl <= required_cpl; if true, return true. Otherwise queue
+ * a #GP and return false.
+ */
+bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl)
+{
+ if (kvm_x86_ops->get_cpl(vcpu) <= required_cpl)
+ return true;
+ kvm_queue_exception_e(vcpu, GP_VECTOR, 0);
+ return false;
+}
+EXPORT_SYMBOL_GPL(kvm_require_cpl);
+
+/*
* Load the pae pdptrs. Return true is they are all valid.
*/
int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3)
@@ -936,6 +949,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
case MSR_P6_EVNTSEL0:
case MSR_P6_EVNTSEL1:
case MSR_K7_EVNTSEL0:
+ case MSR_K8_INT_PENDING_MSG:
data = 0;
break;
case MSR_MTRRcap:
@@ -1416,6 +1430,8 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid,
if (cpuid->nent < 1)
goto out;
+ if (cpuid->nent > KVM_MAX_CPUID_ENTRIES)
+ cpuid->nent = KVM_MAX_CPUID_ENTRIES;
r = -ENOMEM;
cpuid_entries = vmalloc(sizeof(struct kvm_cpuid_entry2) * cpuid->nent);
if (!cpuid_entries)
@@ -1435,6 +1451,10 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid,
for (func = 0x80000001; func <= limit && nent < cpuid->nent; ++func)
do_cpuid_ent(&cpuid_entries[nent], func, 0,
&nent, cpuid->nent);
+ r = -E2BIG;
+ if (nent >= cpuid->nent)
+ goto out_free;
+
r = -EFAULT;
if (copy_to_user(entries, cpuid_entries,
nent * sizeof(struct kvm_cpuid_entry2)))
@@ -2898,6 +2918,11 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
a3 &= 0xFFFFFFFF;
}
+ if (kvm_x86_ops->get_cpl(vcpu) != 0) {
+ ret = -KVM_EPERM;
+ goto out;
+ }
+
switch (nr) {
case KVM_HC_VAPIC_POLL_IRQ:
ret = 0;
@@ -2909,6 +2934,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
ret = -KVM_ENOSYS;
break;
}
+out:
kvm_register_write(vcpu, VCPU_REGS_RAX, ret);
++vcpu->stat.hypercalls;
return r;
@@ -3179,6 +3205,9 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu)
if (!kvm_x86_ops->update_cr8_intercept)
return;
+ if (!vcpu->arch.apic)
+ return;
+
if (!vcpu->arch.apic->vapic_addr)
max_irr = kvm_lapic_find_highest_irr(vcpu);
else
@@ -3733,7 +3762,7 @@ static int save_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
return kvm_write_guest(vcpu->kvm, gpa, seg_desc, 8);
}
-static u32 get_tss_base_addr(struct kvm_vcpu *vcpu,
+static gpa_t get_tss_base_addr(struct kvm_vcpu *vcpu,
struct desc_struct *seg_desc)
{
u32 base_addr;
@@ -4099,13 +4128,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
vcpu->arch.cr2 = sregs->cr2;
mmu_reset_needed |= vcpu->arch.cr3 != sregs->cr3;
-
- down_read(&vcpu->kvm->slots_lock);
- if (gfn_to_memslot(vcpu->kvm, sregs->cr3 >> PAGE_SHIFT))
- vcpu->arch.cr3 = sregs->cr3;
- else
- set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests);
- up_read(&vcpu->kvm->slots_lock);
+ vcpu->arch.cr3 = sregs->cr3;
kvm_set_cr8(vcpu, sregs->cr8);
diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index 616de4628d60..4b12352d0399 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -60,6 +60,7 @@
#define SrcImmByte (6<<4) /* 8-bit sign-extended immediate operand. */
#define SrcOne (7<<4) /* Implied '1' */
#define SrcImmUByte (8<<4) /* 8-bit unsigned immediate operand. */
+#define SrcImmU (9<<4) /* Immediate operand, unsigned */
#define SrcMask (0xf<<4)
/* Generic ModRM decode. */
#define ModRM (1<<8)
@@ -195,7 +196,7 @@ static u32 opcode_table[256] = {
ByteOp | SrcImmUByte, SrcImmUByte,
/* 0xE8 - 0xEF */
SrcImm | Stack, SrcImm | ImplicitOps,
- SrcImm | Src2Imm16, SrcImmByte | ImplicitOps,
+ SrcImmU | Src2Imm16, SrcImmByte | ImplicitOps,
SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
/* 0xF0 - 0xF7 */
@@ -605,6 +606,9 @@ static int do_insn_fetch(struct x86_emulate_ctxt *ctxt,
{
int rc = 0;
+ /* x86 instructions are limited to 15 bytes. */
+ if (eip + size - ctxt->decode.eip_orig > 15)
+ return X86EMUL_UNHANDLEABLE;
eip += ctxt->cs_base;
while (size--) {
rc = do_fetch_insn_byte(ctxt, ops, eip++, dest++);
@@ -863,7 +867,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
/* Shadow copy of register state. Committed on successful emulation. */
memset(c, 0, sizeof(struct decode_cache));
- c->eip = kvm_rip_read(ctxt->vcpu);
+ c->eip = c->eip_orig = kvm_rip_read(ctxt->vcpu);
ctxt->cs_base = seg_base(ctxt, VCPU_SREG_CS);
memcpy(c->regs, ctxt->vcpu->arch.regs, sizeof c->regs);
@@ -1027,6 +1031,7 @@ done_prefixes:
c->src.type = OP_MEM;
break;
case SrcImm:
+ case SrcImmU:
c->src.type = OP_IMM;
c->src.ptr = (unsigned long *)c->eip;
c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
@@ -1044,6 +1049,19 @@ done_prefixes:
c->src.val = insn_fetch(s32, 4, c->eip);
break;
}
+ if ((c->d & SrcMask) == SrcImmU) {
+ switch (c->src.bytes) {
+ case 1:
+ c->src.val &= 0xff;
+ break;
+ case 2:
+ c->src.val &= 0xffff;
+ break;
+ case 4:
+ c->src.val &= 0xffffffff;
+ break;
+ }
+ }
break;
case SrcImmByte:
case SrcImmUByte:
diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile
index eefdeee8a871..0088329b564b 100644
--- a/arch/x86/mm/Makefile
+++ b/arch/x86/mm/Makefile
@@ -1,6 +1,11 @@
obj-y := init.o init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \
pat.o pgtable.o gup.o
+# Make sure __phys_addr has no stackprotector
+nostackp := $(call cc-option, -fno-stack-protector)
+CFLAGS_ioremap.o := $(nostackp)
+CFLAGS_init.o := $(nostackp)
+
obj-$(CONFIG_SMP) += tlb.o
obj-$(CONFIG_X86_32) += pgtable_32.o iomap_32.o
diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c
index 165829600566..c8191defc38a 100644
--- a/arch/x86/mm/mmap.c
+++ b/arch/x86/mm/mmap.c
@@ -29,13 +29,26 @@
#include <linux/random.h>
#include <linux/limits.h>
#include <linux/sched.h>
+#include <asm/elf.h>
+
+static unsigned int stack_maxrandom_size(void)
+{
+ unsigned int max = 0;
+ if ((current->flags & PF_RANDOMIZE) &&
+ !(current->personality & ADDR_NO_RANDOMIZE)) {
+ max = ((-1U) & STACK_RND_MASK) << PAGE_SHIFT;
+ }
+
+ return max;
+}
+
/*
* Top of mmap area (just below the process stack).
*
- * Leave an at least ~128 MB hole.
+ * Leave an at least ~128 MB hole with possible stack randomization.
*/
-#define MIN_GAP (128*1024*1024)
+#define MIN_GAP (128*1024*1024UL + stack_maxrandom_size())
#define MAX_GAP (TASK_SIZE/6*5)
/*
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 7e600c1962db..fbb46d62ee5d 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -143,6 +143,7 @@ void clflush_cache_range(void *vaddr, unsigned int size)
mb();
}
+EXPORT_SYMBOL_GPL(clflush_cache_range);
static void __cpa_flush_all(void *arg)
{
@@ -822,6 +823,7 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages,
{
struct cpa_data cpa;
int ret, cache, checkalias;
+ unsigned long baddr = 0;
/*
* Check, if we are requested to change a not supported
@@ -853,6 +855,11 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages,
*/
WARN_ON_ONCE(1);
}
+ /*
+ * Save address for cache flush. *addr is modified in the call
+ * to __change_page_attr_set_clr() below.
+ */
+ baddr = *addr;
}
/* Must avoid aliasing mappings in the highmem code */
@@ -900,7 +907,7 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages,
cpa_flush_array(addr, numpages, cache,
cpa.flags, pages);
} else
- cpa_flush_range(*addr, numpages, cache);
+ cpa_flush_range(baddr, numpages, cache);
} else
cpa_flush_all(cache);
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c
index 52e62e57fedd..5da8792b48a4 100644
--- a/arch/x86/pci/i386.c
+++ b/arch/x86/pci/i386.c
@@ -282,6 +282,15 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
return -EINVAL;
prot = pgprot_val(vma->vm_page_prot);
+
+ /*
+ * Return error if pat is not enabled and write_combine is requested.
+ * Caller can followup with UC MINUS request and add a WC mtrr if there
+ * is a free mtrr slot.
+ */
+ if (!pat_enabled && write_combine)
+ return -EINVAL;
+
if (pat_enabled && write_combine)
prot |= _PAGE_CACHE_WC;
else if (pat_enabled || boot_cpu_data.x86 > 3)
diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile
index 7410640db173..3bb4fc21f4f2 100644
--- a/arch/x86/xen/Makefile
+++ b/arch/x86/xen/Makefile
@@ -8,6 +8,7 @@ endif
# Make sure early boot has no stackprotector
nostackp := $(call cc-option, -fno-stack-protector)
CFLAGS_enlighten.o := $(nostackp)
+CFLAGS_mmu.o := $(nostackp)
obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \
time.o xen-asm.o xen-asm_$(BITS).o \
@@ -16,3 +17,4 @@ obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \
obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o
obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o
+
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index eb33aaa8415d..a11a115d82d3 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -51,6 +51,7 @@
#include <asm/pgtable.h>
#include <asm/tlbflush.h>
#include <asm/reboot.h>
+#include <asm/stackprotector.h>
#include "xen-ops.h"
#include "mmu.h"
@@ -177,6 +178,7 @@ static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0;
static void xen_cpuid(unsigned int *ax, unsigned int *bx,
unsigned int *cx, unsigned int *dx)
{
+ unsigned maskebx = ~0;
unsigned maskecx = ~0;
unsigned maskedx = ~0;
@@ -184,9 +186,16 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
* Mask out inconvenient features, to try and disable as many
* unsupported kernel subsystems as possible.
*/
- if (*ax == 1) {
+ switch (*ax) {
+ case 1:
maskecx = cpuid_leaf1_ecx_mask;
maskedx = cpuid_leaf1_edx_mask;
+ break;
+
+ case 0xb:
+ /* Suppress extended topology stuff */
+ maskebx = 0;
+ break;
}
asm(XEN_EMULATE_PREFIX "cpuid"
@@ -196,6 +205,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
"=d" (*dx)
: "0" (*ax), "2" (*cx));
+ *bx &= maskebx;
*cx &= maskecx;
*dx &= maskedx;
}
@@ -330,18 +340,28 @@ static void xen_load_gdt(const struct desc_ptr *dtr)
unsigned long frames[pages];
int f;
- /* A GDT can be up to 64k in size, which corresponds to 8192
- 8-byte entries, or 16 4k pages.. */
+ /*
+ * A GDT can be up to 64k in size, which corresponds to 8192
+ * 8-byte entries, or 16 4k pages..
+ */
BUG_ON(size > 65536);
BUG_ON(va & ~PAGE_MASK);
for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
int level;
- pte_t *ptep = lookup_address(va, &level);
+ pte_t *ptep;
unsigned long pfn, mfn;
void *virt;
+ /*
+ * The GDT is per-cpu and is in the percpu data area.
+ * That can be virtually mapped, so we need to do a
+ * page-walk to get the underlying MFN for the
+ * hypercall. The page can also be in the kernel's
+ * linear range, so we need to RO that mapping too.
+ */
+ ptep = lookup_address(va, &level);
BUG_ON(ptep == NULL);
pfn = pte_pfn(*ptep);
@@ -358,6 +378,44 @@ static void xen_load_gdt(const struct desc_ptr *dtr)
BUG();
}
+/*
+ * load_gdt for early boot, when the gdt is only mapped once
+ */
+static __init void xen_load_gdt_boot(const struct desc_ptr *dtr)
+{
+ unsigned long va = dtr->address;
+ unsigned int size = dtr->size + 1;
+ unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE;
+ unsigned long frames[pages];
+ int f;
+
+ /*
+ * A GDT can be up to 64k in size, which corresponds to 8192
+ * 8-byte entries, or 16 4k pages..
+ */
+
+ BUG_ON(size > 65536);
+ BUG_ON(va & ~PAGE_MASK);
+
+ for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
+ pte_t pte;
+ unsigned long pfn, mfn;
+
+ pfn = virt_to_pfn(va);
+ mfn = pfn_to_mfn(pfn);
+
+ pte = pfn_pte(pfn, PAGE_KERNEL_RO);
+
+ if (HYPERVISOR_update_va_mapping((unsigned long)va, pte, 0))
+ BUG();
+
+ frames[f] = mfn;
+ }
+
+ if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct)))
+ BUG();
+}
+
static void load_TLS_descriptor(struct thread_struct *t,
unsigned int cpu, unsigned int i)
{
@@ -581,6 +639,29 @@ static void xen_write_gdt_entry(struct desc_struct *dt, int entry,
preempt_enable();
}
+/*
+ * Version of write_gdt_entry for use at early boot-time needed to
+ * update an entry as simply as possible.
+ */
+static __init void xen_write_gdt_entry_boot(struct desc_struct *dt, int entry,
+ const void *desc, int type)
+{
+ switch (type) {
+ case DESC_LDT:
+ case DESC_TSS:
+ /* ignore */
+ break;
+
+ default: {
+ xmaddr_t maddr = virt_to_machine(&dt[entry]);
+
+ if (HYPERVISOR_update_descriptor(maddr.maddr, *(u64 *)desc))
+ dt[entry] = *(struct desc_struct *)desc;
+ }
+
+ }
+}
+
static void xen_load_sp0(struct tss_struct *tss,
struct thread_struct *thread)
{
@@ -965,6 +1046,23 @@ static const struct machine_ops __initdata xen_machine_ops = {
.emergency_restart = xen_emergency_restart,
};
+/*
+ * Set up the GDT and segment registers for -fstack-protector. Until
+ * we do this, we have to be careful not to call any stack-protected
+ * function, which is most of the kernel.
+ */
+static void __init xen_setup_stackprotector(void)
+{
+ pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot;
+ pv_cpu_ops.load_gdt = xen_load_gdt_boot;
+
+ setup_stack_canary_segment(0);
+ switch_to_new_gdt(0);
+
+ pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry;
+ pv_cpu_ops.load_gdt = xen_load_gdt;
+}
+
/* First C function to be called on Xen boot */
asmlinkage void __init xen_start_kernel(void)
{
@@ -983,14 +1081,34 @@ asmlinkage void __init xen_start_kernel(void)
pv_apic_ops = xen_apic_ops;
pv_mmu_ops = xen_mmu_ops;
-#ifdef CONFIG_X86_64
/*
- * Setup percpu state. We only need to do this for 64-bit
- * because 32-bit already has %fs set properly.
+ * Set up some pagetable state before starting to set any ptes.
*/
- load_percpu_segment(0);
+
+ /* Prevent unwanted bits from being set in PTEs. */
+ __supported_pte_mask &= ~_PAGE_GLOBAL;
+ if (!xen_initial_domain())
+ __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD);
+
+ __supported_pte_mask |= _PAGE_IOMAP;
+
+#ifdef CONFIG_X86_64
+ /* Work out if we support NX */
+ check_efer();
#endif
+ xen_setup_features();
+
+ /* Get mfn list */
+ if (!xen_feature(XENFEAT_auto_translated_physmap))
+ xen_build_dynamic_phys_to_machine();
+
+ /*
+ * Set up kernel GDT and segment registers, mainly so that
+ * -fstack-protector code can be executed.
+ */
+ xen_setup_stackprotector();
+
xen_init_irq_ops();
xen_init_cpuid_mask();
@@ -1001,8 +1119,6 @@ asmlinkage void __init xen_start_kernel(void)
set_xen_basic_apic_ops();
#endif
- xen_setup_features();
-
if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start;
pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit;
@@ -1019,22 +1135,8 @@ asmlinkage void __init xen_start_kernel(void)
xen_smp_init();
- /* Get mfn list */
- if (!xen_feature(XENFEAT_auto_translated_physmap))
- xen_build_dynamic_phys_to_machine();
-
pgd = (pgd_t *)xen_start_info->pt_base;
- /* Prevent unwanted bits from being set in PTEs. */
- __supported_pte_mask &= ~_PAGE_GLOBAL;
- if (!xen_initial_domain())
- __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD);
-
-#ifdef CONFIG_X86_64
- /* Work out if we support NX */
- check_efer();
-#endif
-
/* Don't do the full vcpu_info placement stuff until we have a
possible map and a non-dummy shared_info. */
per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0];
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 429834ec1687..fe03eeed7b48 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -236,6 +236,7 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle)
ctxt->user_regs.ss = __KERNEL_DS;
#ifdef CONFIG_X86_32
ctxt->user_regs.fs = __KERNEL_PERCPU;
+ ctxt->user_regs.gs = __KERNEL_STACK_CANARY;
#else
ctxt->gs_base_kernel = per_cpu_offset(cpu);
#endif
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 5601506f2dd9..36a5141108df 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -187,7 +187,6 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl
struct xen_spinlock *prev;
int irq = __get_cpu_var(lock_kicker_irq);
int ret;
- unsigned long flags;
u64 start;
/* If kicker interrupts not initialized yet, just spin */
@@ -199,16 +198,12 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl
/* announce we're spinning */
prev = spinning_lock(xl);
- flags = __raw_local_save_flags();
- if (irq_enable) {
- ADD_STATS(taken_slow_irqenable, 1);
- raw_local_irq_enable();
- }
-
ADD_STATS(taken_slow, 1);
ADD_STATS(taken_slow_nested, prev != NULL);
do {
+ unsigned long flags;
+
/* clear pending */
xen_clear_irq_pending(irq);
@@ -228,6 +223,12 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl
goto out;
}
+ flags = __raw_local_save_flags();
+ if (irq_enable) {
+ ADD_STATS(taken_slow_irqenable, 1);
+ raw_local_irq_enable();
+ }
+
/*
* Block until irq becomes pending. If we're
* interrupted at this point (after the trylock but
@@ -238,13 +239,15 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl
* pending.
*/
xen_poll_irq(irq);
+
+ raw_local_irq_restore(flags);
+
ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq));
} while (!xen_test_irq_pending(irq)); /* check for spurious wakeups */
kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq));
out:
- raw_local_irq_restore(flags);
unspinning_lock(xl, prev);
spin_time_accum_blocked(start);
@@ -323,8 +326,13 @@ static void xen_spin_unlock(struct raw_spinlock *lock)
smp_wmb(); /* make sure no writes get moved after unlock */
xl->lock = 0; /* release lock */
- /* make sure unlock happens before kick */
- barrier();
+ /*
+ * Make sure unlock happens before checking for waiting
+ * spinners. We need a strong barrier to enforce the
+ * write-read ordering to different memory locations, as the
+ * CPU makes no implied guarantees about their ordering.
+ */
+ mb();
if (unlikely(xl->spinners))
xen_spin_unlock_slow(xl);
diff --git a/arch/xtensa/kernel/Makefile b/arch/xtensa/kernel/Makefile
index fe3186de6a33..6f56d95f2c1e 100644
--- a/arch/xtensa/kernel/Makefile
+++ b/arch/xtensa/kernel/Makefile
@@ -27,7 +27,8 @@ sed-y = -e 's/(\(\.[a-z]*it\|\.ref\|\)\.text)/(\1.literal \1.text)/g' \
-e 's/(\(\.text\.[a-z]*\))/(\1.literal \1)/g'
quiet_cmd__cpp_lds_S = LDS $@
- cmd__cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ $< | sed $(sed-y) >$@
+ cmd__cpp_lds_S = $(CPP) $(cpp_flags) -P -C -Uxtensa -D__ASSEMBLY__ $< \
+ | sed $(sed-y) >$@
$(obj)/vmlinux.lds: $(src)/vmlinux.lds.S FORCE
$(call if_changed_dep,_cpp_lds_S)
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index d3aa2aadb3e0..b78c9c3e2670 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -40,7 +40,12 @@ queue_requests_store(struct request_queue *q, const char *page, size_t count)
{
struct request_list *rl = &q->rq;
unsigned long nr;
- int ret = queue_var_store(&nr, page, count);
+ int ret;
+
+ if (!q->request_fn)
+ return -EINVAL;
+
+ ret = queue_var_store(&nr, page, count);
if (nr < BLKDEV_MIN_RQ)
nr = BLKDEV_MIN_RQ;
diff --git a/block/genhd.c b/block/genhd.c
index c0c7f38c7012..f4c64c2b303a 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -992,22 +992,6 @@ static void disk_release(struct device *dev)
free_part_stats(&disk->part0);
kfree(disk);
}
-
-static int disk_uevent(struct device *dev, struct kobj_uevent_env *env)
-{
- struct gendisk *disk = dev_to_disk(dev);
- struct disk_part_iter piter;
- struct hd_struct *part;
- int cnt = 0;
-
- disk_part_iter_init(&piter, disk, 0);
- while((part = disk_part_iter_next(&piter)))
- cnt++;
- disk_part_iter_exit(&piter);
- add_uevent_var(env, "NPARTS=%u", cnt);
- return 0;
-}
-
struct class block_class = {
.name = "block",
};
@@ -1026,7 +1010,6 @@ static struct device_type disk_type = {
.groups = disk_attr_groups,
.release = disk_release,
.nodename = block_nodename,
- .uevent = disk_uevent,
};
#ifdef CONFIG_PROC_FS
diff --git a/drivers/Kconfig b/drivers/Kconfig
index 5dacbbd42483..48bbdbe43e69 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -90,8 +90,6 @@ source "drivers/memstick/Kconfig"
source "drivers/leds/Kconfig"
-source "drivers/switch/Kconfig"
-
source "drivers/accessibility/Kconfig"
source "drivers/infiniband/Kconfig"
diff --git a/drivers/Makefile b/drivers/Makefile
index c19a0c18e5ed..4a9a1c55b598 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -95,7 +95,6 @@ obj-$(CONFIG_ARCH_MXC) += mxc/
obj-$(CONFIG_MMC) += mmc/
obj-$(CONFIG_MEMSTICK) += memstick/
obj-$(CONFIG_NEW_LEDS) += leds/
-obj-$(CONFIG_SWITCH) += switch/
obj-$(CONFIG_INFINIBAND) += infiniband/
obj-$(CONFIG_SGI_SN) += sn/
obj-y += firmware/
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 5691f165a952..8dff236f7ed3 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -1182,7 +1182,13 @@ int acpi_check_resource_conflict(struct resource *res)
res_list_elem->name,
(long long) res_list_elem->start,
(long long) res_list_elem->end);
- printk(KERN_INFO "ACPI: Device needs an ACPI driver\n");
+ if (acpi_enforce_resources == ENFORCE_RESOURCES_LAX)
+ printk(KERN_NOTICE "ACPI: This conflict may"
+ " cause random problems and system"
+ " instability\n");
+ printk(KERN_INFO "ACPI: If an ACPI driver is available"
+ " for this device, you should use it instead of"
+ " the native driver\n");
}
if (acpi_enforce_resources == ENFORCE_RESOURCES_STRICT)
return -EBUSY;
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
index 55b5b90c2a44..97fad2979920 100644
--- a/drivers/acpi/pci_root.c
+++ b/drivers/acpi/pci_root.c
@@ -400,6 +400,17 @@ struct pci_dev *acpi_get_pci_dev(acpi_handle handle)
pbus = pdev->subordinate;
pci_dev_put(pdev);
+
+ /*
+ * This function may be called for a non-PCI device that has a
+ * PCI parent (eg. a disk under a PCI SATA controller). In that
+ * case pdev->subordinate will be NULL for the parent.
+ */
+ if (!pbus) {
+ dev_dbg(&pdev->dev, "Not a PCI-to-PCI bridge\n");
+ pdev = NULL;
+ break;
+ }
}
out:
list_for_each_entry_safe(node, tmp, &device_list, node)
diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
index 12158e0d009b..da9d6d25cf6d 100644
--- a/drivers/acpi/pci_slot.c
+++ b/drivers/acpi/pci_slot.c
@@ -57,7 +57,7 @@ ACPI_MODULE_NAME("pci_slot");
MY_NAME , ## arg); \
} while (0)
-#define SLOT_NAME_SIZE 20 /* Inspired by #define in acpiphp.h */
+#define SLOT_NAME_SIZE 21 /* Inspired by #define in acpiphp.h */
struct acpi_pci_slot {
acpi_handle root_handle; /* handle of the root bridge */
@@ -149,7 +149,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
return AE_OK;
}
- snprintf(name, sizeof(name), "%u", (u32)sun);
+ snprintf(name, sizeof(name), "%llu", sun);
pci_slot = pci_create_slot(pci_bus, device, name, NULL);
if (IS_ERR(pci_slot)) {
err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot));
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index 66393d5c4c7c..f6d84694f17f 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -876,12 +876,14 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
return(acpi_idle_enter_c1(dev, state));
local_irq_disable();
- current_thread_info()->status &= ~TS_POLLING;
- /*
- * TS_POLLING-cleared state must be visible before we test
- * NEED_RESCHED:
- */
- smp_mb();
+ if (cx->entry_method != ACPI_CSTATE_FFH) {
+ current_thread_info()->status &= ~TS_POLLING;
+ /*
+ * TS_POLLING-cleared state must be visible before we test
+ * NEED_RESCHED:
+ */
+ smp_mb();
+ }
if (unlikely(need_resched())) {
current_thread_info()->status |= TS_POLLING;
@@ -961,12 +963,14 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
}
local_irq_disable();
- current_thread_info()->status &= ~TS_POLLING;
- /*
- * TS_POLLING-cleared state must be visible before we test
- * NEED_RESCHED:
- */
- smp_mb();
+ if (cx->entry_method != ACPI_CSTATE_FFH) {
+ current_thread_info()->status &= ~TS_POLLING;
+ /*
+ * TS_POLLING-cleared state must be visible before we test
+ * NEED_RESCHED:
+ */
+ smp_mb();
+ }
if (unlikely(need_resched())) {
current_thread_info()->status |= TS_POLLING;
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 781435d7e369..5dd702c9c1fa 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1264,16 +1264,6 @@ acpi_add_single_object(struct acpi_device **child,
acpi_device_set_id(device, parent, handle, type);
/*
- * The ACPI device is attached to acpi handle before getting
- * the power/wakeup/peformance flags. Otherwise OS can't get
- * the corresponding ACPI device by the acpi handle in the course
- * of getting the power/wakeup/performance flags.
- */
- result = acpi_device_set_context(device, type);
- if (result)
- goto end;
-
- /*
* Power Management
* ----------------
*/
@@ -1303,6 +1293,8 @@ acpi_add_single_object(struct acpi_device **child,
goto end;
}
+ if ((result = acpi_device_set_context(device, type)))
+ goto end;
result = acpi_device_register(device, parent);
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index 42159a28f433..1caac3b1a558 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -405,6 +405,46 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
},
},
{
+ .callback = init_set_sci_en_on_resume,
+ .ident = "Hewlett-Packard HP Pavilion dv3 Notebook PC",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv3 Notebook PC"),
+ },
+ },
+ {
+ .callback = init_set_sci_en_on_resume,
+ .ident = "Hewlett-Packard Pavilion dv4",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4"),
+ },
+ },
+ {
+ .callback = init_set_sci_en_on_resume,
+ .ident = "Hewlett-Packard Pavilion dv7",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv7"),
+ },
+ },
+ {
+ .callback = init_set_sci_en_on_resume,
+ .ident = "Hewlett-Packard Compaq Presario C700 Notebook PC",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "Compaq Presario C700 Notebook PC"),
+ },
+ },
+ {
+ .callback = init_set_sci_en_on_resume,
+ .ident = "Hewlett-Packard Compaq Presario CQ40 Notebook PC",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "Compaq Presario CQ40 Notebook PC"),
+ },
+ },
+ {
.callback = init_old_suspend_ordering,
.ident = "Panasonic CF51-2L",
.matches = {
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index edc9b0ec9f39..38f4d0fc46a8 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -122,7 +122,8 @@ static const struct ata_port_info ahci_port_info[] = {
[board_ahci_sb600] =
{
AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL |
- AHCI_HFLAG_NO_MSI | AHCI_HFLAG_SECT255),
+ AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_MSI |
+ AHCI_HFLAG_SECT255),
.flags = AHCI_FLAG_COMMON,
.pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6,
@@ -692,51 +693,6 @@ static void ahci_p5wdh_workaround(struct ata_host *host)
}
}
-/*
- * SB600 ahci controller on ASUS M2A-VM can't do 64bit DMA with older
- * BIOS. The oldest version known to be broken is 0901 and working is
- * 1501 which was released on 2007-10-26. Force 32bit DMA on anything
- * older than 1501. Please read bko#9412 for more info.
- */
-static bool ahci_asus_m2a_vm_32bit_only(struct pci_dev *pdev)
-{
- static const struct dmi_system_id sysids[] = {
- {
- .ident = "ASUS M2A-VM",
- .matches = {
- DMI_MATCH(DMI_BOARD_VENDOR,
- "ASUSTeK Computer INC."),
- DMI_MATCH(DMI_BOARD_NAME, "M2A-VM"),
- },
- },
- { }
- };
- const char *cutoff_mmdd = "10/26";
- const char *date;
- int year;
-
- if (pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x12, 0) ||
- !dmi_check_system(sysids))
- return false;
-
- /*
- * Argh.... both version and date are free form strings.
- * Let's hope they're using the same date format across
- * different versions.
- */
- date = dmi_get_system_info(DMI_BIOS_DATE);
- year = dmi_get_year(DMI_BIOS_DATE);
- if (date && strlen(date) >= 10 && date[2] == '/' && date[5] == '/' &&
- (year > 2007 ||
- (year == 2007 && strncmp(date, cutoff_mmdd, 5) >= 0)))
- return false;
-
- dev_printk(KERN_WARNING, &pdev->dev, "ASUS M2A-VM: BIOS too old, "
- "forcing 32bit DMA, update BIOS\n");
-
- return true;
-}
-
static bool ahci_broken_system_poweroff(struct pci_dev *pdev)
{
static const struct dmi_system_id broken_systems[] = {
@@ -996,12 +952,8 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (board_id == board_ahci_sb700 && pdev->revision >= 0x40)
hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL;
- /* apply ASUS M2A_VM quirk */
- if (ahci_asus_m2a_vm_32bit_only(pdev))
- hpriv->flags |= AHCI_HFLAG_32BIT_ONLY;
-
- if (!(hpriv->flags & AHCI_HFLAG_NO_MSI))
- pci_enable_msi(pdev);
+ if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev))
+ pci_intx(pdev, 1);
hpriv->mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 98af50f16e0c..299d32721a56 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -709,7 +709,13 @@ u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev)
head = tf->device & 0xf;
sect = tf->lbal;
- block = (cyl * dev->heads + head) * dev->sectors + sect;
+ if (!sect) {
+ ata_dev_printk(dev, KERN_WARNING, "device reported "
+ "invalid CHS sector 0\n");
+ sect = 1; /* oh well */
+ }
+
+ block = (cyl * dev->heads + head) * dev->sectors + sect - 1;
}
return block;
@@ -5024,12 +5030,14 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
qc->flags |= ATA_QCFLAG_FAILED;
if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
- if (!ata_tag_internal(qc->tag)) {
- /* always fill result TF for failed qc */
- fill_result_tf(qc);
+ /* always fill result TF for failed qc */
+ fill_result_tf(qc);
+
+ if (!ata_tag_internal(qc->tag))
ata_qc_schedule_eh(qc);
- return;
- }
+ else
+ __ata_qc_complete(qc);
+ return;
}
/* read result TF if requested */
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 79711b64054b..1652b9190607 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2541,14 +2541,14 @@ int ata_eh_reset(struct ata_link *link, int classify,
dev->pio_mode = XFER_PIO_0;
dev->flags &= ~ATA_DFLAG_SLEEPING;
- if (!ata_phys_link_offline(ata_dev_phys_link(dev))) {
- /* apply class override */
- if (lflags & ATA_LFLAG_ASSUME_ATA)
- classes[dev->devno] = ATA_DEV_ATA;
- else if (lflags & ATA_LFLAG_ASSUME_SEMB)
- classes[dev->devno] = ATA_DEV_SEMB_UNSUP;
- } else
- classes[dev->devno] = ATA_DEV_NONE;
+ if (ata_phys_link_offline(ata_dev_phys_link(dev)))
+ continue;
+
+ /* apply class override */
+ if (lflags & ATA_LFLAG_ASSUME_ATA)
+ classes[dev->devno] = ATA_DEV_ATA;
+ else if (lflags & ATA_LFLAG_ASSUME_SEMB)
+ classes[dev->devno] = ATA_DEV_SEMB_UNSUP;
}
/* record current link speed */
@@ -2581,34 +2581,48 @@ int ata_eh_reset(struct ata_link *link, int classify,
slave->eh_info.serror = 0;
spin_unlock_irqrestore(link->ap->lock, flags);
- /* Make sure onlineness and classification result correspond.
+ /*
+ * Make sure onlineness and classification result correspond.
* Hotplug could have happened during reset and some
* controllers fail to wait while a drive is spinning up after
* being hotplugged causing misdetection. By cross checking
- * link onlineness and classification result, those conditions
- * can be reliably detected and retried.
+ * link on/offlineness and classification result, those
+ * conditions can be reliably detected and retried.
*/
nr_unknown = 0;
ata_for_each_dev(dev, link, ALL) {
- /* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */
- if (classes[dev->devno] == ATA_DEV_UNKNOWN) {
- classes[dev->devno] = ATA_DEV_NONE;
- if (ata_phys_link_online(ata_dev_phys_link(dev)))
+ if (ata_phys_link_online(ata_dev_phys_link(dev))) {
+ if (classes[dev->devno] == ATA_DEV_UNKNOWN) {
+ ata_dev_printk(dev, KERN_DEBUG, "link online "
+ "but device misclassifed\n");
+ classes[dev->devno] = ATA_DEV_NONE;
nr_unknown++;
+ }
+ } else if (ata_phys_link_offline(ata_dev_phys_link(dev))) {
+ if (ata_class_enabled(classes[dev->devno]))
+ ata_dev_printk(dev, KERN_DEBUG, "link offline, "
+ "clearing class %d to NONE\n",
+ classes[dev->devno]);
+ classes[dev->devno] = ATA_DEV_NONE;
+ } else if (classes[dev->devno] == ATA_DEV_UNKNOWN) {
+ ata_dev_printk(dev, KERN_DEBUG, "link status unknown, "
+ "clearing UNKNOWN to NONE\n");
+ classes[dev->devno] = ATA_DEV_NONE;
}
}
if (classify && nr_unknown) {
if (try < max_tries) {
ata_link_printk(link, KERN_WARNING, "link online but "
- "device misclassified, retrying\n");
+ "%d devices misclassified, retrying\n",
+ nr_unknown);
failed_link = link;
rc = -EAGAIN;
goto fail;
}
ata_link_printk(link, KERN_WARNING,
- "link online but device misclassified, "
- "device detection might fail\n");
+ "link online but %d devices misclassified, "
+ "device detection might fail\n", nr_unknown);
}
/* reset successful, schedule revalidation */
@@ -2835,12 +2849,14 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
* device detection messages backwards.
*/
ata_for_each_dev(dev, link, ALL) {
- if (!(new_mask & (1 << dev->devno)) ||
- dev->class == ATA_DEV_PMP)
+ if (!(new_mask & (1 << dev->devno)))
continue;
dev->class = ehc->classes[dev->devno];
+ if (dev->class == ATA_DEV_PMP)
+ continue;
+
ehc->i.flags |= ATA_EHI_PRINTINFO;
rc = ata_dev_configure(dev);
ehc->i.flags &= ~ATA_EHI_PRINTINFO;
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
index 33a74f11171c..567f3f72774e 100644
--- a/drivers/ata/pata_amd.c
+++ b/drivers/ata/pata_amd.c
@@ -307,6 +307,9 @@ static unsigned long nv_mode_filter(struct ata_device *dev,
limit |= ATA_MASK_PIO;
if (!(limit & (ATA_MASK_MWDMA | ATA_MASK_UDMA)))
limit |= ATA_MASK_MWDMA | ATA_MASK_UDMA;
+ /* PIO4, MWDMA2, UDMA2 should always be supported regardless of
+ cable detection result */
+ limit |= ata_pack_xfermask(ATA_PIO4, ATA_MWDMA2, ATA_UDMA2);
ata_port_printk(ap, KERN_DEBUG, "nv_mode_filter: 0x%lx&0x%lx->0x%lx, "
"BIOS=0x%lx (0x%x) ACPI=0x%lx%s\n",
diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c
index f98dffedf4bc..f0bad9be0f65 100644
--- a/drivers/ata/pata_cmd64x.c
+++ b/drivers/ata/pata_cmd64x.c
@@ -219,7 +219,7 @@ static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev)
regU |= udma_data[adev->dma_mode - XFER_UDMA_0] << shift;
/* Merge the control bits */
regU |= 1 << adev->devno; /* UDMA on */
- if (adev->dma_mode > 2) /* 15nS timing */
+ if (adev->dma_mode > XFER_UDMA_2) /* 15nS timing */
regU |= 4 << adev->devno;
} else {
regU &= ~ (1 << adev->devno); /* UDMA off */
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
index 122c786449a9..ca5f8d7f638c 100644
--- a/drivers/ata/pata_hpt37x.c
+++ b/drivers/ata/pata_hpt37x.c
@@ -24,7 +24,7 @@
#include <linux/libata.h>
#define DRV_NAME "pata_hpt37x"
-#define DRV_VERSION "0.6.12"
+#define DRV_VERSION "0.6.14"
struct hpt_clock {
u8 xfer_speed;
@@ -404,9 +404,8 @@ static void hpt370_set_piomode(struct ata_port *ap, struct ata_device *adev)
pci_read_config_dword(pdev, addr1, &reg);
mode = hpt37x_find_mode(ap, adev->pio_mode);
- mode &= ~0x8000000; /* No FIFO in PIO */
- mode &= ~0x30070000; /* Leave config bits alone */
- reg &= 0x30070000; /* Strip timing bits */
+ mode &= 0xCFC3FFFF; /* Leave DMA bits alone */
+ reg &= ~0xCFC3FFFF; /* Strip timing bits */
pci_write_config_dword(pdev, addr1, reg | mode);
}
@@ -423,8 +422,7 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev)
{
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u32 addr1, addr2;
- u32 reg;
- u32 mode;
+ u32 reg, mode, mask;
u8 fast;
addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no);
@@ -436,11 +434,12 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev)
fast |= 0x01;
pci_write_config_byte(pdev, addr2, fast);
+ mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000;
+
pci_read_config_dword(pdev, addr1, &reg);
mode = hpt37x_find_mode(ap, adev->dma_mode);
- mode |= 0x8000000; /* FIFO in MWDMA or UDMA */
- mode &= ~0xC0000000; /* Leave config bits alone */
- reg &= 0xC0000000; /* Strip timing bits */
+ mode &= mask;
+ reg &= ~mask;
pci_write_config_dword(pdev, addr1, reg | mode);
}
@@ -508,9 +507,8 @@ static void hpt372_set_piomode(struct ata_port *ap, struct ata_device *adev)
mode = hpt37x_find_mode(ap, adev->pio_mode);
printk("Find mode for %d reports %X\n", adev->pio_mode, mode);
- mode &= ~0x80000000; /* No FIFO in PIO */
- mode &= ~0x30070000; /* Leave config bits alone */
- reg &= 0x30070000; /* Strip timing bits */
+ mode &= 0xCFC3FFFF; /* Leave DMA bits alone */
+ reg &= ~0xCFC3FFFF; /* Strip timing bits */
pci_write_config_dword(pdev, addr1, reg | mode);
}
@@ -527,8 +525,7 @@ static void hpt372_set_dmamode(struct ata_port *ap, struct ata_device *adev)
{
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u32 addr1, addr2;
- u32 reg;
- u32 mode;
+ u32 reg, mode, mask;
u8 fast;
addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no);
@@ -539,12 +536,13 @@ static void hpt372_set_dmamode(struct ata_port *ap, struct ata_device *adev)
fast &= ~0x07;
pci_write_config_byte(pdev, addr2, fast);
+ mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000;
+
pci_read_config_dword(pdev, addr1, &reg);
mode = hpt37x_find_mode(ap, adev->dma_mode);
printk("Find mode for DMA %d reports %X\n", adev->dma_mode, mode);
- mode &= ~0xC0000000; /* Leave config bits alone */
- mode |= 0x80000000; /* FIFO in MWDMA or UDMA */
- reg &= 0xC0000000; /* Strip timing bits */
+ mode &= mask;
+ reg &= ~mask;
pci_write_config_dword(pdev, addr1, reg | mode);
}
diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c
index 3d59fe0a408d..d16e87e29189 100644
--- a/drivers/ata/pata_hpt3x2n.c
+++ b/drivers/ata/pata_hpt3x2n.c
@@ -8,7 +8,7 @@
* Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org>
* Portions Copyright (C) 2001 Sun Microsystems, Inc.
* Portions Copyright (C) 2003 Red Hat Inc
- * Portions Copyright (C) 2005-2007 MontaVista Software, Inc.
+ * Portions Copyright (C) 2005-2009 MontaVista Software, Inc.
*
*
* TODO
@@ -25,7 +25,7 @@
#include <linux/libata.h>
#define DRV_NAME "pata_hpt3x2n"
-#define DRV_VERSION "0.3.4"
+#define DRV_VERSION "0.3.8"
enum {
HPT_PCI_FAST = (1 << 31),
@@ -185,9 +185,8 @@ static void hpt3x2n_set_piomode(struct ata_port *ap, struct ata_device *adev)
pci_read_config_dword(pdev, addr1, &reg);
mode = hpt3x2n_find_mode(ap, adev->pio_mode);
- mode &= ~0x8000000; /* No FIFO in PIO */
- mode &= ~0x30070000; /* Leave config bits alone */
- reg &= 0x30070000; /* Strip timing bits */
+ mode &= 0xCFC3FFFF; /* Leave DMA bits alone */
+ reg &= ~0xCFC3FFFF; /* Strip timing bits */
pci_write_config_dword(pdev, addr1, reg | mode);
}
@@ -204,8 +203,7 @@ static void hpt3x2n_set_dmamode(struct ata_port *ap, struct ata_device *adev)
{
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u32 addr1, addr2;
- u32 reg;
- u32 mode;
+ u32 reg, mode, mask;
u8 fast;
addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no);
@@ -216,11 +214,12 @@ static void hpt3x2n_set_dmamode(struct ata_port *ap, struct ata_device *adev)
fast &= ~0x07;
pci_write_config_byte(pdev, addr2, fast);
+ mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000;
+
pci_read_config_dword(pdev, addr1, &reg);
mode = hpt3x2n_find_mode(ap, adev->dma_mode);
- mode |= 0x8000000; /* FIFO in MWDMA or UDMA */
- mode &= ~0xC0000000; /* Leave config bits alone */
- reg &= 0xC0000000; /* Strip timing bits */
+ mode &= mask;
+ reg &= ~mask;
pci_write_config_dword(pdev, addr1, reg | mode);
}
@@ -263,7 +262,7 @@ static void hpt3x2n_bmdma_stop(struct ata_queued_cmd *qc)
static void hpt3x2n_set_clock(struct ata_port *ap, int source)
{
- void __iomem *bmdma = ap->ioaddr.bmdma_addr;
+ void __iomem *bmdma = ap->ioaddr.bmdma_addr - ap->port_no * 8;
/* Tristate the bus */
iowrite8(0x80, bmdma+0x73);
@@ -273,9 +272,9 @@ static void hpt3x2n_set_clock(struct ata_port *ap, int source)
iowrite8(source, bmdma+0x7B);
iowrite8(0xC0, bmdma+0x79);
- /* Reset state machines */
- iowrite8(0x37, bmdma+0x70);
- iowrite8(0x37, bmdma+0x74);
+ /* Reset state machines, avoid enabling the disabled channels */
+ iowrite8(ioread8(bmdma+0x70) | 0x32, bmdma+0x70);
+ iowrite8(ioread8(bmdma+0x74) | 0x32, bmdma+0x74);
/* Complete reset */
iowrite8(0x00, bmdma+0x79);
@@ -285,21 +284,10 @@ static void hpt3x2n_set_clock(struct ata_port *ap, int source)
iowrite8(0x00, bmdma+0x77);
}
-/* Check if our partner interface is busy */
-
-static int hpt3x2n_pair_idle(struct ata_port *ap)
-{
- struct ata_host *host = ap->host;
- struct ata_port *pair = host->ports[ap->port_no ^ 1];
-
- if (pair->hsm_task_state == HSM_ST_IDLE)
- return 1;
- return 0;
-}
-
static int hpt3x2n_use_dpll(struct ata_port *ap, int writing)
{
long flags = (long)ap->host->private_data;
+
/* See if we should use the DPLL */
if (writing)
return USE_DPLL; /* Needed for write */
@@ -308,20 +296,35 @@ static int hpt3x2n_use_dpll(struct ata_port *ap, int writing)
return 0;
}
+static int hpt3x2n_qc_defer(struct ata_queued_cmd *qc)
+{
+ struct ata_port *ap = qc->ap;
+ struct ata_port *alt = ap->host->ports[ap->port_no ^ 1];
+ int rc, flags = (long)ap->host->private_data;
+ int dpll = hpt3x2n_use_dpll(ap, qc->tf.flags & ATA_TFLAG_WRITE);
+
+ /* First apply the usual rules */
+ rc = ata_std_qc_defer(qc);
+ if (rc != 0)
+ return rc;
+
+ if ((flags & USE_DPLL) != dpll && alt->qc_active)
+ return ATA_DEFER_PORT;
+ return 0;
+}
+
static unsigned int hpt3x2n_qc_issue(struct ata_queued_cmd *qc)
{
- struct ata_taskfile *tf = &qc->tf;
struct ata_port *ap = qc->ap;
int flags = (long)ap->host->private_data;
+ int dpll = hpt3x2n_use_dpll(ap, qc->tf.flags & ATA_TFLAG_WRITE);
- if (hpt3x2n_pair_idle(ap)) {
- int dpll = hpt3x2n_use_dpll(ap, (tf->flags & ATA_TFLAG_WRITE));
- if ((flags & USE_DPLL) != dpll) {
- if (dpll == 1)
- hpt3x2n_set_clock(ap, 0x21);
- else
- hpt3x2n_set_clock(ap, 0x23);
- }
+ if ((flags & USE_DPLL) != dpll) {
+ flags &= ~USE_DPLL;
+ flags |= dpll;
+ ap->host->private_data = (void *)(long)flags;
+
+ hpt3x2n_set_clock(ap, dpll ? 0x21 : 0x23);
}
return ata_sff_qc_issue(qc);
}
@@ -338,6 +341,8 @@ static struct ata_port_operations hpt3x2n_port_ops = {
.inherits = &ata_bmdma_port_ops,
.bmdma_stop = hpt3x2n_bmdma_stop,
+
+ .qc_defer = hpt3x2n_qc_defer,
.qc_issue = hpt3x2n_qc_issue,
.cable_detect = hpt3x2n_cable_detect,
@@ -455,7 +460,7 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
unsigned int f_low, f_high;
int adjust;
unsigned long iobase = pci_resource_start(dev, 4);
- void *hpriv = NULL;
+ void *hpriv = (void *)USE_DPLL;
int rc;
rc = pcim_enable_device(dev);
@@ -543,7 +548,7 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
/* Set our private data up. We only need a few flags so we use
it directly */
if (pci_mhz > 60) {
- hpriv = (void *)PCI66;
+ hpriv = (void *)(PCI66 | USE_DPLL);
/*
* On HPT371N, if ATA clock is 66 MHz we must set bit 2 in
* the MISC. register to stretch the UltraDMA Tss timing.
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c
index f49814d6fd2e..3bbed8322ecf 100644
--- a/drivers/ata/pata_sc1200.c
+++ b/drivers/ata/pata_sc1200.c
@@ -235,8 +235,7 @@ static int sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id)
.udma_mask = ATA_UDMA2,
.port_ops = &sc1200_port_ops
};
- /* Can't enable port 2 yet, see top comments */
- const struct ata_port_info *ppi[] = { &info, };
+ const struct ata_port_info *ppi[] = { &info, NULL };
return ata_pci_sff_init_one(dev, ppi, &sc1200_sht, NULL);
}
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
index 45657cacec43..88984b803d6d 100644
--- a/drivers/ata/pata_via.c
+++ b/drivers/ata/pata_via.c
@@ -111,7 +111,7 @@ static const struct via_isa_bridge {
{ "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
{ "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA },
{ "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
- { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
+ { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0xff, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
{ "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
{ "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
{ "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index 86a40582999c..1eb4e020eb5c 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -1594,9 +1594,21 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class,
!ata_dev_enabled(link->device))
sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
NULL, NULL);
- else if (!(ehc->i.flags & ATA_EHI_QUIET))
- ata_link_printk(link, KERN_INFO,
- "nv: skipping hardreset on occupied port\n");
+ else {
+ const unsigned long *timing = sata_ehc_deb_timing(ehc);
+ int rc;
+
+ if (!(ehc->i.flags & ATA_EHI_QUIET))
+ ata_link_printk(link, KERN_INFO, "nv: skipping "
+ "hardreset on occupied port\n");
+
+ /* make sure the link is online */
+ rc = sata_link_resume(link, timing, deadline);
+ /* whine about phy resume failure but proceed */
+ if (rc && rc != -EOPNOTSUPP)
+ ata_link_printk(link, KERN_WARNING, "failed to resume "
+ "link (errno=%d)\n", rc);
+ }
/* device signature acquisition is unreliable */
return -EAGAIN;
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
index bdd43c7f432e..02efd9a83d26 100644
--- a/drivers/ata/sata_via.c
+++ b/drivers/ata/sata_via.c
@@ -93,7 +93,6 @@ static const struct pci_device_id svia_pci_tbl[] = {
{ PCI_VDEVICE(VIA, 0x7372), vt6420 },
{ PCI_VDEVICE(VIA, 0x5287), vt8251 }, /* 2 sata chnls (Master/Slave) */
{ PCI_VDEVICE(VIA, 0x9000), vt8251 },
- { PCI_VDEVICE(VIA, 0x9040), vt8251 },
{ } /* terminate list */
};
diff --git a/drivers/base/base.h b/drivers/base/base.h
index b528145a078f..1e52c125f437 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -104,7 +104,7 @@ extern int system_bus_init(void);
extern int cpu_dev_init(void);
extern int bus_add_device(struct device *dev);
-extern void bus_attach_device(struct device *dev);
+extern void bus_probe_device(struct device *dev);
extern void bus_remove_device(struct device *dev);
extern int bus_add_driver(struct device_driver *drv);
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 4b04a15146d7..973bf2ad4e0d 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -459,8 +459,9 @@ static inline void remove_deprecated_bus_links(struct device *dev) { }
* bus_add_device - add device to bus
* @dev: device being added
*
+ * - Add device's bus attributes.
+ * - Create links to device's bus.
* - Add the device to its bus's list of devices.
- * - Create link to device's bus.
*/
int bus_add_device(struct device *dev)
{
@@ -483,6 +484,7 @@ int bus_add_device(struct device *dev)
error = make_deprecated_bus_links(dev);
if (error)
goto out_deprecated;
+ klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);
}
return 0;
@@ -498,24 +500,19 @@ out_put:
}
/**
- * bus_attach_device - add device to bus
- * @dev: device tried to attach to a driver
+ * bus_probe_device - probe drivers for a new device
+ * @dev: device to probe
*
- * - Add device to bus's list of devices.
- * - Try to attach to driver.
+ * - Automatically probe for a driver if the bus allows it.
*/
-void bus_attach_device(struct device *dev)
+void bus_probe_device(struct device *dev)
{
struct bus_type *bus = dev->bus;
- int ret = 0;
+ int ret;
- if (bus) {
- if (bus->p->drivers_autoprobe)
- ret = device_attach(dev);
+ if (bus && bus->p->drivers_autoprobe) {
+ ret = device_attach(dev);
WARN_ON(ret < 0);
- if (ret >= 0)
- klist_add_tail(&dev->p->knode_bus,
- &bus->p->klist_devices);
}
}
diff --git a/drivers/base/class.c b/drivers/base/class.c
index eb85e4312301..4317d4ca540a 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -59,6 +59,8 @@ static void class_release(struct kobject *kobj)
else
pr_debug("class '%s' does not have a release() function, "
"be careful\n", class->name);
+
+ kfree(cp);
}
static struct sysfs_ops class_sysfs_ops = {
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 7ecb1938e590..c34774d0b9d3 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -945,7 +945,7 @@ int device_add(struct device *dev)
BUS_NOTIFY_ADD_DEVICE, dev);
kobject_uevent(&dev->kobj, KOBJ_ADD);
- bus_attach_device(dev);
+ bus_probe_device(dev);
if (parent)
klist_add_tail(&dev->p->knode_parent,
&parent->p->klist_children);
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 8ae0f63602e0..2b7f5bc8c021 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -236,7 +236,7 @@ int driver_register(struct device_driver *drv)
put_driver(other);
printk(KERN_ERR "Error: Driver '%s' is already registered, "
"aborting...\n", drv->name);
- return -EEXIST;
+ return -EBUSY;
}
ret = bus_add_driver(drv);
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index a52cc7fe45ea..c18bbbf04e47 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -323,6 +323,9 @@ static int cciss_seq_show(struct seq_file *seq, void *v)
if (*pos > h->highest_lun)
return 0;
+ if (drv == NULL) /* it's possible for h->drv[] to have holes. */
+ return 0;
+
if (drv->heads == 0)
return 0;
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
index 49f086977c37..00ebf36b0059 100644
--- a/drivers/char/Kconfig
+++ b/drivers/char/Kconfig
@@ -323,7 +323,7 @@ config SPECIALIX
config SX
tristate "Specialix SX (and SI) card support"
- depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA)
+ depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) && BROKEN
help
This is a driver for the SX and SI multiport serial cards.
Please read the file <file:Documentation/serial/sx.txt> for details.
@@ -334,7 +334,7 @@ config SX
config RIO
tristate "Specialix RIO system support"
- depends on SERIAL_NONSTANDARD
+ depends on SERIAL_NONSTANDARD && BROKEN
help
This is a driver for the Specialix RIO, a smart serial card which
drives an outboard box that can support up to 128 ports. Product
@@ -395,7 +395,7 @@ config NOZOMI
config A2232
tristate "Commodore A2232 serial support (EXPERIMENTAL)"
- depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP
+ depends on EXPERIMENTAL && ZORRO && BROKEN
---help---
This option supports the 2232 7-port serial card shipped with the
Amiga 2000 and other Zorro-bus machines, dating from 1989. At
@@ -444,7 +444,7 @@ config MXC_IIM
config MXS_VIIM
tristate "MXS Virtual IIM device driver"
- depends on (ARCH_STMP3XXX || ARCH_MXS || ARCH_MX5)
+ depends on (ARCH_STMP3XXX || ARCH_MXS)
help
Support for access to MXS Virtual IIM device, most people should say N here.
@@ -564,22 +564,6 @@ config BFIN_OTP_WRITE_ENABLE
If unsure, say N.
-config FSL_OTP
- tristate "Freescale On-Chip OTP Memory Support"
- depends on (ARCH_MX23 || ARCH_MX28 || ARCH_MX50)
- default n
- help
- If you say Y here, you will get support for a character device
- interface into the One Time Programmable memory pages that are
- stored on the iMX23/28/50 processor. This will not get you access
- to the secure memory pages however. You will need to write your
- own secure code and reader for that.
-
- To compile this driver as a module, choose M here: the module
- will be called fsl_otp.
-
- If unsure, it is safe to say Y.
-
config PRINTER
tristate "Parallel printer support"
depends on PARPORT
diff --git a/drivers/char/Makefile b/drivers/char/Makefile
index 898ce27e335d..c711f02de8f7 100644
--- a/drivers/char/Makefile
+++ b/drivers/char/Makefile
@@ -69,7 +69,6 @@ obj-$(CONFIG_IBM_BSR) += bsr.o
obj-$(CONFIG_SGI_MBCS) += mbcs.o
obj-$(CONFIG_BRIQ_PANEL) += briq_panel.o
obj-$(CONFIG_BFIN_OTP) += bfin-otp.o
-obj-$(CONFIG_FSL_OTP) += fsl_otp.o
obj-$(CONFIG_PRINTER) += lp.o
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c
index cfa5a649dfe7..19ce9d6c69f1 100644
--- a/drivers/char/agp/backend.c
+++ b/drivers/char/agp/backend.c
@@ -114,9 +114,9 @@ static int agp_find_max(void)
long memory, index, result;
#if PAGE_SHIFT < 20
- memory = num_physpages >> (20 - PAGE_SHIFT);
+ memory = totalram_pages >> (20 - PAGE_SHIFT);
#else
- memory = num_physpages << (PAGE_SHIFT - 20);
+ memory = totalram_pages << (PAGE_SHIFT - 20);
#endif
index = 1;
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index c58557790585..62711ddeb53a 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -36,6 +36,8 @@
#define PCI_DEVICE_ID_INTEL_Q35_IG 0x29B2
#define PCI_DEVICE_ID_INTEL_Q33_HB 0x29D0
#define PCI_DEVICE_ID_INTEL_Q33_IG 0x29D2
+#define PCI_DEVICE_ID_INTEL_B43_HB 0x2E40
+#define PCI_DEVICE_ID_INTEL_B43_IG 0x2E42
#define PCI_DEVICE_ID_INTEL_GM45_HB 0x2A40
#define PCI_DEVICE_ID_INTEL_GM45_IG 0x2A42
#define PCI_DEVICE_ID_INTEL_IGD_E_HB 0x2E00
@@ -50,6 +52,7 @@
#define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042
#define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044
#define PCI_DEVICE_ID_INTEL_IGDNG_MA_HB 0x0062
+#define PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB 0x006a
#define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046
/* cover 915 and 945 variants */
@@ -81,9 +84,11 @@
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB || \
+ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_B43_HB || \
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB || \
- agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB)
+ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB || \
+ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB)
extern int agp_memory_reserved;
@@ -679,23 +684,39 @@ static void intel_i830_setup_flush(void)
if (!intel_private.i8xx_page)
return;
- /* make page uncached */
- map_page_into_agp(intel_private.i8xx_page);
-
intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page);
if (!intel_private.i8xx_flush_page)
intel_i830_fini_flush();
}
+static void
+do_wbinvd(void *null)
+{
+ wbinvd();
+}
+
+/* The chipset_flush interface needs to get data that has already been
+ * flushed out of the CPU all the way out to main memory, because the GPU
+ * doesn't snoop those buffers.
+ *
+ * The 8xx series doesn't have the same lovely interface for flushing the
+ * chipset write buffers that the later chips do. According to the 865
+ * specs, it's 64 octwords, or 1KB. So, to get those previous things in
+ * that buffer out, we just fill 1KB and clflush it out, on the assumption
+ * that it'll push whatever was in there out. It appears to work.
+ */
static void intel_i830_chipset_flush(struct agp_bridge_data *bridge)
{
unsigned int *pg = intel_private.i8xx_flush_page;
- int i;
- for (i = 0; i < 256; i += 2)
- *(pg + i) = i;
+ memset(pg, 0, 1024);
- wmb();
+ if (cpu_has_clflush) {
+ clflush_cache_range(pg, 1024);
+ } else {
+ if (on_each_cpu(do_wbinvd, NULL, 1) != 0)
+ printk(KERN_ERR "Timed out waiting for cache flush.\n");
+ }
}
/* The intel i830 automatically initializes the agp aperture during POST.
@@ -1216,9 +1237,11 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size)
case PCI_DEVICE_ID_INTEL_Q45_HB:
case PCI_DEVICE_ID_INTEL_G45_HB:
case PCI_DEVICE_ID_INTEL_G41_HB:
+ case PCI_DEVICE_ID_INTEL_B43_HB:
case PCI_DEVICE_ID_INTEL_IGDNG_D_HB:
case PCI_DEVICE_ID_INTEL_IGDNG_M_HB:
case PCI_DEVICE_ID_INTEL_IGDNG_MA_HB:
+ case PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB:
*gtt_offset = *gtt_size = MB(2);
break;
default:
@@ -2192,6 +2215,8 @@ static const struct intel_driver_description {
"Q45/Q43", NULL, &intel_i965_driver },
{ PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG, 0,
"G45/G43", NULL, &intel_i965_driver },
+ { PCI_DEVICE_ID_INTEL_B43_HB, PCI_DEVICE_ID_INTEL_B43_IG, 0,
+ "B43", NULL, &intel_i965_driver },
{ PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0,
"G41", NULL, &intel_i965_driver },
{ PCI_DEVICE_ID_INTEL_IGDNG_D_HB, PCI_DEVICE_ID_INTEL_IGDNG_D_IG, 0,
@@ -2200,6 +2225,8 @@ static const struct intel_driver_description {
"IGDNG/M", NULL, &intel_i965_driver },
{ PCI_DEVICE_ID_INTEL_IGDNG_MA_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0,
"IGDNG/MA", NULL, &intel_i965_driver },
+ { PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0,
+ "IGDNG/MC2", NULL, &intel_i965_driver },
{ 0, 0, 0, NULL, NULL, NULL }
};
@@ -2313,15 +2340,6 @@ static int agp_intel_resume(struct pci_dev *pdev)
struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
int ret_val;
- pci_restore_state(pdev);
-
- /* We should restore our graphics device's config space,
- * as host bridge (00:00) resumes before graphics device (02:00),
- * then our access to its pci space can work right.
- */
- if (intel_private.pcidev)
- pci_restore_state(intel_private.pcidev);
-
if (bridge->driver == &intel_generic_driver)
intel_configure();
else if (bridge->driver == &intel_850_driver)
@@ -2401,9 +2419,11 @@ static struct pci_device_id agp_intel_pci_table[] = {
ID(PCI_DEVICE_ID_INTEL_Q45_HB),
ID(PCI_DEVICE_ID_INTEL_G45_HB),
ID(PCI_DEVICE_ID_INTEL_G41_HB),
+ ID(PCI_DEVICE_ID_INTEL_B43_HB),
ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB),
ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB),
ID(PCI_DEVICE_ID_INTEL_IGDNG_MA_HB),
+ ID(PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB),
{ }
};
diff --git a/drivers/char/hvc_xen.c b/drivers/char/hvc_xen.c
index eba999f8598d..ae453cc25a66 100644
--- a/drivers/char/hvc_xen.c
+++ b/drivers/char/hvc_xen.c
@@ -55,7 +55,7 @@ static inline void notify_daemon(void)
notify_remote_via_evtchn(xen_start_info->console.domU.evtchn);
}
-static int write_console(uint32_t vtermno, const char *data, int len)
+static int __write_console(const char *data, int len)
{
struct xencons_interface *intf = xencons_interface();
XENCONS_RING_IDX cons, prod;
@@ -76,6 +76,29 @@ static int write_console(uint32_t vtermno, const char *data, int len)
return sent;
}
+static int write_console(uint32_t vtermno, const char *data, int len)
+{
+ int ret = len;
+
+ /*
+ * Make sure the whole buffer is emitted, polling if
+ * necessary. We don't ever want to rely on the hvc daemon
+ * because the most interesting console output is when the
+ * kernel is crippled.
+ */
+ while (len) {
+ int sent = __write_console(data, len);
+
+ data += sent;
+ len -= sent;
+
+ if (unlikely(len))
+ HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
+ }
+
+ return ret;
+}
+
static int read_console(uint32_t vtermno, char *buf, int len)
{
struct xencons_interface *intf = xencons_interface();
diff --git a/drivers/char/hw_random/fsl-rngc.c b/drivers/char/hw_random/fsl-rngc.c
index 9e788f97c4d8..9bf78e846fa0 100644
--- a/drivers/char/hw_random/fsl-rngc.c
+++ b/drivers/char/hw_random/fsl-rngc.c
@@ -1,7 +1,7 @@
/*
* RNG driver for Freescale RNGC
*
- * Copyright (C) 2008-2010 Freescale Semiconductor, Inc.
+ * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -42,6 +42,7 @@
#include <linux/interrupt.h>
#include <linux/hw_random.h>
#include <linux/io.h>
+#include <asm/hardware.h>
#define RNGC_VERSION_MAJOR3 3
@@ -291,7 +292,7 @@ static int __init fsl_rngc_probe(struct platform_device *pdev)
if (rng_dev)
return -EBUSY;
- clk = clk_get(&pdev->dev, "rng_clk");
+ clk = clk_get(NULL, "rng_clk");
if (IS_ERR(clk)) {
dev_err(&pdev->dev, "Can not get rng_clk\n");
@@ -333,17 +334,9 @@ static int __init fsl_rngc_probe(struct platform_device *pdev)
static int __exit fsl_rngc_remove(struct platform_device *pdev)
{
- struct clk *clk;
struct resource *mem = dev_get_drvdata(&pdev->dev);
void __iomem *rngc_base = (void __iomem *)fsl_rngc.priv;
- clk = clk_get(&pdev->dev, "rng_clk");
-
- if (IS_ERR(clk))
- dev_err(&pdev->dev, "Can not get rng_clk\n");
- else
- clk_disable(clk);
-
hwrng_unregister(&fsl_rngc);
release_resource(mem);
@@ -353,47 +346,12 @@ static int __exit fsl_rngc_remove(struct platform_device *pdev)
return 0;
}
-static int fsl_rngc_suspend(struct platform_device *pdev,
- pm_message_t state)
-{
-#ifdef CONFIG_PM
- struct clk *clk = clk_get(&pdev->dev, "rng_clk");
-
- if (IS_ERR(clk)) {
- dev_err(&pdev->dev, "Can not get rng_clk\n");
- return PTR_ERR(clk);
- }
-
- clk_disable(clk);
-#endif
-
- return 0;
-}
-
-static int fsl_rngc_resume(struct platform_device *pdev)
-{
-#ifdef CONFIG_PM
- struct clk *clk = clk_get(&pdev->dev, "rng_clk");
-
- if (IS_ERR(clk)) {
- dev_err(&pdev->dev, "Can not get rng_clk\n");
- return PTR_ERR(clk);
- }
-
- clk_enable(clk);
-#endif
-
- return 0;
-}
-
static struct platform_driver fsl_rngc_driver = {
.driver = {
.name = "fsl_rngc",
.owner = THIS_MODULE,
},
.remove = __exit_p(fsl_rngc_remove),
- .suspend = fsl_rngc_suspend,
- .resume = fsl_rngc_resume,
};
static int __init mod_init(void)
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c
index 737be953cc58..950837cf9e9c 100644
--- a/drivers/char/keyboard.c
+++ b/drivers/char/keyboard.c
@@ -1249,7 +1249,7 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
if (keycode >= NR_KEYS)
if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8)
- keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1);
+ keysym = U(K(KT_BRL, keycode - KEY_BRL_DOT1 + 1));
else
return;
else
diff --git a/drivers/char/nozomi.c b/drivers/char/nozomi.c
index ec58d8c387ff..2171e9dac1ab 100644
--- a/drivers/char/nozomi.c
+++ b/drivers/char/nozomi.c
@@ -1628,10 +1628,10 @@ static void ntty_close(struct tty_struct *tty, struct file *file)
dc->open_ttys--;
port->count--;
- tty_port_tty_set(port, NULL);
if (port->count == 0) {
DBG1("close: %d", nport->token_dl);
+ tty_port_tty_set(port, NULL);
spin_lock_irqsave(&dc->spin_mutex, flags);
dc->last_ier &= ~(nport->token_dl);
writew(dc->last_ier, dc->reg_ier);
diff --git a/drivers/char/pty.c b/drivers/char/pty.c
index b33d6688e910..53761cefa915 100644
--- a/drivers/char/pty.c
+++ b/drivers/char/pty.c
@@ -120,8 +120,10 @@ static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
/* Stuff the data into the input queue of the other end */
c = tty_insert_flip_string(to, buf, c);
/* And shovel */
- tty_flip_buffer_push(to);
- tty_wakeup(tty);
+ if (c) {
+ tty_flip_buffer_push(to);
+ tty_wakeup(tty);
+ }
}
return c;
}
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index b0603b2e5684..47c2d2763456 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -696,8 +696,7 @@ int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)
cmd.header.in = pcrread_header;
cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx);
- BUILD_BUG_ON(cmd.header.in.length > READ_PCR_RESULT_SIZE);
- rc = transmit_cmd(chip, &cmd, cmd.header.in.length,
+ rc = transmit_cmd(chip, &cmd, READ_PCR_RESULT_SIZE,
"attempting to read a pcr value");
if (rc == 0)
@@ -742,7 +741,7 @@ EXPORT_SYMBOL_GPL(tpm_pcr_read);
* the module usage count.
*/
#define TPM_ORD_PCR_EXTEND cpu_to_be32(20)
-#define EXTEND_PCR_SIZE 34
+#define EXTEND_PCR_RESULT_SIZE 34
static struct tpm_input_header pcrextend_header = {
.tag = TPM_TAG_RQU_COMMAND,
.length = cpu_to_be32(34),
@@ -760,10 +759,9 @@ int tpm_pcr_extend(u32 chip_num, int pcr_idx, const u8 *hash)
return -ENODEV;
cmd.header.in = pcrextend_header;
- BUILD_BUG_ON(be32_to_cpu(cmd.header.in.length) > EXTEND_PCR_SIZE);
cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(pcr_idx);
memcpy(cmd.params.pcrextend_in.hash, hash, TPM_DIGEST_SIZE);
- rc = transmit_cmd(chip, &cmd, cmd.header.in.length,
+ rc = transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE,
"attempting extend a PCR value");
module_put(chip->dev->driver->owner);
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
index aec1931608aa..0b73e4ec1add 100644
--- a/drivers/char/tpm/tpm_tis.c
+++ b/drivers/char/tpm/tpm_tis.c
@@ -450,6 +450,12 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
goto out_err;
}
+ /* Default timeouts */
+ chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+ chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
+ chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+ chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+
if (request_locality(chip, 0) != 0) {
rc = -ENODEV;
goto out_err;
@@ -457,12 +463,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0));
- /* Default timeouts */
- chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
- chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
- chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
- chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
-
dev_info(dev,
"1.2 TPM (device-id 0x%X, rev-id %d)\n",
vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0)));
diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c
index 3108991c5c8b..0296612cc7df 100644
--- a/drivers/char/tty_buffer.c
+++ b/drivers/char/tty_buffer.c
@@ -402,28 +402,26 @@ static void flush_to_ldisc(struct work_struct *work)
container_of(work, struct tty_struct, buf.work.work);
unsigned long flags;
struct tty_ldisc *disc;
- struct tty_buffer *tbuf, *head;
- char *char_buf;
- unsigned char *flag_buf;
disc = tty_ldisc_ref(tty);
if (disc == NULL) /* !TTY_LDISC */
return;
spin_lock_irqsave(&tty->buf.lock, flags);
- /* So we know a flush is running */
- set_bit(TTY_FLUSHING, &tty->flags);
- head = tty->buf.head;
- if (head != NULL) {
- tty->buf.head = NULL;
- for (;;) {
- int count = head->commit - head->read;
+
+ if (!test_and_set_bit(TTY_FLUSHING, &tty->flags)) {
+ struct tty_buffer *head;
+ while ((head = tty->buf.head) != NULL) {
+ int count;
+ char *char_buf;
+ unsigned char *flag_buf;
+
+ count = head->commit - head->read;
if (!count) {
if (head->next == NULL)
break;
- tbuf = head;
- head = head->next;
- tty_buffer_free(tty, tbuf);
+ tty->buf.head = head->next;
+ tty_buffer_free(tty, head);
continue;
}
/* Ldisc or user is trying to flush the buffers
@@ -445,9 +443,9 @@ static void flush_to_ldisc(struct work_struct *work)
flag_buf, count);
spin_lock_irqsave(&tty->buf.lock, flags);
}
- /* Restore the queue head */
- tty->buf.head = head;
+ clear_bit(TTY_FLUSHING, &tty->flags);
}
+
/* We may have a deferred request to flush the input buffer,
if so pull the chain under the lock and empty the queue */
if (test_bit(TTY_FLUSHPENDING, &tty->flags)) {
@@ -455,7 +453,6 @@ static void flush_to_ldisc(struct work_struct *work)
clear_bit(TTY_FLUSHPENDING, &tty->flags);
wake_up(&tty->read_wait);
}
- clear_bit(TTY_FLUSHING, &tty->flags);
spin_unlock_irqrestore(&tty->buf.lock, flags);
tty_ldisc_deref(disc);
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index a3afa0c387cd..9531cf8b3482 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -1184,6 +1184,7 @@ int tty_init_termios(struct tty_struct *tty)
tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
return 0;
}
+EXPORT_SYMBOL_GPL(tty_init_termios);
/**
* tty_driver_install_tty() - install a tty entry in the driver
@@ -1911,8 +1912,10 @@ static int tty_fasync(int fd, struct file *filp, int on)
pid = task_pid(current);
type = PIDTYPE_PID;
}
+ get_pid(pid);
spin_unlock_irqrestore(&tty->ctrl_lock, flags);
retval = __f_setown(filp, pid, type, 0);
+ put_pid(pid);
if (retval)
goto out;
} else {
diff --git a/drivers/char/tty_ldisc.c b/drivers/char/tty_ldisc.c
index e48af9f79219..414372a442d9 100644
--- a/drivers/char/tty_ldisc.c
+++ b/drivers/char/tty_ldisc.c
@@ -516,7 +516,7 @@ static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
static int tty_ldisc_halt(struct tty_struct *tty)
{
clear_bit(TTY_LDISC, &tty->flags);
- return cancel_delayed_work(&tty->buf.work);
+ return cancel_delayed_work_sync(&tty->buf.work);
}
/**
@@ -754,12 +754,9 @@ void tty_ldisc_hangup(struct tty_struct *tty)
* N_TTY.
*/
if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
- /* Make sure the old ldisc is quiescent */
- tty_ldisc_halt(tty);
- flush_scheduled_work();
-
/* Avoid racing set_ldisc or tty_ldisc_release */
mutex_lock(&tty->ldisc_mutex);
+ tty_ldisc_halt(tty);
if (tty->ldisc) { /* Not yet closed */
/* Switch back to N_TTY */
tty_ldisc_reinit(tty);
diff --git a/drivers/char/tty_port.c b/drivers/char/tty_port.c
index 9769b1149f76..c0ff7eeafbb2 100644
--- a/drivers/char/tty_port.c
+++ b/drivers/char/tty_port.c
@@ -96,6 +96,14 @@ void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty)
}
EXPORT_SYMBOL(tty_port_tty_set);
+static void tty_port_shutdown(struct tty_port *port)
+{
+ if (port->ops->shutdown &&
+ test_and_clear_bit(ASYNCB_INITIALIZED, &port->flags))
+ port->ops->shutdown(port);
+
+}
+
/**
* tty_port_hangup - hangup helper
* @port: tty port
@@ -116,6 +124,7 @@ void tty_port_hangup(struct tty_port *port)
port->tty = NULL;
spin_unlock_irqrestore(&port->lock, flags);
wake_up_interruptible(&port->open_wait);
+ tty_port_shutdown(port);
}
EXPORT_SYMBOL(tty_port_hangup);
@@ -208,8 +217,14 @@ int tty_port_block_til_ready(struct tty_port *port,
/* if non-blocking mode is set we can pass directly to open unless
the port has just hung up or is in another error state */
- if ((filp->f_flags & O_NONBLOCK) ||
- (tty->flags & (1 << TTY_IO_ERROR))) {
+ if (tty->flags & (1 << TTY_IO_ERROR)) {
+ port->flags |= ASYNC_NORMAL_ACTIVE;
+ return 0;
+ }
+ if (filp->f_flags & O_NONBLOCK) {
+ /* Indicate we are open */
+ if (tty->termios->c_cflag & CBAUD)
+ tty_port_raise_dtr_rts(port);
port->flags |= ASYNC_NORMAL_ACTIVE;
return 0;
}
@@ -296,15 +311,17 @@ int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct f
if (port->count) {
spin_unlock_irqrestore(&port->lock, flags);
+ if (port->ops->drop)
+ port->ops->drop(port);
return 0;
}
- port->flags |= ASYNC_CLOSING;
+ set_bit(ASYNCB_CLOSING, &port->flags);
tty->closing = 1;
spin_unlock_irqrestore(&port->lock, flags);
/* Don't block on a stalled port, just pull the chain */
if (tty->flow_stopped)
tty_driver_flush_buffer(tty);
- if (port->flags & ASYNC_INITIALIZED &&
+ if (test_bit(ASYNCB_INITIALIZED, &port->flags) &&
port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
tty_wait_until_sent(tty, port->closing_wait);
if (port->drain_delay) {
@@ -318,6 +335,9 @@ int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct f
timeout = 2 * HZ;
schedule_timeout_interruptible(timeout);
}
+ /* Don't call port->drop for the last reference. Callers will want
+ to drop the last active reference in ->shutdown() or the tty
+ shutdown path */
return 1;
}
EXPORT_SYMBOL(tty_port_close_start);
@@ -348,3 +368,14 @@ void tty_port_close_end(struct tty_port *port, struct tty_struct *tty)
spin_unlock_irqrestore(&port->lock, flags);
}
EXPORT_SYMBOL(tty_port_close_end);
+
+void tty_port_close(struct tty_port *port, struct tty_struct *tty,
+ struct file *filp)
+{
+ if (tty_port_close_start(port, tty, filp) == 0)
+ return;
+ tty_port_shutdown(port);
+ tty_port_close_end(port, tty);
+ tty_port_tty_set(port, NULL);
+}
+EXPORT_SYMBOL(tty_port_close);
diff --git a/drivers/char/vt.c b/drivers/char/vt.c
index 404f4c1ee431..6aa88f50b039 100644
--- a/drivers/char/vt.c
+++ b/drivers/char/vt.c
@@ -2948,9 +2948,6 @@ int __init vty_init(const struct file_operations *console_fops)
panic("Couldn't register console driver\n");
kbd_init();
console_map_init();
-#ifdef CONFIG_PROM_CONSOLE
- prom_con_init();
-#endif
#ifdef CONFIG_MDA_CONSOLE
mda_console_init();
#endif
diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c
index c5afc98e2675..9ca20d04dd5a 100644
--- a/drivers/connector/cn_proc.c
+++ b/drivers/connector/cn_proc.c
@@ -202,9 +202,8 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
* cn_proc_mcast_ctl
* @data: message sent from userspace via the connector
*/
-static void cn_proc_mcast_ctl(void *data)
+static void cn_proc_mcast_ctl(struct cn_msg *msg, struct netlink_skb_parms *nsp)
{
- struct cn_msg *msg = data;
enum proc_cn_mcast_op *mc_op = NULL;
int err = 0;
diff --git a/drivers/connector/cn_queue.c b/drivers/connector/cn_queue.c
index 408c2af25d50..210338ea222f 100644
--- a/drivers/connector/cn_queue.c
+++ b/drivers/connector/cn_queue.c
@@ -78,16 +78,20 @@ void cn_queue_wrapper(struct work_struct *work)
struct cn_callback_entry *cbq =
container_of(work, struct cn_callback_entry, work);
struct cn_callback_data *d = &cbq->data;
+ struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(d->skb));
+ struct netlink_skb_parms *nsp = &NETLINK_CB(d->skb);
- d->callback(d->callback_priv);
+ d->callback(msg, nsp);
- d->destruct_data(d->ddata);
- d->ddata = NULL;
+ kfree_skb(d->skb);
+ d->skb = NULL;
kfree(d->free);
}
-static struct cn_callback_entry *cn_queue_alloc_callback_entry(char *name, struct cb_id *id, void (*callback)(void *))
+static struct cn_callback_entry *
+cn_queue_alloc_callback_entry(char *name, struct cb_id *id,
+ void (*callback)(struct cn_msg *, struct netlink_skb_parms *))
{
struct cn_callback_entry *cbq;
@@ -120,7 +124,8 @@ int cn_cb_equal(struct cb_id *i1, struct cb_id *i2)
return ((i1->idx == i2->idx) && (i1->val == i2->val));
}
-int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *))
+int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id,
+ void (*callback)(struct cn_msg *, struct netlink_skb_parms *))
{
struct cn_callback_entry *cbq, *__cbq;
int found = 0;
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c
index 08b2500f21ec..537c29ac4487 100644
--- a/drivers/connector/connector.c
+++ b/drivers/connector/connector.c
@@ -36,17 +36,6 @@ MODULE_LICENSE("GPL");
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
-static u32 cn_idx = CN_IDX_CONNECTOR;
-static u32 cn_val = CN_VAL_CONNECTOR;
-
-module_param(cn_idx, uint, 0);
-module_param(cn_val, uint, 0);
-MODULE_PARM_DESC(cn_idx, "Connector's main device idx.");
-MODULE_PARM_DESC(cn_val, "Connector's main device val.");
-
-static DEFINE_MUTEX(notify_lock);
-static LIST_HEAD(notify_list);
-
static struct cn_dev cdev;
static int cn_already_initialized;
@@ -129,21 +118,19 @@ EXPORT_SYMBOL_GPL(cn_netlink_send);
/*
* Callback helper - queues work and setup destructor for given data.
*/
-static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), void *data)
+static int cn_call_callback(struct sk_buff *skb)
{
struct cn_callback_entry *__cbq, *__new_cbq;
struct cn_dev *dev = &cdev;
+ struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(skb));
int err = -ENODEV;
spin_lock_bh(&dev->cbdev->queue_lock);
list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) {
if (cn_cb_equal(&__cbq->id.id, &msg->id)) {
if (likely(!work_pending(&__cbq->work) &&
- __cbq->data.ddata == NULL)) {
- __cbq->data.callback_priv = msg;
-
- __cbq->data.ddata = data;
- __cbq->data.destruct_data = destruct_data;
+ __cbq->data.skb == NULL)) {
+ __cbq->data.skb = skb;
if (queue_cn_work(__cbq, &__cbq->work))
err = 0;
@@ -156,10 +143,8 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v
__new_cbq = kzalloc(sizeof(struct cn_callback_entry), GFP_ATOMIC);
if (__new_cbq) {
d = &__new_cbq->data;
- d->callback_priv = msg;
+ d->skb = skb;
d->callback = __cbq->data.callback;
- d->ddata = data;
- d->destruct_data = destruct_data;
d->free = __new_cbq;
__new_cbq->pdev = __cbq->pdev;
@@ -191,7 +176,6 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v
*/
static void cn_rx_skb(struct sk_buff *__skb)
{
- struct cn_msg *msg;
struct nlmsghdr *nlh;
int err;
struct sk_buff *skb;
@@ -208,68 +192,20 @@ static void cn_rx_skb(struct sk_buff *__skb)
return;
}
- msg = NLMSG_DATA(nlh);
- err = cn_call_callback(msg, (void (*)(void *))kfree_skb, skb);
+ err = cn_call_callback(skb);
if (err < 0)
kfree_skb(skb);
}
}
/*
- * Notification routing.
- *
- * Gets id and checks if there are notification request for it's idx
- * and val. If there are such requests notify the listeners with the
- * given notify event.
- *
- */
-static void cn_notify(struct cb_id *id, u32 notify_event)
-{
- struct cn_ctl_entry *ent;
-
- mutex_lock(&notify_lock);
- list_for_each_entry(ent, &notify_list, notify_entry) {
- int i;
- struct cn_notify_req *req;
- struct cn_ctl_msg *ctl = ent->msg;
- int idx_found, val_found;
-
- idx_found = val_found = 0;
-
- req = (struct cn_notify_req *)ctl->data;
- for (i = 0; i < ctl->idx_notify_num; ++i, ++req) {
- if (id->idx >= req->first &&
- id->idx < req->first + req->range) {
- idx_found = 1;
- break;
- }
- }
-
- for (i = 0; i < ctl->val_notify_num; ++i, ++req) {
- if (id->val >= req->first &&
- id->val < req->first + req->range) {
- val_found = 1;
- break;
- }
- }
-
- if (idx_found && val_found) {
- struct cn_msg m = { .ack = notify_event, };
-
- memcpy(&m.id, id, sizeof(m.id));
- cn_netlink_send(&m, ctl->group, GFP_KERNEL);
- }
- }
- mutex_unlock(&notify_lock);
-}
-
-/*
* Callback add routing - adds callback with given ID and name.
* If there is registered callback with the same ID it will not be added.
*
* May sleep.
*/
-int cn_add_callback(struct cb_id *id, char *name, void (*callback)(void *))
+int cn_add_callback(struct cb_id *id, char *name,
+ void (*callback)(struct cn_msg *, struct netlink_skb_parms *))
{
int err;
struct cn_dev *dev = &cdev;
@@ -281,8 +217,6 @@ int cn_add_callback(struct cb_id *id, char *name, void (*callback)(void *))
if (err)
return err;
- cn_notify(id, 0);
-
return 0;
}
EXPORT_SYMBOL_GPL(cn_add_callback);
@@ -300,112 +234,9 @@ void cn_del_callback(struct cb_id *id)
struct cn_dev *dev = &cdev;
cn_queue_del_callback(dev->cbdev, id);
- cn_notify(id, 1);
}
EXPORT_SYMBOL_GPL(cn_del_callback);
-/*
- * Checks two connector's control messages to be the same.
- * Returns 1 if they are the same or if the first one is corrupted.
- */
-static int cn_ctl_msg_equals(struct cn_ctl_msg *m1, struct cn_ctl_msg *m2)
-{
- int i;
- struct cn_notify_req *req1, *req2;
-
- if (m1->idx_notify_num != m2->idx_notify_num)
- return 0;
-
- if (m1->val_notify_num != m2->val_notify_num)
- return 0;
-
- if (m1->len != m2->len)
- return 0;
-
- if ((m1->idx_notify_num + m1->val_notify_num) * sizeof(*req1) !=
- m1->len)
- return 1;
-
- req1 = (struct cn_notify_req *)m1->data;
- req2 = (struct cn_notify_req *)m2->data;
-
- for (i = 0; i < m1->idx_notify_num; ++i) {
- if (req1->first != req2->first || req1->range != req2->range)
- return 0;
- req1++;
- req2++;
- }
-
- for (i = 0; i < m1->val_notify_num; ++i) {
- if (req1->first != req2->first || req1->range != req2->range)
- return 0;
- req1++;
- req2++;
- }
-
- return 1;
-}
-
-/*
- * Main connector device's callback.
- *
- * Used for notification of a request's processing.
- */
-static void cn_callback(void *data)
-{
- struct cn_msg *msg = data;
- struct cn_ctl_msg *ctl;
- struct cn_ctl_entry *ent;
- u32 size;
-
- if (msg->len < sizeof(*ctl))
- return;
-
- ctl = (struct cn_ctl_msg *)msg->data;
-
- size = (sizeof(*ctl) + ((ctl->idx_notify_num +
- ctl->val_notify_num) *
- sizeof(struct cn_notify_req)));
-
- if (msg->len != size)
- return;
-
- if (ctl->len + sizeof(*ctl) != msg->len)
- return;
-
- /*
- * Remove notification.
- */
- if (ctl->group == 0) {
- struct cn_ctl_entry *n;
-
- mutex_lock(&notify_lock);
- list_for_each_entry_safe(ent, n, &notify_list, notify_entry) {
- if (cn_ctl_msg_equals(ent->msg, ctl)) {
- list_del(&ent->notify_entry);
- kfree(ent);
- }
- }
- mutex_unlock(&notify_lock);
-
- return;
- }
-
- size += sizeof(*ent);
-
- ent = kzalloc(size, GFP_KERNEL);
- if (!ent)
- return;
-
- ent->msg = (struct cn_ctl_msg *)(ent + 1);
-
- memcpy(ent->msg, ctl, size - sizeof(*ent));
-
- mutex_lock(&notify_lock);
- list_add(&ent->notify_entry, &notify_list);
- mutex_unlock(&notify_lock);
-}
-
static int cn_proc_show(struct seq_file *m, void *v)
{
struct cn_queue_dev *dev = cdev.cbdev;
@@ -443,11 +274,8 @@ static const struct file_operations cn_file_ops = {
static int __devinit cn_init(void)
{
struct cn_dev *dev = &cdev;
- int err;
dev->input = cn_rx_skb;
- dev->id.idx = cn_idx;
- dev->id.val = cn_val;
dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR,
CN_NETLINK_USERS + 0xf,
@@ -463,14 +291,6 @@ static int __devinit cn_init(void)
cn_already_initialized = 1;
- err = cn_add_callback(&dev->id, "connector", &cn_callback);
- if (err) {
- cn_already_initialized = 0;
- cn_queue_free_dev(dev->cbdev);
- netlink_kernel_release(dev->nls);
- return -EINVAL;
- }
-
proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops);
return 0;
@@ -484,7 +304,6 @@ static void __devexit cn_fini(void)
proc_net_remove(&init_net, "connector");
- cn_del_callback(&dev->id);
cn_queue_free_dev(dev->cbdev);
netlink_kernel_release(dev->nls);
}
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index 8504a2108557..910c49d2641c 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -75,8 +75,11 @@ static void cpuidle_idle_call(void)
#endif
/* ask the governor for the next state */
next_state = cpuidle_curr_governor->select(dev);
- if (need_resched())
+ if (need_resched()) {
+ local_irq_enable();
return;
+ }
+
target_state = &dev->states[next_state];
/* enter the state and update stats */
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig
index 5057cb958230..9c2919a431a8 100644
--- a/drivers/crypto/Kconfig
+++ b/drivers/crypto/Kconfig
@@ -211,7 +211,7 @@ config CRYPTO_DEV_PPC4XX
config CRYPTO_DEV_DCP
tristate "Support for the DCP engine"
- depends on ARCH_MX28 || ARCH_MX23 || ARCH_MX50
+ depends on ARCH_MX28 || ARCH_MX23
select CRYPTO_ALGAPI
select CRYPTO_BLKCIPHER
help
diff --git a/drivers/crypto/dcp.c b/drivers/crypto/dcp.c
index eb7a83d276b7..8b54b127d6d0 100644
--- a/drivers/crypto/dcp.c
+++ b/drivers/crypto/dcp.c
@@ -36,7 +36,7 @@
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/uaccess.h>
-#include <linux/clk.h>
+
#include <linux/io.h>
#include <linux/delay.h>
@@ -60,8 +60,6 @@ struct dcp {
int dcp_vmi_irq;
int dcp_irq;
u32 dcp_regs_base;
- ulong clock_state;
- bool chan_in_use[DCP_NUM_CHANNELS];
/* Following buffers used in hashing to meet 64-byte len alignment */
char *buf1;
@@ -97,10 +95,6 @@ struct dcp {
#define DCP_FILL 0x5000
#define DCP_MODE_MASK 0xf000
-/* clock defines */
-#define CLOCK_ON 1
-#define CLOCK_OFF 0
-
struct dcp_op {
unsigned int flags;
@@ -183,45 +177,6 @@ struct dcp_hash_op {
/* only one */
static struct dcp *global_sdcp;
-static void dcp_clock(struct dcp *sdcp, ulong state, bool force)
-{
- u32 chan;
- struct clk *clk = clk_get(sdcp->dev, "dcp_clk");
-
- /* unless force is true (used during suspend/resume), if any
- * channel is running, then clk is already on, and must stay on */
- if (!force)
- for (chan = 0; chan < DCP_NUM_CHANNELS; chan++)
- if (sdcp->chan_in_use[chan])
- goto exit;
-
- if (state == CLOCK_OFF) {
- /* gate at clock source */
- if (!IS_ERR(clk))
- clk_disable(clk);
- /* gate at DCP */
- else
- __raw_writel(BM_DCP_CTRL_CLKGATE,
- sdcp->dcp_regs_base + HW_DCP_CTRL_SET);
-
- sdcp->clock_state = CLOCK_OFF;
-
- } else {
- /* ungate at clock source */
- if (!IS_ERR(clk))
- clk_enable(clk);
- /* ungate at DCP */
- else
- __raw_writel(BM_DCP_CTRL_CLKGATE,
- sdcp->dcp_regs_base + HW_DCP_CTRL_CLR);
-
- sdcp->clock_state = CLOCK_ON;
- }
-
-exit:
- return;
-}
-
static void dcp_perform_op(struct dcp_op *op)
{
struct dcp *sdcp = global_sdcp;
@@ -307,8 +262,6 @@ static void dcp_perform_op(struct dcp_op *op)
/* submit the work */
mutex_lock(mutex);
- dcp_clock(sdcp, CLOCK_ON, false);
- sdcp->chan_in_use[chan] = true;
__raw_writel(-1, sdcp->dcp_regs_base + HW_DCP_CHnSTAT_CLR(chan));
@@ -337,9 +290,8 @@ static void dcp_perform_op(struct dcp_op *op)
__raw_readl(sdcp->dcp_regs_base +
HW_DCP_CHnSTAT(chan)) & 0xff);
out:
- sdcp->chan_in_use[chan] = false;
- dcp_clock(sdcp, CLOCK_OFF, false);
mutex_unlock(mutex);
+
dma_unmap_single(sdcp->dev, pkt_phys, sizeof(*pkt), DMA_TO_DEVICE);
}
@@ -1109,8 +1061,6 @@ static int dcp_sha_init(struct shash_desc *desc)
struct mutex *mutex = &sdcp->op_mutex[HASH_CHAN];
mutex_lock(mutex);
- dcp_clock(sdcp, CLOCK_ON, false);
- sdcp->chan_in_use[HASH_CHAN] = true;
op->length = 0;
@@ -1240,8 +1190,6 @@ static int dcp_sha_final(struct shash_desc *desc, u8 *out)
for (i = 0; i < digest_len; i++)
*out++ = *--digest;
- sdcp->chan_in_use[HASH_CHAN] = false;
- dcp_clock(sdcp, CLOCK_OFF, false);
mutex_unlock(mutex);
return ret;
@@ -1340,8 +1288,6 @@ static int dcp_bootstream_ioctl(struct inode *inode, struct file *file,
mutex = &sdcp->op_mutex[chan];
mutex_lock(mutex);
- dcp_clock(sdcp, CLOCK_ON, false);
- sdcp->chan_in_use[chan] = true;
__raw_writel(-1, sdcp->dcp_regs_base +
HW_DCP_CHnSTAT_CLR(ROM_DCP_CHAN));
@@ -1402,8 +1348,6 @@ static int dcp_bootstream_ioctl(struct inode *inode, struct file *file,
retVal = 0;
exit:
- sdcp->chan_in_use[chan] = false;
- dcp_clock(sdcp, CLOCK_OFF, false);
mutex_unlock(mutex);
return retVal;
}
@@ -1446,7 +1390,6 @@ static int dcp_probe(struct platform_device *pdev)
for (i = 0; i < DCP_NUM_CHANNELS; i++) {
mutex_init(&sdcp->op_mutex[i]);
init_completion(&sdcp->op_wait[i]);
- sdcp->chan_in_use[i] = false;
}
platform_set_drvdata(pdev, sdcp);
@@ -1457,8 +1400,7 @@ static int dcp_probe(struct platform_device *pdev)
ret = -ENXIO;
goto err_kfree;
}
- sdcp->dcp_regs_base = (u32) ioremap(r->start, r->end - r->start + 1);
- dcp_clock(sdcp, CLOCK_ON, true);
+ sdcp->dcp_regs_base = (u32) IO_ADDRESS(r->start);
/* Soft reset and remove the clock gate */
__raw_writel(BM_DCP_CTRL_SFTRST, sdcp->dcp_regs_base + HW_DCP_CTRL_SET);
@@ -1494,14 +1436,14 @@ static int dcp_probe(struct platform_device *pdev)
if (!r) {
dev_err(&pdev->dev, "can't get IRQ resource (0)\n");
ret = -EIO;
- goto err_gate_clk;
+ goto err_kfree;
}
sdcp->dcp_vmi_irq = r->start;
ret = request_irq(sdcp->dcp_vmi_irq, dcp_vmi_irq, 0, "dcp",
sdcp);
if (ret != 0) {
dev_err(&pdev->dev, "can't request_irq (0)\n");
- goto err_gate_clk;
+ goto err_kfree;
}
r = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
@@ -1522,7 +1464,7 @@ static int dcp_probe(struct platform_device *pdev)
ret = crypto_register_alg(&dcp_aes_alg);
if (ret != 0) {
dev_err(&pdev->dev, "Failed to register aes crypto\n");
- goto err_free_irq1;
+ goto err_kfree;
}
ret = crypto_register_alg(&dcp_aes_ecb_alg);
@@ -1633,7 +1575,6 @@ static int dcp_probe(struct platform_device *pdev)
goto err_dereg;
}
- dcp_clock(sdcp, CLOCK_OFF, false);
dev_notice(&pdev->dev, "DCP crypto enabled.!\n");
return 0;
@@ -1647,12 +1588,8 @@ err_unregister_aes_ecb:
crypto_unregister_alg(&dcp_aes_ecb_alg);
err_unregister_aes:
crypto_unregister_alg(&dcp_aes_alg);
-err_free_irq1:
- free_irq(sdcp->dcp_irq, sdcp);
err_free_irq0:
free_irq(sdcp->dcp_vmi_irq, sdcp);
-err_gate_clk:
- dcp_clock(sdcp, CLOCK_OFF, false);
err_kfree:
kfree(sdcp);
err:
@@ -1667,8 +1604,6 @@ static int dcp_remove(struct platform_device *pdev)
sdcp = platform_get_drvdata(pdev);
platform_set_drvdata(pdev, NULL);
- dcp_clock(sdcp, CLOCK_ON, false);
-
free_irq(sdcp->dcp_irq, sdcp);
free_irq(sdcp->dcp_vmi_irq, sdcp);
@@ -1707,41 +1642,28 @@ static int dcp_remove(struct platform_device *pdev)
crypto_unregister_alg(&dcp_aes_cbc_alg);
crypto_unregister_alg(&dcp_aes_ecb_alg);
crypto_unregister_alg(&dcp_aes_alg);
-
- dcp_clock(sdcp, CLOCK_OFF, true);
- iounmap((void *) sdcp->dcp_regs_base);
kfree(sdcp);
global_sdcp = NULL;
return 0;
}
+
+#ifdef CONFIG_PM
static int dcp_suspend(struct platform_device *pdev,
pm_message_t state)
{
-#ifdef CONFIG_PM
- struct dcp *sdcp = platform_get_drvdata(pdev);
-
- if (sdcp->clock_state == CLOCK_ON) {
- dcp_clock(sdcp, CLOCK_OFF, true);
- /* indicate that clock needs to be turned on upon resume */
- sdcp->clock_state = CLOCK_ON;
- }
-#endif
return 0;
}
static int dcp_resume(struct platform_device *pdev)
{
-#ifdef CONFIG_PM
- struct dcp *sdcp = platform_get_drvdata(pdev);
-
- /* if clock was on prior to suspend, turn it back on */
- if (sdcp->clock_state == CLOCK_ON)
- dcp_clock(sdcp, CLOCK_ON, true);
-#endif
return 0;
}
+#else
+#define dcp_suspend NULL
+#define dcp_resume NULL
+#endif
static struct platform_driver dcp_driver = {
.probe = dcp_probe,
diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c
index a9952b1236b0..84c51e177269 100644
--- a/drivers/crypto/padlock-aes.c
+++ b/drivers/crypto/padlock-aes.c
@@ -236,7 +236,7 @@ static inline void ecb_crypt(const u8 *in, u8 *out, u32 *key,
/* Padlock in ECB mode fetches at least ecb_fetch_bytes of data.
* We could avoid some copying here but it's probably not worth it.
*/
- if (unlikely(((unsigned long)in & PAGE_SIZE) + ecb_fetch_bytes > PAGE_SIZE)) {
+ if (unlikely(((unsigned long)in & ~PAGE_MASK) + ecb_fetch_bytes > PAGE_SIZE)) {
ecb_crypt_copy(in, out, key, cword, count);
return;
}
@@ -248,7 +248,7 @@ static inline u8 *cbc_crypt(const u8 *in, u8 *out, u32 *key,
u8 *iv, struct cword *cword, int count)
{
/* Padlock in CBC mode fetches at least cbc_fetch_bytes of data. */
- if (unlikely(((unsigned long)in & PAGE_SIZE) + cbc_fetch_bytes > PAGE_SIZE))
+ if (unlikely(((unsigned long)in & ~PAGE_MASK) + cbc_fetch_bytes > PAGE_SIZE))
return cbc_crypt_copy(in, out, key, iv, cword, count);
return rep_xcrypt_cbc(in, out, key, iv, cword, count);
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
index 9a1e5fb412ed..73957fb9db5f 100644
--- a/drivers/dma/at_hdmac.c
+++ b/drivers/dma/at_hdmac.c
@@ -813,7 +813,7 @@ atc_is_tx_complete(struct dma_chan *chan,
dev_vdbg(chan2dev(chan), "is_tx_complete: %d (d%d, u%d)\n",
cookie, done ? *done : 0, used ? *used : 0);
- spin_lock_bh(atchan->lock);
+ spin_lock_bh(&atchan->lock);
last_complete = atchan->completed_cookie;
last_used = chan->cookie;
@@ -828,7 +828,7 @@ atc_is_tx_complete(struct dma_chan *chan,
ret = dma_async_is_complete(cookie, last_complete, last_used);
}
- spin_unlock_bh(atchan->lock);
+ spin_unlock_bh(&atchan->lock);
if (done)
*done = last_complete;
diff --git a/drivers/dma/pxp/pxp_device.c b/drivers/dma/pxp/pxp_device.c
index 74176d3da9d3..afd08ac6587c 100644
--- a/drivers/dma/pxp/pxp_device.c
+++ b/drivers/dma/pxp/pxp_device.c
@@ -132,6 +132,8 @@ static int pxp_ioc_config_chan(unsigned long arg)
init_waitqueue_head(&(irq_info[chan_id].waitq));
+ /* Fixme */
+ mdelay(100);
/* find the channel */
spin_lock(&pxp_chan_lock);
list_for_each_entry(info, &list, list) {
@@ -484,7 +486,7 @@ static int __devexit pxp_device_remove(struct platform_device *pdev)
return 0;
}
-static struct platform_driver pxp_client_driver = {
+static struct platform_driver pxp_device = {
.probe = pxp_device_probe,
.remove = __exit_p(pxp_device_remove),
.driver = {
@@ -495,12 +497,12 @@ static struct platform_driver pxp_client_driver = {
static int __init pxp_device_init(void)
{
- return platform_driver_register(&pxp_client_driver);
+ return platform_driver_register(&pxp_device);
}
static void __exit pxp_device_exit(void)
{
- platform_driver_unregister(&pxp_client_driver);
+ platform_driver_unregister(&pxp_device);
}
module_init(pxp_device_init);
diff --git a/drivers/dma/pxp/pxp_dma.c b/drivers/dma/pxp/pxp_dma.c
index b8648049de89..e418f6c9715e 100644
--- a/drivers/dma/pxp/pxp_dma.c
+++ b/drivers/dma/pxp/pxp_dma.c
@@ -31,7 +31,6 @@
#include <linux/vmalloc.h>
#include <linux/dmaengine.h>
#include <linux/pxp_dma.h>
-#include <linux/timer.h>
#include <linux/clk.h>
#include "regs-pxp.h"
@@ -51,23 +50,16 @@ struct pxps {
int irq; /* PXP IRQ to the CPU */
spinlock_t lock;
- struct mutex mutex_clk;
- int clk_stat;
-#define CLK_STAT_OFF 0
-#define CLK_STAT_ON 1
+ struct mutex mutex;
struct device *dev;
struct pxp_dma pxp_dma;
struct pxp_channel channel[NR_PXP_VIRT_CHANNEL];
struct work_struct work;
struct workqueue_struct *workqueue;
- wait_queue_head_t done;
/* describes most recent processing configuration */
struct pxp_config_data pxp_conf_state;
-
- /* to turn clock off when pxp is inactive */
- struct timer_list clk_timer;
};
#define to_pxp_dma(d) container_of(d, struct pxp_dma, dma)
@@ -78,9 +70,6 @@ struct pxps {
#define PXP_DEF_BUFS 2
#define PXP_MIN_PIX 8
-#define PXP_WAITCON ((__raw_readl(pxp->base + HW_PXP_STAT) & \
- BM_PXP_STAT_IRQ) != BM_PXP_STAT_IRQ)
-
static uint32_t pxp_s0_formats[] = {
PXP_PIX_FMT_RGB24,
PXP_PIX_FMT_RGB565,
@@ -94,76 +83,72 @@ static uint32_t pxp_s0_formats[] = {
*/
static void dump_pxp_reg(struct pxps *pxp)
{
- dev_dbg(pxp->dev, "PXP_CTRL 0x%x",
+ dev_err(pxp->dev, "PXP_CTRL 0x%x",
__raw_readl(pxp->base + HW_PXP_CTRL));
- dev_dbg(pxp->dev, "PXP_STAT 0x%x",
+ dev_err(pxp->dev, "PXP_STAT 0x%x",
__raw_readl(pxp->base + HW_PXP_STAT));
- dev_dbg(pxp->dev, "PXP_OUTBUF 0x%x",
+ dev_err(pxp->dev, "PXP_OUTBUF 0x%x",
__raw_readl(pxp->base + HW_PXP_OUTBUF));
- dev_dbg(pxp->dev, "PXP_OUTBUF2 0x%x",
+ dev_err(pxp->dev, "PXP_OUTBUF2 0x%x",
__raw_readl(pxp->base + HW_PXP_OUTBUF2));
- dev_dbg(pxp->dev, "PXP_OUTSIZE 0x%x",
+ dev_err(pxp->dev, "PXP_OUTSIZE 0x%x",
__raw_readl(pxp->base + HW_PXP_OUTSIZE));
- dev_dbg(pxp->dev, "PXP_S0BUF 0x%x",
+ dev_err(pxp->dev, "PXP_S0BUF 0x%x",
__raw_readl(pxp->base + HW_PXP_S0BUF));
- dev_dbg(pxp->dev, "PXP_S0UBUF 0x%x",
+ dev_err(pxp->dev, "PXP_S0UBUF 0x%x",
__raw_readl(pxp->base + HW_PXP_S0UBUF));
- dev_dbg(pxp->dev, "PXP_S0VBUF 0x%x",
+ dev_err(pxp->dev, "PXP_S0VBUF 0x%x",
__raw_readl(pxp->base + HW_PXP_S0VBUF));
- dev_dbg(pxp->dev, "PXP_S0PARAM 0x%x",
+ dev_err(pxp->dev, "PXP_S0PARAM 0x%x",
__raw_readl(pxp->base + HW_PXP_S0PARAM));
- dev_dbg(pxp->dev, "PXP_S0BACKGROUND 0x%x",
+ dev_err(pxp->dev, "PXP_S0BACKGROUND 0x%x",
__raw_readl(pxp->base + HW_PXP_S0BACKGROUND));
- dev_dbg(pxp->dev, "PXP_S0CROP 0x%x",
+ dev_err(pxp->dev, "PXP_S0CROP 0x%x",
__raw_readl(pxp->base + HW_PXP_S0CROP));
- dev_dbg(pxp->dev, "PXP_S0SCALE 0x%x",
+ dev_err(pxp->dev, "PXP_S0SCALE 0x%x",
__raw_readl(pxp->base + HW_PXP_S0SCALE));
- dev_dbg(pxp->dev, "PXP_OLn 0x%x",
+ dev_err(pxp->dev, "PXP_OLn 0x%x",
__raw_readl(pxp->base + HW_PXP_OLn(0)));
- dev_dbg(pxp->dev, "PXP_OLnSIZE 0x%x",
+ dev_err(pxp->dev, "PXP_OLnSIZE 0x%x",
__raw_readl(pxp->base + HW_PXP_OLnSIZE(0)));
- dev_dbg(pxp->dev, "PXP_OLnPARAM 0x%x",
+ dev_err(pxp->dev, "PXP_OLnPARAM 0x%x",
__raw_readl(pxp->base + HW_PXP_OLnPARAM(0)));
- dev_dbg(pxp->dev, "PXP_CSCCOEF0 0x%x",
+ dev_err(pxp->dev, "PXP_CSCCOEF0 0x%x",
__raw_readl(pxp->base + HW_PXP_CSCCOEF0));
- dev_dbg(pxp->dev, "PXP_CSCCOEF1 0x%x",
- __raw_readl(pxp->base + HW_PXP_CSCCOEF1));
- dev_dbg(pxp->dev, "PXP_CSCCOEF2 0x%x",
- __raw_readl(pxp->base + HW_PXP_CSCCOEF2));
- dev_dbg(pxp->dev, "PXP_CSC2CTRL 0x%x",
+ dev_err(pxp->dev, "PXP_CSC2CTRL 0x%x",
__raw_readl(pxp->base + HW_PXP_CSC2CTRL));
- dev_dbg(pxp->dev, "PXP_CSC2COEF0 0x%x",
+ dev_err(pxp->dev, "PXP_CSC2COEF0 0x%x",
__raw_readl(pxp->base + HW_PXP_CSC2COEF0));
- dev_dbg(pxp->dev, "PXP_CSC2COEF1 0x%x",
+ dev_err(pxp->dev, "PXP_CSC2COEF1 0x%x",
__raw_readl(pxp->base + HW_PXP_CSC2COEF1));
- dev_dbg(pxp->dev, "PXP_CSC2COEF2 0x%x",
+ dev_err(pxp->dev, "PXP_CSC2COEF2 0x%x",
__raw_readl(pxp->base + HW_PXP_CSC2COEF2));
- dev_dbg(pxp->dev, "PXP_CSC2COEF3 0x%x",
+ dev_err(pxp->dev, "PXP_CSC2COEF3 0x%x",
__raw_readl(pxp->base + HW_PXP_CSC2COEF3));
- dev_dbg(pxp->dev, "PXP_CSC2COEF4 0x%x",
+ dev_err(pxp->dev, "PXP_CSC2COEF4 0x%x",
__raw_readl(pxp->base + HW_PXP_CSC2COEF4));
- dev_dbg(pxp->dev, "PXP_CSC2COEF5 0x%x",
+ dev_err(pxp->dev, "PXP_CSC2COEF5 0x%x",
__raw_readl(pxp->base + HW_PXP_CSC2COEF5));
- dev_dbg(pxp->dev, "PXP_LUT_CTRL 0x%x",
+ dev_err(pxp->dev, "PXP_LUT_CTRL 0x%x",
__raw_readl(pxp->base + HW_PXP_LUT_CTRL));
- dev_dbg(pxp->dev, "PXP_LUT 0x%x", __raw_readl(pxp->base + HW_PXP_LUT));
- dev_dbg(pxp->dev, "PXP_HIST_CTRL 0x%x",
+ dev_err(pxp->dev, "PXP_LUT 0x%x", __raw_readl(pxp->base + HW_PXP_LUT));
+ dev_err(pxp->dev, "PXP_HIST_CTRL 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST_CTRL));
- dev_dbg(pxp->dev, "PXP_HIST2_PARAM 0x%x",
+ dev_err(pxp->dev, "PXP_HIST2_PARAM 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST2_PARAM));
- dev_dbg(pxp->dev, "PXP_HIST4_PARAM 0x%x",
+ dev_err(pxp->dev, "PXP_HIST4_PARAM 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST4_PARAM));
- dev_dbg(pxp->dev, "PXP_HIST8_PARAM0 0x%x",
+ dev_err(pxp->dev, "PXP_HIST8_PARAM0 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST8_PARAM0));
- dev_dbg(pxp->dev, "PXP_HIST8_PARAM1 0x%x",
+ dev_err(pxp->dev, "PXP_HIST8_PARAM1 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST8_PARAM1));
- dev_dbg(pxp->dev, "PXP_HIST16_PARAM0 0x%x",
+ dev_err(pxp->dev, "PXP_HIST16_PARAM0 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST16_PARAM0));
- dev_dbg(pxp->dev, "PXP_HIST16_PARAM1 0x%x",
+ dev_err(pxp->dev, "PXP_HIST16_PARAM1 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST16_PARAM1));
- dev_dbg(pxp->dev, "PXP_HIST16_PARAM2 0x%x",
+ dev_err(pxp->dev, "PXP_HIST16_PARAM2 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST16_PARAM2));
- dev_dbg(pxp->dev, "PXP_HIST16_PARAM3 0x%x",
+ dev_err(pxp->dev, "PXP_HIST16_PARAM3 0x%x",
__raw_readl(pxp->base + HW_PXP_HIST16_PARAM3));
}
@@ -268,7 +253,6 @@ static int pxp_start(struct pxps *pxp)
static void pxp_set_outbuf(struct pxps *pxp)
{
struct pxp_config_data *pxp_conf = &pxp->pxp_conf_state;
- struct pxp_proc_data *proc_data = &pxp_conf->proc_data;
struct pxp_layer_param *out_params = &pxp_conf->out_param;
__raw_writel(out_params->paddr, pxp->base + HW_PXP_OUTBUF);
@@ -340,7 +324,7 @@ static void pxp_set_olparam(int layer_no, struct pxps *pxp)
else
olparam |=
BF_PXP_OLnPARAM_FORMAT(BV_PXP_OLnPARAM_FORMAT__RGB565);
- if (olparams_data->global_alpha_enable)
+ if (olparams_data->global_alpha)
olparam |=
BF_PXP_OLnPARAM_ALPHA_CNTL
(BV_PXP_OLnPARAM_ALPHA_CNTL__Override);
@@ -493,9 +477,9 @@ static void pxp_set_csc(struct pxps *pxp)
*/
/* CSC1 - YUV->RGB */
- __raw_writel(0x84ab01f0, pxp->base + HW_PXP_CSCCOEF0);
- __raw_writel(0x01230204, pxp->base + HW_PXP_CSCCOEF1);
- __raw_writel(0x0730079c, pxp->base + HW_PXP_CSCCOEF2);
+ __raw_writel(0x04030000, pxp->base + HW_PXP_CSCCOEF0);
+ __raw_writel(0x01230208, pxp->base + HW_PXP_CSCCOEF1);
+ __raw_writel(0x076b079c, pxp->base + HW_PXP_CSCCOEF2);
/* CSC2 - Bypass */
__raw_writel(0x1, pxp->base + HW_PXP_CSC2CTRL);
@@ -596,43 +580,6 @@ static int pxp_config(struct pxps *pxp, struct pxp_channel *pxp_chan)
return 0;
}
-static void pxp_clk_enable(struct pxps *pxp)
-{
- mutex_lock(&pxp->mutex_clk);
-
- if (pxp->clk_stat == CLK_STAT_ON) {
- mutex_unlock(&pxp->mutex_clk);
- return;
- }
-
- clk_enable(pxp->clk);
- pxp->clk_stat = CLK_STAT_ON;
-
- mutex_unlock(&pxp->mutex_clk);
-}
-
-static void pxp_clk_disable(struct pxps *pxp)
-{
- mutex_lock(&pxp->mutex_clk);
-
- if (pxp->clk_stat == CLK_STAT_OFF) {
- mutex_unlock(&pxp->mutex_clk);
- return;
- }
-
- clk_disable(pxp->clk);
- pxp->clk_stat = CLK_STAT_OFF;
-
- mutex_unlock(&pxp->mutex_clk);
-}
-
-static void pxp_clkoff_timer(unsigned long arg)
-{
- struct pxps *pxp = (struct pxps *)arg;
-
- pxp_clk_disable(pxp);
-}
-
static struct pxp_tx_desc *pxpdma_first_active(struct pxp_channel *pxp_chan)
{
return list_entry(pxp_chan->active_list.next, struct pxp_tx_desc, list);
@@ -689,9 +636,13 @@ static void pxpdma_dostart_work(struct work_struct *w)
struct pxps *pxp = container_of(w, struct pxps, work);
struct pxp_channel *pxp_chan = NULL;
unsigned long flags, flags1;
+ int val;
- while (__raw_readl(pxp->base + HW_PXP_CTRL) & BM_PXP_CTRL_ENABLE)
- ;
+ val = __raw_readl(pxp->base + HW_PXP_CTRL);
+ if (val & BM_PXP_CTRL_ENABLE) {
+ pr_warning("pxp is active, quit.\n");
+ return;
+ }
spin_lock_irqsave(&pxp->lock, flags);
if (list_empty(&head)) {
@@ -813,7 +764,7 @@ static int pxp_init_channel(struct pxp_dma *pxp_dma,
spin_lock_irqsave(&pxp->lock, flags);
/* max desc nr: S0+OL+OUT = 1+8+1 */
- n_desc = 16;
+ n_desc = 10;
spin_unlock_irqrestore(&pxp->lock, flags);
@@ -844,38 +795,25 @@ static int pxp_uninit_channel(struct pxp_dma *pxp_dma,
static irqreturn_t pxp_irq(int irq, void *dev_id)
{
- struct pxps *pxp = dev_id;
- struct pxp_channel *pxp_chan;
+ struct pxp_channel *pxp_chan = dev_id;
+ struct pxp_dma *pxp_dma = to_pxp_dma(pxp_chan->dma_chan.device);
+ struct pxps *pxp = to_pxp(pxp_dma);
struct pxp_tx_desc *desc;
dma_async_tx_callback callback;
void *callback_param;
- unsigned long flags, flags1;
+ unsigned long flags;
u32 hist_status;
- dump_pxp_reg(pxp);
-
hist_status =
__raw_readl(pxp->base + HW_PXP_HIST_CTRL) & BM_PXP_HIST_CTRL_STATUS;
__raw_writel(BM_PXP_STAT_IRQ, pxp->base + HW_PXP_STAT_CLR);
- mod_timer(&pxp->clk_timer, jiffies + msecs_to_jiffies(4000));
-
spin_lock_irqsave(&pxp->lock, flags);
- if (list_empty(&head)) {
- spin_unlock_irqrestore(&pxp->lock, flags);
- return IRQ_NONE;
- }
-
- spin_lock_irqsave(&pxp_chan->lock, flags1);
- pxp_chan = list_entry(head.next, struct pxp_channel, list);
- list_del_init(&pxp_chan->list);
-
if (list_empty(&pxp_chan->active_list)) {
pr_debug("PXP_IRQ pxp_chan->active_list empty. chan_id %d\n",
pxp_chan->dma_chan.chan_id);
- spin_unlock_irqrestore(&pxp_chan->lock, flags1);
spin_unlock_irqrestore(&pxp->lock, flags);
return IRQ_NONE;
}
@@ -901,11 +839,10 @@ static irqreturn_t pxp_irq(int irq, void *dev_id)
list_del(&pxp_chan->list);
- wake_up(&pxp->done);
-
- spin_unlock_irqrestore(&pxp_chan->lock, flags1);
spin_unlock_irqrestore(&pxp->lock, flags);
+ queue_work(pxp->workqueue, &pxp->work);
+
return IRQ_HANDLED;
}
@@ -1021,27 +958,17 @@ static void pxp_issue_pending(struct dma_chan *chan)
spin_lock_irqsave(&pxp->lock, flags0);
spin_lock_irqsave(&pxp_chan->lock, flags);
+ if (!list_empty(&pxp_chan->active_list))
+ queue_work(pxp->workqueue, &pxp->work);
if (!list_empty(&pxp_chan->queue)) {
pxpdma_dequeue(pxp_chan, &pxp_chan->active_list);
pxp_chan->status = PXP_CHANNEL_READY;
list_add_tail(&pxp_chan->list, &head);
- } else {
- spin_unlock_irqrestore(&pxp_chan->lock, flags);
- spin_unlock_irqrestore(&pxp->lock, flags0);
- return;
+ queue_work(pxp->workqueue, &pxp->work);
}
spin_unlock_irqrestore(&pxp_chan->lock, flags);
spin_unlock_irqrestore(&pxp->lock, flags0);
-
- pxp_clk_enable(pxp);
- if (!wait_event_interruptible_timeout(pxp->done, PXP_WAITCON, 2 * HZ) ||
- signal_pending(current)) {
- pxp_clk_disable(pxp);
- return;
- }
-
- queue_work(pxp->workqueue, &pxp->work);
}
static void __pxp_terminate_all(struct dma_chan *chan)
@@ -1089,6 +1016,11 @@ static int pxp_alloc_chan_resources(struct dma_chan *chan)
if (ret < 0)
goto err_chan;
+ ret = request_irq(pxp_chan->eof_irq, pxp_irq, IRQF_SHARED,
+ "pxp-irq", pxp_chan);
+ if (ret < 0)
+ goto err_irq;
+
pxp_chan->status = PXP_CHANNEL_INITIALIZED;
dev_dbg(&chan->dev->device, "Found channel 0x%x, irq %d\n",
@@ -1096,6 +1028,8 @@ static int pxp_alloc_chan_resources(struct dma_chan *chan)
return ret;
+err_irq:
+ pxp_uninit_channel(pxp_dma, pxp_chan);
err_chan:
return ret;
}
@@ -1113,6 +1047,8 @@ static void pxp_free_chan_resources(struct dma_chan *chan)
pxp_uninit_channel(pxp_dma, pxp_chan);
+ free_irq(pxp_chan->eof_irq, pxp_chan);
+
mutex_unlock(&pxp_chan->chan_mutex);
}
@@ -1315,7 +1251,7 @@ static int pxp_probe(struct platform_device *pdev)
pxp->irq = irq;
spin_lock_init(&pxp->lock);
- mutex_init(&pxp->mutex_clk);
+ mutex_init(&pxp->mutex);
if (!request_mem_region(res->start, resource_size(res), "pxp-mem")) {
err = -EBUSY;
@@ -1333,26 +1269,19 @@ static int pxp_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "failed to initialize hardware\n");
goto release;
}
- clk_disable(pxp->clk);
- err = request_irq(pxp->irq, pxp_irq, 0, "pxp-irq", pxp);
- if (err)
- goto release;
/* Initialize DMA engine */
err = pxp_dma_init(pxp);
if (err < 0)
goto err_dma_init;
- init_waitqueue_head(&pxp->done);
INIT_WORK(&pxp->work, pxpdma_dostart_work);
pxp->workqueue = create_singlethread_workqueue("pxp_dma");
- init_timer(&pxp->clk_timer);
- pxp->clk_timer.function = pxp_clkoff_timer;
- pxp->clk_timer.data = (unsigned long)pxp;
exit:
return err;
err_dma_init:
free_irq(pxp->irq, pxp);
+ clk_disable(pxp->clk);
release:
release_mem_region(res->start, resource_size(res));
freepxp:
@@ -1366,8 +1295,8 @@ static int __devexit pxp_remove(struct platform_device *pdev)
struct pxps *pxp = platform_get_drvdata(pdev);
cancel_work_sync(&pxp->work);
+ kfree(pxp);
- del_timer_sync(&pxp->clk_timer);
free_irq(pxp->irq, pxp);
clk_disable(pxp->clk);
clk_put(pxp->clk);
@@ -1383,12 +1312,11 @@ static int pxp_suspend(struct platform_device *pdev, pm_message_t state)
{
struct pxps *pxp = platform_get_drvdata(pdev);
- pxp_clk_enable(pxp);
while (__raw_readl(pxp->base + HW_PXP_CTRL) & BM_PXP_CTRL_ENABLE)
;
__raw_writel(BM_PXP_CTRL_SFTRST, pxp->base + HW_PXP_CTRL);
- pxp_clk_disable(pxp);
+ clk_disable(pxp->clk);
return 0;
}
@@ -1397,10 +1325,9 @@ static int pxp_resume(struct platform_device *pdev)
{
struct pxps *pxp = platform_get_drvdata(pdev);
- pxp_clk_enable(pxp);
+ clk_enable(pxp->clk);
/* Pull PxP out of reset */
__raw_writel(0, pxp->base + HW_PXP_CTRL);
- pxp_clk_disable(pxp);
return 0;
}
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c
index d335086f4a26..0bd85eb99e6e 100644
--- a/drivers/edac/i5000_edac.c
+++ b/drivers/edac/i5000_edac.c
@@ -577,7 +577,13 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci,
debugf0("\tUncorrected bits= 0x%x\n", ue_errors);
branch = EXTRACT_FBDCHAN_INDX(info->ferr_nf_fbd);
- channel = branch;
+
+ /*
+ * According with i5000 datasheet, bit 28 has no significance
+ * for errors M4Err-M12Err and M17Err-M21Err, on FERR_NF_FBD
+ */
+ channel = branch & 2;
+
bank = NREC_BANK(info->nrecmema);
rank = NREC_RANK(info->nrecmema);
rdwr = NREC_RDWR(info->nrecmema);
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index 76b321bb73f9..e5827da92296 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -2180,6 +2180,13 @@ static int ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
page = payload >> PAGE_SHIFT;
offset = payload & ~PAGE_MASK;
rest = p->payload_length;
+ /*
+ * The controllers I've tested have not worked correctly when
+ * second_req_count is zero. Rather than do something we know won't
+ * work, return an error
+ */
+ if (rest == 0)
+ return -EINVAL;
/* FIXME: make packet-per-buffer/dual-buffer a context option */
while (rest > 0) {
@@ -2233,7 +2240,7 @@ static int ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base,
unsigned long payload)
{
struct iso_context *ctx = container_of(base, struct iso_context, base);
- struct descriptor *d = NULL, *pd = NULL;
+ struct descriptor *d, *pd;
struct fw_iso_packet *p = packet;
dma_addr_t d_bus, page_bus;
u32 z, header_z, rest;
@@ -2271,8 +2278,9 @@ static int ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base,
d->data_address = cpu_to_le32(d_bus + (z * sizeof(*d)));
rest = payload_per_buffer;
+ pd = d;
for (j = 1; j < z; j++) {
- pd = d + j;
+ pd++;
pd->control = cpu_to_le16(DESCRIPTOR_STATUS |
DESCRIPTOR_INPUT_MORE);
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 39b393d38bb3..012cf1f7b8db 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -82,6 +82,7 @@ config DRM_I830
config DRM_I915
tristate "i915 driver"
depends on AGP_INTEL
+ select SHMEM
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 7f2728bbc16c..55fb98d179ef 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -333,6 +333,12 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
mode->vsync_end = mode->vsync_start + vsync_pulse_width;
mode->vtotal = mode->vdisplay + vblank;
+ /* Some EDIDs have bogus h/vtotal values */
+ if (mode->hsync_end > mode->htotal)
+ mode->htotal = mode->hsync_end + 1;
+ if (mode->vsync_end > mode->vtotal)
+ mode->vtotal = mode->vsync_end + 1;
+
drm_mode_set_name(mode);
if (pt->misc & DRM_EDID_PT_INTERLACED)
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index f85aaf21e783..f298434e87c7 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -402,15 +402,21 @@ int drm_vblank_get(struct drm_device *dev, int crtc)
spin_lock_irqsave(&dev->vbl_lock, irqflags);
/* Going from 0->1 means we have to enable interrupts again */
- if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1 &&
- !dev->vblank_enabled[crtc]) {
- ret = dev->driver->enable_vblank(dev, crtc);
- DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret);
- if (ret)
+ if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1) {
+ if (!dev->vblank_enabled[crtc]) {
+ ret = dev->driver->enable_vblank(dev, crtc);
+ DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret);
+ if (ret)
+ atomic_dec(&dev->vblank_refcount[crtc]);
+ else {
+ dev->vblank_enabled[crtc] = 1;
+ drm_update_vblank_count(dev, crtc);
+ }
+ }
+ } else {
+ if (!dev->vblank_enabled[crtc]) {
atomic_dec(&dev->vblank_refcount[crtc]);
- else {
- dev->vblank_enabled[crtc] = 1;
- drm_update_vblank_count(dev, crtc);
+ ret = -EINVAL;
}
}
spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
@@ -437,6 +443,18 @@ void drm_vblank_put(struct drm_device *dev, int crtc)
}
EXPORT_SYMBOL(drm_vblank_put);
+void drm_vblank_off(struct drm_device *dev, int crtc)
+{
+ unsigned long irqflags;
+
+ spin_lock_irqsave(&dev->vbl_lock, irqflags);
+ DRM_WAKEUP(&dev->vbl_queue[crtc]);
+ dev->vblank_enabled[crtc] = 0;
+ dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc);
+ spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+}
+EXPORT_SYMBOL(drm_vblank_off);
+
/**
* drm_vblank_pre_modeset - account for vblanks across mode sets
* @dev: DRM device
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index fc4b68aa2d05..c078d995aa91 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -94,8 +94,6 @@ static int i915_resume(struct drm_device *dev)
struct drm_i915_private *dev_priv = dev->dev_private;
int ret = 0;
- pci_set_power_state(dev->pdev, PCI_D0);
- pci_restore_state(dev->pdev);
if (pci_enable_device(dev->pdev))
return -1;
pci_set_master(dev->pdev);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 5b4f87e55621..d3f365d8b6ef 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -264,6 +264,7 @@ typedef struct drm_i915_private {
u32 saveDSPASURF;
u32 saveDSPATILEOFF;
u32 savePFIT_PGM_RATIOS;
+ u32 saveBLC_HIST_CTL;
u32 saveBLC_PWM_CTL;
u32 saveBLC_PWM_CTL2;
u32 saveFPB0;
@@ -837,6 +838,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
#define IS_I85X(dev) ((dev)->pci_device == 0x3582)
#define IS_I855(dev) ((dev)->pci_device == 0x3582)
#define IS_I865G(dev) ((dev)->pci_device == 0x2572)
+#define IS_I8XX(dev) (IS_I830(dev) || IS_845G(dev) || IS_I85X(dev) || IS_I865G(dev))
#define IS_I915G(dev) ((dev)->pci_device == 0x2582 || (dev)->pci_device == 0x258a)
#define IS_I915GM(dev) ((dev)->pci_device == 0x2592)
@@ -854,6 +856,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
(dev)->pci_device == 0x2E12 || \
(dev)->pci_device == 0x2E22 || \
(dev)->pci_device == 0x2E32 || \
+ (dev)->pci_device == 0x2E42 || \
(dev)->pci_device == 0x0042 || \
(dev)->pci_device == 0x0046)
@@ -866,6 +869,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
(dev)->pci_device == 0x2E12 || \
(dev)->pci_device == 0x2E22 || \
(dev)->pci_device == 0x2E32 || \
+ (dev)->pci_device == 0x2E42 || \
IS_GM45(dev))
#define IS_IGDG(dev) ((dev)->pci_device == 0xa001)
@@ -896,9 +900,12 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
*/
#define HAS_128_BYTE_Y_TILING(dev) (IS_I9XX(dev) && !(IS_I915G(dev) || \
IS_I915GM(dev)))
+#define SUPPORTS_DIGITAL_OUTPUTS(dev) (IS_I9XX(dev) && !IS_IGD(dev))
#define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_IGDNG(dev))
#define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IGDNG(dev))
#define SUPPORTS_EDP(dev) (IS_IGDNG_M(dev))
+#define SUPPORTS_TV(dev) (IS_I9XX(dev) && IS_MOBILE(dev) && \
+ !IS_IGDNG(dev) && !IS_IGD(dev))
#define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev))
/* dsparb controlled by hw only */
#define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IGDNG(dev))
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 80e5ba490dc2..2b7aeeed3990 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1151,27 +1151,21 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
mutex_lock(&dev->struct_mutex);
if (!obj_priv->gtt_space) {
ret = i915_gem_object_bind_to_gtt(obj, obj_priv->gtt_alignment);
- if (ret) {
- mutex_unlock(&dev->struct_mutex);
- return VM_FAULT_SIGBUS;
- }
-
- ret = i915_gem_object_set_to_gtt_domain(obj, write);
- if (ret) {
- mutex_unlock(&dev->struct_mutex);
- return VM_FAULT_SIGBUS;
- }
+ if (ret)
+ goto unlock;
list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
+
+ ret = i915_gem_object_set_to_gtt_domain(obj, write);
+ if (ret)
+ goto unlock;
}
/* Need a new fence register? */
if (obj_priv->tiling_mode != I915_TILING_NONE) {
ret = i915_gem_object_get_fence_reg(obj);
- if (ret) {
- mutex_unlock(&dev->struct_mutex);
- return VM_FAULT_SIGBUS;
- }
+ if (ret)
+ goto unlock;
}
pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) +
@@ -1179,18 +1173,18 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
/* Finally, remap it using the new GTT offset */
ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
-
+unlock:
mutex_unlock(&dev->struct_mutex);
switch (ret) {
+ case 0:
+ case -ERESTARTSYS:
+ return VM_FAULT_NOPAGE;
case -ENOMEM:
case -EAGAIN:
return VM_FAULT_OOM;
- case -EFAULT:
- case -EINVAL:
- return VM_FAULT_SIGBUS;
default:
- return VM_FAULT_NOPAGE;
+ return VM_FAULT_SIGBUS;
}
}
@@ -2506,16 +2500,6 @@ i915_gem_clflush_object(struct drm_gem_object *obj)
if (obj_priv->pages == NULL)
return;
- /* XXX: The 865 in particular appears to be weird in how it handles
- * cache flushing. We haven't figured it out, but the
- * clflush+agp_chipset_flush doesn't appear to successfully get the
- * data visible to the PGU, while wbinvd + agp_chipset_flush does.
- */
- if (IS_I865G(obj->dev)) {
- wbinvd();
- return;
- }
-
drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE);
}
@@ -3007,6 +2991,16 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj,
return -EINVAL;
}
+ if (reloc->delta >= target_obj->size) {
+ DRM_ERROR("Relocation beyond target object bounds: "
+ "obj %p target %d delta %d size %d.\n",
+ obj, reloc->target_handle,
+ (int) reloc->delta, (int) target_obj->size);
+ drm_gem_object_unreference(target_obj);
+ i915_gem_object_unpin(obj);
+ return -EINVAL;
+ }
+
if (reloc->write_domain & I915_GEM_DOMAIN_CPU ||
reloc->read_domains & I915_GEM_DOMAIN_CPU) {
DRM_ERROR("reloc with read/write CPU domains: "
@@ -3837,7 +3831,8 @@ void i915_gem_free_object(struct drm_gem_object *obj)
i915_gem_object_unbind(obj);
- i915_gem_free_mmap_offset(obj);
+ if (obj_priv->mmap_offset)
+ i915_gem_free_mmap_offset(obj);
kfree(obj_priv->page_cpu_valid);
kfree(obj_priv->bit_17);
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index a2d527b22ec4..e774a4a1a503 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -234,7 +234,13 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN;
bool need_disable;
- if (!IS_I9XX(dev)) {
+ if (IS_IGDNG(dev)) {
+ /* On IGDNG whatever DRAM config, GPU always do
+ * same swizzling setup.
+ */
+ swizzle_x = I915_BIT_6_SWIZZLE_9_10;
+ swizzle_y = I915_BIT_6_SWIZZLE_9;
+ } else if (!IS_I9XX(dev)) {
/* As far as we know, the 865 doesn't have these bit 6
* swizzling issues.
*/
@@ -317,13 +323,6 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
}
}
- /* FIXME: check with memory config on IGDNG */
- if (IS_IGDNG(dev)) {
- DRM_ERROR("disable tiling on IGDNG...\n");
- swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN;
- swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN;
- }
-
dev_priv->mm.bit_6_swizzle_x = swizzle_x;
dev_priv->mm.bit_6_swizzle_y = swizzle_y;
}
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 7ebc84c2881e..9431a727a985 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -253,10 +253,15 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev)
{
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
int ret = IRQ_NONE;
- u32 de_iir, gt_iir;
+ u32 de_iir, gt_iir, de_ier;
u32 new_de_iir, new_gt_iir;
struct drm_i915_master_private *master_priv;
+ /* disable master interrupt before clearing iir */
+ de_ier = I915_READ(DEIER);
+ I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
+ (void)I915_READ(DEIER);
+
de_iir = I915_READ(DEIIR);
gt_iir = I915_READ(GTIIR);
@@ -287,6 +292,9 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev)
gt_iir = new_gt_iir;
}
+ I915_WRITE(DEIER, de_ier);
+ (void)I915_READ(DEIER);
+
return ret;
}
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 2955083aa471..9917749afb32 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -915,6 +915,8 @@
#define BACKLIGHT_DUTY_CYCLE_SHIFT (0)
#define BACKLIGHT_DUTY_CYCLE_MASK (0xffff)
+#define BLC_HIST_CTL 0x61260
+
/* TV port control */
#define TV_CTL 0x68000
/** Enables the TV encoder */
@@ -1616,6 +1618,11 @@
#define PIPE_START_VBLANK_INTERRUPT_STATUS (1UL<<2) /* 965 or later */
#define PIPE_VBLANK_INTERRUPT_STATUS (1UL<<1)
#define PIPE_OVERLAY_UPDATED_STATUS (1UL<<0)
+#define PIPE_BPC_MASK (7 << 5) /* Ironlake */
+#define PIPE_8BPC (0 << 5)
+#define PIPE_10BPC (1 << 5)
+#define PIPE_6BPC (2 << 5)
+#define PIPE_12BPC (3 << 5)
#define DSPARB 0x70030
#define DSPARB_CSTART_MASK (0x7f << 7)
@@ -1733,6 +1740,7 @@
#define DISPPLANE_NO_LINE_DOUBLE 0
#define DISPPLANE_STEREO_POLARITY_FIRST 0
#define DISPPLANE_STEREO_POLARITY_SECOND (1<<18)
+#define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* IGDNG */
#define DISPPLANE_TILED (1<<10)
#define DSPAADDR 0x70184
#define DSPASTRIDE 0x70188
@@ -1865,8 +1873,15 @@
#define PFA_CTL_1 0x68080
#define PFB_CTL_1 0x68880
#define PF_ENABLE (1<<31)
+#define PF_FILTER_MASK (3<<23)
+#define PF_FILTER_PROGRAMMED (0<<23)
+#define PF_FILTER_MED_3x3 (1<<23)
+#define PF_FILTER_EDGE_ENHANCE (2<<23)
+#define PF_FILTER_EDGE_SOFTEN (3<<23)
#define PFA_WIN_SZ 0x68074
#define PFB_WIN_SZ 0x68874
+#define PFA_WIN_POS 0x68070
+#define PFB_WIN_POS 0x68870
/* legacy palette */
#define LGC_PALETTE_A 0x4a000
@@ -1913,6 +1928,9 @@
#define GTIIR 0x44018
#define GTIER 0x4401c
+#define DISP_ARB_CTL 0x45000
+#define DISP_TILE_SURFACE_SWIZZLING (1<<13)
+
/* PCH */
/* south display engine interrupt */
@@ -1979,11 +1997,11 @@
#define DREF_CPU_SOURCE_OUTPUT_MASK (3<<13)
#define DREF_SSC_SOURCE_DISABLE (0<<11)
#define DREF_SSC_SOURCE_ENABLE (2<<11)
-#define DREF_SSC_SOURCE_MASK (2<<11)
+#define DREF_SSC_SOURCE_MASK (3<<11)
#define DREF_NONSPREAD_SOURCE_DISABLE (0<<9)
#define DREF_NONSPREAD_CK505_ENABLE (1<<9)
#define DREF_NONSPREAD_SOURCE_ENABLE (2<<9)
-#define DREF_NONSPREAD_SOURCE_MASK (2<<9)
+#define DREF_NONSPREAD_SOURCE_MASK (3<<9)
#define DREF_SUPERSPREAD_SOURCE_DISABLE (0<<7)
#define DREF_SUPERSPREAD_SOURCE_ENABLE (2<<7)
#define DREF_SSC4_DOWNSPREAD (0<<6)
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
index 1d04e1904ac6..2e4aca658b8b 100644
--- a/drivers/gpu/drm/i915/i915_suspend.c
+++ b/drivers/gpu/drm/i915/i915_suspend.c
@@ -416,6 +416,7 @@ int i915_save_state(struct drm_device *dev)
dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL);
dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS);
dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL);
+ dev_priv->saveBLC_HIST_CTL = I915_READ(BLC_HIST_CTL);
if (IS_I965G(dev))
dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2);
if (IS_MOBILE(dev) && !IS_I830(dev))
@@ -560,6 +561,7 @@ int i915_restore_state(struct drm_device *dev)
I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS);
I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL);
+ I915_WRITE(BLC_HIST_CTL, dev_priv->saveBLC_HIST_CTL);
I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS);
I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS);
I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR);
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index f806fcc54e09..698a0edf0ea9 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -217,6 +217,9 @@ parse_general_features(struct drm_i915_private *dev_priv,
if (IS_I85X(dev_priv->dev))
dev_priv->lvds_ssc_freq =
general->ssc_freq ? 66 : 48;
+ else if (IS_IGDNG(dev_priv->dev))
+ dev_priv->lvds_ssc_freq =
+ general->ssc_freq ? 100 : 120;
else
dev_priv->lvds_ssc_freq =
general->ssc_freq ? 100 : 96;
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 590f81c8f594..046027fa9731 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -151,13 +151,10 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector)
{
struct drm_device *dev = connector->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
- u32 adpa, temp;
+ u32 adpa;
bool ret;
- temp = adpa = I915_READ(PCH_ADPA);
-
- adpa &= ~ADPA_DAC_ENABLE;
- I915_WRITE(PCH_ADPA, adpa);
+ adpa = I915_READ(PCH_ADPA);
adpa &= ~ADPA_CRT_HOTPLUG_MASK;
@@ -184,8 +181,6 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector)
else
ret = false;
- /* restore origin register */
- I915_WRITE(PCH_ADPA, temp);
return ret;
}
@@ -239,8 +234,8 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
} while (time_after(timeout, jiffies));
}
- if ((I915_READ(PORT_HOTPLUG_STAT) & CRT_HOTPLUG_MONITOR_MASK) ==
- CRT_HOTPLUG_MONITOR_COLOR)
+ if ((I915_READ(PORT_HOTPLUG_STAT) & CRT_HOTPLUG_MONITOR_MASK) !=
+ CRT_HOTPLUG_MONITOR_NONE)
return true;
return false;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 748ed50c55ca..3ac3b7c49869 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -818,7 +818,7 @@ intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
refclk, best_clock);
if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
- if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) ==
+ if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) ==
LVDS_CLKB_POWER_UP)
clock.p2 = limit->p2.p2_fast;
else
@@ -1008,6 +1008,10 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
dspcntr &= ~DISPPLANE_TILED;
}
+ if (IS_IGDNG(dev))
+ /* must disable */
+ dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
+
I915_WRITE(dspcntr_reg, dspcntr);
Start = obj_priv->gtt_offset;
@@ -1154,6 +1158,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF;
int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1;
int pf_win_size = (pipe == 0) ? PFA_WIN_SZ : PFB_WIN_SZ;
+ int pf_win_pos = (pipe == 0) ? PFA_WIN_POS : PFB_WIN_POS;
int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B;
int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B;
int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B;
@@ -1177,6 +1182,15 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
case DRM_MODE_DPMS_STANDBY:
case DRM_MODE_DPMS_SUSPEND:
DRM_DEBUG("crtc %d dpms on\n", pipe);
+
+ if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
+ temp = I915_READ(PCH_LVDS);
+ if ((temp & LVDS_PORT_EN) == 0) {
+ I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN);
+ POSTING_READ(PCH_LVDS);
+ }
+ }
+
if (HAS_eDP) {
/* enable eDP PLL */
igdng_enable_pll_edp(crtc);
@@ -1205,6 +1219,19 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
}
}
+ /* Enable panel fitting for LVDS */
+ if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
+ temp = I915_READ(pf_ctl_reg);
+ I915_WRITE(pf_ctl_reg, temp | PF_ENABLE | PF_FILTER_MED_3x3);
+
+ /* currently full aspect */
+ I915_WRITE(pf_win_pos, 0);
+
+ I915_WRITE(pf_win_size,
+ (dev_priv->panel_fixed_mode->hdisplay << 16) |
+ (dev_priv->panel_fixed_mode->vdisplay));
+ }
+
/* Enable CPU pipe */
temp = I915_READ(pipeconf_reg);
if ((temp & PIPEACONF_ENABLE) == 0) {
@@ -1348,8 +1375,6 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
case DRM_MODE_DPMS_OFF:
DRM_DEBUG("crtc %d dpms off\n", pipe);
- i915_disable_vga(dev);
-
/* Disable display plane */
temp = I915_READ(dspcntr_reg);
if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
@@ -1359,6 +1384,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
I915_READ(dspbase_reg);
}
+ i915_disable_vga(dev);
+
/* disable cpu pipe, disable after all planes disabled */
temp = I915_READ(pipeconf_reg);
if ((temp & PIPEACONF_ENABLE) != 0) {
@@ -1379,9 +1406,15 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
} else
DRM_DEBUG("crtc %d is disabled\n", pipe);
- if (HAS_eDP) {
- igdng_disable_pll_edp(crtc);
+ udelay(100);
+
+ /* Disable PF */
+ temp = I915_READ(pf_ctl_reg);
+ if ((temp & PF_ENABLE) != 0) {
+ I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE);
+ I915_READ(pf_ctl_reg);
}
+ I915_WRITE(pf_win_size, 0);
/* disable CPU FDI tx and PCH FDI rx */
temp = I915_READ(fdi_tx_reg);
@@ -1407,6 +1440,13 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
udelay(100);
+ if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
+ temp = I915_READ(PCH_LVDS);
+ I915_WRITE(PCH_LVDS, temp & ~LVDS_PORT_EN);
+ I915_READ(PCH_LVDS);
+ udelay(100);
+ }
+
/* disable PCH transcoder */
temp = I915_READ(transconf_reg);
if ((temp & TRANS_ENABLE) != 0) {
@@ -1426,6 +1466,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
}
}
+ udelay(100);
+
/* disable PCH DPLL */
temp = I915_READ(pch_dpll_reg);
if ((temp & DPLL_VCO_ENABLE) != 0) {
@@ -1433,14 +1475,20 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
I915_READ(pch_dpll_reg);
}
- temp = I915_READ(fdi_rx_reg);
- if ((temp & FDI_RX_PLL_ENABLE) != 0) {
- temp &= ~FDI_SEL_PCDCLK;
- temp &= ~FDI_RX_PLL_ENABLE;
- I915_WRITE(fdi_rx_reg, temp);
- I915_READ(fdi_rx_reg);
+ if (HAS_eDP) {
+ igdng_disable_pll_edp(crtc);
}
+ temp = I915_READ(fdi_rx_reg);
+ temp &= ~FDI_SEL_PCDCLK;
+ I915_WRITE(fdi_rx_reg, temp);
+ I915_READ(fdi_rx_reg);
+
+ temp = I915_READ(fdi_rx_reg);
+ temp &= ~FDI_RX_PLL_ENABLE;
+ I915_WRITE(fdi_rx_reg, temp);
+ I915_READ(fdi_rx_reg);
+
/* Disable CPU FDI TX PLL */
temp = I915_READ(fdi_tx_reg);
if ((temp & FDI_TX_PLL_ENABLE) != 0) {
@@ -1449,16 +1497,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
udelay(100);
}
- /* Disable PF */
- temp = I915_READ(pf_ctl_reg);
- if ((temp & PF_ENABLE) != 0) {
- I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE);
- I915_READ(pf_ctl_reg);
- }
- I915_WRITE(pf_win_size, 0);
-
/* Wait for the clocks to turn off. */
- udelay(150);
+ udelay(100);
break;
}
}
@@ -1522,6 +1562,7 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
intel_update_watermarks(dev);
/* Give the overlay scaler a chance to disable if it's on this pipe */
//intel_crtc_dpms_video(crtc, FALSE); TODO
+ drm_vblank_off(dev, pipe);
/* Disable the VGA plane that we never use */
i915_disable_vga(dev);
@@ -1746,7 +1787,7 @@ fdi_reduce_ratio(u32 *num, u32 *den)
#define LINK_N 0x80000
static void
-igdng_compute_m_n(int bytes_per_pixel, int nlanes,
+igdng_compute_m_n(int bits_per_pixel, int nlanes,
int pixel_clock, int link_clock,
struct fdi_m_n *m_n)
{
@@ -1756,7 +1797,8 @@ igdng_compute_m_n(int bytes_per_pixel, int nlanes,
temp = (u64) DATA_N * pixel_clock;
temp = div_u64(temp, link_clock);
- m_n->gmch_m = div_u64(temp * bytes_per_pixel, nlanes);
+ m_n->gmch_m = div_u64(temp * bits_per_pixel, nlanes);
+ m_n->gmch_m >>= 3; /* convert to bytes_per_pixel */
m_n->gmch_n = DATA_N;
fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n);
@@ -1858,7 +1900,14 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
{
long entries_required, wm_size;
- entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000;
+ /*
+ * Note: we need to make sure we don't overflow for various clock &
+ * latency values.
+ * clocks go from a few thousand to several hundred thousand.
+ * latency is usually a few thousand
+ */
+ entries_required = ((clock_in_khz / 1000) * pixel_size * latency_ns) /
+ 1000;
entries_required /= wm->cacheline_size;
DRM_DEBUG("FIFO entries required for mode: %d\n", entries_required);
@@ -2371,7 +2420,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
/* FDI link */
if (IS_IGDNG(dev)) {
- int lane, link_bw;
+ int lane, link_bw, bpp;
/* eDP doesn't require FDI link, so just set DP M/N
according to current link config */
if (is_edp) {
@@ -2390,10 +2439,72 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
lane = 4;
link_bw = 270000;
}
- igdng_compute_m_n(3, lane, target_clock,
+
+ /* determine panel color depth */
+ temp = I915_READ(pipeconf_reg);
+
+ switch (temp & PIPE_BPC_MASK) {
+ case PIPE_8BPC:
+ bpp = 24;
+ break;
+ case PIPE_10BPC:
+ bpp = 30;
+ break;
+ case PIPE_6BPC:
+ bpp = 18;
+ break;
+ case PIPE_12BPC:
+ bpp = 36;
+ break;
+ default:
+ DRM_ERROR("unknown pipe bpc value\n");
+ bpp = 24;
+ }
+
+ igdng_compute_m_n(bpp, lane, target_clock,
link_bw, &m_n);
}
+ /* Ironlake: try to setup display ref clock before DPLL
+ * enabling. This is only under driver's control after
+ * PCH B stepping, previous chipset stepping should be
+ * ignoring this setting.
+ */
+ if (IS_IGDNG(dev)) {
+ temp = I915_READ(PCH_DREF_CONTROL);
+ /* Always enable nonspread source */
+ temp &= ~DREF_NONSPREAD_SOURCE_MASK;
+ temp |= DREF_NONSPREAD_SOURCE_ENABLE;
+ I915_WRITE(PCH_DREF_CONTROL, temp);
+ POSTING_READ(PCH_DREF_CONTROL);
+
+ temp &= ~DREF_SSC_SOURCE_MASK;
+ temp |= DREF_SSC_SOURCE_ENABLE;
+ I915_WRITE(PCH_DREF_CONTROL, temp);
+ POSTING_READ(PCH_DREF_CONTROL);
+
+ udelay(200);
+
+ if (is_edp) {
+ if (dev_priv->lvds_use_ssc) {
+ temp |= DREF_SSC1_ENABLE;
+ I915_WRITE(PCH_DREF_CONTROL, temp);
+ POSTING_READ(PCH_DREF_CONTROL);
+
+ udelay(200);
+
+ temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
+ temp |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
+ I915_WRITE(PCH_DREF_CONTROL, temp);
+ POSTING_READ(PCH_DREF_CONTROL);
+ } else {
+ temp |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
+ I915_WRITE(PCH_DREF_CONTROL, temp);
+ POSTING_READ(PCH_DREF_CONTROL);
+ }
+ }
+ }
+
if (IS_IGD(dev))
fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2;
else
@@ -2616,6 +2727,12 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
intel_wait_for_vblank(dev);
+ if (IS_IGDNG(dev)) {
+ /* enable address swizzle for tiling buffer */
+ temp = I915_READ(DISP_ARB_CTL);
+ I915_WRITE(DISP_ARB_CTL, temp | DISP_TILE_SURFACE_SWIZZLING);
+ }
+
I915_WRITE(dspcntr_reg, dspcntr);
/* Flush the plane changes */
@@ -3231,7 +3348,7 @@ static void intel_setup_outputs(struct drm_device *dev)
if (I915_READ(PCH_DP_D) & DP_DETECTED)
intel_dp_init(dev, PCH_DP_D);
- } else if (IS_I9XX(dev)) {
+ } else if (SUPPORTS_DIGITAL_OUTPUTS(dev)) {
bool found = false;
if (I915_READ(SDVOB) & SDVO_DETECTED) {
@@ -3258,10 +3375,10 @@ static void intel_setup_outputs(struct drm_device *dev)
if (SUPPORTS_INTEGRATED_DP(dev) && (I915_READ(DP_D) & DP_DETECTED))
intel_dp_init(dev, DP_D);
- } else
+ } else if (IS_I8XX(dev))
intel_dvo_init(dev);
- if (IS_I9XX(dev) && IS_MOBILE(dev) && !IS_IGDNG(dev))
+ if (SUPPORTS_TV(dev))
intel_tv_init(dev);
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
index 1d30802e773e..75a9b83fd7d3 100644
--- a/drivers/gpu/drm/i915/intel_fb.c
+++ b/drivers/gpu/drm/i915/intel_fb.c
@@ -114,7 +114,7 @@ static int intelfb_check_var(struct fb_var_screeninfo *var,
struct drm_framebuffer *fb = &intel_fb->base;
int depth;
- if (var->pixclock == -1 || !var->pixclock)
+ if (var->pixclock != 0)
return -EINVAL;
/* Need to resize the fb object !!! */
@@ -205,7 +205,7 @@ static int intelfb_set_par(struct fb_info *info)
DRM_DEBUG("%d %d\n", var->xres, var->pixclock);
- if (var->pixclock != -1) {
+ if (var->pixclock != 0) {
DRM_ERROR("PIXEL CLOCK SET\n");
return -EINVAL;
@@ -692,7 +692,7 @@ static int intelfb_multi_fb_probe_crtc(struct drm_device *dev, struct drm_crtc *
par->crtc_count = 1;
if (new_fb) {
- info->var.pixclock = -1;
+ info->var.pixclock = 0;
if (register_framebuffer(info) < 0)
return -EINVAL;
} else
@@ -846,7 +846,7 @@ static int intelfb_single_fb_probe(struct drm_device *dev)
par->crtc_count = crtc_count;
if (new_fb) {
- info->var.pixclock = -1;
+ info->var.pixclock = 0;
if (register_framebuffer(info) < 0)
return -EINVAL;
} else
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 8df02ef89261..b7d091ba8c5c 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -305,6 +305,10 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
goto out;
}
+ /* full screen scale for now */
+ if (IS_IGDNG(dev))
+ goto out;
+
/* 965+ wants fuzzy fitting */
if (IS_I965G(dev))
pfit_control |= (intel_crtc->pipe << PFIT_PIPE_SHIFT) |
@@ -332,8 +336,10 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
* to register description and PRM.
* Change the value here to see the borders for debugging
*/
- I915_WRITE(BCLRPAT_A, 0);
- I915_WRITE(BCLRPAT_B, 0);
+ if (!IS_IGDNG(dev)) {
+ I915_WRITE(BCLRPAT_A, 0);
+ I915_WRITE(BCLRPAT_B, 0);
+ }
switch (lvds_priv->fitting_mode) {
case DRM_MODE_SCALE_NO_SCALE:
@@ -582,7 +588,6 @@ static void intel_lvds_mode_set(struct drm_encoder *encoder,
* settings.
*/
- /* No panel fitting yet, fixme */
if (IS_IGDNG(dev))
return;
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index d3b74ba62b4a..66dc1a54cbf6 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -114,6 +114,9 @@ struct intel_sdvo_priv {
/* DDC bus used by this SDVO output */
uint8_t ddc_bus;
+ /* Mac mini hack -- use the same DDC as the analog connector */
+ struct i2c_adapter *analog_ddc_bus;
+
int save_sdvo_mult;
u16 save_active_outputs;
struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2;
@@ -1478,6 +1481,36 @@ intel_sdvo_multifunc_encoder(struct intel_output *intel_output)
return (caps > 1);
}
+static struct drm_connector *
+intel_find_analog_connector(struct drm_device *dev)
+{
+ struct drm_connector *connector;
+ struct intel_output *intel_output;
+
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+ intel_output = to_intel_output(connector);
+ if (intel_output->type == INTEL_OUTPUT_ANALOG)
+ return connector;
+ }
+ return NULL;
+}
+
+static int
+intel_analog_is_connected(struct drm_device *dev)
+{
+ struct drm_connector *analog_connector;
+ analog_connector = intel_find_analog_connector(dev);
+
+ if (!analog_connector)
+ return false;
+
+ if (analog_connector->funcs->detect(analog_connector) ==
+ connector_status_disconnected)
+ return false;
+
+ return true;
+}
+
enum drm_connector_status
intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
{
@@ -1488,6 +1521,15 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
edid = drm_get_edid(&intel_output->base,
intel_output->ddc_bus);
+
+ /* when there is no edid and no monitor is connected with VGA
+ * port, try to use the CRT ddc to read the EDID for DVI-connector
+ */
+ if (edid == NULL &&
+ sdvo_priv->analog_ddc_bus &&
+ !intel_analog_is_connected(intel_output->base.dev))
+ edid = drm_get_edid(&intel_output->base,
+ sdvo_priv->analog_ddc_bus);
if (edid != NULL) {
/* Don't report the output as connected if it's a DVI-I
* connector with a non-digital EDID coming out.
@@ -1540,31 +1582,32 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect
static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
{
struct intel_output *intel_output = to_intel_output(connector);
+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
+ int num_modes;
/* set the bus switch and get the modes */
- intel_ddc_get_modes(intel_output);
+ num_modes = intel_ddc_get_modes(intel_output);
-#if 0
- struct drm_device *dev = encoder->dev;
- struct drm_i915_private *dev_priv = dev->dev_private;
- /* Mac mini hack. On this device, I get DDC through the analog, which
- * load-detects as disconnected. I fail to DDC through the SDVO DDC,
- * but it does load-detect as connected. So, just steal the DDC bits
- * from analog when we fail at finding it the right way.
+ /*
+ * Mac mini hack. On this device, the DVI-I connector shares one DDC
+ * link between analog and digital outputs. So, if the regular SDVO
+ * DDC fails, check to see if the analog output is disconnected, in
+ * which case we'll look there for the digital DDC data.
*/
- crt = xf86_config->output[0];
- intel_output = crt->driver_private;
- if (intel_output->type == I830_OUTPUT_ANALOG &&
- crt->funcs->detect(crt) == XF86OutputStatusDisconnected) {
- I830I2CInit(pScrn, &intel_output->pDDCBus, GPIOA, "CRTDDC_A");
- edid_mon = xf86OutputGetEDID(crt, intel_output->pDDCBus);
- xf86DestroyI2CBusRec(intel_output->pDDCBus, true, true);
- }
- if (edid_mon) {
- xf86OutputSetEDID(output, edid_mon);
- modes = xf86OutputGetEDIDModes(output);
+ if (num_modes == 0 &&
+ sdvo_priv->analog_ddc_bus &&
+ !intel_analog_is_connected(intel_output->base.dev)) {
+ struct i2c_adapter *digital_ddc_bus;
+
+ /* Switch to the analog ddc bus and try that
+ */
+ digital_ddc_bus = intel_output->ddc_bus;
+ intel_output->ddc_bus = sdvo_priv->analog_ddc_bus;
+
+ (void) intel_ddc_get_modes(intel_output);
+
+ intel_output->ddc_bus = digital_ddc_bus;
}
-#endif
}
/**
@@ -1748,6 +1791,8 @@ static void intel_sdvo_destroy(struct drm_connector *connector)
intel_i2c_destroy(intel_output->i2c_bus);
if (intel_output->ddc_bus)
intel_i2c_destroy(intel_output->ddc_bus);
+ if (sdvo_priv->analog_ddc_bus)
+ intel_i2c_destroy(sdvo_priv->analog_ddc_bus);
if (sdvo_priv->sdvo_lvds_fixed_mode != NULL)
drm_mode_destroy(connector->dev,
@@ -2074,10 +2119,15 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device)
}
/* setup the DDC bus. */
- if (output_device == SDVOB)
+ if (output_device == SDVOB) {
intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOB DDC BUS");
- else
+ sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA,
+ "SDVOB/VGA DDC BUS");
+ } else {
intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOC DDC BUS");
+ sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA,
+ "SDVOC/VGA DDC BUS");
+ }
if (intel_output->ddc_bus == NULL)
goto err_i2c;
@@ -2143,6 +2193,8 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device)
return true;
err_i2c:
+ if (sdvo_priv->analog_ddc_bus != NULL)
+ intel_i2c_destroy(sdvo_priv->analog_ddc_bus);
if (intel_output->ddc_bus != NULL)
intel_i2c_destroy(intel_output->ddc_bus);
if (intel_output->i2c_bus != NULL)
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index 5b1c9e9fdba0..05f6fe40f2e3 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -1212,20 +1212,17 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
tv_ctl |= TV_TRILEVEL_SYNC;
if (tv_mode->pal_burst)
tv_ctl |= TV_PAL_BURST;
+
scctl1 = 0;
- /* dda1 implies valid video levels */
- if (tv_mode->dda1_inc) {
+ if (tv_mode->dda1_inc)
scctl1 |= TV_SC_DDA1_EN;
- }
-
if (tv_mode->dda2_inc)
scctl1 |= TV_SC_DDA2_EN;
-
if (tv_mode->dda3_inc)
scctl1 |= TV_SC_DDA3_EN;
-
scctl1 |= tv_mode->sc_reset;
- scctl1 |= video_levels->burst << TV_BURST_LEVEL_SHIFT;
+ if (video_levels)
+ scctl1 |= video_levels->burst << TV_BURST_LEVEL_SHIFT;
scctl1 |= tv_mode->dda1_inc << TV_SCDDA1_INC_SHIFT;
scctl2 = tv_mode->dda2_size << TV_SCDDA2_SIZE_SHIFT |
diff --git a/drivers/gpu/drm/r128/r128_cce.c b/drivers/gpu/drm/r128/r128_cce.c
index c75fd3564040..ebf9f63e5d49 100644
--- a/drivers/gpu/drm/r128/r128_cce.c
+++ b/drivers/gpu/drm/r128/r128_cce.c
@@ -353,6 +353,11 @@ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init)
DRM_DEBUG("\n");
+ if (dev->dev_private) {
+ DRM_DEBUG("called when already initialized\n");
+ return -EINVAL;
+ }
+
dev_priv = kzalloc(sizeof(drm_r128_private_t), GFP_KERNEL);
if (dev_priv == NULL)
return -ENOMEM;
@@ -649,6 +654,8 @@ int r128_cce_start(struct drm_device *dev, void *data, struct drm_file *file_pri
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
if (dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4) {
DRM_DEBUG("while CCE running\n");
return 0;
@@ -671,6 +678,8 @@ int r128_cce_stop(struct drm_device *dev, void *data, struct drm_file *file_priv
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
/* Flush any pending CCE commands. This ensures any outstanding
* commands are exectuted by the engine before we turn it off.
*/
@@ -708,10 +717,7 @@ int r128_cce_reset(struct drm_device *dev, void *data, struct drm_file *file_pri
LOCK_TEST_WITH_RETURN(dev, file_priv);
- if (!dev_priv) {
- DRM_DEBUG("called before init done\n");
- return -EINVAL;
- }
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
r128_do_cce_reset(dev_priv);
@@ -728,6 +734,8 @@ int r128_cce_idle(struct drm_device *dev, void *data, struct drm_file *file_priv
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
if (dev_priv->cce_running) {
r128_do_cce_flush(dev_priv);
}
@@ -741,6 +749,8 @@ int r128_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev->dev_private);
+
return r128_do_engine_reset(dev);
}
diff --git a/drivers/gpu/drm/r128/r128_drv.h b/drivers/gpu/drm/r128/r128_drv.h
index 797a26c42dab..3c60829d82e9 100644
--- a/drivers/gpu/drm/r128/r128_drv.h
+++ b/drivers/gpu/drm/r128/r128_drv.h
@@ -422,6 +422,14 @@ static __inline__ void r128_update_ring_snapshot(drm_r128_private_t * dev_priv)
* Misc helper macros
*/
+#define DEV_INIT_TEST_WITH_RETURN(_dev_priv) \
+do { \
+ if (!_dev_priv) { \
+ DRM_ERROR("called with no initialization\n"); \
+ return -EINVAL; \
+ } \
+} while (0)
+
#define RING_SPACE_TEST_WITH_RETURN( dev_priv ) \
do { \
drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i; \
diff --git a/drivers/gpu/drm/r128/r128_state.c b/drivers/gpu/drm/r128/r128_state.c
index 026a48c95c8f..af2665cf4718 100644
--- a/drivers/gpu/drm/r128/r128_state.c
+++ b/drivers/gpu/drm/r128/r128_state.c
@@ -1244,14 +1244,18 @@ static void r128_cce_dispatch_stipple(struct drm_device * dev, u32 * stipple)
static int r128_cce_clear(struct drm_device *dev, void *data, struct drm_file *file_priv)
{
drm_r128_private_t *dev_priv = dev->dev_private;
- drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
+ drm_r128_sarea_t *sarea_priv;
drm_r128_clear_t *clear = data;
DRM_DEBUG("\n");
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
RING_SPACE_TEST_WITH_RETURN(dev_priv);
+ sarea_priv = dev_priv->sarea_priv;
+
if (sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS)
sarea_priv->nbox = R128_NR_SAREA_CLIPRECTS;
@@ -1312,6 +1316,8 @@ static int r128_cce_flip(struct drm_device *dev, void *data, struct drm_file *fi
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
RING_SPACE_TEST_WITH_RETURN(dev_priv);
if (!dev_priv->page_flipping)
@@ -1331,6 +1337,8 @@ static int r128_cce_swap(struct drm_device *dev, void *data, struct drm_file *fi
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
RING_SPACE_TEST_WITH_RETURN(dev_priv);
if (sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS)
@@ -1354,10 +1362,7 @@ static int r128_cce_vertex(struct drm_device *dev, void *data, struct drm_file *
LOCK_TEST_WITH_RETURN(dev, file_priv);
- if (!dev_priv) {
- DRM_ERROR("called with no initialization\n");
- return -EINVAL;
- }
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
DRM_DEBUG("pid=%d index=%d count=%d discard=%d\n",
DRM_CURRENTPID, vertex->idx, vertex->count, vertex->discard);
@@ -1410,10 +1415,7 @@ static int r128_cce_indices(struct drm_device *dev, void *data, struct drm_file
LOCK_TEST_WITH_RETURN(dev, file_priv);
- if (!dev_priv) {
- DRM_ERROR("called with no initialization\n");
- return -EINVAL;
- }
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
DRM_DEBUG("pid=%d buf=%d s=%d e=%d d=%d\n", DRM_CURRENTPID,
elts->idx, elts->start, elts->end, elts->discard);
@@ -1476,6 +1478,8 @@ static int r128_cce_blit(struct drm_device *dev, void *data, struct drm_file *fi
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
DRM_DEBUG("pid=%d index=%d\n", DRM_CURRENTPID, blit->idx);
if (blit->idx < 0 || blit->idx >= dma->buf_count) {
@@ -1501,6 +1505,8 @@ static int r128_cce_depth(struct drm_device *dev, void *data, struct drm_file *f
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
RING_SPACE_TEST_WITH_RETURN(dev_priv);
ret = -EINVAL;
@@ -1531,6 +1537,8 @@ static int r128_cce_stipple(struct drm_device *dev, void *data, struct drm_file
LOCK_TEST_WITH_RETURN(dev, file_priv);
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
+
if (DRM_COPY_FROM_USER(&mask, stipple->mask, 32 * sizeof(u32)))
return -EFAULT;
@@ -1555,10 +1563,7 @@ static int r128_cce_indirect(struct drm_device *dev, void *data, struct drm_file
LOCK_TEST_WITH_RETURN(dev, file_priv);
- if (!dev_priv) {
- DRM_ERROR("called with no initialization\n");
- return -EINVAL;
- }
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
DRM_DEBUG("idx=%d s=%d e=%d d=%d\n",
indirect->idx, indirect->start, indirect->end,
@@ -1620,10 +1625,7 @@ static int r128_getparam(struct drm_device *dev, void *data, struct drm_file *fi
drm_r128_getparam_t *param = data;
int value;
- if (!dev_priv) {
- DRM_ERROR("called with no initialization\n");
- return -EINVAL;
- }
+ DEV_INIT_TEST_WITH_RETURN(dev_priv);
DRM_DEBUG("pid=%d\n", DRM_CURRENTPID);
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index fcfe5c02d744..7bae834df0ca 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -134,6 +134,14 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
}
}
+ /* HIS X1300 is DVI+VGA, not DVI+DVI */
+ if ((dev->pdev->device == 0x7146) &&
+ (dev->pdev->subsystem_vendor == 0x17af) &&
+ (dev->pdev->subsystem_device == 0x2058)) {
+ if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
+ return false;
+ }
+
/* Funky macbooks */
if ((dev->pdev->device == 0x71C5) &&
(dev->pdev->subsystem_vendor == 0x106b) &&
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
index ec383edf5f38..f1d6d3d4519f 100644
--- a/drivers/gpu/drm/radeon/radeon_fb.c
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
@@ -120,7 +120,7 @@ static int radeonfb_check_var(struct fb_var_screeninfo *var,
struct drm_framebuffer *fb = &rfb->base;
int depth;
- if (var->pixclock == -1 || !var->pixclock) {
+ if (var->pixclock != 0) {
return -EINVAL;
}
/* Need to resize the fb object !!! */
@@ -234,7 +234,7 @@ static int radeonfb_set_par(struct fb_info *info)
int ret;
int i;
- if (var->pixclock != -1) {
+ if (var->pixclock != 0) {
DRM_ERROR("PIXEL CLCOK SET\n");
return -EINVAL;
}
@@ -828,7 +828,7 @@ static int radeonfb_single_fb_probe(struct radeon_device *rdev)
rfbdev->crtc_count = crtc_count;
if (new_fb) {
- info->var.pixclock = -1;
+ info->var.pixclock = 0;
if (register_framebuffer(info) < 0)
return -EINVAL;
} else {
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index 0da72f18fd3a..ff9c18d07925 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -291,8 +291,7 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
uint32_t mask;
if (radeon_crtc->crtc_id)
- mask = (RADEON_CRTC2_EN |
- RADEON_CRTC2_DISP_DIS |
+ mask = (RADEON_CRTC2_DISP_DIS |
RADEON_CRTC2_VSYNC_DIS |
RADEON_CRTC2_HSYNC_DIS |
RADEON_CRTC2_DISP_REQ_EN_B);
@@ -304,7 +303,7 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
switch (mode) {
case DRM_MODE_DPMS_ON:
if (radeon_crtc->crtc_id)
- WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~mask);
+ WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask));
else {
WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN |
RADEON_CRTC_DISP_REQ_EN_B));
@@ -318,7 +317,7 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
case DRM_MODE_DPMS_OFF:
drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id);
if (radeon_crtc->crtc_id)
- WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~mask);
+ WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
else {
WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN |
RADEON_CRTC_DISP_REQ_EN_B));
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
index 303ccce05bb3..637867e94c9c 100644
--- a/drivers/hid/hid-apple.c
+++ b/drivers/hid/hid-apple.c
@@ -431,6 +431,13 @@ static const struct hid_device_id apple_devices[] = {
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
+ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
+ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
+ APPLE_ISO_KEYBOARD },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS),
+ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY),
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY),
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 5eb10c2ce665..c0537218d9c1 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1259,6 +1259,9 @@ static const struct hid_device_id hid_blacklist[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
{ HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
@@ -1319,7 +1322,6 @@ static const struct hid_device_id hid_blacklist[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
- { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
{ }
};
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 630101037921..bee718f8714e 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -88,6 +88,9 @@
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
+#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239
+#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
+#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
diff --git a/drivers/hwmon/adt7462.c b/drivers/hwmon/adt7462.c
index 1852f27bac51..14f910d3dd9b 100644
--- a/drivers/hwmon/adt7462.c
+++ b/drivers/hwmon/adt7462.c
@@ -97,7 +97,7 @@ I2C_CLIENT_INSMOD_1(adt7462);
#define ADT7462_PIN24_SHIFT 6
#define ADT7462_PIN26_VOLT_INPUT 0x08
#define ADT7462_PIN25_VOLT_INPUT 0x20
-#define ADT7462_PIN28_SHIFT 6 /* cfg3 */
+#define ADT7462_PIN28_SHIFT 4 /* cfg3 */
#define ADT7462_PIN28_VOLT 0x5
#define ADT7462_REG_ALARM1 0xB8
@@ -182,7 +182,7 @@ I2C_CLIENT_INSMOD_1(adt7462);
*
* Some, but not all, of these voltages have low/high limits.
*/
-#define ADT7462_VOLT_COUNT 12
+#define ADT7462_VOLT_COUNT 13
#define ADT7462_VENDOR 0x41
#define ADT7462_DEVICE 0x62
diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index d39877a7da63..20579fad4a24 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -350,8 +350,7 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
case FAULT:
/* Note - only for remote1 and remote2 */
- out = data->alarms & (sattr->index ? 0x8000 : 0x4000);
- out = out ? 0 : 1;
+ out = !!(data->alarms & (sattr->index ? 0x8000 : 0x4000));
break;
default:
@@ -1152,7 +1151,7 @@ static struct adt7475_data *adt7475_update_device(struct device *dev)
}
/* Limits and settings, should never change update every 60 seconds */
- if (time_after(jiffies, data->limits_updated + HZ * 2) ||
+ if (time_after(jiffies, data->limits_updated + HZ * 60) ||
!data->valid) {
data->config5 = adt7475_read(REG_CONFIG5);
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
index 93c17223b527..2b8f439794b9 100644
--- a/drivers/hwmon/coretemp.c
+++ b/drivers/hwmon/coretemp.c
@@ -191,7 +191,7 @@ static int __devinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *
if (err) {
dev_warn(dev,
"Unable to access MSR 0xEE, for Tjmax, left"
- " at default");
+ " at default\n");
} else if (eax & 0x40000000) {
tjmax = 85000;
}
diff --git a/drivers/hwmon/fschmd.c b/drivers/hwmon/fschmd.c
index ea955edde87e..3e51d54b60f4 100644
--- a/drivers/hwmon/fschmd.c
+++ b/drivers/hwmon/fschmd.c
@@ -767,6 +767,7 @@ leave:
static int watchdog_open(struct inode *inode, struct file *filp)
{
struct fschmd_data *pos, *data = NULL;
+ int watchdog_is_open;
/* We get called from drivers/char/misc.c with misc_mtx hold, and we
call misc_register() from fschmd_probe() with watchdog_data_mutex
@@ -781,10 +782,12 @@ static int watchdog_open(struct inode *inode, struct file *filp)
}
}
/* Note we can never not have found data, so we don't check for this */
- kref_get(&data->kref);
+ watchdog_is_open = test_and_set_bit(0, &data->watchdog_is_open);
+ if (!watchdog_is_open)
+ kref_get(&data->kref);
mutex_unlock(&watchdog_data_mutex);
- if (test_and_set_bit(0, &data->watchdog_is_open))
+ if (watchdog_is_open)
return -EBUSY;
/* Start the watchdog */
@@ -819,7 +822,7 @@ static int watchdog_release(struct inode *inode, struct file *filp)
static ssize_t watchdog_write(struct file *filp, const char __user *buf,
size_t count, loff_t *offset)
{
- size_t ret;
+ int ret;
struct fschmd_data *data = filp->private_data;
if (count) {
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index 9157247fed8e..231a6a5d6d70 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -1028,12 +1028,11 @@ static int __init it87_find(unsigned short *address,
chip_type, *address, sio_data->revision);
/* Read GPIO config and VID value from LDN 7 (GPIO) */
- if (chip_type != IT8705F_DEVID) {
+ if (sio_data->type != it87) {
int reg;
superio_select(GPIO);
- if ((chip_type == it8718) ||
- (chip_type == it8720))
+ if (sio_data->type == it8718 || sio_data->type == it8720)
sio_data->vid_value = superio_inb(IT87_SIO_VID_REG);
reg = superio_inb(IT87_SIO_PINX2_REG);
diff --git a/drivers/hwmon/lm78.c b/drivers/hwmon/lm78.c
index a1787fdf5b9f..2348622b533c 100644
--- a/drivers/hwmon/lm78.c
+++ b/drivers/hwmon/lm78.c
@@ -870,17 +870,16 @@ static struct lm78_data *lm78_update_device(struct device *dev)
static int __init lm78_isa_found(unsigned short address)
{
int val, save, found = 0;
-
- /* We have to request the region in two parts because some
- boards declare base+4 to base+7 as a PNP device */
- if (!request_region(address, 4, "lm78")) {
- pr_debug("lm78: Failed to request low part of region\n");
- return 0;
- }
- if (!request_region(address + 4, 4, "lm78")) {
- pr_debug("lm78: Failed to request high part of region\n");
- release_region(address, 4);
- return 0;
+ int port;
+
+ /* Some boards declare base+0 to base+7 as a PNP device, some base+4
+ * to base+7 and some base+5 to base+6. So we better request each port
+ * individually for the probing phase. */
+ for (port = address; port < address + LM78_EXTENT; port++) {
+ if (!request_region(port, 1, "lm78")) {
+ pr_debug("lm78: Failed to request port 0x%x\n", port);
+ goto release;
+ }
}
#define REALLY_SLOW_IO
@@ -944,8 +943,8 @@ static int __init lm78_isa_found(unsigned short address)
val & 0x80 ? "LM79" : "LM78", (int)address);
release:
- release_region(address + 4, 4);
- release_region(address, 4);
+ for (port--; port >= address; port--)
+ release_region(port, 1);
return found;
}
diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c
index 6290a259456e..e828d17e9318 100644
--- a/drivers/hwmon/sht15.c
+++ b/drivers/hwmon/sht15.c
@@ -304,7 +304,7 @@ static inline int sht15_calc_temp(struct sht15_data *data)
int d1 = 0;
int i;
- for (i = 1; i < ARRAY_SIZE(temppoints) - 1; i++)
+ for (i = 1; i < ARRAY_SIZE(temppoints); i++)
/* Find pointer to interpolate */
if (data->supply_uV > temppoints[i - 1].vdd) {
d1 = (data->supply_uV/1000 - temppoints[i - 1].vdd)
@@ -331,12 +331,12 @@ static inline int sht15_calc_humid(struct sht15_data *data)
const int c1 = -4;
const int c2 = 40500; /* x 10 ^ -6 */
- const int c3 = 2800; /* x10 ^ -9 */
+ const int c3 = -2800; /* x10 ^ -9 */
RHlinear = c1*1000
+ c2 * data->val_humid/1000
+ (data->val_humid * data->val_humid * c3)/1000000;
- return (temp - 25000) * (10000 + 800 * data->val_humid)
+ return (temp - 25000) * (10000 + 80 * data->val_humid)
/ 1000000 + RHlinear;
}
diff --git a/drivers/hwmon/w83781d.c b/drivers/hwmon/w83781d.c
index 0bdab959b736..3c237004b1ca 100644
--- a/drivers/hwmon/w83781d.c
+++ b/drivers/hwmon/w83781d.c
@@ -1818,17 +1818,17 @@ static int __init
w83781d_isa_found(unsigned short address)
{
int val, save, found = 0;
-
- /* We have to request the region in two parts because some
- boards declare base+4 to base+7 as a PNP device */
- if (!request_region(address, 4, "w83781d")) {
- pr_debug("w83781d: Failed to request low part of region\n");
- return 0;
- }
- if (!request_region(address + 4, 4, "w83781d")) {
- pr_debug("w83781d: Failed to request high part of region\n");
- release_region(address, 4);
- return 0;
+ int port;
+
+ /* Some boards declare base+0 to base+7 as a PNP device, some base+4
+ * to base+7 and some base+5 to base+6. So we better request each port
+ * individually for the probing phase. */
+ for (port = address; port < address + W83781D_EXTENT; port++) {
+ if (!request_region(port, 1, "w83781d")) {
+ pr_debug("w83781d: Failed to request port 0x%x\n",
+ port);
+ goto release;
+ }
}
#define REALLY_SLOW_IO
@@ -1902,8 +1902,8 @@ w83781d_isa_found(unsigned short address)
val == 0x30 ? "W83782D" : "W83781D", (int)address);
release:
- release_region(address + 4, 4);
- release_region(address, 4);
+ for (port--; port >= address; port--)
+ release_region(port, 1);
return found;
}
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c
index f7d6fe9c49ba..8f0b90ef8c76 100644
--- a/drivers/i2c/busses/i2c-amd756.c
+++ b/drivers/i2c/busses/i2c-amd756.c
@@ -364,7 +364,7 @@ static int __devinit amd756_probe(struct pci_dev *pdev,
error = acpi_check_region(amd756_ioport, SMB_IOSIZE,
amd756_driver.name);
if (error)
- return error;
+ return -ENODEV;
if (!request_region(amd756_ioport, SMB_IOSIZE, amd756_driver.name)) {
dev_err(&pdev->dev, "SMB region 0x%x already in use!\n",
diff --git a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c
index a7c59908c457..5b4ad86ca166 100644
--- a/drivers/i2c/busses/i2c-amd8111.c
+++ b/drivers/i2c/busses/i2c-amd8111.c
@@ -376,8 +376,10 @@ static int __devinit amd8111_probe(struct pci_dev *dev,
smbus->size = pci_resource_len(dev, 0);
error = acpi_check_resource_conflict(&dev->resource[0]);
- if (error)
+ if (error) {
+ error = -ENODEV;
goto out_kfree;
+ }
if (!request_region(smbus->base, smbus->size, amd8111_driver.name)) {
error = -EBUSY;
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index 9d2c5adf5d4f..55edcfe5b851 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -732,8 +732,10 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id
}
err = acpi_check_resource_conflict(&dev->resource[SMBBAR]);
- if (err)
+ if (err) {
+ err = -ENODEV;
goto exit;
+ }
err = pci_request_region(dev, SMBBAR, i801_driver.name);
if (err) {
diff --git a/drivers/i2c/busses/i2c-isch.c b/drivers/i2c/busses/i2c-isch.c
index 9f6b8e0f8632..dba6eb053e2f 100644
--- a/drivers/i2c/busses/i2c-isch.c
+++ b/drivers/i2c/busses/i2c-isch.c
@@ -281,7 +281,7 @@ static int __devinit sch_probe(struct pci_dev *dev,
return -ENODEV;
}
if (acpi_check_region(sch_smba, SMBIOSIZE, sch_driver.name))
- return -EBUSY;
+ return -ENODEV;
if (!request_region(sch_smba, SMBIOSIZE, sch_driver.name)) {
dev_err(&dev->dev, "SMBus region 0x%x already in use!\n",
sch_smba);
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c
index 8bb795e7d7b2..e3235ff8e551 100644
--- a/drivers/i2c/busses/i2c-mxs.c
+++ b/drivers/i2c/busses/i2c-mxs.c
@@ -68,19 +68,10 @@ static u8 *i2c_buf_virt;
static void hw_i2c_dmachan_reset(struct mxs_i2c_dev *dev)
{
- mxs_dma_disable(dev->dma_chan);
mxs_dma_reset(dev->dma_chan);
mxs_dma_ack_irq(dev->dma_chan);
}
-static mxs_i2c_reset(struct mxs_i2c_dev *mxs_i2c)
-{
- hw_i2c_dmachan_reset(mxs_i2c);
- mxs_dma_enable_irq(mxs_i2c->dma_chan, 1);
- mxs_reset_block((void __iomem *)mxs_i2c->regbase, 0);
- __raw_writel(0x0000FF00, mxs_i2c->regbase + HW_I2C_CTRL1_SET);
-}
-
static int hw_i2c_dma_init(struct platform_device *pdev)
{
struct mxs_i2c_dev *mxs_i2c = platform_get_drvdata(pdev);
@@ -168,7 +159,7 @@ static void hw_i2c_dma_setup_read(u8 addr, void *buff, int len, int flags)
desc[0]->cmd.cmd.bits.pio_words = 1;
desc[0]->cmd.cmd.bits.wait4end = 1;
desc[0]->cmd.cmd.bits.dec_sem = 1;
- desc[0]->cmd.cmd.bits.irq = 0;
+ desc[0]->cmd.cmd.bits.irq = 1;
desc[0]->cmd.cmd.bits.chain = 1;
desc[0]->cmd.cmd.bits.command = DMA_READ;
desc[0]->cmd.address = i2c_buf_phys;
@@ -328,7 +319,6 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap,
msecs_to_jiffies(1000)
);
if (err <= 0) {
- mxs_i2c_reset(dev);
dev_dbg(dev->dev, "controller is timed out\n");
return -ETIMEDOUT;
}
@@ -375,19 +365,9 @@ static irqreturn_t mxs_i2c_dma_isr(int this_irq, void *dev_id)
mxs_dma_ack_irq(mxs_i2c->dma_chan);
mxs_dma_cooked(mxs_i2c->dma_chan, &list);
- complete(&mxs_i2c->cmd_complete);
-
return IRQ_HANDLED;
}
-static void mxs_i2c_task(struct work_struct *work)
-{
- struct mxs_i2c_dev *mxs_i2c = container_of(work,
- struct mxs_i2c_dev, work);
- mxs_i2c_reset(mxs_i2c);
- complete(&mxs_i2c->cmd_complete);
-}
-
#define I2C_IRQ_MASK 0x000000FF
static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id)
{
@@ -402,8 +382,20 @@ static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id)
if (stat & BM_I2C_CTRL1_NO_SLAVE_ACK_IRQ) {
mxs_i2c->cmd_err = -EREMOTEIO;
- /* it takes long time to reset i2c */
- schedule_work(&mxs_i2c->work);
+
+ /*
+ * Stop DMA
+ * Clear NAK
+ */
+ __raw_writel(BM_I2C_CTRL1_CLR_GOT_A_NAK,
+ mxs_i2c->regbase + HW_I2C_CTRL1_SET);
+ hw_i2c_dmachan_reset(mxs_i2c);
+ mxs_reset_block((void __iomem *)mxs_i2c->regbase, 1);
+ /* Will catch all error (IRQ mask) */
+ __raw_writel(0x0000FF00, mxs_i2c->regbase + HW_I2C_CTRL1_SET);
+
+ complete(&mxs_i2c->cmd_complete);
+
goto done;
}
@@ -415,10 +407,7 @@ static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id)
complete(&mxs_i2c->cmd_complete);
goto done;
}
-
- if ((stat & done_mask) == done_mask &&
- (mxs_i2c->flags & MXS_I2C_PIOQUEUE_MODE))
-
+ if ((stat & done_mask) == done_mask)
complete(&mxs_i2c->cmd_complete);
done:
@@ -535,8 +524,6 @@ static int mxs_i2c_probe(struct platform_device *pdev)
}
- INIT_WORK(&mxs_i2c->work, mxs_i2c_task);
-
return 0;
no_i2c_adapter:
diff --git a/drivers/i2c/busses/i2c-mxs.h b/drivers/i2c/busses/i2c-mxs.h
index 1a35385b793b..4ddca007624a 100644
--- a/drivers/i2c/busses/i2c-mxs.h
+++ b/drivers/i2c/busses/i2c-mxs.h
@@ -37,6 +37,5 @@ struct mxs_i2c_dev {
struct i2c_adapter adapter;
spinlock_t lock;
wait_queue_head_t queue;
- struct work_struct work;
};
#endif
diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c
index 0ed68e2ccd22..f7346a9bd95f 100644
--- a/drivers/i2c/busses/i2c-pca-isa.c
+++ b/drivers/i2c/busses/i2c-pca-isa.c
@@ -75,7 +75,7 @@ static int pca_isa_waitforcompletion(void *pd)
unsigned long timeout;
if (irq > -1) {
- ret = wait_event_interruptible_timeout(pca_wait,
+ ret = wait_event_timeout(pca_wait,
pca_isa_readbyte(pd, I2C_PCA_CON)
& I2C_PCA_CON_SI, pca_isa_ops.timeout);
} else {
@@ -96,7 +96,7 @@ static void pca_isa_resetchip(void *pd)
}
static irqreturn_t pca_handler(int this_irq, void *dev_id) {
- wake_up_interruptible(&pca_wait);
+ wake_up(&pca_wait);
return IRQ_HANDLED;
}
diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c
index c4df9d411cd5..5b2213df5ed0 100644
--- a/drivers/i2c/busses/i2c-pca-platform.c
+++ b/drivers/i2c/busses/i2c-pca-platform.c
@@ -84,7 +84,7 @@ static int i2c_pca_pf_waitforcompletion(void *pd)
unsigned long timeout;
if (i2c->irq) {
- ret = wait_event_interruptible_timeout(i2c->wait,
+ ret = wait_event_timeout(i2c->wait,
i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
& I2C_PCA_CON_SI, i2c->adap.timeout);
} else {
@@ -122,7 +122,7 @@ static irqreturn_t i2c_pca_pf_handler(int this_irq, void *dev_id)
if ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0)
return IRQ_NONE;
- wake_up_interruptible(&i2c->wait);
+ wake_up(&i2c->wait);
return IRQ_HANDLED;
}
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
index 0249a7d762b9..808e49e6ad4e 100644
--- a/drivers/i2c/busses/i2c-piix4.c
+++ b/drivers/i2c/busses/i2c-piix4.c
@@ -168,7 +168,7 @@ static int __devinit piix4_setup(struct pci_dev *PIIX4_dev,
}
if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name))
- return -EBUSY;
+ return -ENODEV;
if (!request_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) {
dev_err(&PIIX4_dev->dev, "SMBus region 0x%x already in use!\n",
@@ -259,7 +259,7 @@ static int __devinit piix4_setup_sb800(struct pci_dev *PIIX4_dev,
piix4_smba = ((smba_en_hi << 8) | smba_en_lo) & 0xffe0;
if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name))
- return -EBUSY;
+ return -ENODEV;
if (!request_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) {
dev_err(&PIIX4_dev->dev, "SMBus region 0x%x already in use!\n",
diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c
index 8295885b2fdb..1649963b00dc 100644
--- a/drivers/i2c/busses/i2c-sis96x.c
+++ b/drivers/i2c/busses/i2c-sis96x.c
@@ -280,7 +280,7 @@ static int __devinit sis96x_probe(struct pci_dev *dev,
retval = acpi_check_resource_conflict(&dev->resource[SIS96x_BAR]);
if (retval)
- return retval;
+ return -ENODEV;
/* Everything is happy, let's grab the memory and set things up. */
if (!request_region(sis96x_smbus_base, SMB_IOSIZE,
diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c
index b1c050ff311d..e29b6d5ba8ef 100644
--- a/drivers/i2c/busses/i2c-tiny-usb.c
+++ b/drivers/i2c/busses/i2c-tiny-usb.c
@@ -13,6 +13,7 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/module.h>
+#include <linux/types.h>
/* include interfaces to usb layer */
#include <linux/usb.h>
@@ -31,8 +32,8 @@
#define CMD_I2C_IO_END (1<<1)
/* i2c bit delay, default is 10us -> 100kHz */
-static int delay = 10;
-module_param(delay, int, 0);
+static unsigned short delay = 10;
+module_param(delay, ushort, 0);
MODULE_PARM_DESC(delay, "bit delay in microseconds, "
"e.g. 10 for 100kHz (default is 100kHz)");
@@ -109,7 +110,7 @@ static int usb_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num)
static u32 usb_func(struct i2c_adapter *adapter)
{
- u32 func;
+ __le32 func;
/* get functionality from adapter */
if (usb_read(adapter, CMD_GET_FUNC, 0, 0, &func, sizeof(func)) !=
@@ -118,7 +119,7 @@ static u32 usb_func(struct i2c_adapter *adapter)
return 0;
}
- return func;
+ return le32_to_cpu(func);
}
/* This is the actual algorithm we define */
@@ -216,8 +217,7 @@ static int i2c_tiny_usb_probe(struct usb_interface *interface,
"i2c-tiny-usb at bus %03d device %03d",
dev->usb_dev->bus->busnum, dev->usb_dev->devnum);
- if (usb_write(&dev->adapter, CMD_SET_DELAY,
- cpu_to_le16(delay), 0, NULL, 0) != 0) {
+ if (usb_write(&dev->adapter, CMD_SET_DELAY, delay, 0, NULL, 0) != 0) {
dev_err(&dev->adapter.dev,
"failure setting delay to %dus\n", delay);
retval = -EIO;
diff --git a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c
index 54d810a4d00f..e4b1543015af 100644
--- a/drivers/i2c/busses/i2c-viapro.c
+++ b/drivers/i2c/busses/i2c-viapro.c
@@ -365,7 +365,7 @@ static int __devinit vt596_probe(struct pci_dev *pdev,
found:
error = acpi_check_region(vt596_smba, 8, vt596_driver.name);
if (error)
- return error;
+ return -ENODEV;
if (!request_region(vt596_smba, 8, vt596_driver.name)) {
dev_err(&pdev->dev, "SMBus region 0x%x already in use!\n",
diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c
index b96f3025e588..ec0a7cab6c8b 100644
--- a/drivers/i2c/chips/tsl2550.c
+++ b/drivers/i2c/chips/tsl2550.c
@@ -277,6 +277,7 @@ static DEVICE_ATTR(operating_mode, S_IWUSR | S_IRUGO,
static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf)
{
+ struct tsl2550_data *data = i2c_get_clientdata(client);
u8 ch0, ch1;
int ret;
@@ -296,6 +297,8 @@ static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf)
ret = tsl2550_calculate_lux(ch0, ch1);
if (ret < 0)
return ret;
+ if (data->operating_mode == 1)
+ ret *= 5;
return sprintf(buf, "%d\n", ret);
}
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index 0e45c296d3d2..b67c32c3fa13 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -718,6 +718,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)
{
int res = 0;
struct i2c_adapter *found;
+ struct i2c_client *client, *next;
/* First make sure that this adapter was ever added */
mutex_lock(&core_lock);
@@ -737,10 +738,23 @@ int i2c_del_adapter(struct i2c_adapter *adap)
if (res)
return res;
+ /* Remove devices instantiated from sysfs */
+ list_for_each_entry_safe(client, next, &userspace_devices, detected) {
+ if (client->adapter == adap) {
+ dev_dbg(&adap->dev, "Removing %s at 0x%x\n",
+ client->name, client->addr);
+ list_del(&client->detected);
+ i2c_unregister_device(client);
+ }
+ }
+
/* Detach any active clients. This can't fail, thus we do not
checking the returned value. */
res = device_for_each_child(&adap->dev, NULL, __unregister_client);
+ /* device name is gone after device_unregister */
+ dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
+
/* clean up the sysfs representation */
init_completion(&adap->dev_released);
device_unregister(&adap->dev);
@@ -753,8 +767,6 @@ int i2c_del_adapter(struct i2c_adapter *adap)
idr_remove(&i2c_adapter_idr, adap->nr);
mutex_unlock(&core_lock);
- dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
-
/* Clear the device structure in case this adapter is ever going to be
added again */
memset(&adap->dev, 0, sizeof(adap->dev));
diff --git a/drivers/ide/cmd64x.c b/drivers/ide/cmd64x.c
index 680e5975217f..ca0c46f6580a 100644
--- a/drivers/ide/cmd64x.c
+++ b/drivers/ide/cmd64x.c
@@ -379,7 +379,8 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = {
.enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}},
.port_ops = &cmd64x_port_ops,
.host_flags = IDE_HFLAG_CLEAR_SIMPLEX |
- IDE_HFLAG_ABUSE_PREFETCH,
+ IDE_HFLAG_ABUSE_PREFETCH |
+ IDE_HFLAG_SERIALIZE,
.pio_mask = ATA_PIO5,
.mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x00, /* no udma */
@@ -389,7 +390,8 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = {
.init_chipset = init_chipset_cmd64x,
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
.port_ops = &cmd648_port_ops,
- .host_flags = IDE_HFLAG_ABUSE_PREFETCH,
+ .host_flags = IDE_HFLAG_ABUSE_PREFETCH |
+ IDE_HFLAG_SERIALIZE,
.pio_mask = ATA_PIO5,
.mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA2,
diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c
index e246d3d3fbcc..b05ee089841a 100644
--- a/drivers/ide/ide-ioctls.c
+++ b/drivers/ide/ide-ioctls.c
@@ -162,7 +162,7 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg)
if (tf->command == ATA_CMD_SET_FEATURES &&
tf->feature == SETFEATURES_XFER &&
tf->nsect >= XFER_SW_DMA_0) {
- xfer_rate = ide_find_dma_mode(drive, XFER_UDMA_6);
+ xfer_rate = ide_find_dma_mode(drive, tf->nsect);
if (xfer_rate != tf->nsect) {
err = -EINVAL;
goto abort;
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 1bb106f6221a..ad33db2eacf1 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -1035,15 +1035,6 @@ static void ide_port_init_devices(ide_hwif_t *hwif)
if (port_ops && port_ops->init_dev)
port_ops->init_dev(drive);
}
-
- ide_port_for_each_dev(i, drive, hwif) {
- /*
- * default to PIO Mode 0 before we figure out
- * the most suited mode for the attached device
- */
- if (port_ops && port_ops->set_pio_mode)
- port_ops->set_pio_mode(drive, 0);
- }
}
static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
diff --git a/drivers/ide/sis5513.c b/drivers/ide/sis5513.c
index afca22beaadf..3b88eba04c9c 100644
--- a/drivers/ide/sis5513.c
+++ b/drivers/ide/sis5513.c
@@ -2,7 +2,7 @@
* Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org>
* Copyright (C) 2002 Lionel Bouton <Lionel.Bouton@inet6.fr>, Maintainer
* Copyright (C) 2003 Vojtech Pavlik <vojtech@suse.cz>
- * Copyright (C) 2007 Bartlomiej Zolnierkiewicz
+ * Copyright (C) 2007-2009 Bartlomiej Zolnierkiewicz
*
* May be copied or modified under the terms of the GNU General Public License
*
@@ -281,11 +281,13 @@ static void config_drive_art_rwp(ide_drive_t *drive)
pci_read_config_byte(dev, 0x4b, &reg4bh);
+ rw_prefetch = reg4bh & ~(0x11 << drive->dn);
+
if (drive->media == ide_disk)
- rw_prefetch = 0x11 << drive->dn;
+ rw_prefetch |= 0x11 << drive->dn;
- if ((reg4bh & (0x11 << drive->dn)) != rw_prefetch)
- pci_write_config_byte(dev, 0x4b, reg4bh|rw_prefetch);
+ if (reg4bh != rw_prefetch)
+ pci_write_config_byte(dev, 0x4b, rw_prefetch);
}
static void sis_set_pio_mode(ide_drive_t *drive, const u8 pio)
diff --git a/drivers/ide/slc90e66.c b/drivers/ide/slc90e66.c
index 9aec78d3bcff..1ccfb40e7215 100644
--- a/drivers/ide/slc90e66.c
+++ b/drivers/ide/slc90e66.c
@@ -91,8 +91,7 @@ static void slc90e66_set_dma_mode(ide_drive_t *drive, const u8 speed)
if (!(reg48 & u_flag))
pci_write_config_word(dev, 0x48, reg48|u_flag);
- /* FIXME: (reg4a & a_speed) ? */
- if ((reg4a & u_speed) != u_speed) {
+ if ((reg4a & a_speed) != u_speed) {
pci_write_config_word(dev, 0x4a, reg4a & ~a_speed);
pci_read_config_word(dev, 0x4a, &reg4a);
pci_write_config_word(dev, 0x4a, reg4a|u_speed);
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index 5598ecb48c5b..1148140d08a1 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -19,9 +19,6 @@
#include <linux/input.h>
#include <linux/major.h>
#include <linux/device.h>
-#ifdef CONFIG_WAKELOCK
-#include <linux/wakelock.h>
-#endif
#include "input-compat.h"
struct evdev {
@@ -45,10 +42,6 @@ struct evdev_client {
struct fasync_struct *fasync;
struct evdev *evdev;
struct list_head node;
-#ifdef CONFIG_WAKELOCK
- struct wake_lock wake_lock;
- char name[28];
-#endif
};
static struct evdev *evdev_table[EVDEV_MINORS];
@@ -61,9 +54,6 @@ static void evdev_pass_event(struct evdev_client *client,
* Interrupts are disabled, just acquire the lock
*/
spin_lock(&client->buffer_lock);
-#ifdef CONFIG_WAKELOCK
- wake_lock_timeout(&client->wake_lock, 5 * HZ);
-#endif
client->buffer[client->head++] = *event;
client->head &= EVDEV_BUFFER_SIZE - 1;
spin_unlock(&client->buffer_lock);
@@ -80,15 +70,8 @@ static void evdev_event(struct input_handle *handle,
struct evdev *evdev = handle->private;
struct evdev_client *client;
struct input_event event;
-#ifdef CONFIG_WAKELOCK
- struct timespec ts;
- ktime_get_ts(&ts);
- event.time.tv_sec = ts.tv_sec;
- event.time.tv_usec = ts.tv_nsec / NSEC_PER_USEC;
-#else
do_gettimeofday(&event.time);
-#endif
event.type = type;
event.code = code;
event.value = value;
@@ -249,9 +232,6 @@ static int evdev_release(struct inode *inode, struct file *file)
mutex_unlock(&evdev->mutex);
evdev_detach_client(evdev, client);
-#ifdef CONFIG_WAKELOCK
- wake_lock_destroy(&client->wake_lock);
-#endif
kfree(client);
evdev_close_device(evdev);
@@ -288,11 +268,6 @@ static int evdev_open(struct inode *inode, struct file *file)
}
spin_lock_init(&client->buffer_lock);
-#ifdef CONFIG_WAKELOCK
- snprintf(client->name, sizeof(client->name), "%s-%d", dev_name(&evdev->dev),
- task_tgid_vnr(current));
- wake_lock_init(&client->wake_lock, WAKE_LOCK_SUSPEND, client->name);
-#endif
client->evdev = evdev;
evdev_attach_client(evdev, client);
@@ -356,10 +331,6 @@ static int evdev_fetch_next_event(struct evdev_client *client,
if (have_event) {
*event = client->buffer[client->tail++];
client->tail &= EVDEV_BUFFER_SIZE - 1;
-#ifdef CONFIG_WAKELOCK
- if (client->head == client->tail)
- wake_unlock(&client->wake_lock);
-#endif
}
spin_unlock_irq(&client->buffer_lock);
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
index 88e2a24d9cff..fea01a591076 100644
--- a/drivers/input/keyboard/Makefile
+++ b/drivers/input/keyboard/Makefile
@@ -31,7 +31,7 @@ obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o
obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o
obj-$(CONFIG_KEYBOARD_TOSA) += tosakbd.o
obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o
-obj-$(CONFIG_KEYBOARD_MXC) += mxc_keyb.o mxc_pwrkey.o
+obj-$(CONFIG_KEYBOARD_MXC) += mxc_keyb.o
obj-$(CONFIG_KEYBOARD_MPR084) += mpr084.o
obj-$(CONFIG_KEYBOARD_STMP3XXX) += stmp3xxx-kbd.o
obj-$(CONFIG_KEYBOARD_MXS) += mxs-kbd.o
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index 6c6a09b1c0fe..abc314f93ff3 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -1608,6 +1608,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
.driver_data = atkbd_samsung_forced_release_keys,
},
{
+ .ident = "Samsung R59P/R60P/R61P",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"),
+ },
+ .callback = atkbd_setup_forced_release,
+ .driver_data = atkbd_samsung_forced_release_keys,
+ },
+ {
.ident = "Fujitsu Amilo PA 1510",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
diff --git a/drivers/input/keyboard/mxc_keyb.c b/drivers/input/keyboard/mxc_keyb.c
index bd5ecd8c20f1..033713cbdfdf 100644
--- a/drivers/input/keyboard/mxc_keyb.c
+++ b/drivers/input/keyboard/mxc_keyb.c
@@ -1077,7 +1077,7 @@ static int mxc_kpp_probe(struct platform_device *pdev)
retval = request_irq(irq, mxc_kpp_interrupt, 0, MOD_NAME, MOD_NAME);
if (retval) {
pr_debug("KPP: request_irq(%d) returned error %d\n",
- irq, retval);
+ MXC_INT_KPP, retval);
goto err3;
}
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 5547e2429fbe..b172bef75910 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -5,6 +5,7 @@
* Copyright (c) 2003-2005 Peter Osterlund <petero2@telia.com>
* Copyright (c) 2004 Dmitry Torokhov <dtor@mail.ru>
* Copyright (c) 2005 Vojtech Pavlik <vojtech@suse.cz>
+ * Copyright (c) 2009 Sebastian Kapfer <sebastian_kapfer@gmx.net>
*
* ALPS detection, tap switching and status querying info is taken from
* tpconfig utility (by C. Scott Ananian and Bruce Kall).
@@ -35,6 +36,8 @@
#define ALPS_OLDPROTO 0x10
#define ALPS_PASS 0x20
#define ALPS_FW_BK_2 0x40
+#define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with
+ 6-byte ALPS packet */
static const struct alps_model_info alps_model_data[] = {
{ { 0x32, 0x02, 0x14 }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* Toshiba Salellite Pro M10 */
@@ -55,7 +58,9 @@ static const struct alps_model_info alps_model_data[] = {
{ { 0x20, 0x02, 0x0e }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* XXX */
{ { 0x22, 0x02, 0x0a }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT },
{ { 0x22, 0x02, 0x14 }, 0xff, 0xff, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D600 */
- { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude E6500 */
+ /* Dell Latitude E5500, E6400, E6500, Precision M4400 */
+ { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf,
+ ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED },
{ { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FW_BK_1 }, /* Dell Vostro 1400 */
};
@@ -66,20 +71,88 @@ static const struct alps_model_info alps_model_data[] = {
*/
/*
- * ALPS abolute Mode - new format
+ * PS/2 packet format
+ *
+ * byte 0: 0 0 YSGN XSGN 1 M R L
+ * byte 1: X7 X6 X5 X4 X3 X2 X1 X0
+ * byte 2: Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
+ *
+ * Note that the device never signals overflow condition.
+ *
+ * ALPS absolute Mode - new format
*
* byte 0: 1 ? ? ? 1 ? ? ?
* byte 1: 0 x6 x5 x4 x3 x2 x1 x0
- * byte 2: 0 x10 x9 x8 x7 ? fin ges
+ * byte 2: 0 x10 x9 x8 x7 ? fin ges
* byte 3: 0 y9 y8 y7 1 M R L
* byte 4: 0 y6 y5 y4 y3 y2 y1 y0
* byte 5: 0 z6 z5 z4 z3 z2 z1 z0
*
+ * Dualpoint device -- interleaved packet format
+ *
+ * byte 0: 1 1 0 0 1 1 1 1
+ * byte 1: 0 x6 x5 x4 x3 x2 x1 x0
+ * byte 2: 0 x10 x9 x8 x7 0 fin ges
+ * byte 3: 0 0 YSGN XSGN 1 1 1 1
+ * byte 4: X7 X6 X5 X4 X3 X2 X1 X0
+ * byte 5: Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
+ * byte 6: 0 y9 y8 y7 1 m r l
+ * byte 7: 0 y6 y5 y4 y3 y2 y1 y0
+ * byte 8: 0 z6 z5 z4 z3 z2 z1 z0
+ *
+ * CAPITALS = stick, miniscules = touchpad
+ *
* ?'s can have different meanings on different models,
* such as wheel rotation, extra buttons, stick buttons
* on a dualpoint, etc.
*/
+static bool alps_is_valid_first_byte(const struct alps_model_info *model,
+ unsigned char data)
+{
+ return (data & model->mask0) == model->byte0;
+}
+
+static void alps_report_buttons(struct psmouse *psmouse,
+ struct input_dev *dev1, struct input_dev *dev2,
+ int left, int right, int middle)
+{
+ struct alps_data *priv = psmouse->private;
+ const struct alps_model_info *model = priv->i;
+
+ if (model->flags & ALPS_PS2_INTERLEAVED) {
+ struct input_dev *dev;
+
+ /*
+ * If shared button has already been reported on the
+ * other device (dev2) then this event should be also
+ * sent through that device.
+ */
+ dev = test_bit(BTN_LEFT, dev2->key) ? dev2 : dev1;
+ input_report_key(dev, BTN_LEFT, left);
+
+ dev = test_bit(BTN_RIGHT, dev2->key) ? dev2 : dev1;
+ input_report_key(dev, BTN_RIGHT, right);
+
+ dev = test_bit(BTN_MIDDLE, dev2->key) ? dev2 : dev1;
+ input_report_key(dev, BTN_MIDDLE, middle);
+
+ /*
+ * Sync the _other_ device now, we'll do the first
+ * device later once we report the rest of the events.
+ */
+ input_sync(dev2);
+ } else {
+ /*
+ * For devices with non-interleaved packets we know what
+ * device buttons belong to so we can simply report them.
+ */
+ input_report_key(dev1, BTN_LEFT, left);
+ input_report_key(dev1, BTN_RIGHT, right);
+ input_report_key(dev1, BTN_MIDDLE, middle);
+ }
+}
+
static void alps_process_packet(struct psmouse *psmouse)
{
struct alps_data *priv = psmouse->private;
@@ -89,18 +162,6 @@ static void alps_process_packet(struct psmouse *psmouse)
int x, y, z, ges, fin, left, right, middle;
int back = 0, forward = 0;
- if ((packet[0] & 0xc8) == 0x08) { /* 3-byte PS/2 packet */
- input_report_key(dev2, BTN_LEFT, packet[0] & 1);
- input_report_key(dev2, BTN_RIGHT, packet[0] & 2);
- input_report_key(dev2, BTN_MIDDLE, packet[0] & 4);
- input_report_rel(dev2, REL_X,
- packet[1] ? packet[1] - ((packet[0] << 4) & 0x100) : 0);
- input_report_rel(dev2, REL_Y,
- packet[2] ? ((packet[0] << 3) & 0x100) - packet[2] : 0);
- input_sync(dev2);
- return;
- }
-
if (priv->i->flags & ALPS_OLDPROTO) {
left = packet[2] & 0x10;
right = packet[2] & 0x08;
@@ -136,18 +197,13 @@ static void alps_process_packet(struct psmouse *psmouse)
input_report_rel(dev2, REL_X, (x > 383 ? (x - 768) : x));
input_report_rel(dev2, REL_Y, -(y > 255 ? (y - 512) : y));
- input_report_key(dev2, BTN_LEFT, left);
- input_report_key(dev2, BTN_RIGHT, right);
- input_report_key(dev2, BTN_MIDDLE, middle);
+ alps_report_buttons(psmouse, dev2, dev, left, right, middle);
- input_sync(dev);
input_sync(dev2);
return;
}
- input_report_key(dev, BTN_LEFT, left);
- input_report_key(dev, BTN_RIGHT, right);
- input_report_key(dev, BTN_MIDDLE, middle);
+ alps_report_buttons(psmouse, dev, dev2, left, right, middle);
/* Convert hardware tap to a reasonable Z value */
if (ges && !fin) z = 40;
@@ -188,25 +244,168 @@ static void alps_process_packet(struct psmouse *psmouse)
input_sync(dev);
}
+static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
+ unsigned char packet[],
+ bool report_buttons)
+{
+ struct alps_data *priv = psmouse->private;
+ struct input_dev *dev2 = priv->dev2;
+
+ if (report_buttons)
+ alps_report_buttons(psmouse, dev2, psmouse->dev,
+ packet[0] & 1, packet[0] & 2, packet[0] & 4);
+
+ input_report_rel(dev2, REL_X,
+ packet[1] ? packet[1] - ((packet[0] << 4) & 0x100) : 0);
+ input_report_rel(dev2, REL_Y,
+ packet[2] ? ((packet[0] << 3) & 0x100) - packet[2] : 0);
+
+ input_sync(dev2);
+}
+
+static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
+{
+ struct alps_data *priv = psmouse->private;
+
+ if (psmouse->pktcnt < 6)
+ return PSMOUSE_GOOD_DATA;
+
+ if (psmouse->pktcnt == 6) {
+ /*
+ * Start a timer to flush the packet if it ends up last
+ * 6-byte packet in the stream. Timer needs to fire
+ * psmouse core times out itself. 20 ms should be enough
+ * to decide if we are getting more data or not.
+ */
+ mod_timer(&priv->timer, jiffies + msecs_to_jiffies(20));
+ return PSMOUSE_GOOD_DATA;
+ }
+
+ del_timer(&priv->timer);
+
+ if (psmouse->packet[6] & 0x80) {
+
+ /*
+ * Highest bit is set - that means we either had
+ * complete ALPS packet and this is start of the
+ * next packet or we got garbage.
+ */
+
+ if (((psmouse->packet[3] |
+ psmouse->packet[4] |
+ psmouse->packet[5]) & 0x80) ||
+ (!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) {
+ dbg("refusing packet %x %x %x %x "
+ "(suspected interleaved ps/2)\n",
+ psmouse->packet[3], psmouse->packet[4],
+ psmouse->packet[5], psmouse->packet[6]);
+ return PSMOUSE_BAD_DATA;
+ }
+
+ alps_process_packet(psmouse);
+
+ /* Continue with the next packet */
+ psmouse->packet[0] = psmouse->packet[6];
+ psmouse->pktcnt = 1;
+
+ } else {
+
+ /*
+ * High bit is 0 - that means that we indeed got a PS/2
+ * packet in the middle of ALPS packet.
+ *
+ * There is also possibility that we got 6-byte ALPS
+ * packet followed by 3-byte packet from trackpoint. We
+ * can not distinguish between these 2 scenarios but
+ * becase the latter is unlikely to happen in course of
+ * normal operation (user would need to press all
+ * buttons on the pad and start moving trackpoint
+ * without touching the pad surface) we assume former.
+ * Even if we are wrong the wost thing that would happen
+ * the cursor would jump but we should not get protocol
+ * desynchronization.
+ */
+
+ alps_report_bare_ps2_packet(psmouse, &psmouse->packet[3],
+ false);
+
+ /*
+ * Continue with the standard ALPS protocol handling,
+ * but make sure we won't process it as an interleaved
+ * packet again, which may happen if all buttons are
+ * pressed. To avoid this let's reset the 4th bit which
+ * is normally 1.
+ */
+ psmouse->packet[3] = psmouse->packet[6] & 0xf7;
+ psmouse->pktcnt = 4;
+ }
+
+ return PSMOUSE_GOOD_DATA;
+}
+
+static void alps_flush_packet(unsigned long data)
+{
+ struct psmouse *psmouse = (struct psmouse *)data;
+
+ serio_pause_rx(psmouse->ps2dev.serio);
+
+ if (psmouse->pktcnt == 6) {
+
+ /*
+ * We did not any more data in reasonable amount of time.
+ * Validate the last 3 bytes and process as a standard
+ * ALPS packet.
+ */
+ if ((psmouse->packet[3] |
+ psmouse->packet[4] |
+ psmouse->packet[5]) & 0x80) {
+ dbg("refusing packet %x %x %x "
+ "(suspected interleaved ps/2)\n",
+ psmouse->packet[3], psmouse->packet[4],
+ psmouse->packet[5]);
+ } else {
+ alps_process_packet(psmouse);
+ }
+ psmouse->pktcnt = 0;
+ }
+
+ serio_continue_rx(psmouse->ps2dev.serio);
+}
+
static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
{
struct alps_data *priv = psmouse->private;
+ const struct alps_model_info *model = priv->i;
if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */
if (psmouse->pktcnt == 3) {
- alps_process_packet(psmouse);
+ alps_report_bare_ps2_packet(psmouse, psmouse->packet,
+ true);
return PSMOUSE_FULL_PACKET;
}
return PSMOUSE_GOOD_DATA;
}
- if ((psmouse->packet[0] & priv->i->mask0) != priv->i->byte0)
+ /* Check for PS/2 packet stuffed in the middle of ALPS packet. */
+
+ if ((model->flags & ALPS_PS2_INTERLEAVED) &&
+ psmouse->pktcnt >= 4 && (psmouse->packet[3] & 0x0f) == 0x0f) {
+ return alps_handle_interleaved_ps2(psmouse);
+ }
+
+ if (!alps_is_valid_first_byte(model, psmouse->packet[0])) {
+ dbg("refusing packet[0] = %x (mask0 = %x, byte0 = %x)\n",
+ psmouse->packet[0], model->mask0, model->byte0);
return PSMOUSE_BAD_DATA;
+ }
/* Bytes 2 - 6 should have 0 in the highest bit */
if (psmouse->pktcnt >= 2 && psmouse->pktcnt <= 6 &&
- (psmouse->packet[psmouse->pktcnt - 1] & 0x80))
+ (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {
+ dbg("refusing packet[%i] = %x\n",
+ psmouse->pktcnt - 1, psmouse->packet[psmouse->pktcnt - 1]);
return PSMOUSE_BAD_DATA;
+ }
if (psmouse->pktcnt == 6) {
alps_process_packet(psmouse);
@@ -441,6 +640,7 @@ static void alps_disconnect(struct psmouse *psmouse)
struct alps_data *priv = psmouse->private;
psmouse_reset(psmouse);
+ del_timer_sync(&priv->timer);
input_unregister_device(priv->dev2);
kfree(priv);
}
@@ -457,6 +657,8 @@ int alps_init(struct psmouse *psmouse)
goto init_fail;
priv->dev2 = dev2;
+ setup_timer(&priv->timer, alps_flush_packet, (unsigned long)psmouse);
+
psmouse->private = priv;
if (alps_hw_init(psmouse, &version))
diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
index 4bbddc99962b..4b6024163d3c 100644
--- a/drivers/input/mouse/alps.h
+++ b/drivers/input/mouse/alps.h
@@ -23,6 +23,7 @@ struct alps_data {
char phys[32]; /* Phys */
const struct alps_model_info *i;/* Info */
int prev_fin; /* Finger bit from previous packet */
+ struct timer_list timer;
};
#ifdef CONFIG_MOUSE_PS2_ALPS
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
index 19984bf06cad..c65e24510494 100644
--- a/drivers/input/mouse/synaptics.c
+++ b/drivers/input/mouse/synaptics.c
@@ -652,6 +652,16 @@ static const struct dmi_system_id toshiba_dmi_table[] = {
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"),
},
+
+ },
+ {
+ .ident = "Toshiba Portege M300",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"),
+ },
+
},
{ }
};
diff --git a/drivers/input/touchscreen/mxc_ts.c b/drivers/input/touchscreen/mxc_ts.c
index 6cce76f1494f..6146b27f01da 100644
--- a/drivers/input/touchscreen/mxc_ts.c
+++ b/drivers/input/touchscreen/mxc_ts.c
@@ -43,9 +43,6 @@
#include <linux/pmic_external.h>
#include <linux/pmic_adc.h>
#include <linux/kthread.h>
-#ifdef CONFIG_EARLYSUSPEND
-#include <linux/earlysuspend.h>
-#endif
#define MXC_TS_NAME "mxc_ts"
@@ -63,30 +60,6 @@ static struct task_struct *tstask;
static int calibration[7];
module_param_array(calibration, int, NULL, S_IRUGO | S_IWUSR);
-#ifdef CONFIG_EARLYSUSPEND
-
-static wait_queue_head_t ts_wait;
-static int ts_suspend;
-
-static void stop_ts_early_suspend(struct early_suspend *h)
-{
- ts_suspend = 1;
-}
-
-static void start_ts_late_resume(struct early_suspend *h)
-{
- ts_suspend = 0;
- wake_up_interruptible(&ts_wait);
-}
-
-static struct early_suspend stop_ts_early_suspend_desc = {
- .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING,
- .suspend = stop_ts_early_suspend,
- .resume = start_ts_late_resume,
-};
-
-#endif
-
static int ts_thread(void *arg)
{
t_touch_screen ts_sample;
@@ -96,9 +69,6 @@ static int ts_thread(void *arg)
int x, y;
static int last_x = -1, last_y = -1, last_press = -1;
-#ifdef CONFIG_EARLYSUSPEND
- wait_event_interruptible(ts_wait, !ts_suspend);
-#endif
memset(&ts_sample, 0, sizeof(t_touch_screen));
/* After 2 consecutive samples with the pen up, enable irq waiting */
@@ -112,7 +82,7 @@ static int ts_thread(void *arg)
}
if (ts_sample.x_position == 0 && ts_sample.y_position == 0 &&
- ts_sample.contact_resistance == 0) {
+ ts_sample.contact_resistance == 0) {
x = last_x;
y = last_y;
} else if (calibration[6] == 0) {
@@ -120,14 +90,14 @@ static int ts_thread(void *arg)
y = ts_sample.y_position;
} else {
x = calibration[0] * (int)ts_sample.x_position +
- calibration[1] * (int)ts_sample.y_position +
- calibration[2];
+ calibration[1] * (int)ts_sample.y_position +
+ calibration[2];
x /= calibration[6];
if (x < 0)
x = 0;
y = calibration[3] * (int)ts_sample.x_position +
- calibration[4] * (int)ts_sample.y_position +
- calibration[5];
+ calibration[4] * (int)ts_sample.y_position +
+ calibration[5];
y /= calibration[6];
if (y < 0)
y = 0;
@@ -156,7 +126,7 @@ static int ts_thread(void *arg)
/* report the BTN_TOUCH */
if (ts_sample.contact_resistance != last_press)
input_event(mxc_inputdev, EV_KEY,
- BTN_TOUCH, ts_sample.contact_resistance);
+ BTN_TOUCH, ts_sample.contact_resistance);
input_sync(mxc_inputdev);
last_press = ts_sample.contact_resistance;
@@ -177,7 +147,8 @@ static int __init mxc_ts_init(void)
mxc_inputdev = input_allocate_device();
if (!mxc_inputdev) {
- printk(KERN_ERR "mxc_ts_init: not enough memory\n");
+ printk(KERN_ERR
+ "mxc_ts_init: not enough memory\n");
return -ENOMEM;
}
@@ -194,14 +165,11 @@ static int __init mxc_ts_init(void)
tstask = kthread_run(ts_thread, NULL, "mxc_ts");
if (IS_ERR(tstask)) {
- printk(KERN_ERR "mxc_ts_init: failed to create kthread");
+ printk(KERN_ERR
+ "mxc_ts_init: failed to create kthread");
tstask = NULL;
return -1;
}
-#ifdef CONFIG_EARLYSUSPEND
- init_waitqueue_head(&ts_wait);
- register_early_suspend(&stop_ts_early_suspend_desc);
-#endif
printk("mxc input touchscreen loaded\n");
return 0;
}
@@ -217,9 +185,6 @@ static void __exit mxc_ts_exit(void)
input_free_device(mxc_inputdev);
mxc_inputdev = NULL;
}
-#ifdef CONFIG_EARLYSUSPEND
- unregister_early_suspend(&stop_ts_early_suspend_desc);
-#endif
}
late_initcall(mxc_ts_init);
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c
index 8ff7e35c7069..f33ac27de643 100644
--- a/drivers/isdn/gigaset/interface.c
+++ b/drivers/isdn/gigaset/interface.c
@@ -408,33 +408,28 @@ static int if_write_room(struct tty_struct *tty)
return retval;
}
-/* FIXME: This function does not have error returns */
-
static int if_chars_in_buffer(struct tty_struct *tty)
{
struct cardstate *cs;
- int retval = -ENODEV;
+ int retval = 0;
cs = (struct cardstate *) tty->driver_data;
if (!cs) {
pr_err("%s: no cardstate\n", __func__);
- return -ENODEV;
+ return 0;
}
gig_dbg(DEBUG_IF, "%u: %s()", cs->minor_index, __func__);
- if (mutex_lock_interruptible(&cs->mutex))
- return -ERESTARTSYS; // FIXME -EINTR?
+ mutex_lock(&cs->mutex);
- if (!cs->connected) {
+ if (!cs->connected)
gig_dbg(DEBUG_IF, "not connected");
- retval = -ENODEV;
- } else if (!cs->open_count)
+ else if (!cs->open_count)
dev_warn(cs->dev, "%s: device not opened\n", __func__);
- else if (cs->mstate != MS_LOCKED) {
+ else if (cs->mstate != MS_LOCKED)
dev_warn(cs->dev, "can't write to unlocked device\n");
- retval = -EBUSY;
- } else
+ else
retval = cs->ops->chars_in_buffer(cs);
mutex_unlock(&cs->mutex);
diff --git a/drivers/isdn/hisax/hfc_usb.c b/drivers/isdn/hisax/hfc_usb.c
index 9de54202c90c..a420b64472e3 100644
--- a/drivers/isdn/hisax/hfc_usb.c
+++ b/drivers/isdn/hisax/hfc_usb.c
@@ -817,8 +817,8 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
}
/* we have a complete hdlc packet */
if (finish) {
- if ((!fifo->skbuff->data[fifo->skbuff->len - 1])
- && (fifo->skbuff->len > 3)) {
+ if (fifo->skbuff->len > 3 &&
+ !fifo->skbuff->data[fifo->skbuff->len - 1]) {
if (fifon == HFCUSB_D_RX) {
DBG(HFCUSB_DBG_DCHANNEL,
diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c
index aa30b5cb3513..9a9dc3be1c49 100644
--- a/drivers/isdn/i4l/isdn_ppp.c
+++ b/drivers/isdn/i4l/isdn_ppp.c
@@ -1535,10 +1535,8 @@ static int isdn_ppp_mp_bundle_array_init(void)
int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle);
if( (isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL )
return -ENOMEM;
- for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
+ for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
- skb_queue_head_init(&isdn_ppp_bundle_arr[i].frags);
- }
return 0;
}
@@ -1571,7 +1569,7 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL)
return -ENOMEM;
lp->next = lp->last = lp; /* nobody else in a queue */
- skb_queue_head_init(&lp->netdev->pb->frags);
+ lp->netdev->pb->frags = NULL;
lp->netdev->pb->frames = 0;
lp->netdev->pb->seq = UINT_MAX;
}
@@ -1583,29 +1581,28 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
static u32 isdn_ppp_mp_get_seq( int short_seq,
struct sk_buff * skb, u32 last_seq );
-static void isdn_ppp_mp_discard(ippp_bundle *mp, struct sk_buff *from,
- struct sk_buff *to);
-static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
- struct sk_buff *from, struct sk_buff *to,
- u32 lastseq);
-static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb);
+static struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
+ struct sk_buff * from, struct sk_buff * to );
+static void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
+ struct sk_buff * from, struct sk_buff * to );
+static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb );
static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb );
static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
- struct sk_buff *skb)
+ struct sk_buff *skb)
{
- struct sk_buff *newfrag, *frag, *start, *nextf;
- u32 newseq, minseq, thisseq;
- isdn_mppp_stats *stats;
struct ippp_struct *is;
+ isdn_net_local * lpq;
+ ippp_bundle * mp;
+ isdn_mppp_stats * stats;
+ struct sk_buff * newfrag, * frag, * start, *nextf;
+ u32 newseq, minseq, thisseq;
unsigned long flags;
- isdn_net_local *lpq;
- ippp_bundle *mp;
int slot;
spin_lock_irqsave(&net_dev->pb->lock, flags);
- mp = net_dev->pb;
- stats = &mp->stats;
+ mp = net_dev->pb;
+ stats = &mp->stats;
slot = lp->ppp_slot;
if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
@@ -1616,19 +1613,20 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
return;
}
is = ippp_table[slot];
- if (++mp->frames > stats->max_queue_len)
+ if( ++mp->frames > stats->max_queue_len )
stats->max_queue_len = mp->frames;
if (is->debug & 0x8)
isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ,
- skb, is->last_link_seqno);
+ skb, is->last_link_seqno);
+
/* if this packet seq # is less than last already processed one,
* toss it right away, but check for sequence start case first
*/
- if (mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT)) {
+ if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) {
mp->seq = newseq; /* the first packet: required for
* rfc1990 non-compliant clients --
* prevents constant packet toss */
@@ -1659,31 +1657,22 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
* packets */
newfrag = skb;
- /* Insert new fragment into the proper sequence slot. */
- skb_queue_walk(&mp->frags, frag) {
- if (MP_SEQ(frag) == newseq) {
- isdn_ppp_mp_free_skb(mp, newfrag);
- newfrag = NULL;
- break;
- }
- if (MP_LT(newseq, MP_SEQ(frag))) {
- __skb_queue_before(&mp->frags, frag, newfrag);
- newfrag = NULL;
- break;
- }
- }
- if (newfrag)
- __skb_queue_tail(&mp->frags, newfrag);
+ /* if this new fragment is before the first one, then enqueue it now. */
+ if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
+ newfrag->next = frag;
+ mp->frags = frag = newfrag;
+ newfrag = NULL;
+ }
- frag = skb_peek(&mp->frags);
- start = ((MP_FLAGS(frag) & MP_BEGIN_FRAG) &&
- (MP_SEQ(frag) == mp->seq)) ? frag : NULL;
- if (!start)
- goto check_overflow;
+ start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
+ MP_SEQ(frag) == mp->seq ? frag : NULL;
- /* main fragment traversing loop
+ /*
+ * main fragment traversing loop
*
* try to accomplish several tasks:
+ * - insert new fragment into the proper sequence slot (once that's done
+ * newfrag will be set to NULL)
* - reassemble any complete fragment sequence (non-null 'start'
* indicates there is a continguous sequence present)
* - discard any incomplete sequences that are below minseq -- due
@@ -1692,46 +1681,71 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
* come to complete such sequence and it should be discarded
*
* loop completes when we accomplished the following tasks:
+ * - new fragment is inserted in the proper sequence ('newfrag' is
+ * set to NULL)
* - we hit a gap in the sequence, so no reassembly/processing is
* possible ('start' would be set to NULL)
*
* algorithm for this code is derived from code in the book
* 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
*/
- skb_queue_walk_safe(&mp->frags, frag, nextf) {
- thisseq = MP_SEQ(frag);
-
- /* check for misplaced start */
- if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
- printk(KERN_WARNING"isdn_mppp(seq %d): new "
- "BEGIN flag with no prior END", thisseq);
- stats->seqerrs++;
- stats->frame_drops++;
- isdn_ppp_mp_discard(mp, start, frag);
- start = frag;
- } else if (MP_LE(thisseq, minseq)) {
- if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
+ while (start != NULL || newfrag != NULL) {
+
+ thisseq = MP_SEQ(frag);
+ nextf = frag->next;
+
+ /* drop any duplicate fragments */
+ if (newfrag != NULL && thisseq == newseq) {
+ isdn_ppp_mp_free_skb(mp, newfrag);
+ newfrag = NULL;
+ }
+
+ /* insert new fragment before next element if possible. */
+ if (newfrag != NULL && (nextf == NULL ||
+ MP_LT(newseq, MP_SEQ(nextf)))) {
+ newfrag->next = nextf;
+ frag->next = nextf = newfrag;
+ newfrag = NULL;
+ }
+
+ if (start != NULL) {
+ /* check for misplaced start */
+ if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
+ printk(KERN_WARNING"isdn_mppp(seq %d): new "
+ "BEGIN flag with no prior END", thisseq);
+ stats->seqerrs++;
+ stats->frame_drops++;
+ start = isdn_ppp_mp_discard(mp, start,frag);
+ nextf = frag->next;
+ }
+ } else if (MP_LE(thisseq, minseq)) {
+ if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
start = frag;
- else {
+ else {
if (MP_FLAGS(frag) & MP_END_FRAG)
- stats->frame_drops++;
- __skb_unlink(skb, &mp->frags);
+ stats->frame_drops++;
+ if( mp->frags == frag )
+ mp->frags = nextf;
isdn_ppp_mp_free_skb(mp, frag);
+ frag = nextf;
continue;
- }
+ }
}
- /* if we have end fragment, then we have full reassembly
- * sequence -- reassemble and process packet now
+ /* if start is non-null and we have end fragment, then
+ * we have full reassembly sequence -- reassemble
+ * and process packet now
*/
- if (MP_FLAGS(frag) & MP_END_FRAG) {
- minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK;
- /* Reassemble the packet then dispatch it */
- isdn_ppp_mp_reassembly(net_dev, lp, start, frag, thisseq);
+ if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
+ minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK;
+ /* Reassemble the packet then dispatch it */
+ isdn_ppp_mp_reassembly(net_dev, lp, start, nextf);
- start = NULL;
- frag = NULL;
- }
+ start = NULL;
+ frag = NULL;
+
+ mp->frags = nextf;
+ }
/* check if need to update start pointer: if we just
* reassembled the packet and sequence is contiguous
@@ -1742,25 +1756,26 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
* below low watermark and set start to the next frag or
* clear start ptr.
*/
- if (nextf != (struct sk_buff *)&mp->frags &&
+ if (nextf != NULL &&
((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
- /* if we just reassembled and the next one is here,
- * then start another reassembly.
- */
- if (frag == NULL) {
+ /* if we just reassembled and the next one is here,
+ * then start another reassembly. */
+
+ if (frag == NULL) {
if (MP_FLAGS(nextf) & MP_BEGIN_FRAG)
- start = nextf;
- else {
- printk(KERN_WARNING"isdn_mppp(seq %d):"
- " END flag with no following "
- "BEGIN", thisseq);
+ start = nextf;
+ else
+ {
+ printk(KERN_WARNING"isdn_mppp(seq %d):"
+ " END flag with no following "
+ "BEGIN", thisseq);
stats->seqerrs++;
}
}
- } else {
- if (nextf != (struct sk_buff *)&mp->frags &&
- frag != NULL &&
- MP_LT(thisseq, minseq)) {
+
+ } else {
+ if ( nextf != NULL && frag != NULL &&
+ MP_LT(thisseq, minseq)) {
/* we've got a break in the sequence
* and we not at the end yet
* and we did not just reassembled
@@ -1769,39 +1784,41 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
* discard all the frames below low watermark
* and start over */
stats->frame_drops++;
- isdn_ppp_mp_discard(mp, start, nextf);
+ mp->frags = isdn_ppp_mp_discard(mp,start,nextf);
}
/* break in the sequence, no reassembly */
- start = NULL;
- }
- if (!start)
- break;
- }
+ start = NULL;
+ }
+
+ frag = nextf;
+ } /* while -- main loop */
+
+ if (mp->frags == NULL)
+ mp->frags = frag;
-check_overflow:
/* rather straighforward way to deal with (not very) possible
- * queue overflow
- */
+ * queue overflow */
if (mp->frames > MP_MAX_QUEUE_LEN) {
stats->overflows++;
- skb_queue_walk_safe(&mp->frags, frag, nextf) {
- if (mp->frames <= MP_MAX_QUEUE_LEN)
- break;
- __skb_unlink(frag, &mp->frags);
- isdn_ppp_mp_free_skb(mp, frag);
+ while (mp->frames > MP_MAX_QUEUE_LEN) {
+ frag = mp->frags->next;
+ isdn_ppp_mp_free_skb(mp, mp->frags);
+ mp->frags = frag;
}
}
spin_unlock_irqrestore(&mp->lock, flags);
}
-static void isdn_ppp_mp_cleanup(isdn_net_local *lp)
+static void isdn_ppp_mp_cleanup( isdn_net_local * lp )
{
- struct sk_buff *skb, *tmp;
-
- skb_queue_walk_safe(&lp->netdev->pb->frags, skb, tmp) {
- __skb_unlink(skb, &lp->netdev->pb->frags);
- isdn_ppp_mp_free_skb(lp->netdev->pb, skb);
- }
+ struct sk_buff * frag = lp->netdev->pb->frags;
+ struct sk_buff * nextfrag;
+ while( frag ) {
+ nextfrag = frag->next;
+ isdn_ppp_mp_free_skb(lp->netdev->pb, frag);
+ frag = nextfrag;
+ }
+ lp->netdev->pb->frags = NULL;
}
static u32 isdn_ppp_mp_get_seq( int short_seq,
@@ -1838,115 +1855,72 @@ static u32 isdn_ppp_mp_get_seq( int short_seq,
return seq;
}
-static void isdn_ppp_mp_discard(ippp_bundle *mp, struct sk_buff *from,
- struct sk_buff *to)
+struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
+ struct sk_buff * from, struct sk_buff * to )
{
- if (from) {
- struct sk_buff *skb, *tmp;
- int freeing = 0;
-
- skb_queue_walk_safe(&mp->frags, skb, tmp) {
- if (skb == to)
- break;
- if (skb == from)
- freeing = 1;
- if (!freeing)
- continue;
- __skb_unlink(skb, &mp->frags);
- isdn_ppp_mp_free_skb(mp, skb);
+ if( from )
+ while (from != to) {
+ struct sk_buff * next = from->next;
+ isdn_ppp_mp_free_skb(mp, from);
+ from = next;
}
- }
+ return from;
}
-static unsigned int calc_tot_len(struct sk_buff_head *queue,
- struct sk_buff *from, struct sk_buff *to)
+void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
+ struct sk_buff * from, struct sk_buff * to )
{
- unsigned int tot_len = 0;
- struct sk_buff *skb;
- int found_start = 0;
-
- skb_queue_walk(queue, skb) {
- if (skb == from)
- found_start = 1;
- if (!found_start)
- continue;
- tot_len += skb->len - MP_HEADER_LEN;
- if (skb == to)
- break;
- }
- return tot_len;
-}
-
-/* Reassemble packet using fragments in the reassembly queue from
- * 'from' until 'to', inclusive.
- */
-static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
- struct sk_buff *from, struct sk_buff *to,
- u32 lastseq)
-{
- ippp_bundle *mp = net_dev->pb;
- unsigned int tot_len;
- struct sk_buff *skb;
+ ippp_bundle * mp = net_dev->pb;
int proto;
+ struct sk_buff * skb;
+ unsigned int tot_len;
if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
__func__, lp->ppp_slot);
return;
}
-
- tot_len = calc_tot_len(&mp->frags, from, to);
-
- if (MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG)) {
- if (ippp_table[lp->ppp_slot]->debug & 0x40)
+ if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) {
+ if( ippp_table[lp->ppp_slot]->debug & 0x40 )
printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
- "len %d\n", MP_SEQ(from), from->len);
+ "len %d\n", MP_SEQ(from), from->len );
skb = from;
skb_pull(skb, MP_HEADER_LEN);
- __skb_unlink(skb, &mp->frags);
mp->frames--;
} else {
- struct sk_buff *walk, *tmp;
- int found_start = 0;
+ struct sk_buff * frag;
+ int n;
- if (ippp_table[lp->ppp_slot]->debug & 0x40)
- printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
- "to %d, len %d\n", MP_SEQ(from), lastseq,
- tot_len);
+ for(tot_len=n=0, frag=from; frag != to; frag=frag->next, n++)
+ tot_len += frag->len - MP_HEADER_LEN;
- skb = dev_alloc_skb(tot_len);
- if (!skb)
+ if( ippp_table[lp->ppp_slot]->debug & 0x40 )
+ printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
+ "to %d, len %d\n", MP_SEQ(from),
+ (MP_SEQ(from)+n-1) & MP_LONGSEQ_MASK, tot_len );
+ if( (skb = dev_alloc_skb(tot_len)) == NULL ) {
printk(KERN_ERR "isdn_mppp: cannot allocate sk buff "
- "of size %d\n", tot_len);
-
- found_start = 0;
- skb_queue_walk_safe(&mp->frags, walk, tmp) {
- if (walk == from)
- found_start = 1;
- if (!found_start)
- continue;
+ "of size %d\n", tot_len);
+ isdn_ppp_mp_discard(mp, from, to);
+ return;
+ }
- if (skb) {
- unsigned int len = walk->len - MP_HEADER_LEN;
- skb_copy_from_linear_data_offset(walk, MP_HEADER_LEN,
- skb_put(skb, len),
- len);
- }
- __skb_unlink(walk, &mp->frags);
- isdn_ppp_mp_free_skb(mp, walk);
+ while( from != to ) {
+ unsigned int len = from->len - MP_HEADER_LEN;
- if (walk == to)
- break;
+ skb_copy_from_linear_data_offset(from, MP_HEADER_LEN,
+ skb_put(skb,len),
+ len);
+ frag = from->next;
+ isdn_ppp_mp_free_skb(mp, from);
+ from = frag;
}
}
- if (!skb)
- return;
-
proto = isdn_ppp_strip_proto(skb);
isdn_ppp_push_higher(net_dev, lp, skb, proto);
}
-static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb)
+static void isdn_ppp_mp_free_skb(ippp_bundle * mp, struct sk_buff * skb)
{
dev_kfree_skb(skb);
mp->frames--;
diff --git a/drivers/leds/leds-mxs-pwm.c b/drivers/leds/leds-mxs-pwm.c
index a546900a44d0..c76821770446 100644
--- a/drivers/leds/leds-mxs-pwm.c
+++ b/drivers/leds/leds-mxs-pwm.c
@@ -165,35 +165,10 @@ static int __devexit mxs_pwm_led_remove(struct platform_device *pdev)
return 0;
}
-#ifdef CONFIG_PM
-static int mxs_led_suspend(struct platform_device *dev, pm_message_t state)
-{
- int i;
-
- for (i = 0; i < leds.led_num; i++)
- led_classdev_suspend(&leds.leds[i].dev);
- return 0;
-}
-
-static int mxs_led_resume(struct platform_device *dev)
-{
- int i;
-
- for (i = 0; i < leds.led_num; i++)
- led_classdev_resume(&leds.leds[i].dev);
- return 0;
-}
-#else
-#define mxs_led_suspend NULL
-#define mxs_led_resume NULL
-#endif
-
static struct platform_driver mxs_pwm_led_driver = {
.probe = mxs_pwm_led_probe,
.remove = __devexit_p(mxs_pwm_led_remove),
- .suspend = mxs_led_suspend,
- .resume = mxs_led_resume,
.driver = {
.name = "mxs-leds",
},
diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c
index fde377c60cca..386a7972111d 100644
--- a/drivers/macintosh/therm_adt746x.c
+++ b/drivers/macintosh/therm_adt746x.c
@@ -79,6 +79,7 @@ struct thermostat {
u8 limits[3];
int last_speed[2];
int last_var[2];
+ int pwm_inv[2];
};
static enum {ADT7460, ADT7467} therm_type;
@@ -124,6 +125,8 @@ read_reg(struct thermostat* th, int reg)
return data;
}
+static struct i2c_driver thermostat_driver;
+
static int
attach_thermostat(struct i2c_adapter *adapter)
{
@@ -148,7 +151,7 @@ attach_thermostat(struct i2c_adapter *adapter)
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
- list_add_tail(&client->detected, &client->driver->clients);
+ list_add_tail(&client->detected, &thermostat_driver.clients);
return 0;
}
@@ -227,19 +230,23 @@ static void write_fan_speed(struct thermostat *th, int speed, int fan)
if (speed >= 0) {
manual = read_reg(th, MANUAL_MODE[fan]);
+ manual &= ~INVERT_MASK;
write_reg(th, MANUAL_MODE[fan],
- (manual|MANUAL_MASK) & (~INVERT_MASK));
+ manual | MANUAL_MASK | th->pwm_inv[fan]);
write_reg(th, FAN_SPD_SET[fan], speed);
} else {
/* back to automatic */
if(therm_type == ADT7460) {
manual = read_reg(th,
MANUAL_MODE[fan]) & (~MANUAL_MASK);
-
+ manual &= ~INVERT_MASK;
+ manual |= th->pwm_inv[fan];
write_reg(th,
MANUAL_MODE[fan], manual|REM_CONTROL[fan]);
} else {
manual = read_reg(th, MANUAL_MODE[fan]);
+ manual &= ~INVERT_MASK;
+ manual |= th->pwm_inv[fan];
write_reg(th, MANUAL_MODE[fan], manual&(~AUTO_MASK));
}
}
@@ -416,6 +423,10 @@ static int probe_thermostat(struct i2c_client *client,
thermostat = th;
+ /* record invert bit status because fw can corrupt it after suspend */
+ th->pwm_inv[0] = read_reg(th, MANUAL_MODE[0]) & INVERT_MASK;
+ th->pwm_inv[1] = read_reg(th, MANUAL_MODE[1]) & INVERT_MASK;
+
/* be sure to really write fan speed the first time */
th->last_speed[0] = -2;
th->last_speed[1] = -2;
diff --git a/drivers/macintosh/therm_pm72.c b/drivers/macintosh/therm_pm72.c
index a028598af2d3..ea32c7e5a9af 100644
--- a/drivers/macintosh/therm_pm72.c
+++ b/drivers/macintosh/therm_pm72.c
@@ -286,6 +286,8 @@ struct fcu_fan_table fcu_fans[] = {
},
};
+static struct i2c_driver therm_pm72_driver;
+
/*
* Utility function to create an i2c_client structure and
* attach it to one of u3 adapters
@@ -318,7 +320,7 @@ static struct i2c_client *attach_i2c_chip(int id, const char *name)
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
- list_add_tail(&clt->detected, &clt->driver->clients);
+ list_add_tail(&clt->detected, &therm_pm72_driver.clients);
return clt;
}
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c
index b40fb9b6c862..6f308a4757ee 100644
--- a/drivers/macintosh/via-pmu.c
+++ b/drivers/macintosh/via-pmu.c
@@ -405,7 +405,11 @@ static int __init via_pmu_start(void)
printk(KERN_ERR "via-pmu: can't map interrupt\n");
return -ENODEV;
}
- if (request_irq(irq, via_pmu_interrupt, 0, "VIA-PMU", (void *)0)) {
+ /* We set IRQF_TIMER because we don't want the interrupt to be disabled
+ * between the 2 passes of driver suspend, we control our own disabling
+ * for that one
+ */
+ if (request_irq(irq, via_pmu_interrupt, IRQF_TIMER, "VIA-PMU", (void *)0)) {
printk(KERN_ERR "via-pmu: can't request irq %d\n", irq);
return -ENODEV;
}
@@ -419,7 +423,7 @@ static int __init via_pmu_start(void)
gpio_irq = irq_of_parse_and_map(gpio_node, 0);
if (gpio_irq != NO_IRQ) {
- if (request_irq(gpio_irq, gpio1_interrupt, 0,
+ if (request_irq(gpio_irq, gpio1_interrupt, IRQF_TIMER,
"GPIO1 ADB", (void *)0))
printk(KERN_ERR "pmu: can't get irq %d"
" (GPIO1)\n", gpio_irq);
@@ -925,8 +929,7 @@ proc_write_options(struct file *file, const char __user *buffer,
#ifdef CONFIG_ADB
/* Send an ADB command */
-static int
-pmu_send_request(struct adb_request *req, int sync)
+static int pmu_send_request(struct adb_request *req, int sync)
{
int i, ret;
@@ -1005,16 +1008,11 @@ pmu_send_request(struct adb_request *req, int sync)
}
/* Enable/disable autopolling */
-static int
-pmu_adb_autopoll(int devs)
+static int __pmu_adb_autopoll(int devs)
{
struct adb_request req;
- if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb)
- return -ENXIO;
-
if (devs) {
- adb_dev_map = devs;
pmu_request(&req, NULL, 5, PMU_ADB_CMD, 0, 0x86,
adb_dev_map >> 8, adb_dev_map);
pmu_adb_flags = 2;
@@ -1027,9 +1025,17 @@ pmu_adb_autopoll(int devs)
return 0;
}
+static int pmu_adb_autopoll(int devs)
+{
+ if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb)
+ return -ENXIO;
+
+ adb_dev_map = devs;
+ return __pmu_adb_autopoll(devs);
+}
+
/* Reset the ADB bus */
-static int
-pmu_adb_reset_bus(void)
+static int pmu_adb_reset_bus(void)
{
struct adb_request req;
int save_autopoll = adb_dev_map;
@@ -1038,13 +1044,13 @@ pmu_adb_reset_bus(void)
return -ENXIO;
/* anyone got a better idea?? */
- pmu_adb_autopoll(0);
+ __pmu_adb_autopoll(0);
- req.nbytes = 5;
+ req.nbytes = 4;
req.done = NULL;
req.data[0] = PMU_ADB_CMD;
- req.data[1] = 0;
- req.data[2] = ADB_BUSRESET;
+ req.data[1] = ADB_BUSRESET;
+ req.data[2] = 0;
req.data[3] = 0;
req.data[4] = 0;
req.reply_len = 0;
@@ -1056,7 +1062,7 @@ pmu_adb_reset_bus(void)
pmu_wait_complete(&req);
if (save_autopoll != 0)
- pmu_adb_autopoll(save_autopoll);
+ __pmu_adb_autopoll(save_autopoll);
return 0;
}
diff --git a/drivers/macintosh/windfarm_lm75_sensor.c b/drivers/macintosh/windfarm_lm75_sensor.c
index 529886c7a826..ed6426a10773 100644
--- a/drivers/macintosh/windfarm_lm75_sensor.c
+++ b/drivers/macintosh/windfarm_lm75_sensor.c
@@ -115,6 +115,8 @@ static int wf_lm75_probe(struct i2c_client *client,
return rc;
}
+static struct i2c_driver wf_lm75_driver;
+
static struct i2c_client *wf_lm75_create(struct i2c_adapter *adapter,
u8 addr, int ds1775,
const char *loc)
@@ -157,7 +159,7 @@ static struct i2c_client *wf_lm75_create(struct i2c_adapter *adapter,
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
- list_add_tail(&client->detected, &client->driver->clients);
+ list_add_tail(&client->detected, &wf_lm75_driver.clients);
return client;
fail:
return NULL;
diff --git a/drivers/macintosh/windfarm_max6690_sensor.c b/drivers/macintosh/windfarm_max6690_sensor.c
index e2a55ecda2b2..a67b349319e9 100644
--- a/drivers/macintosh/windfarm_max6690_sensor.c
+++ b/drivers/macintosh/windfarm_max6690_sensor.c
@@ -88,6 +88,8 @@ static int wf_max6690_probe(struct i2c_client *client,
return rc;
}
+static struct i2c_driver wf_max6690_driver;
+
static struct i2c_client *wf_max6690_create(struct i2c_adapter *adapter,
u8 addr, const char *loc)
{
@@ -119,7 +121,7 @@ static struct i2c_client *wf_max6690_create(struct i2c_adapter *adapter,
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
- list_add_tail(&client->detected, &client->driver->clients);
+ list_add_tail(&client->detected, &wf_max6690_driver.clients);
return client;
fail:
diff --git a/drivers/macintosh/windfarm_smu_sat.c b/drivers/macintosh/windfarm_smu_sat.c
index 5da729e58f99..e20330a28959 100644
--- a/drivers/macintosh/windfarm_smu_sat.c
+++ b/drivers/macintosh/windfarm_smu_sat.c
@@ -194,6 +194,8 @@ static struct wf_sensor_ops wf_sat_ops = {
.owner = THIS_MODULE,
};
+static struct i2c_driver wf_sat_driver;
+
static void wf_sat_create(struct i2c_adapter *adapter, struct device_node *dev)
{
struct i2c_board_info info;
@@ -222,7 +224,7 @@ static void wf_sat_create(struct i2c_adapter *adapter, struct device_node *dev)
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
- list_add_tail(&client->detected, &client->driver->clients);
+ list_add_tail(&client->detected, &wf_sat_driver.clients);
}
static int wf_sat_probe(struct i2c_client *client,
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index 3319c2fec28e..0aee97a30b80 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -1077,23 +1077,31 @@ static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap,
* out to disk
*/
-void bitmap_daemon_work(struct bitmap *bitmap)
+void bitmap_daemon_work(mddev_t *mddev)
{
+ struct bitmap *bitmap;
unsigned long j;
unsigned long flags;
struct page *page = NULL, *lastpage = NULL;
int blocks;
void *paddr;
- if (bitmap == NULL)
+ /* Use a mutex to guard daemon_work against
+ * bitmap_destroy.
+ */
+ mutex_lock(&mddev->bitmap_mutex);
+ bitmap = mddev->bitmap;
+ if (bitmap == NULL) {
+ mutex_unlock(&mddev->bitmap_mutex);
return;
+ }
if (time_before(jiffies, bitmap->daemon_lastrun + bitmap->daemon_sleep*HZ))
goto done;
bitmap->daemon_lastrun = jiffies;
if (bitmap->allclean) {
bitmap->mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
- return;
+ goto done;
}
bitmap->allclean = 1;
@@ -1202,6 +1210,7 @@ void bitmap_daemon_work(struct bitmap *bitmap)
done:
if (bitmap->allclean == 0)
bitmap->mddev->thread->timeout = bitmap->daemon_sleep * HZ;
+ mutex_unlock(&mddev->bitmap_mutex);
}
static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap,
@@ -1538,9 +1547,9 @@ void bitmap_flush(mddev_t *mddev)
*/
sleep = bitmap->daemon_sleep;
bitmap->daemon_sleep = 0;
- bitmap_daemon_work(bitmap);
- bitmap_daemon_work(bitmap);
- bitmap_daemon_work(bitmap);
+ bitmap_daemon_work(mddev);
+ bitmap_daemon_work(mddev);
+ bitmap_daemon_work(mddev);
bitmap->daemon_sleep = sleep;
bitmap_update_sb(bitmap);
}
@@ -1571,6 +1580,7 @@ static void bitmap_free(struct bitmap *bitmap)
kfree(bp);
kfree(bitmap);
}
+
void bitmap_destroy(mddev_t *mddev)
{
struct bitmap *bitmap = mddev->bitmap;
@@ -1578,7 +1588,9 @@ void bitmap_destroy(mddev_t *mddev)
if (!bitmap) /* there was no bitmap */
return;
+ mutex_lock(&mddev->bitmap_mutex);
mddev->bitmap = NULL; /* disconnect from the md device */
+ mutex_unlock(&mddev->bitmap_mutex);
if (mddev->thread)
mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
diff --git a/drivers/md/bitmap.h b/drivers/md/bitmap.h
index e98900671ca9..7e38d13ddcac 100644
--- a/drivers/md/bitmap.h
+++ b/drivers/md/bitmap.h
@@ -282,7 +282,7 @@ void bitmap_close_sync(struct bitmap *bitmap);
void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector);
void bitmap_unplug(struct bitmap *bitmap);
-void bitmap_daemon_work(struct bitmap *bitmap);
+void bitmap_daemon_work(mddev_t *mddev);
#endif
#endif
diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c
index 556acff3952f..932d1b123143 100644
--- a/drivers/md/dm-exception-store.c
+++ b/drivers/md/dm-exception-store.c
@@ -155,7 +155,8 @@ static int set_chunk_size(struct dm_exception_store *store,
char *value;
chunk_size_ulong = simple_strtoul(chunk_size_arg, &value, 10);
- if (*chunk_size_arg == '\0' || *value != '\0') {
+ if (*chunk_size_arg == '\0' || *value != '\0' ||
+ chunk_size_ulong > UINT_MAX) {
*error = "Invalid chunk size";
return -EINVAL;
}
@@ -171,34 +172,35 @@ static int set_chunk_size(struct dm_exception_store *store,
*/
chunk_size_ulong = round_up(chunk_size_ulong, PAGE_SIZE >> 9);
- return dm_exception_store_set_chunk_size(store, chunk_size_ulong,
+ return dm_exception_store_set_chunk_size(store,
+ (unsigned) chunk_size_ulong,
error);
}
int dm_exception_store_set_chunk_size(struct dm_exception_store *store,
- unsigned long chunk_size_ulong,
+ unsigned chunk_size,
char **error)
{
/* Check chunk_size is a power of 2 */
- if (!is_power_of_2(chunk_size_ulong)) {
+ if (!is_power_of_2(chunk_size)) {
*error = "Chunk size is not a power of 2";
return -EINVAL;
}
/* Validate the chunk size against the device block size */
- if (chunk_size_ulong % (bdev_logical_block_size(store->cow->bdev) >> 9)) {
+ if (chunk_size % (bdev_logical_block_size(store->cow->bdev) >> 9)) {
*error = "Chunk size is not a multiple of device blocksize";
return -EINVAL;
}
- if (chunk_size_ulong > INT_MAX >> SECTOR_SHIFT) {
+ if (chunk_size > INT_MAX >> SECTOR_SHIFT) {
*error = "Chunk size is too high";
return -EINVAL;
}
- store->chunk_size = chunk_size_ulong;
- store->chunk_mask = chunk_size_ulong - 1;
- store->chunk_shift = ffs(chunk_size_ulong) - 1;
+ store->chunk_size = chunk_size;
+ store->chunk_mask = chunk_size - 1;
+ store->chunk_shift = ffs(chunk_size) - 1;
return 0;
}
@@ -251,7 +253,7 @@ int dm_exception_store_create(struct dm_target *ti, int argc, char **argv,
r = set_chunk_size(tmp_store, argv[2], &ti->error);
if (r)
- goto bad_cow;
+ goto bad_ctr;
r = type->ctr(tmp_store, 0, NULL);
if (r) {
diff --git a/drivers/md/dm-exception-store.h b/drivers/md/dm-exception-store.h
index 812c71872ba0..8a223a48802c 100644
--- a/drivers/md/dm-exception-store.h
+++ b/drivers/md/dm-exception-store.h
@@ -101,9 +101,9 @@ struct dm_exception_store {
struct dm_dev *cow;
/* Size of data blocks saved - must be a power of 2 */
- chunk_t chunk_size;
- chunk_t chunk_mask;
- chunk_t chunk_shift;
+ unsigned chunk_size;
+ unsigned chunk_mask;
+ unsigned chunk_shift;
void *context;
};
@@ -169,7 +169,7 @@ int dm_exception_store_type_register(struct dm_exception_store_type *type);
int dm_exception_store_type_unregister(struct dm_exception_store_type *type);
int dm_exception_store_set_chunk_size(struct dm_exception_store *store,
- unsigned long chunk_size_ulong,
+ unsigned chunk_size,
char **error);
int dm_exception_store_create(struct dm_target *ti, int argc, char **argv,
diff --git a/drivers/md/dm-log-userspace-base.c b/drivers/md/dm-log-userspace-base.c
index 6e186b1a062d..7ac2c1450d10 100644
--- a/drivers/md/dm-log-userspace-base.c
+++ b/drivers/md/dm-log-userspace-base.c
@@ -156,7 +156,7 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti,
}
/* The ptr value is sufficient for local unique id */
- lc->luid = (uint64_t)lc;
+ lc->luid = (unsigned long)lc;
lc->ti = ti;
@@ -582,7 +582,7 @@ static int userspace_status(struct dm_dirty_log *log, status_type_t status_type,
break;
case STATUSTYPE_TABLE:
sz = 0;
- table_args = strstr(lc->usr_argv_str, " ");
+ table_args = strchr(lc->usr_argv_str, ' ');
BUG_ON(!table_args); /* There will always be a ' ' */
table_args++;
diff --git a/drivers/md/dm-log-userspace-transfer.c b/drivers/md/dm-log-userspace-transfer.c
index ba0edad2d048..54abf9e303b7 100644
--- a/drivers/md/dm-log-userspace-transfer.c
+++ b/drivers/md/dm-log-userspace-transfer.c
@@ -129,11 +129,13 @@ static int fill_pkg(struct cn_msg *msg, struct dm_ulog_request *tfr)
* This is the connector callback that delivers data
* that was sent from userspace.
*/
-static void cn_ulog_callback(void *data)
+static void cn_ulog_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
{
- struct cn_msg *msg = (struct cn_msg *)data;
struct dm_ulog_request *tfr = (struct dm_ulog_request *)(msg + 1);
+ if (!cap_raised(nsp->eff_cap, CAP_SYS_ADMIN))
+ return;
+
spin_lock(&receiving_list_lock);
if (msg->len == 0)
fill_pkg(msg, NULL);
diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c
index d5b2e08750d5..0c746420c008 100644
--- a/drivers/md/dm-snap-persistent.c
+++ b/drivers/md/dm-snap-persistent.c
@@ -284,12 +284,13 @@ static int read_header(struct pstore *ps, int *new_snapshot)
{
int r;
struct disk_header *dh;
- chunk_t chunk_size;
+ unsigned chunk_size;
int chunk_size_supplied = 1;
char *chunk_err;
/*
- * Use default chunk size (or hardsect_size, if larger) if none supplied
+ * Use default chunk size (or logical_block_size, if larger)
+ * if none supplied
*/
if (!ps->store->chunk_size) {
ps->store->chunk_size = max(DM_CHUNK_SIZE_DEFAULT_SECTORS,
@@ -334,10 +335,9 @@ static int read_header(struct pstore *ps, int *new_snapshot)
return 0;
if (chunk_size_supplied)
- DMWARN("chunk size %llu in device metadata overrides "
- "table chunk size of %llu.",
- (unsigned long long)chunk_size,
- (unsigned long long)ps->store->chunk_size);
+ DMWARN("chunk size %u in device metadata overrides "
+ "table chunk size of %u.",
+ chunk_size, ps->store->chunk_size);
/* We had a bogus chunk_size. Fix stuff up. */
free_area(ps);
@@ -345,8 +345,8 @@ static int read_header(struct pstore *ps, int *new_snapshot)
r = dm_exception_store_set_chunk_size(ps->store, chunk_size,
&chunk_err);
if (r) {
- DMERR("invalid on-disk chunk size %llu: %s.",
- (unsigned long long)chunk_size, chunk_err);
+ DMERR("invalid on-disk chunk size %u: %s.",
+ chunk_size, chunk_err);
return r;
}
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
index 57f1bf7f3b7a..3a3ba46e6d4b 100644
--- a/drivers/md/dm-snap.c
+++ b/drivers/md/dm-snap.c
@@ -296,6 +296,7 @@ static void __insert_origin(struct origin *o)
*/
static int register_snapshot(struct dm_snapshot *snap)
{
+ struct dm_snapshot *l;
struct origin *o, *new_o;
struct block_device *bdev = snap->origin->bdev;
@@ -319,7 +320,11 @@ static int register_snapshot(struct dm_snapshot *snap)
__insert_origin(o);
}
- list_add_tail(&snap->list, &o->snapshots);
+ /* Sort the list according to chunk size, largest-first smallest-last */
+ list_for_each_entry(l, &o->snapshots, list)
+ if (l->store->chunk_size < snap->store->chunk_size)
+ break;
+ list_add_tail(&snap->list, &l->list);
up_write(&_origins_lock);
return 0;
@@ -668,6 +673,11 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
bio_list_init(&s->queued_bios);
INIT_WORK(&s->queued_bios_work, flush_queued_bios);
+ if (!s->store->chunk_size) {
+ ti->error = "Chunk size not set";
+ goto bad_load_and_register;
+ }
+
/* Add snapshot to the list of snapshots for this origin */
/* Exceptions aren't triggered till snapshot_resume() is called */
if (register_snapshot(s)) {
@@ -951,7 +961,7 @@ static void start_copy(struct dm_snap_pending_exception *pe)
src.bdev = bdev;
src.sector = chunk_to_sector(s->store, pe->e.old_chunk);
- src.count = min(s->store->chunk_size, dev_size - src.sector);
+ src.count = min((sector_t)s->store->chunk_size, dev_size - src.sector);
dest.bdev = s->store->cow->bdev;
dest.sector = chunk_to_sector(s->store, pe->e.new_chunk);
@@ -1142,6 +1152,8 @@ static int snapshot_status(struct dm_target *ti, status_type_t type,
unsigned sz = 0;
struct dm_snapshot *snap = ti->private;
+ down_write(&snap->lock);
+
switch (type) {
case STATUSTYPE_INFO:
if (!snap->valid)
@@ -1173,6 +1185,8 @@ static int snapshot_status(struct dm_target *ti, status_type_t type,
break;
}
+ up_write(&snap->lock);
+
return 0;
}
@@ -1388,7 +1402,7 @@ static void origin_resume(struct dm_target *ti)
struct dm_dev *dev = ti->private;
struct dm_snapshot *snap;
struct origin *o;
- chunk_t chunk_size = 0;
+ unsigned chunk_size = 0;
down_read(&_origins_lock);
o = __lookup_origin(dev->bdev);
@@ -1465,7 +1479,7 @@ static int __init dm_snapshot_init(void)
r = dm_register_target(&snapshot_target);
if (r) {
DMERR("snapshot target register failed %d", r);
- return r;
+ goto bad_register_snapshot_target;
}
r = dm_register_target(&origin_target);
@@ -1522,6 +1536,9 @@ bad2:
dm_unregister_target(&origin_target);
bad1:
dm_unregister_target(&snapshot_target);
+
+bad_register_snapshot_target:
+ dm_exception_store_exit();
return r;
}
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index b4845b14740d..ae087b0c49f9 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -47,6 +47,7 @@ struct dm_io {
atomic_t io_count;
struct bio *bio;
unsigned long start_time;
+ spinlock_t endio_lock;
};
/*
@@ -576,8 +577,12 @@ static void dec_pending(struct dm_io *io, int error)
struct mapped_device *md = io->md;
/* Push-back supersedes any I/O errors */
- if (error && !(io->error > 0 && __noflush_suspending(md)))
- io->error = error;
+ if (unlikely(error)) {
+ spin_lock_irqsave(&io->endio_lock, flags);
+ if (!(io->error > 0 && __noflush_suspending(md)))
+ io->error = error;
+ spin_unlock_irqrestore(&io->endio_lock, flags);
+ }
if (atomic_dec_and_test(&io->io_count)) {
if (io->error == DM_ENDIO_REQUEUE) {
@@ -1224,6 +1229,7 @@ static void __split_and_process_bio(struct mapped_device *md, struct bio *bio)
atomic_set(&ci.io->io_count, 1);
ci.io->bio = bio;
ci.io->md = md;
+ spin_lock_init(&ci.io->endio_lock);
ci.sector = bio->bi_sector;
ci.sector_count = bio_sectors(bio);
if (unlikely(bio_empty_barrier(bio)))
@@ -1819,6 +1825,7 @@ static struct mapped_device *alloc_dev(int minor)
bad_bdev:
destroy_workqueue(md->wq);
bad_thread:
+ del_gendisk(md->disk);
put_disk(md->disk);
bad_disk:
blk_cleanup_queue(md->queue);
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 9dd872000cec..2938e9ca711e 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -276,7 +276,9 @@ static void mddev_put(mddev_t *mddev)
if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock))
return;
if (!mddev->raid_disks && list_empty(&mddev->disks) &&
- !mddev->hold_active) {
+ mddev->ctime == 0 && !mddev->hold_active) {
+ /* Array is not configured at all, and not held active,
+ * so destroy it */
list_del(&mddev->all_mddevs);
if (mddev->gendisk) {
/* we did a probe so need to clean up.
@@ -361,6 +363,7 @@ static mddev_t * mddev_find(dev_t unit)
mutex_init(&new->open_mutex);
mutex_init(&new->reconfig_mutex);
+ mutex_init(&new->bitmap_mutex);
INIT_LIST_HEAD(&new->disks);
INIT_LIST_HEAD(&new->all_mddevs);
init_timer(&new->safemode_timer);
@@ -5039,6 +5042,10 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
mddev->minor_version = info->minor_version;
mddev->patch_version = info->patch_version;
mddev->persistent = !info->not_persistent;
+ /* ensure mddev_put doesn't delete this now that there
+ * is some minimal configuration.
+ */
+ mddev->ctime = get_seconds();
return 0;
}
mddev->major_version = MD_MAJOR_VERSION;
@@ -6495,8 +6502,9 @@ void md_do_sync(mddev_t *mddev)
skip:
mddev->curr_resync = 0;
mddev->curr_resync_completed = 0;
- mddev->resync_min = 0;
- mddev->resync_max = MaxSector;
+ if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery))
+ /* We completed so max setting can be forgotten. */
+ mddev->resync_max = MaxSector;
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
wake_up(&resync_wait);
set_bit(MD_RECOVERY_DONE, &mddev->recovery);
@@ -6594,7 +6602,7 @@ void md_check_recovery(mddev_t *mddev)
if (mddev->bitmap)
- bitmap_daemon_work(mddev->bitmap);
+ bitmap_daemon_work(mddev);
if (mddev->ro)
return;
diff --git a/drivers/md/md.h b/drivers/md/md.h
index f8fc188bc762..d7aad830018e 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -289,6 +289,7 @@ struct mddev_s
* hot-adding a bitmap. It should
* eventually be settable by sysfs.
*/
+ struct mutex bitmap_mutex;
struct list_head all_mddevs;
};
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 8726fd7ebce5..d3e492e8781c 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1643,11 +1643,12 @@ static void raid1d(mddev_t *mddev)
r1_bio->sector,
r1_bio->sectors);
unfreeze_array(conf);
- }
+ } else
+ md_error(mddev,
+ conf->mirrors[r1_bio->read_disk].rdev);
bio = r1_bio->bios[r1_bio->read_disk];
- if ((disk=read_balance(conf, r1_bio)) == -1 ||
- disk == r1_bio->read_disk) {
+ if ((disk=read_balance(conf, r1_bio)) == -1) {
printk(KERN_ALERT "raid1: %s: unrecoverable I/O"
" read error for block %llu\n",
bdevname(bio->bi_bdev,b),
@@ -1676,6 +1677,7 @@ static void raid1d(mddev_t *mddev)
generic_make_request(bio);
}
}
+ cond_resched();
}
if (unplug)
unplug_slaves(mddev);
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 3d9020cf6f6e..6a5a5fb18b30 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1630,6 +1630,7 @@ static void raid10d(mddev_t *mddev)
generic_make_request(bio);
}
}
+ cond_resched();
}
if (unplug)
unplug_slaves(mddev);
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index b8a2c5dc67ba..c339c8fdcbd5 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -3790,6 +3790,8 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
sector_nr = conf->reshape_progress;
sector_div(sector_nr, new_data_disks);
if (sector_nr) {
+ mddev->curr_resync_completed = sector_nr;
+ sysfs_notify(&mddev->kobj, NULL, "sync_completed");
*skipped = 1;
return sector_nr;
}
diff --git a/drivers/media/common/tuners/mxl5007t.c b/drivers/media/common/tuners/mxl5007t.c
index 2d02698d4f4f..7eb1bf75cd07 100644
--- a/drivers/media/common/tuners/mxl5007t.c
+++ b/drivers/media/common/tuners/mxl5007t.c
@@ -196,7 +196,7 @@ static void copy_reg_bits(struct reg_pair_t *reg_pair1,
i = j = 0;
while (reg_pair1[i].reg || reg_pair1[i].val) {
- while (reg_pair2[j].reg || reg_pair2[j].reg) {
+ while (reg_pair2[j].reg || reg_pair2[j].val) {
if (reg_pair1[i].reg != reg_pair2[j].reg) {
j++;
continue;
diff --git a/drivers/media/common/tuners/tda18271-fe.c b/drivers/media/common/tuners/tda18271-fe.c
index b10935630154..f446f9a18ef1 100644
--- a/drivers/media/common/tuners/tda18271-fe.c
+++ b/drivers/media/common/tuners/tda18271-fe.c
@@ -595,13 +595,13 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
case RF2:
map[i].rf_a1 = (prog_cal[RF2] - prog_tab[RF2] -
prog_cal[RF1] + prog_tab[RF1]) /
- ((rf_freq[RF2] - rf_freq[RF1]) / 1000);
+ (s32)((rf_freq[RF2] - rf_freq[RF1]) / 1000);
map[i].rf2 = rf_freq[RF2] / 1000;
break;
case RF3:
map[i].rf_a2 = (prog_cal[RF3] - prog_tab[RF3] -
prog_cal[RF2] + prog_tab[RF2]) /
- ((rf_freq[RF3] - rf_freq[RF2]) / 1000);
+ (s32)((rf_freq[RF3] - rf_freq[RF2]) / 1000);
map[i].rf_b2 = prog_cal[RF2] - prog_tab[RF2];
map[i].rf3 = rf_freq[RF3] / 1000;
break;
@@ -963,12 +963,12 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe,
struct tda18271_std_map_item *map;
char *mode;
int ret;
- u32 freq = params->frequency * 62500;
+ u32 freq = params->frequency * 125 *
+ ((params->mode == V4L2_TUNER_RADIO) ? 1 : 1000) / 2;
priv->mode = TDA18271_ANALOG;
if (params->mode == V4L2_TUNER_RADIO) {
- freq = freq / 1000;
map = &std_map->fm_radio;
mode = "fm";
} else if (params->std & V4L2_STD_MN) {
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c
index 26690dfb3260..4d0c8d56047c 100644
--- a/drivers/media/dvb/dvb-usb/af9015.c
+++ b/drivers/media/dvb/dvb-usb/af9015.c
@@ -1266,6 +1266,7 @@ static struct usb_device_id af9015_usb_table[] = {
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)},
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)},
{USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)},
+/* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)},
{0},
};
MODULE_DEVICE_TABLE(usb, af9015_usb_table);
@@ -1346,7 +1347,8 @@ static struct dvb_usb_device_properties af9015_properties[] = {
{
.name = "KWorld PlusTV Dual DVB-T Stick " \
"(DVB-T 399U)",
- .cold_ids = {&af9015_usb_table[4], NULL},
+ .cold_ids = {&af9015_usb_table[4],
+ &af9015_usb_table[25], NULL},
.warm_ids = {NULL},
},
{
diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c
index 406d7fba369d..f32b332ba76d 100644
--- a/drivers/media/dvb/dvb-usb/cxusb.c
+++ b/drivers/media/dvb/dvb-usb/cxusb.c
@@ -663,6 +663,14 @@ static struct zl10353_config cxusb_zl10353_xc3028_config = {
.parallel_ts = 1,
};
+static struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = {
+ .demod_address = 0x0f,
+ .if2 = 45600,
+ .no_tuner = 1,
+ .parallel_ts = 1,
+ .disable_i2c_gate_ctrl = 1,
+};
+
static struct mt352_config cxusb_mt352_xc3028_config = {
.demod_address = 0x0f,
.if2 = 4560,
@@ -894,7 +902,7 @@ static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
if ((adap->fe = dvb_attach(zl10353_attach,
- &cxusb_zl10353_xc3028_config,
+ &cxusb_zl10353_xc3028_config_no_i2c_gate,
&adap->dev->i2c_adap)) == NULL)
return -EIO;
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 9593b7289994..5ace1312c34c 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -103,6 +103,7 @@
#define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1
#define USB_PID_INTEL_CE9500 0x9500
#define USB_PID_KWORLD_399U 0xe399
+#define USB_PID_KWORLD_399U_2 0xe400
#define USB_PID_KWORLD_395U 0xe396
#define USB_PID_KWORLD_395U_2 0xe39b
#define USB_PID_KWORLD_395U_3 0xe395
diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c
index 8217e5b38f47..ac10fff61f3c 100644
--- a/drivers/media/dvb/frontends/dib7000p.c
+++ b/drivers/media/dvb/frontends/dib7000p.c
@@ -1344,6 +1344,11 @@ struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr,
if (dib7000p_identify(st) != 0)
goto error;
+ /* FIXME: make sure the dev.parent field is initialized, or else
+ request_firmware() will hit an OOPS (this should be moved somewhere
+ more common) */
+ st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent;
+
dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr);
dib7000p_demod_reset(st);
diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c
index cb8a358b7310..8f88a586b0dd 100644
--- a/drivers/media/dvb/siano/smsusb.c
+++ b/drivers/media/dvb/siano/smsusb.c
@@ -529,6 +529,12 @@ struct usb_device_id smsusb_id_table[] = {
.driver_info = SMS1XXX_BOARD_SIANO_NICE },
{ USB_DEVICE(0x187f, 0x0301),
.driver_info = SMS1XXX_BOARD_SIANO_VENICE },
+ { USB_DEVICE(0x2040, 0xb900),
+ .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+ { USB_DEVICE(0x2040, 0xb910),
+ .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+ { USB_DEVICE(0x2040, 0xc000),
+ .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
{ } /* Terminating entry */
};
diff --git a/drivers/media/radio/radio-gemtek-pci.c b/drivers/media/radio/radio-gemtek-pci.c
index c3f579de6e71..c6cf11661868 100644
--- a/drivers/media/radio/radio-gemtek-pci.c
+++ b/drivers/media/radio/radio-gemtek-pci.c
@@ -181,12 +181,10 @@ static void gemtek_pci_mute(struct gemtek_pci *card)
static void gemtek_pci_unmute(struct gemtek_pci *card)
{
- mutex_lock(&card->lock);
if (card->mute) {
gemtek_pci_setfrequency(card, card->current_frequency);
card->mute = false;
}
- mutex_unlock(&card->lock);
}
static int gemtek_pci_getsignal(struct gemtek_pci *card)
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
index e7185d1cf281..c64c8d201262 100644
--- a/drivers/media/video/Kconfig
+++ b/drivers/media/video/Kconfig
@@ -592,17 +592,6 @@ config VIDEO_MXS_PXP
To compile this driver as a module, choose M here: the
module will be called pxp.
-config VIDEO_MXC_PXP_V4L2
- tristate "MXC PxP V4L2 driver"
- depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MX5
- select VIDEOBUF_DMA_CONTIG
- ---help---
- This is a video4linux driver for the Freescale PxP
- (Pixel Pipeline). This module supports output overlay of
- the MXC framebuffer on a video stream.
-
- To compile this driver as a module, choose M here.
-
config VIDEO_MXC_OPL
tristate
depends on VIDEO_DEV && ARCH_MXC
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile
index a4de2a151253..49cb18802024 100644
--- a/drivers/media/video/Makefile
+++ b/drivers/media/video/Makefile
@@ -94,7 +94,6 @@ obj-$(CONFIG_VIDEO_MXC_CSI_CAMERA) += mxc/capture/
obj-$(CONFIG_VIDEO_MXC_IPU_OUTPUT) += mxc/output/
obj-$(CONFIG_VIDEO_MXC_IPUV1_WVGA_OUTPUT) += mxc/output/
obj-$(CONFIG_VIDEO_MXC_EMMA_OUTPUT) += mxc/output/
-obj-$(CONFIG_VIDEO_MXC_PXP_V4L2) += mxc/output/
obj-$(CONFIG_VIDEO_MXC_OPL) += mxc/opl/
obj-$(CONFIG_VIDEO_PXP) += pxp.o
obj-$(CONFIG_VIDEO_MXS_PXP) += mxs_pxp.o
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c
index 8cc6dd28d6a7..b8e276c88353 100644
--- a/drivers/media/video/bt8xx/bttv-driver.c
+++ b/drivers/media/video/bt8xx/bttv-driver.c
@@ -1299,7 +1299,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm)
tvnorm = &bttv_tvnorms[norm];
- if (!memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
+ if (memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
sizeof (tvnorm->cropcap))) {
bttv_crop_reset(&btv->crop[0], norm);
btv->crop[1] = btv->crop[0]; /* current = default */
@@ -3798,11 +3798,34 @@ bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
(item->vb.queue.next != &btv->capture)) {
item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
+ /* Mike Isely <isely@pobox.com> - Only check
+ * and set up the bottom field in the logic
+ * below. Don't ever do the top field. This
+ * of course means that if we set up the
+ * bottom field in the above code that we'll
+ * actually skip a field. But that's OK.
+ * Having processed only a single buffer this
+ * time, then the next time around the first
+ * available buffer should be for a top field.
+ * That will then cause us here to set up a
+ * top then a bottom field in the normal way.
+ * The alternative to this understanding is
+ * that we set up the second available buffer
+ * as a top field, but that's out of order
+ * since this driver always processes the top
+ * field first - the effect will be the two
+ * buffers being returned in the wrong order,
+ * with the second buffer also being delayed
+ * by one field time (owing to the fifo nature
+ * of videobuf). Worse still, we'll be stuck
+ * doing fields out of order now every time
+ * until something else causes a field to be
+ * dropped. By effectively forcing a field to
+ * drop this way then we always get back into
+ * sync within a single frame time. (Out of
+ * order fields can screw up deinterlacing
+ * algorithms.) */
if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
- if (NULL == set->top &&
- V4L2_FIELD_TOP == item->vb.field) {
- set->top = item;
- }
if (NULL == set->bottom &&
V4L2_FIELD_BOTTOM == item->vb.field) {
set->bottom = item;
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c
index 7bd8a70f0a0b..ac947aecb9c3 100644
--- a/drivers/media/video/em28xx/em28xx-audio.c
+++ b/drivers/media/video/em28xx/em28xx-audio.c
@@ -383,6 +383,11 @@ static int snd_em28xx_hw_capture_free(struct snd_pcm_substream *substream)
static int snd_em28xx_prepare(struct snd_pcm_substream *substream)
{
+ struct em28xx *dev = snd_pcm_substream_chip(substream);
+
+ dev->adev.hwptr_done_capture = 0;
+ dev->adev.capture_transfer_done = 0;
+
return 0;
}
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c
index 1c2e544eda73..ffe9306f5bb9 100644
--- a/drivers/media/video/em28xx/em28xx-cards.c
+++ b/drivers/media/video/em28xx/em28xx-cards.c
@@ -2170,8 +2170,6 @@ static int em28xx_hint_board(struct em28xx *dev)
/* ----------------------------------------------------------------------- */
void em28xx_register_i2c_ir(struct em28xx *dev)
{
- struct i2c_board_info info;
- struct IR_i2c_init_data init_data;
const unsigned short addr_list[] = {
0x30, 0x47, I2C_CLIENT_END
};
@@ -2179,9 +2177,9 @@ void em28xx_register_i2c_ir(struct em28xx *dev)
if (disable_ir)
return;
- memset(&info, 0, sizeof(struct i2c_board_info));
- memset(&init_data, 0, sizeof(struct IR_i2c_init_data));
- strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
+ memset(&dev->info, 0, sizeof(&dev->info));
+ memset(&dev->init_data, 0, sizeof(dev->init_data));
+ strlcpy(dev->info.type, "ir_video", I2C_NAME_SIZE);
/* detect & configure */
switch (dev->model) {
@@ -2191,19 +2189,19 @@ void em28xx_register_i2c_ir(struct em28xx *dev)
break;
case (EM2800_BOARD_TERRATEC_CINERGY_200):
case (EM2820_BOARD_TERRATEC_CINERGY_250):
- init_data.ir_codes = ir_codes_em_terratec;
- init_data.get_key = em28xx_get_key_terratec;
- init_data.name = "i2c IR (EM28XX Terratec)";
+ dev->init_data.ir_codes = ir_codes_em_terratec;
+ dev->init_data.get_key = em28xx_get_key_terratec;
+ dev->init_data.name = "i2c IR (EM28XX Terratec)";
break;
case (EM2820_BOARD_PINNACLE_USB_2):
- init_data.ir_codes = ir_codes_pinnacle_grey;
- init_data.get_key = em28xx_get_key_pinnacle_usb_grey;
- init_data.name = "i2c IR (EM28XX Pinnacle PCTV)";
+ dev->init_data.ir_codes = ir_codes_pinnacle_grey;
+ dev->init_data.get_key = em28xx_get_key_pinnacle_usb_grey;
+ dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)";
break;
case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
- init_data.ir_codes = ir_codes_hauppauge_new;
- init_data.get_key = em28xx_get_key_em_haup;
- init_data.name = "i2c IR (EM2840 Hauppauge)";
+ dev->init_data.ir_codes = ir_codes_hauppauge_new;
+ dev->init_data.get_key = em28xx_get_key_em_haup;
+ dev->init_data.name = "i2c IR (EM2840 Hauppauge)";
break;
case (EM2820_BOARD_MSI_VOX_USB_2):
break;
@@ -2215,9 +2213,9 @@ void em28xx_register_i2c_ir(struct em28xx *dev)
break;
}
- if (init_data.name)
- info.platform_data = &init_data;
- i2c_new_probed_device(&dev->i2c_adap, &info, addr_list);
+ if (dev->init_data.name)
+ dev->info.platform_data = &dev->init_data;
+ i2c_new_probed_device(&dev->i2c_adap, &dev->info, addr_list);
}
void em28xx_card_setup(struct em28xx *dev)
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c
index d603575431b4..ec1d212f7e3a 100644
--- a/drivers/media/video/em28xx/em28xx-dvb.c
+++ b/drivers/media/video/em28xx/em28xx-dvb.c
@@ -591,6 +591,7 @@ static int dvb_fini(struct em28xx *dev)
if (dev->dvb) {
unregister_dvb(dev->dvb);
+ kfree(dev->dvb);
dev->dvb = NULL;
}
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h
index a2add61f7d59..cb2a70a59a0f 100644
--- a/drivers/media/video/em28xx/em28xx.h
+++ b/drivers/media/video/em28xx/em28xx.h
@@ -595,6 +595,10 @@ struct em28xx {
struct delayed_work sbutton_query_work;
struct em28xx_dvb *dvb;
+
+ /* I2C keyboard data */
+ struct i2c_board_info info;
+ struct IR_i2c_init_data init_data;
};
struct em28xx_ops {
diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
index 0163903d1c0f..3b159e4e69b1 100644
--- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
+++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
@@ -35,12 +35,25 @@ static
const
struct dmi_system_id s5k4aa_vflip_dmi_table[] = {
{
+ .ident = "BRUNEINIT",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "BRUNENIT"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "BRUNENIT"),
+ DMI_MATCH(DMI_BOARD_VERSION, "00030D0000000001")
+ }
+ }, {
.ident = "Fujitsu-Siemens Amilo Xa 2528",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xa 2528")
}
}, {
+ .ident = "Fujitsu-Siemens Amilo Xi 2528",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 2528")
+ }
+ }, {
.ident = "Fujitsu-Siemens Amilo Xi 2550",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
@@ -51,6 +64,13 @@ static
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"),
DMI_MATCH(DMI_PRODUCT_NAME, "GX700"),
+ DMI_MATCH(DMI_BIOS_DATE, "12/02/2008")
+ }
+ }, {
+ .ident = "MSI GX700",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "GX700"),
DMI_MATCH(DMI_BIOS_DATE, "07/26/2007")
}
}, {
diff --git a/drivers/media/video/gspca/ov519.c b/drivers/media/video/gspca/ov519.c
index 2f6e135d94bc..557886522211 100644
--- a/drivers/media/video/gspca/ov519.c
+++ b/drivers/media/video/gspca/ov519.c
@@ -3364,6 +3364,7 @@ static const __devinitdata struct usb_device_id device_table[] = {
{USB_DEVICE(0x041e, 0x4061), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x041e, 0x4064),
.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
+ {USB_DEVICE(0x041e, 0x4067), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x041e, 0x4068),
.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
{USB_DEVICE(0x045e, 0x028c), .driver_info = BRIDGE_OV519 },
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c
index d6332ab80669..33f4d0a1f6fd 100644
--- a/drivers/media/video/gspca/sonixj.c
+++ b/drivers/media/video/gspca/sonixj.c
@@ -727,7 +727,7 @@ static const u8 ov7660_sensor_init[][8] = {
{0xa1, 0x21, 0x12, 0x05, 0x00, 0x00, 0x00, 0x10},
/* Outformat = rawRGB */
{0xa1, 0x21, 0x13, 0xb8, 0x00, 0x00, 0x00, 0x10}, /* init COM8 */
- {0xd1, 0x21, 0x00, 0x01, 0x74, 0x74, 0x00, 0x10},
+ {0xd1, 0x21, 0x00, 0x01, 0x74, 0x92, 0x00, 0x10},
/* GAIN BLUE RED VREF */
{0xd1, 0x21, 0x04, 0x00, 0x7d, 0x62, 0x00, 0x10},
/* COM 1 BAVE GEAVE AECHH */
@@ -783,7 +783,7 @@ static const u8 ov7660_sensor_init[][8] = {
{0xc1, 0x21, 0x88, 0xaf, 0xc7, 0xdf, 0x00, 0x10}, /* gamma curve */
{0xc1, 0x21, 0x8b, 0x99, 0x99, 0xcf, 0x00, 0x10}, /* reserved */
{0xb1, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x10}, /* DM_LNL/H */
- {0xb1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10},
+ {0xa1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10},
/****** (some exchanges in the win trace) ******/
{0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, /* MVFP */
/* bits[3..0]reserved */
@@ -1145,17 +1145,12 @@ static int configure_gpio(struct gspca_dev *gspca_dev,
reg_w1(gspca_dev, 0x01, 0x42);
break;
case SENSOR_OV7660:
- reg_w1(gspca_dev, 0x01, 0x61);
- reg_w1(gspca_dev, 0x17, 0x20);
- reg_w1(gspca_dev, 0x01, 0x60);
- reg_w1(gspca_dev, 0x01, 0x40);
- break;
case SENSOR_SP80708:
reg_w1(gspca_dev, 0x01, 0x63);
reg_w1(gspca_dev, 0x17, 0x20);
reg_w1(gspca_dev, 0x01, 0x62);
reg_w1(gspca_dev, 0x01, 0x42);
- mdelay(100);
+ msleep(100);
reg_w1(gspca_dev, 0x02, 0x62);
break;
/* case SENSOR_HV7131R: */
@@ -1624,6 +1619,8 @@ static void setvflip(struct sd *sd)
static void setinfrared(struct sd *sd)
{
+ if (sd->gspca_dev.ctrl_dis & (1 << INFRARED_IDX))
+ return;
/*fixme: different sequence for StarCam Clip and StarCam 370i */
/* Clip */
i2c_w1(&sd->gspca_dev, 0x02, /* gpio */
@@ -1637,16 +1634,19 @@ static void setfreq(struct gspca_dev *gspca_dev)
if (gspca_dev->ctrl_dis & (1 << FREQ_IDX))
return;
if (sd->sensor == SENSOR_OV7660) {
+ u8 com8;
+
+ com8 = 0xdf; /* auto gain/wb/expo */
switch (sd->freq) {
case 0: /* Banding filter disabled */
- i2c_w1(gspca_dev, 0x13, 0xdf);
+ i2c_w1(gspca_dev, 0x13, com8 | 0x20);
break;
case 1: /* 50 hz */
- i2c_w1(gspca_dev, 0x13, 0xff);
+ i2c_w1(gspca_dev, 0x13, com8);
i2c_w1(gspca_dev, 0x3b, 0x0a);
break;
case 2: /* 60 hz */
- i2c_w1(gspca_dev, 0x13, 0xff);
+ i2c_w1(gspca_dev, 0x13, com8);
i2c_w1(gspca_dev, 0x3b, 0x02);
break;
}
@@ -1796,12 +1796,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
reg_w1(gspca_dev, 0x99, 0x60);
break;
case SENSOR_OV7660:
- reg_w1(gspca_dev, 0x9a, 0x05);
- if (sd->bridge == BRIDGE_SN9C105)
- reg_w1(gspca_dev, 0x99, 0xff);
- else
- reg_w1(gspca_dev, 0x99, 0x5b);
- break;
case SENSOR_SP80708:
reg_w1(gspca_dev, 0x9a, 0x05);
reg_w1(gspca_dev, 0x99, 0x59);
@@ -2325,18 +2319,19 @@ static const __devinitdata struct usb_device_id device_table[] = {
{USB_DEVICE(0x0c45, 0x607c), BSI(SN9C102P, HV7131R, 0x11)},
/* {USB_DEVICE(0x0c45, 0x607e), BSI(SN9C102P, OV7630, 0x??)}, */
{USB_DEVICE(0x0c45, 0x60c0), BSI(SN9C105, MI0360, 0x5d)},
-/* {USB_DEVICE(0x0c45, 0x60c8), BSI(SN9C105, OM6801, 0x??)}, */
+/* {USB_DEVICE(0x0c45, 0x60c8), BSI(SN9C105, OM6802, 0x??)}, */
/* {USB_DEVICE(0x0c45, 0x60cc), BSI(SN9C105, HV7131GP, 0x??)}, */
{USB_DEVICE(0x0c45, 0x60ec), BSI(SN9C105, MO4000, 0x21)},
/* {USB_DEVICE(0x0c45, 0x60ef), BSI(SN9C105, ICM105C, 0x??)}, */
/* {USB_DEVICE(0x0c45, 0x60fa), BSI(SN9C105, OV7648, 0x??)}, */
{USB_DEVICE(0x0c45, 0x60fb), BSI(SN9C105, OV7660, 0x21)},
- {USB_DEVICE(0x0c45, 0x60fc), BSI(SN9C105, HV7131R, 0x11)},
#if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
+ {USB_DEVICE(0x0c45, 0x60fc), BSI(SN9C105, HV7131R, 0x11)},
{USB_DEVICE(0x0c45, 0x60fe), BSI(SN9C105, OV7630, 0x21)},
#endif
{USB_DEVICE(0x0c45, 0x6100), BSI(SN9C120, MI0360, 0x5d)}, /*sn9c128*/
-/* {USB_DEVICE(0x0c45, 0x6108), BSI(SN9C120, OM6801, 0x??)}, */
+/* {USB_DEVICE(0x0c45, 0x6102), BSI(SN9C120, PO2030N, ??)}, */
+/* {USB_DEVICE(0x0c45, 0x6108), BSI(SN9C120, OM6802, 0x21)}, */
{USB_DEVICE(0x0c45, 0x610a), BSI(SN9C120, OV7648, 0x21)}, /*sn9c128*/
{USB_DEVICE(0x0c45, 0x610b), BSI(SN9C120, OV7660, 0x21)}, /*sn9c128*/
{USB_DEVICE(0x0c45, 0x610c), BSI(SN9C120, HV7131R, 0x11)}, /*sn9c128*/
@@ -2352,6 +2347,7 @@ static const __devinitdata struct usb_device_id device_table[] = {
#if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
{USB_DEVICE(0x0c45, 0x6130), BSI(SN9C120, MI0360, 0x5d)},
#endif
+/* {USB_DEVICE(0x0c45, 0x6132), BSI(SN9C120, OV7670, 0x21)}, */
{USB_DEVICE(0x0c45, 0x6138), BSI(SN9C120, MO4000, 0x21)},
{USB_DEVICE(0x0c45, 0x613a), BSI(SN9C120, OV7648, 0x21)},
#if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
@@ -2359,7 +2355,9 @@ static const __devinitdata struct usb_device_id device_table[] = {
#endif
{USB_DEVICE(0x0c45, 0x613c), BSI(SN9C120, HV7131R, 0x11)},
{USB_DEVICE(0x0c45, 0x613e), BSI(SN9C120, OV7630, 0x21)},
- {USB_DEVICE(0x0c45, 0x6143), BSI(SN9C120, SP80708, 0x18)},
+/* {USB_DEVICE(0x0c45, 0x6142), BSI(SN9C120, PO2030N, ??)}, *sn9c120b*/
+ {USB_DEVICE(0x0c45, 0x6143), BSI(SN9C120, SP80708, 0x18)}, /*sn9c120b*/
+ {USB_DEVICE(0x0c45, 0x6148), BSI(SN9C120, OM6802, 0x21)}, /*sn9c120b*/
{}
};
MODULE_DEVICE_TABLE(usb, device_table);
diff --git a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
index be9a988aff2f..0ab131d605a4 100644
--- a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
+++ b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
@@ -2244,7 +2244,7 @@ static int mxc_mmap(struct file *file, struct vm_area_struct *vma)
return -EINTR;
size = vma->vm_end - vma->vm_start;
- vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
if (remap_pfn_range(vma, vma->vm_start,
vma->vm_pgoff, size, vma->vm_page_prot)) {
diff --git a/drivers/media/video/mxc/capture/ov3640.c b/drivers/media/video/mxc/capture/ov3640.c
index 899945b7d071..0169e0553ada 100644
--- a/drivers/media/video/mxc/capture/ov3640.c
+++ b/drivers/media/video/mxc/capture/ov3640.c
@@ -26,7 +26,7 @@
#define OV3640_VOLTAGE_ANALOG 2800000
#define OV3640_VOLTAGE_DIGITAL_CORE 1500000
#define OV3640_VOLTAGE_DIGITAL_IO 1800000
-#define OV3640_VOLTAGE_DIGITAL_GPO 2800000
+
/* Check these values! */
#define MIN_FPS 15
@@ -1317,15 +1317,12 @@ static int ov3640_probe(struct i2c_client *client,
gpo_regulator = regulator_get(&client->dev,
plat_data->gpo_regulator);
if (!IS_ERR(gpo_regulator)) {
- regulator_set_voltage(gpo_regulator,
- OV3640_VOLTAGE_DIGITAL_GPO,
- OV3640_VOLTAGE_DIGITAL_GPO);
if (regulator_enable(gpo_regulator) != 0) {
- pr_err("%s:gpo enable error\n", __func__);
+ pr_err("%s:gpo3 enable error\n", __func__);
goto err4;
} else {
dev_dbg(&client->dev,
- "%s:gpo enable ok\n", __func__);
+ "%s:gpo3 enable ok\n", __func__);
}
} else
gpo_regulator = NULL;
diff --git a/drivers/media/video/mxc/output/Makefile b/drivers/media/video/mxc/output/Makefile
index 500442544902..1713fa3bf3ab 100644
--- a/drivers/media/video/mxc/output/Makefile
+++ b/drivers/media/video/mxc/output/Makefile
@@ -6,9 +6,6 @@ endif
ifeq ($(CONFIG_VIDEO_MXC_IPU_OUTPUT),y)
obj-$(CONFIG_VIDEO_MXC_OUTPUT) += mxc_v4l2_output.o
endif
-ifeq ($(CONFIG_VIDEO_MXC_PXP_V4L2),y)
- obj-$(CONFIG_VIDEO_MXC_PXP_V4L2) += mxc_pxp_v4l2.o
-endif
ifeq ($(CONFIG_VIDEO_MXC_IPUV1_WVGA_OUTPUT),y)
obj-$(CONFIG_VIDEO_MXC_OUTPUT) += mx31_v4l2_wvga_output.o
endif
diff --git a/drivers/media/video/mxc/output/mxc_v4l2_output.c b/drivers/media/video/mxc/output/mxc_v4l2_output.c
index b7bbfed73019..0567298dcb7e 100644
--- a/drivers/media/video/mxc/output/mxc_v4l2_output.c
+++ b/drivers/media/video/mxc/output/mxc_v4l2_output.c
@@ -245,7 +245,6 @@ static int select_display_buffer(vout_data *vout, int next_buf)
{
int ret = 0;
- vout->disp_buf_num = next_buf;
if (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER)
!= next_buf)
ret = ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER,
@@ -290,9 +289,10 @@ static int finish_previous_frame(vout_data *vout)
mm_segment_t old_fs;
int ret = 0;
- /* make sure buf[vout->disp_buf_num] in showing */
+ /* make sure buf[next_done_ipu_buf] showed */
while (ipu_check_buffer_busy(vout->display_ch,
- IPU_INPUT_BUFFER, vout->disp_buf_num)) {
+ IPU_INPUT_BUFFER, vout->next_done_ipu_buf)) {
+ /* wait for display frame finish */
if (fbi->fbops->fb_ioctl) {
old_fs = get_fs();
set_fs(KERNEL_DS);
@@ -303,7 +303,7 @@ static int finish_previous_frame(vout_data *vout)
if (ret < 0) {
/* ic_bypass need clear display buffer ready for next update*/
ipu_clear_buffer_ready(vout->display_ch, IPU_INPUT_BUFFER,
- vout->disp_buf_num);
+ vout->next_done_ipu_buf);
}
}
}
@@ -318,9 +318,9 @@ static int show_current_frame(vout_data *vout)
mm_segment_t old_fs;
int ret = 0;
- /* make sure buf[vout->disp_buf_num] begin to show */
+ /* make sure buf[next_rdy_ipu_buf] begin to show */
if (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER)
- != vout->disp_buf_num) {
+ != vout->next_rdy_ipu_buf) {
/* wait for display frame finish */
if (fbi->fbops->fb_ioctl) {
old_fs = get_fs();
@@ -334,10 +334,10 @@ static int show_current_frame(vout_data *vout)
return ret;
}
-static void icbypass_work_func(struct work_struct *work)
+static void timer_work_func(struct work_struct *work)
{
vout_data *vout =
- container_of(work, vout_data, icbypass_work);
+ container_of(work, vout_data, timer_work);
int index, ret;
int last_buf;
unsigned long lock_flags = 0;
@@ -346,30 +346,34 @@ static void icbypass_work_func(struct work_struct *work)
spin_lock_irqsave(&g_lock, lock_flags);
- index = dequeue_buf(&vout->ready_q);
- if (index == -1) { /* no buffers ready, should never occur */
- dev_err(&vout->video_dev->dev,
- "mxc_v4l2out: timer - no queued buffers ready\n");
- goto exit;
- }
- g_buf_dq_cnt++;
- vout->frame_count++;
+ if (g_buf_output_cnt == 0) {
+ ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, 1);
+ } else {
+ index = dequeue_buf(&vout->ready_q);
+ if (index == -1) { /* no buffers ready, should never occur */
+ dev_err(&vout->video_dev->dev,
+ "mxc_v4l2out: timer - no queued buffers ready\n");
+ goto exit;
+ }
+ g_buf_dq_cnt++;
+ vout->frame_count++;
- vout->ipu_buf[vout->next_rdy_ipu_buf] = index;
- ret = ipu_update_channel_buffer(vout->display_ch, IPU_INPUT_BUFFER,
- vout->next_rdy_ipu_buf,
- vout->v4l2_bufs[index].m.offset);
- ret += select_display_buffer(vout, vout->next_rdy_ipu_buf);
- if (ret < 0) {
- dev_err(&vout->video_dev->dev,
- "unable to update buffer %d address rc=%d\n",
- vout->next_rdy_ipu_buf, ret);
- goto exit;
+ vout->ipu_buf[vout->next_rdy_ipu_buf] = index;
+ ret = ipu_update_channel_buffer(vout->display_ch, IPU_INPUT_BUFFER,
+ vout->next_rdy_ipu_buf,
+ vout->v4l2_bufs[index].m.offset);
+ ret += select_display_buffer(vout, vout->next_rdy_ipu_buf);
+ if (ret < 0) {
+ dev_err(&vout->video_dev->dev,
+ "unable to update buffer %d address rc=%d\n",
+ vout->next_rdy_ipu_buf, ret);
+ goto exit;
+ }
+ spin_unlock_irqrestore(&g_lock, lock_flags);
+ show_current_frame(vout);
+ spin_lock_irqsave(&g_lock, lock_flags);
+ vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf;
}
- spin_unlock_irqrestore(&g_lock, lock_flags);
- show_current_frame(vout);
- spin_lock_irqsave(&g_lock, lock_flags);
- vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf;
last_buf = vout->ipu_buf[vout->next_done_ipu_buf];
if (last_buf != -1) {
@@ -399,24 +403,6 @@ exit:
spin_unlock_irqrestore(&g_lock, lock_flags);
}
-static int get_cur_fb_blank(vout_data *vout)
-{
- struct fb_info *fbi =
- registered_fb[vout->output_fb_num[vout->cur_disp_output]];
- mm_segment_t old_fs;
- int ret = 0;
-
- if (fbi->fbops->fb_ioctl) {
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- ret = fbi->fbops->fb_ioctl(fbi, MXCFB_GET_FB_BLANK,
- (unsigned int)(&vout->fb_blank));
- set_fs(old_fs);
- }
-
- return ret;
-}
-
static void mxc_v4l2out_timer_handler(unsigned long arg)
{
int index, ret;
@@ -450,22 +436,12 @@ static void mxc_v4l2out_timer_handler(unsigned long arg)
/* Handle ic bypass mode in work queue */
if (vout->ic_bypass) {
- if (queue_work(vout->v4l_wq, &vout->icbypass_work) == 0) {
- dev_err(&vout->video_dev->dev,
- "ic bypass work was in queue already!\n ");
+ if (queue_work(vout->v4l_wq, &vout->timer_work) == 0) {
+ dev_err(&vout->video_dev->dev, "work was in queue already!\n ");
vout->state = STATE_STREAM_PAUSED;
}
goto exit0;
- } else if (!vout->fb_blank &&
- (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER)
- == vout->next_disp_ipu_buf)) {
- dev_dbg(&vout->video_dev->dev, "IPU disp busy\n");
- get_cur_fb_blank(vout);
- index = peek_next_buf(&vout->ready_q);
- setup_next_buf_timer(vout, index);
- goto exit0;
}
- vout->fb_blank = 0;
/* Dequeue buffer and pass to IPU */
index = dequeue_buf(&vout->ready_q);
@@ -547,13 +523,10 @@ static void mxc_v4l2out_timer_handler(unsigned long arg)
goto exit0;
}
- /* Split mode use buf 0 only, no need swith buf */
+ /* Non IC split action */
if (!vout->pp_split)
vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf;
- /* Always assume display in double buffers */
- vout->next_disp_ipu_buf = !vout->next_disp_ipu_buf;
-
/* Setup timer for next buffer */
index = peek_next_buf(&vout->ready_q);
if (index != -1)
@@ -655,6 +628,13 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id)
if (ret < 0)
dev_err(&vout->video_dev->dev,
"unable to set IPU buffer ready\n");
+ vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf;
+
+ } else {/* last stripe is done, run display refresh */
+ select_display_buffer(vout, disp_buf_num);
+ vout->ipu_buf[vout->next_done_ipu_buf] = -1;
+ vout->next_done_ipu_buf = !vout->next_done_ipu_buf;
+ vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf;
}
/* offset for next buffer's EBA */
@@ -696,8 +676,11 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id)
/* next stripe_buffer index 0..7 */
vout->pp_split_buf_num = (vout->pp_split_buf_num + vout->pp_split) & 0x7;
+
+
} else {
- disp_buf_num = vout->next_done_ipu_buf;
+ /* show to display */
+ select_display_buffer(vout, vout->next_done_ipu_buf);
ret += ipu_select_buffer(vout->display_input_ch, IPU_OUTPUT_BUFFER,
vout->next_done_ipu_buf);
}
@@ -705,7 +688,6 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id)
/* release buffer. For split mode: if second stripe is done */
release_buffer = vout->pp_split ? (!(vout->pp_split_buf_num & 0x3)) : 1;
if (release_buffer) {
- select_display_buffer(vout, disp_buf_num);
g_buf_output_cnt++;
vout->v4l2_bufs[last_buf].flags = V4L2_BUF_FLAG_DONE;
queue_buf(&vout->done_q, last_buf);
@@ -715,9 +697,7 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id)
vout->ipu_buf_p[vout->next_done_ipu_buf] = -1;
vout->ipu_buf_n[vout->next_done_ipu_buf] = -1;
}
- /* split mode use buf 0 only, no need switch buf */
- if (!vout->pp_split)
- vout->next_done_ipu_buf = !vout->next_done_ipu_buf;
+ vout->next_done_ipu_buf = !vout->next_done_ipu_buf;
}
} /* end of last_buf != -1 */
@@ -950,9 +930,6 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout,
u32 eba_offset;
u16 x_pos;
u16 y_pos;
- dma_addr_t phy_addr0;
- dma_addr_t phy_addr1;
-
eba_offset = 0;
x_pos = 0;
y_pos = 0;
@@ -1042,12 +1019,6 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout,
return -EINVAL;
}
- /* always enable double buffer */
- phy_addr0 = vout->v4l2_bufs[vout->ipu_buf[0]].m.offset;
- if (vout->ipu_buf[1] == -1)
- phy_addr1 = phy_addr0;
- else
- phy_addr1 = vout->v4l2_bufs[vout->ipu_buf[1]].m.offset;
if (ipu_init_channel_buffer(vout->post_proc_ch,
IPU_INPUT_BUFFER,
params->mem_pp_mem.in_pixel_fmt,
@@ -1057,8 +1028,8 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout,
bytes_per_pixel(params->mem_pp_mem.
in_pixel_fmt),
IPU_ROTATE_NONE,
- phy_addr0,
- phy_addr1,
+ vout->v4l2_bufs[vout->ipu_buf[0]].m.offset,
+ vout->v4l2_bufs[vout->ipu_buf[1]].m.offset,
vout->offset.u_offset,
vout->offset.v_offset) != 0) {
dev_err(dev, "Error initializing PP input buffer\n");
@@ -1223,10 +1194,8 @@ static int mxc_v4l2out_streamon(vout_data * vout)
g_irq_cnt = g_buf_output_cnt = g_buf_q_cnt = g_buf_dq_cnt = 0;
out_width = vout->crop_current.width;
out_height = vout->crop_current.height;
- vout->disp_buf_num = 0;
vout->next_done_ipu_buf = 0;
- vout->next_rdy_ipu_buf = vout->next_disp_ipu_buf = 1;
- vout->fb_blank = 0;
+ vout->next_rdy_ipu_buf = 1;
vout->pp_split = 0;
ipu_ic_out_max_height_size = 1024;
#ifdef CONFIG_MXC_IPU_V1
@@ -1241,12 +1210,12 @@ static int mxc_v4l2out_streamon(vout_data * vout)
(out_height > ipu_ic_out_max_height_size))
vout->pp_split = 4;
if (!INTERLACED_CONTENT(vout)) {
+ vout->next_done_ipu_buf = vout->next_rdy_ipu_buf = 0;
vout->ipu_buf[0] = dequeue_buf(&vout->ready_q);
/* split IC by two stripes, the by pass is impossible*/
if ((out_width != vout->v2f.fmt.pix.width ||
out_height != vout->v2f.fmt.pix.height) &&
vout->pp_split) {
- vout->next_done_ipu_buf = vout->next_rdy_ipu_buf = 0;
vout->ipu_buf[1] = vout->ipu_buf[0];
vout->frame_count = 1;
if ((out_width > ipu_ic_out_max_width_size) &&
@@ -1257,8 +1226,8 @@ static int mxc_v4l2out_streamon(vout_data * vout)
else
vout->pp_split = 3; /*2 vertical stripes*/
} else {
- vout->ipu_buf[1] = -1;
- vout->frame_count = 1;
+ vout->ipu_buf[1] = dequeue_buf(&vout->ready_q);
+ vout->frame_count = 2;
}
} else if (!LOAD_3FIELDS(vout)) {
vout->ipu_buf[0] = dequeue_buf(&vout->ready_q);
@@ -1492,8 +1461,13 @@ static int mxc_v4l2out_streamon(vout_data * vout)
ipu_enable_channel(MEM_VDI_PRP_VF_MEM_P);
ipu_enable_channel(MEM_VDI_PRP_VF_MEM_N);
ipu_select_multi_vdi_buffer(0);
- } else
+ } else if (INTERLACED_CONTENT(vout)) {
+ ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 0);
+ } else {
ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 0);
+ if (!vout->pp_split)
+ ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 1);
+ }
ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, 0);
ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, 1);
#ifdef CONFIG_MXC_IPU_V1
@@ -1503,6 +1477,9 @@ static int mxc_v4l2out_streamon(vout_data * vout)
ipu_update_channel_buffer(vout->display_ch,
IPU_INPUT_BUFFER,
0, vout->v4l2_bufs[vout->ipu_buf[0]].m.offset);
+ ipu_update_channel_buffer(vout->display_ch,
+ IPU_INPUT_BUFFER,
+ 1, vout->v4l2_bufs[vout->ipu_buf[1]].m.offset);
if (vout->offset.u_offset || vout->offset.v_offset)
/* only update u/v offset */
ipu_update_channel_offset(vout->display_ch,
@@ -1516,7 +1493,7 @@ static int mxc_v4l2out_streamon(vout_data * vout)
0,
0);
ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, 0);
- queue_work(vout->v4l_wq, &vout->icbypass_work);
+ queue_work(vout->v4l_wq, &vout->timer_work);
}
vout->start_jiffies = jiffies;
@@ -1554,7 +1531,7 @@ static int mxc_v4l2out_streamoff(vout_data * vout)
ipu_free_irq(vout->work_irq, vout);
if (vout->ic_bypass)
- cancel_work_sync(&vout->icbypass_work);
+ cancel_work_sync(&vout->timer_work);
spin_lock_irqsave(&g_lock, lockflag);
@@ -1915,7 +1892,7 @@ static int mxc_v4l2out_open(struct file *file)
goto oops;
}
- INIT_WORK(&vout->icbypass_work, icbypass_work_func);
+ INIT_WORK(&vout->timer_work, timer_work_func);
}
file->private_data = dev;
diff --git a/drivers/media/video/mxc/output/mxc_v4l2_output.h b/drivers/media/video/mxc/output/mxc_v4l2_output.h
index c26194f5ff90..096dc3b17a06 100644
--- a/drivers/media/video/mxc/output/mxc_v4l2_output.h
+++ b/drivers/media/video/mxc/output/mxc_v4l2_output.h
@@ -79,9 +79,7 @@ typedef struct _vout_data {
struct timer_list output_timer;
struct workqueue_struct *v4l_wq;
- struct work_struct icbypass_work;
- int disp_buf_num;
- int fb_blank;
+ struct work_struct timer_work;
unsigned long start_jiffies;
u32 frame_count;
@@ -90,7 +88,6 @@ typedef struct _vout_data {
s8 next_rdy_ipu_buf;
s8 next_done_ipu_buf;
- s8 next_disp_ipu_buf;
s8 ipu_buf[2];
s8 ipu_buf_p[2];
s8 ipu_buf_n[2];
diff --git a/drivers/media/video/ov511.c b/drivers/media/video/ov511.c
index 0bc2cf573c76..2bed9e22968b 100644
--- a/drivers/media/video/ov511.c
+++ b/drivers/media/video/ov511.c
@@ -5878,7 +5878,7 @@ ov51x_probe(struct usb_interface *intf, const struct usb_device_id *id)
goto error;
}
- mutex_lock(&ov->lock);
+ mutex_unlock(&ov->lock);
return 0;
diff --git a/drivers/media/video/pwc/pwc-ctrl.c b/drivers/media/video/pwc/pwc-ctrl.c
index 50b415e07eda..f7f7e04cf485 100644
--- a/drivers/media/video/pwc/pwc-ctrl.c
+++ b/drivers/media/video/pwc/pwc-ctrl.c
@@ -753,7 +753,7 @@ int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value)
buf[0] = 0xff; /* fixed */
ret = send_control_msg(pdev,
- SET_LUM_CTL, SHUTTER_MODE_FORMATTER, &buf, sizeof(buf));
+ SET_LUM_CTL, SHUTTER_MODE_FORMATTER, &buf, 1);
if (!mode && ret >= 0) {
if (value < 0)
diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c
index 9e3262c0ba37..2c0bb06cab3b 100644
--- a/drivers/media/video/s2255drv.c
+++ b/drivers/media/video/s2255drv.c
@@ -598,11 +598,6 @@ static int s2255_got_frame(struct s2255_dev *dev, int chn, int jpgsize)
buf = list_entry(dma_q->active.next,
struct s2255_buffer, vb.queue);
- if (!waitqueue_active(&buf->vb.done)) {
- /* no one active */
- rc = -1;
- goto unlock;
- }
list_del(&buf->vb.queue);
do_gettimeofday(&buf->vb.ts);
dprintk(100, "[%p/%d] wakeup\n", buf, buf->vb.i);
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index 6eebe3ef97d3..52a79b3f8a4a 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -3373,6 +3373,7 @@ struct saa7134_board saa7134_boards[] = {
.tuner_config = 3,
.mpeg = SAA7134_MPEG_DVB,
.ts_type = SAA7134_MPEG_TS_SERIAL,
+ .ts_force_val = 1,
.gpiomask = 0x0800100, /* GPIO 21 is an INPUT */
.inputs = {{
.name = name_tv,
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
index 6e219c2db841..69e48ceee27f 100644
--- a/drivers/media/video/saa7134/saa7134-input.c
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -684,8 +684,6 @@ void saa7134_input_fini(struct saa7134_dev *dev)
void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
{
- struct i2c_board_info info;
- struct IR_i2c_init_data init_data;
const unsigned short addr_list[] = {
0x7a, 0x47, 0x71, 0x2d,
I2C_CLIENT_END
@@ -705,32 +703,32 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
return;
}
- memset(&info, 0, sizeof(struct i2c_board_info));
- memset(&init_data, 0, sizeof(struct IR_i2c_init_data));
- strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
+ memset(&dev->info, 0, sizeof(dev->info));
+ memset(&dev->init_data, 0, sizeof(dev->init_data));
+ strlcpy(dev->info.type, "ir_video", I2C_NAME_SIZE);
switch (dev->board) {
case SAA7134_BOARD_PINNACLE_PCTV_110i:
case SAA7134_BOARD_PINNACLE_PCTV_310i:
- init_data.name = "Pinnacle PCTV";
+ dev->init_data.name = "Pinnacle PCTV";
if (pinnacle_remote == 0) {
- init_data.get_key = get_key_pinnacle_color;
- init_data.ir_codes = ir_codes_pinnacle_color;
+ dev->init_data.get_key = get_key_pinnacle_color;
+ dev->init_data.ir_codes = ir_codes_pinnacle_color;
} else {
- init_data.get_key = get_key_pinnacle_grey;
- init_data.ir_codes = ir_codes_pinnacle_grey;
+ dev->init_data.get_key = get_key_pinnacle_grey;
+ dev->init_data.ir_codes = ir_codes_pinnacle_grey;
}
break;
case SAA7134_BOARD_UPMOST_PURPLE_TV:
- init_data.name = "Purple TV";
- init_data.get_key = get_key_purpletv;
- init_data.ir_codes = ir_codes_purpletv;
+ dev->init_data.name = "Purple TV";
+ dev->init_data.get_key = get_key_purpletv;
+ dev->init_data.ir_codes = ir_codes_purpletv;
break;
case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS:
- init_data.name = "MSI TV@nywhere Plus";
- init_data.get_key = get_key_msi_tvanywhere_plus;
- init_data.ir_codes = ir_codes_msi_tvanywhere_plus;
- info.addr = 0x30;
+ dev->init_data.name = "MSI TV@nywhere Plus";
+ dev->init_data.get_key = get_key_msi_tvanywhere_plus;
+ dev->init_data.ir_codes = ir_codes_msi_tvanywhere_plus;
+ dev->info.addr = 0x30;
/* MSI TV@nywhere Plus controller doesn't seem to
respond to probes unless we read something from
an existing device. Weird...
@@ -741,9 +739,9 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
(1 == rc) ? "yes" : "no");
break;
case SAA7134_BOARD_HAUPPAUGE_HVR1110:
- init_data.name = "HVR 1110";
- init_data.get_key = get_key_hvr1110;
- init_data.ir_codes = ir_codes_hauppauge_new;
+ dev->init_data.name = "HVR 1110";
+ dev->init_data.get_key = get_key_hvr1110;
+ dev->init_data.ir_codes = ir_codes_hauppauge_new;
break;
case SAA7134_BOARD_BEHOLD_607FM_MK3:
case SAA7134_BOARD_BEHOLD_607FM_MK5:
@@ -757,26 +755,26 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
case SAA7134_BOARD_BEHOLD_M63:
case SAA7134_BOARD_BEHOLD_M6_EXTRA:
case SAA7134_BOARD_BEHOLD_H6:
- init_data.name = "BeholdTV";
- init_data.get_key = get_key_beholdm6xx;
- init_data.ir_codes = ir_codes_behold;
+ dev->init_data.name = "BeholdTV";
+ dev->init_data.get_key = get_key_beholdm6xx;
+ dev->init_data.ir_codes = ir_codes_behold;
break;
case SAA7134_BOARD_AVERMEDIA_CARDBUS_501:
case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
- info.addr = 0x40;
+ dev->info.addr = 0x40;
break;
}
- if (init_data.name)
- info.platform_data = &init_data;
+ if (dev->init_data.name)
+ dev->info.platform_data = &dev->init_data;
/* No need to probe if address is known */
- if (info.addr) {
- i2c_new_device(&dev->i2c_adap, &info);
+ if (dev->info.addr) {
+ i2c_new_device(&dev->i2c_adap, &dev->info);
return;
}
/* Address not known, fallback to probing */
- i2c_new_probed_device(&dev->i2c_adap, &info, addr_list);
+ i2c_new_probed_device(&dev->i2c_adap, &dev->info, addr_list);
}
static int saa7134_rc5_irq(struct saa7134_dev *dev)
diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c
index 3fa652279ac0..03488ba4c99c 100644
--- a/drivers/media/video/saa7134/saa7134-ts.c
+++ b/drivers/media/video/saa7134/saa7134-ts.c
@@ -262,11 +262,13 @@ int saa7134_ts_start(struct saa7134_dev *dev)
switch (saa7134_boards[dev->board].ts_type) {
case SAA7134_MPEG_TS_PARALLEL:
saa_writeb(SAA7134_TS_SERIAL0, 0x40);
- saa_writeb(SAA7134_TS_PARALLEL, 0xec);
+ saa_writeb(SAA7134_TS_PARALLEL, 0xec |
+ (saa7134_boards[dev->board].ts_force_val << 4));
break;
case SAA7134_MPEG_TS_SERIAL:
saa_writeb(SAA7134_TS_SERIAL0, 0xd8);
- saa_writeb(SAA7134_TS_PARALLEL, 0x6c);
+ saa_writeb(SAA7134_TS_PARALLEL, 0x6c |
+ (saa7134_boards[dev->board].ts_force_val << 4));
saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 0xbc);
saa_writeb(SAA7134_TS_SERIAL1, 0x02);
break;
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
index fb564f14887c..f50734f39466 100644
--- a/drivers/media/video/saa7134/saa7134.h
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -355,6 +355,7 @@ struct saa7134_board {
enum saa7134_mpeg_type mpeg;
enum saa7134_mpeg_ts_type ts_type;
unsigned int vid_port_opts;
+ unsigned int ts_force_val:1;
};
#define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name)
@@ -584,6 +585,10 @@ struct saa7134_dev {
int nosignal;
unsigned int insuspend;
+ /* I2C keyboard data */
+ struct i2c_board_info info;
+ struct IR_i2c_init_data init_data;
+
/* SAA7134_MPEG_* */
struct saa7134_ts ts;
struct saa7134_dmaqueue ts_q;
diff --git a/drivers/media/video/sn9c102/sn9c102_devtable.h b/drivers/media/video/sn9c102/sn9c102_devtable.h
index 38a716020d7f..36ee43a9ee95 100644
--- a/drivers/media/video/sn9c102/sn9c102_devtable.h
+++ b/drivers/media/video/sn9c102/sn9c102_devtable.h
@@ -123,8 +123,8 @@ static const struct usb_device_id sn9c102_id_table[] = {
{ SN9C102_USB_DEVICE(0x0c45, 0x613b, BRIDGE_SN9C120), },
#if !defined CONFIG_USB_GSPCA && !defined CONFIG_USB_GSPCA_MODULE
{ SN9C102_USB_DEVICE(0x0c45, 0x613c, BRIDGE_SN9C120), },
-#endif
{ SN9C102_USB_DEVICE(0x0c45, 0x613e, BRIDGE_SN9C120), },
+#endif
{ }
};
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
index 04b47832fa0a..5a8a8d1cc9c0 100644
--- a/drivers/media/video/uvc/uvc_driver.c
+++ b/drivers/media/video/uvc/uvc_driver.c
@@ -46,6 +46,7 @@
unsigned int uvc_no_drop_param;
static unsigned int uvc_quirks_param;
unsigned int uvc_trace_param;
+unsigned int uvc_timeout_param = UVC_CTRL_STREAMING_TIMEOUT;
/* ------------------------------------------------------------------------
* Video formats
@@ -2034,6 +2035,8 @@ module_param_named(quirks, uvc_quirks_param, uint, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(quirks, "Forced device quirks");
module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(trace, "Trace level bitmask");
+module_param_named(timeout, uvc_timeout_param, uint, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c
index be99c8797dcc..f2480c35c265 100644
--- a/drivers/media/video/uvc/uvc_video.c
+++ b/drivers/media/video/uvc/uvc_video.c
@@ -130,7 +130,7 @@ static int uvc_get_video_ctrl(struct uvc_video_device *video,
ret = __uvc_query_ctrl(video->dev, query, 0, video->streaming->intfnum,
probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, data, size,
- UVC_CTRL_STREAMING_TIMEOUT);
+ uvc_timeout_param);
if ((query == GET_MIN || query == GET_MAX) && ret == 2) {
/* Some cameras, mostly based on Bison Electronics chipsets,
@@ -235,7 +235,7 @@ static int uvc_set_video_ctrl(struct uvc_video_device *video,
ret = __uvc_query_ctrl(video->dev, SET_CUR, 0,
video->streaming->intfnum,
probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, data, size,
- UVC_CTRL_STREAMING_TIMEOUT);
+ uvc_timeout_param);
if (ret != size) {
uvc_printk(KERN_ERR, "Failed to set UVC %s control : "
"%d (exp. %u).\n", probe ? "probe" : "commit",
@@ -707,10 +707,6 @@ static void uvc_video_complete(struct urb *urb)
if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n",
ret);
- if (ret == -ENODEV) {
- uvc_queue_cancel(queue, 1);
- return;
- }
}
}
diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h
index 3c78d3c1e4c0..3265fbf3fc96 100644
--- a/drivers/media/video/uvc/uvcvideo.h
+++ b/drivers/media/video/uvc/uvcvideo.h
@@ -304,7 +304,7 @@ struct uvc_xu_control {
#define UVC_MAX_STATUS_SIZE 16
#define UVC_CTRL_CONTROL_TIMEOUT 300
-#define UVC_CTRL_STREAMING_TIMEOUT 1000
+#define UVC_CTRL_STREAMING_TIMEOUT 3000
/* Devices quirks */
#define UVC_QUIRK_STATUS_INTERVAL 0x00000001
@@ -695,6 +695,7 @@ struct uvc_driver {
extern unsigned int uvc_no_drop_param;
extern unsigned int uvc_trace_param;
+extern unsigned int uvc_timeout_param;
#define uvc_trace(flag, msg...) \
do { \
diff --git a/drivers/media/video/v4l1-compat.c b/drivers/media/video/v4l1-compat.c
index 02f2a6d18b45..ec766937aff6 100644
--- a/drivers/media/video/v4l1-compat.c
+++ b/drivers/media/video/v4l1-compat.c
@@ -565,10 +565,9 @@ static noinline long v4l1_compat_get_input_info(
break;
}
chan->norm = 0;
- err = drv(file, VIDIOC_G_STD, &sid);
- if (err < 0)
- dprintk("VIDIOCGCHAN / VIDIOC_G_STD: %ld\n", err);
- if (err == 0) {
+ /* Note: G_STD might not be present for radio receivers,
+ * so we should ignore any errors. */
+ if (drv(file, VIDIOC_G_STD, &sid) == 0) {
if (sid & V4L2_STD_PAL)
chan->norm = VIDEO_MODE_PAL;
if (sid & V4L2_STD_NTSC)
@@ -777,10 +776,9 @@ static noinline long v4l1_compat_get_tuner(
tun->flags |= VIDEO_TUNER_SECAM;
}
- err = drv(file, VIDIOC_G_STD, &sid);
- if (err < 0)
- dprintk("VIDIOCGTUNER / VIDIOC_G_STD: %ld\n", err);
- if (err == 0) {
+ /* Note: G_STD might not be present for radio receivers,
+ * so we should ignore any errors. */
+ if (drv(file, VIDIOC_G_STD, &sid) == 0) {
if (sid & V4L2_STD_PAL)
tun->mode = VIDEO_MODE_PAL;
if (sid & V4L2_STD_NTSC)
diff --git a/drivers/media/video/videobuf-dma-contig.c b/drivers/media/video/videobuf-dma-contig.c
index dc4f32bbd83d..2ac8c2421ad2 100644
--- a/drivers/media/video/videobuf-dma-contig.c
+++ b/drivers/media/video/videobuf-dma-contig.c
@@ -319,7 +319,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
mem->size = PAGE_ALIGN(q->bufs[first]->bsize);
mem->vaddr = dma_alloc_coherent(q->dev, mem->size,
- &mem->dma_handle, GFP_DMA);
+ &mem->dma_handle, GFP_KERNEL);
if (!mem->vaddr) {
dev_err(q->dev, "dma_alloc_coherent size %ld failed\n",
mem->size);
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c
index 5d0ba4f5924c..9ad7bb4e721f 100644
--- a/drivers/message/fusion/mptbase.c
+++ b/drivers/message/fusion/mptbase.c
@@ -1015,9 +1015,9 @@ mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
{
SGESimple64_t *pSge = (SGESimple64_t *) pAddr;
pSge->Address.Low = cpu_to_le32
- (lower_32_bits((unsigned long)(dma_addr)));
+ (lower_32_bits(dma_addr));
pSge->Address.High = cpu_to_le32
- (upper_32_bits((unsigned long)dma_addr));
+ (upper_32_bits(dma_addr));
pSge->FlagsLength = cpu_to_le32
((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING));
}
@@ -1038,8 +1038,8 @@ mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
u32 tmp;
pSge->Address.Low = cpu_to_le32
- (lower_32_bits((unsigned long)(dma_addr)));
- tmp = (u32)(upper_32_bits((unsigned long)dma_addr));
+ (lower_32_bits(dma_addr));
+ tmp = (u32)(upper_32_bits(dma_addr));
/*
* 1078 errata workaround for the 36GB limitation
@@ -1101,7 +1101,7 @@ mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr)
pChain->NextChainOffset = next;
pChain->Address.Low = cpu_to_le32(tmp);
- tmp = (u32)(upper_32_bits((unsigned long)dma_addr));
+ tmp = (u32)(upper_32_bits(dma_addr));
pChain->Address.High = cpu_to_le32(tmp);
}
diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c
index 13e7d7bfe85f..dd8b6b3ff1ea 100644
--- a/drivers/mfd/ab3100-core.c
+++ b/drivers/mfd/ab3100-core.c
@@ -643,7 +643,7 @@ struct ab3100_init_setting {
u8 setting;
};
-static const struct ab3100_init_setting __initdata
+static const struct ab3100_init_setting __initconst
ab3100_init_settings[] = {
{
.abreg = AB3100_MCA,
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 72c10192d802..281b61b3b5f3 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -13,10 +13,6 @@ menuconfig MISC_DEVICES
if MISC_DEVICES
-config ANDROID_PMEM
- bool "Android pmem allocator"
- default y
-
config ATMEL_PWM
tristate "Atmel AT32/AT91 PWM support"
depends on AVR32 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9
@@ -242,14 +238,6 @@ config MXS_PERSISTENT
depends on ARCH_MXS
default y
-config UID_STAT
- bool "UID based statistics tracking exported to /proc/uid_stat"
- default n
-
-config FSL_CACHE
- tristate "Freescale Cache manipulate driver"
- default n
-
source "drivers/misc/c2port/Kconfig"
source "drivers/misc/eeprom/Kconfig"
source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c435ec82d664..03dd5ee05ce2 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -21,8 +21,5 @@ obj-$(CONFIG_HP_ILO) += hpilo.o
obj-$(CONFIG_ISL29003) += isl29003.o
obj-$(CONFIG_C2PORT) += c2port/
obj-$(CONFIG_MXS_PERSISTENT) += mxs-persistent.o
-obj-$(CONFIG_ANDROID_PMEM) += pmem.o
-obj-$(CONFIG_UID_STAT) += uid_stat.o
-obj-$(CONFIG_FSL_CACHE) += fsl_cache.o
obj-y += eeprom/
obj-y += cb710/
diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c
index 348443bdb23b..8393376b1080 100644
--- a/drivers/misc/enclosure.c
+++ b/drivers/misc/enclosure.c
@@ -362,6 +362,7 @@ static const char *const enclosure_status [] = {
[ENCLOSURE_STATUS_NOT_INSTALLED] = "not installed",
[ENCLOSURE_STATUS_UNKNOWN] = "unknown",
[ENCLOSURE_STATUS_UNAVAILABLE] = "unavailable",
+ [ENCLOSURE_STATUS_MAX] = NULL,
};
static const char *const enclosure_type [] = {
diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c
index 9cbf95bedce6..de530d9942d2 100644
--- a/drivers/misc/sgi-gru/gruprocfs.c
+++ b/drivers/misc/sgi-gru/gruprocfs.c
@@ -161,14 +161,15 @@ static int options_show(struct seq_file *s, void *p)
static ssize_t options_write(struct file *file, const char __user *userbuf,
size_t count, loff_t *data)
{
- unsigned long val;
- char buf[80];
+ char buf[20];
- if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0)
+ if (count >= sizeof(buf))
+ return -EINVAL;
+ if (copy_from_user(buf, userbuf, count))
return -EFAULT;
- buf[count - 1] = '\0';
- if (!strict_strtoul(buf, 10, &val))
- gru_options = val;
+ buf[count] = '\0';
+ if (strict_strtoul(buf, 0, &gru_options))
+ return -EINVAL;
return count;
}
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 2338c761c74f..abcd4392a8e9 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -179,11 +179,11 @@ static int mmc_read_ext_csd(struct mmc_card *card)
err = mmc_send_ext_csd(card, ext_csd);
if (err) {
- /*
- * We all hosts that cannot perform the command
- * to fail more gracefully
- */
- if (err != -EINVAL)
+ /* If the host or the card can't do the switch,
+ * fail more gracefully. */
+ if ((err != -EINVAL)
+ && (err != -ENOSYS)
+ && (err != -EFAULT))
goto out;
/*
@@ -225,10 +225,6 @@ static int mmc_read_ext_csd(struct mmc_card *card)
mmc_card_set_blockaddr(card);
}
- card->ext_csd.boot_info = ext_csd[EXT_CSD_BOOT_INFO];
- card->ext_csd.boot_size_mult = ext_csd[EXT_CSD_BOOT_SIZE_MULT];
- card->ext_csd.boot_config = ext_csd[EXT_CSD_BOOT_CONFIG];
- card->ext_csd.boot_bus_width = ext_csd[EXT_CSD_BOOT_BUS_WIDTH];
card->ext_csd.card_type = ext_csd[EXT_CSD_CARD_TYPE];
switch (ext_csd[EXT_CSD_CARD_TYPE]) {
@@ -267,281 +263,6 @@ out:
return err;
}
-/* configure the boot partitions */
-static ssize_t
-setup_boot_partitions(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int err, busy = 0;
- u32 part, new_part;
- u8 *ext_csd, boot_config;
- struct mmc_command cmd;
- struct mmc_card *card = container_of(dev, struct mmc_card, dev);
-
- BUG_ON(!card);
-
- sscanf(buf, "%d\n", &part);
-
- if (card->csd.mmca_vsn < CSD_SPEC_VER_4) {
- printk(KERN_ERR "%s: invalid mmc version"
- " mmc version is below version 4!)\n",
- mmc_hostname(card->host));
- return -EINVAL;
- }
-
- /* it's a normal SD/MMC but user request to configure boot partition */
- if (card->ext_csd.boot_size_mult <= 0) {
- printk(KERN_ERR "%s: this is a normal SD/MMC card"
- " but you request to access boot partition!\n",
- mmc_hostname(card->host));
- return -EINVAL;
- }
-
- ext_csd = kmalloc(512, GFP_KERNEL);
- if (!ext_csd) {
- printk(KERN_ERR "%s: could not allocate a buffer to "
- "receive the ext_csd.\n", mmc_hostname(card->host));
- return -ENOMEM;
- }
-
- mmc_claim_host(card->host);
- err = mmc_send_ext_csd(card, ext_csd);
- if (err) {
- printk(KERN_ERR "%s: unable to read EXT_CSD.\n",
- mmc_hostname(card->host));
- goto err_rtn;
- }
-
- /* enable the boot partition in boot mode */
- /* boot enable be -
- * 0x00 - disable boot enable.
- * 0x08 - boot partition 1 is enabled for boot.
- * 0x10 - boot partition 2 is enabled for boot.
- * 0x38 - User area is enabled for boot.
- */
- switch (part & EXT_CSD_BOOT_PARTITION_ENABLE_MASK) {
- case 0:
- boot_config = (ext_csd[EXT_CSD_BOOT_CONFIG]
- & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK
- & ~EXT_CSD_BOOT_ACK_ENABLE);
- break;
- case EXT_CSD_BOOT_PARTITION_PART1:
- boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG]
- & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK)
- | EXT_CSD_BOOT_PARTITION_PART1
- | EXT_CSD_BOOT_ACK_ENABLE);
- break;
- case EXT_CSD_BOOT_PARTITION_PART2:
- boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG]
- & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK)
- | EXT_CSD_BOOT_PARTITION_PART2
- | EXT_CSD_BOOT_ACK_ENABLE);
- break;
- case EXT_CSD_BOOT_PARTITION_ENABLE_MASK:
- boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG]
- | EXT_CSD_BOOT_PARTITION_ENABLE_MASK)
- & ~EXT_CSD_BOOT_ACK_ENABLE);
- break;
- default:
- printk(KERN_ERR "%s: wrong boot config parameter"
- " 00 (disable boot), 08 (enable boot1),"
- "16 (enable boot2), 56 (User area)\n",
- mmc_hostname(card->host));
- err = -EINVAL;
- goto err_rtn;
- }
-
- /* switch the partitions that used to be accessed in OS layer */
- /* partition must be -
- * 0 - user area
- * 1 - boot partition 1
- * 2 - boot partition 2
- */
- if ((part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK) > 2) {
- printk(KERN_ERR "%s: wrong partition id"
- " 0 (user area), 1 (boot1), 2 (boot2)\n",
- mmc_hostname(card->host));
- err = -EINVAL;
- goto err_rtn;
- }
-
- /* Send SWITCH command to change partition for access */
- boot_config &= ~EXT_CSD_BOOT_PARTITION_ACCESS_MASK;
- boot_config |= (part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK);
- err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
- EXT_CSD_BOOT_CONFIG, boot_config);
- if (err) {
- printk(KERN_ERR "%s: fail to send SWITCH command"
- " to card to swich partition for access!\n",
- mmc_hostname(card->host));
- goto err_rtn;
- }
-
- /* waiting for the card to finish the busy state */
- do {
- memset(&cmd, 0, sizeof(struct mmc_command));
-
- cmd.opcode = MMC_SEND_STATUS;
- cmd.arg = card->rca << 16;
- cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
-
- err = mmc_wait_for_cmd(card->host, &cmd, 0);
- if (err || busy > 100) {
- printk(KERN_ERR "%s: failed to wait for"
- "the busy state to end.\n",
- mmc_hostname(card->host));
- break;
- }
-
- if (!busy && !(cmd.resp[0] & R1_READY_FOR_DATA)) {
- printk(KERN_INFO "%s: card is in busy state"
- "pls wait for busy state to end.\n",
- mmc_hostname(card->host));
- }
- busy++;
- } while (!(cmd.resp[0] & R1_READY_FOR_DATA));
-
- /* Now check whether it works */
- err = mmc_send_ext_csd(card, ext_csd);
- if (err) {
- printk(KERN_ERR "%s: %d unable to re-read EXT_CSD.\n",
- mmc_hostname(card->host), err);
- goto err_rtn;
- }
-
- new_part = ext_csd[EXT_CSD_BOOT_CONFIG] &
- EXT_CSD_BOOT_PARTITION_ACCESS_MASK;
- if ((part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK) != new_part) {
- printk(KERN_ERR "%s: after SWITCH, current part id %d is not"
- " same as requested partition %d!\n",
- mmc_hostname(card->host), new_part, part);
- goto err_rtn;
- }
- card->ext_csd.boot_config = ext_csd[EXT_CSD_BOOT_CONFIG];
-
-err_rtn:
- mmc_release_host(card->host);
- kfree(ext_csd);
- if (err)
- return err;
- else
- return count;
-}
-
-/* configure the boot bus */
-static ssize_t
-setup_boot_bus(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int err, busy = 0;
- u32 boot_bus, new_bus;
- u8 *ext_csd;
- struct mmc_command cmd;
- struct mmc_card *card = container_of(dev, struct mmc_card, dev);
-
- BUG_ON(!card);
-
- sscanf(buf, "%d\n", &boot_bus);
-
- if (card->csd.mmca_vsn < CSD_SPEC_VER_4) {
- printk(KERN_ERR "%s: invalid mmc version"
- " mmc version is below version 4!)\n",
- mmc_hostname(card->host));
- return -EINVAL;
- }
-
- /* it's a normal SD/MMC but user request to configure boot bus */
- if (card->ext_csd.boot_size_mult <= 0) {
- printk(KERN_ERR "%s: this is a normal SD/MMC card"
- " but you request to configure boot bus !\n",
- mmc_hostname(card->host));
- return -EINVAL;
- }
-
- ext_csd = kmalloc(512, GFP_KERNEL);
- if (!ext_csd) {
- printk(KERN_ERR "%s: could not allocate a buffer to "
- "receive the ext_csd.\n", mmc_hostname(card->host));
- return -ENOMEM;
- }
-
- mmc_claim_host(card->host);
- err = mmc_send_ext_csd(card, ext_csd);
- if (err) {
- printk(KERN_ERR "%s: unable to read EXT_CSD.\n",
- mmc_hostname(card->host));
- goto err_rtn;
- }
-
- /* Configure the boot bus width when boot partition is enabled */
- if (((boot_bus & EXT_CSD_BOOT_BUS_WIDTH_MODE_MASK) >> 3) > 2
- || (boot_bus & EXT_CSD_BOOT_BUS_WIDTH_WIDTH_MASK) > 2
- || (boot_bus & ~EXT_CSD_BOOT_BUS_WIDTH_MASK) > 0) {
- printk(KERN_ERR "%s: Invalid inputs!\n",
- mmc_hostname(card->host));
- err = -EINVAL;
- goto err_rtn;
- }
-
- err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
- EXT_CSD_BOOT_BUS_WIDTH, boot_bus);
- if (err) {
- printk(KERN_ERR "%s: fail to send SWITCH command to "
- "card to swich partition for access!\n",
- mmc_hostname(card->host));
- goto err_rtn;
- }
-
- /* waiting for the card to finish the busy state */
- do {
- memset(&cmd, 0, sizeof(struct mmc_command));
-
- cmd.opcode = MMC_SEND_STATUS;
- cmd.arg = card->rca << 16;
- cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
-
- err = mmc_wait_for_cmd(card->host, &cmd, 0);
- if (err || busy > 100) {
- printk(KERN_ERR "%s: failed to wait for"
- "the busy state to end.\n",
- mmc_hostname(card->host));
- break;
- }
-
- if (!busy && !(cmd.resp[0] & R1_READY_FOR_DATA)) {
- printk(KERN_INFO "%s: card is in busy state"
- "pls wait for busy state to end.\n",
- mmc_hostname(card->host));
- }
- busy++;
- } while (!(cmd.resp[0] & R1_READY_FOR_DATA));
-
- /* Now check whether it works */
- err = mmc_send_ext_csd(card, ext_csd);
- if (err) {
- printk(KERN_ERR "%s: %d unable to re-read EXT_CSD.\n",
- mmc_hostname(card->host), err);
- goto err_rtn;
- }
-
- new_bus = ext_csd[EXT_CSD_BOOT_BUS_WIDTH];
- if (boot_bus != new_bus) {
- printk(KERN_ERR "%s: after SWITCH, current boot bus mode %d"
- " is not same as requested bus mode %d!\n",
- mmc_hostname(card->host), new_bus, boot_bus);
- goto err_rtn;
- }
- card->ext_csd.boot_bus_width = ext_csd[EXT_CSD_BOOT_BUS_WIDTH];
-
-err_rtn:
- mmc_release_host(card->host);
- kfree(ext_csd);
- if (err)
- return err;
- else
- return count;
-}
-
MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
card->raw_cid[2], card->raw_cid[3]);
MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
@@ -553,12 +274,6 @@ MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
-MMC_DEV_ATTR(boot_info, "boot_info:0x%02x; boot_size:%04dKB;"
- " boot_partition:0x%02x; boot_bus:0x%02x\n",
- card->ext_csd.boot_info, card->ext_csd.boot_size_mult * 128,
- card->ext_csd.boot_config, card->ext_csd.boot_bus_width);
-DEVICE_ATTR(boot_config, S_IWUGO, NULL, setup_boot_partitions);
-DEVICE_ATTR(boot_bus_config, S_IWUGO, NULL, setup_boot_bus);
static struct attribute *mmc_std_attrs[] = {
&dev_attr_cid.attr,
@@ -570,9 +285,6 @@ static struct attribute *mmc_std_attrs[] = {
&dev_attr_name.attr,
&dev_attr_oemid.attr,
&dev_attr_serial.attr,
- &dev_attr_boot_info.attr,
- &dev_attr_boot_config.attr,
- &dev_attr_boot_bus_config.attr,
NULL,
};
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index 4a73e34f9200..c2a8cafd8276 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -210,11 +210,11 @@ static int mmc_read_switch(struct mmc_card *card)
err = mmc_sd_switch(card, 0, 0, 1, status);
if (err) {
- /*
- * We all hosts that cannot perform the command
- * to fail more gracefully
- */
- if (err != -EINVAL)
+ /* If the host or the card can't do the switch,
+ * fail more gracefully. */
+ if ((err != -EINVAL)
+ && (err != -ENOSYS)
+ && (err != -EFAULT))
goto out;
printk(KERN_WARNING "%s: problem reading switch "
diff --git a/drivers/mmc/host/mx_sdhci.c b/drivers/mmc/host/mx_sdhci.c
index 732135308eb6..0557d4d337c1 100644
--- a/drivers/mmc/host/mx_sdhci.c
+++ b/drivers/mmc/host/mx_sdhci.c
@@ -814,7 +814,6 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
host->plat_data->clk_flg = 1;
}
}
-
if (clock == host->clock && !(ios.bus_width & MMC_BUS_WIDTH_DDR))
return;
@@ -854,20 +853,85 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
DBG("prescaler = 0x%x, divider = 0x%x\n", prescaler, div);
clk |= (prescaler << 8) | (div << 4);
- if (host->plat_data->clk_always_on
- | (host->mmc->card && mmc_card_sdio(host->mmc->card)))
- clk |= SDHCI_CLOCK_PER_EN | SDHCI_CLOCK_HLK_EN
- | SDHCI_CLOCK_IPG_EN;
- else
- clk &= ~(SDHCI_CLOCK_PER_EN | SDHCI_CLOCK_HLK_EN
- | SDHCI_CLOCK_IPG_EN);
+ /* Configure the DLL when DDR mode is enabled */
+ if (ios.bus_width & MMC_BUS_WIDTH_DDR) {
+ /* Make sure that the PER, HLK, IPG are all enabled */
+ writel(readl(host->ioaddr + SDHCI_CLOCK_CONTROL)
+ | SDHCI_CLOCK_IPG_EN
+ | SDHCI_CLOCK_HLK_EN
+ | SDHCI_CLOCK_PER_EN,
+ host->ioaddr + SDHCI_CLOCK_CONTROL);
- /* Configure the clock delay line */
- if ((host->plat_data->vendor_ver >= ESDHC_VENDOR_V3)
- && host->plat_data->dll_override_en)
- writel((host->plat_data->dll_delay_cells << 10)
- | DLL_CTRL_SLV_OVERRIDE,
- host->ioaddr + SDHCI_DLL_CONTROL);
+ /* Enable the DLL and delay chain */
+ writel(readl(host->ioaddr + SDHCI_DLL_CONTROL)
+ | DLL_CTRL_ENABLE,
+ host->ioaddr + SDHCI_DLL_CONTROL);
+
+ timeout = 1000000;
+ while (timeout > 0) {
+ timeout--;
+ if (readl(host->ioaddr + SDHCI_DLL_STATUS)
+ & DLL_STS_REF_LOCK)
+ break;
+ else if (timeout == 0)
+ printk(KERN_ERR "DLL REF LOCK Timeout!\n");
+ };
+ DBG("dll stat: 0x%x\n", readl(host->ioaddr + SDHCI_DLL_STATUS));
+
+ writel(readl(host->ioaddr + SDHCI_DLL_CONTROL)
+ | DLL_CTRL_SLV_UP_INT | DLL_CTRL_REF_UP_INT
+ | DLL_CTRL_SLV_DLY_TAR,
+ host->ioaddr + SDHCI_DLL_CONTROL);
+
+ timeout = 1000000;
+ while (timeout > 0) {
+ timeout--;
+ if (readl(host->ioaddr + SDHCI_DLL_STATUS)
+ & DLL_STS_SLV_LOCK)
+ break;
+ else if (timeout == 0)
+ printk(KERN_ERR "DLL SLV LOCK Timeout!\n");
+ };
+
+ writel(readl(host->ioaddr + SDHCI_DLL_CONTROL)
+ | DLL_CTRL_SLV_FORCE_UPD,
+ host->ioaddr + SDHCI_DLL_CONTROL);
+
+ writel(readl(host->ioaddr + SDHCI_DLL_CONTROL)
+ & (~DLL_CTRL_SLV_FORCE_UPD),
+ host->ioaddr + SDHCI_DLL_CONTROL);
+
+ timeout = 1000000;
+ while (timeout > 0) {
+ timeout--;
+ if (readl(host->ioaddr + SDHCI_DLL_STATUS)
+ & DLL_STS_REF_LOCK)
+ break;
+ else if (timeout == 0)
+ printk(KERN_ERR "DLL REF LOCK Timeout!\n");
+ };
+ timeout = 1000000;
+ while (timeout > 0) {
+ timeout--;
+ if (readl(host->ioaddr + SDHCI_DLL_STATUS)
+ & DLL_STS_SLV_LOCK)
+ break;
+ else if (timeout == 0)
+ printk(KERN_ERR "DLL SLV LOCK Timeout!\n");
+ };
+ DBG("dll stat: 0x%x\n", readl(host->ioaddr + SDHCI_DLL_STATUS));
+
+ /* Let the PER, HLK, IPG to be auto-gate */
+ writel(readl(host->ioaddr + SDHCI_CLOCK_CONTROL)
+ & ~(SDHCI_CLOCK_IPG_EN | SDHCI_CLOCK_HLK_EN
+ | SDHCI_CLOCK_PER_EN),
+ host->ioaddr + SDHCI_CLOCK_CONTROL);
+
+ } else if (readl(host->ioaddr + SDHCI_DLL_STATUS) & DLL_STS_SLV_LOCK) {
+ /* reset DLL CTRL */
+ writel(readl(host->ioaddr + SDHCI_DLL_CONTROL) | DLL_CTRL_RESET,
+ host->ioaddr + SDHCI_DLL_CONTROL);
+ }
/* Configure the clock control register */
clk |=
@@ -1093,7 +1157,7 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
{
struct sdhci_host *host;
unsigned long flags;
- u32 ier, prot, present;
+ u32 ier, prot, clk, present;
host = mmc_priv(mmc);
@@ -1106,12 +1170,19 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
if (--(host->sdio_enable))
goto exit_unlock;
}
-
- ier = readl(host->ioaddr + SDHCI_INT_ENABLE);
+ /* Enable the clock */
+ if (!host->plat_data->clk_flg) {
+ clk_enable(host->clk);
+ host->plat_data->clk_flg = 1;
+ }
+ ier = readl(host->ioaddr + SDHCI_SIGNAL_ENABLE);
prot = readl(host->ioaddr + SDHCI_HOST_CONTROL);
+ clk = readl(host->ioaddr + SDHCI_CLOCK_CONTROL);
if (enable) {
ier |= SDHCI_INT_CARD_INT;
+ prot |= SDHCI_CTRL_D3CD;
+ clk |= SDHCI_CLOCK_PER_EN | SDHCI_CLOCK_IPG_EN;
present = readl(host->ioaddr + SDHCI_PRESENT_STATE);
if ((present & SDHCI_CARD_INT_MASK) != SDHCI_CARD_INT_ID)
writel(SDHCI_INT_CARD_INT,
@@ -1119,24 +1190,12 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
} else {
ier &= ~SDHCI_INT_CARD_INT;
prot &= ~SDHCI_CTRL_D3CD;
+ clk &= ~(SDHCI_CLOCK_PER_EN | SDHCI_CLOCK_IPG_EN);
}
writel(prot, host->ioaddr + SDHCI_HOST_CONTROL);
- writel(ier, host->ioaddr + SDHCI_INT_ENABLE);
writel(ier, host->ioaddr + SDHCI_SIGNAL_ENABLE);
-
- /*
- * Using D3CD to manually driver the HW to re-sample the SDIO interrupt
- * on bus one more time to guarantee the SDIO interrupt signal sent
- * from card during the interrupt signal disabled period will not
- * be lost.
- */
- prot |= SDHCI_CTRL_CDSS;
- writel(prot, host->ioaddr + SDHCI_HOST_CONTROL);
- prot &= ~SDHCI_CTRL_D3CD;
- writel(prot, host->ioaddr + SDHCI_HOST_CONTROL);
- prot |= SDHCI_CTRL_D3CD;
- writel(prot, host->ioaddr + SDHCI_HOST_CONTROL);
+ writel(clk, host->ioaddr + SDHCI_CLOCK_CONTROL);
mmiowb();
exit_unlock:
@@ -1262,7 +1321,7 @@ static void sdhci_tasklet_finish(unsigned long param)
* The root cause is that the ROM code don't ensure
* the SD/MMC clk is running when boot system.
* */
- if (req_done && host->plat_data->clk_flg &&
+ if (!machine_is_mx35_3ds() && req_done && host->plat_data->clk_flg &&
!(host->mmc && host->mmc->card && mmc_card_sdio(host->mmc->card))) {
clk_disable(host->clk);
host->plat_data->clk_flg = 0;
@@ -1840,10 +1899,8 @@ static int __devinit sdhci_probe_slot(struct platform_device
/* Get the SDHC clock from clock system APIs */
host->clk = clk_get(&pdev->dev, mmc_plat->clock_mmc);
- if (NULL == host->clk) {
+ if (NULL == host->clk)
printk(KERN_ERR "MXC MMC can't get clock.\n");
- goto out1;
- }
DBG("SDHC:%d clock:%lu\n", pdev->id, clk_get_rate(host->clk));
host->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -2057,6 +2114,9 @@ static int __devinit sdhci_probe_slot(struct platform_device
}
mxc_dma_callback_set(host->dma, sdhci_dma_irq, (void *)host);
}
+#ifdef CONFIG_MMC_DEBUG
+ sdhci_dumpregs(host);
+#endif
mmiowb();
diff --git a/drivers/mmc/host/mx_sdhci.h b/drivers/mmc/host/mx_sdhci.h
index 83d02975ecd1..fa36dff0fd9a 100644
--- a/drivers/mmc/host/mx_sdhci.h
+++ b/drivers/mmc/host/mx_sdhci.h
@@ -69,7 +69,6 @@
#define SDHCI_CTRL_4BITBUS 0x00000002
#define SDHCI_CTRL_8BITBUS 0x00000004
#define SDHCI_CTRL_HISPD 0x00000004
-#define SDHCI_CTRL_CDSS 0x80
#define SDHCI_CTRL_DMA_MASK 0x18
#define SDHCI_CTRL_SDMA 0x00
#define SDHCI_CTRL_ADMA1 0x08
@@ -194,7 +193,6 @@
#define DLL_CTRL_ENABLE 0x00000001
#define DLL_CTRL_RESET 0x00000002
#define DLL_CTRL_SLV_FORCE_UPD 0x00000004
-#define DLL_CTRL_SLV_OVERRIDE 0x00000200
#define DLL_CTRL_SLV_DLY_TAR 0x00000000
#define DLL_CTRL_SLV_UP_INT 0x00200000
#define DLL_CTRL_REF_UP_INT 0x20000000
@@ -221,7 +219,6 @@ enum {
#define SDHCI_SPEC_100 0
#define SDHCI_SPEC_200 1
#define ESDHC_VENDOR_V22 0x12
-#define ESDHC_VENDOR_V3 0x13
struct sdhci_chip;
diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
index b7210b7d7af3..b849e873613b 100644
--- a/drivers/mmc/host/mxs-mmc.c
+++ b/drivers/mmc/host/mxs-mmc.c
@@ -49,7 +49,7 @@
#define MXS_MMC_DETECT_TIMEOUT (HZ/2)
/* Max value supported for XFER_COUNT */
-#define SSP_BUFFER_SIZE (65535)
+#define SSP_BUFFER_SIZE (65536)
#ifndef BF
#define BF(value, field) (((value) << BP_##field) & BM_##field)
@@ -93,9 +93,6 @@
#define BF_SSP_BLOCK_SIZE_BLOCK_SIZE(v) \
(((v) << 16) & BM_SSP_BLOCK_SIZE_BLOCK_SIZE)
#endif
-#ifndef BM_SSP_CMD0_DBL_DATA_RATE_EN
-#define BM_SSP_CMD0_DBL_DATA_RATE_EN 0x02000000
-#endif
struct mxs_mmc_host {
struct device *dev;
@@ -162,7 +159,6 @@ static inline int mxs_mmc_is_plugged(struct mxs_mmc_host *host)
return !(status & BM_SSP_STATUS_CARD_DETECT);
}
-static void mxs_mmc_reset(struct mxs_mmc_host *host);
/* Card detection polling function */
static void mxs_mmc_detect_poll(unsigned long arg)
{
@@ -171,8 +167,6 @@ static void mxs_mmc_detect_poll(unsigned long arg)
card_status = mxs_mmc_is_plugged(host);
if (card_status != host->present) {
- /* Reset MMC block */
- mxs_mmc_reset(host);
host->present = card_status;
mmc_detect_change(host->mmc, 0);
}
@@ -558,9 +552,6 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
dev_dbg(host->dev, "%s blksz is 0x%x.\n", __func__, log2_block_size);
if (ssp_ver_major > 3) {
- /* Configure the CMD0 */
- ssp_cmd0 = BF(cmd->opcode, SSP_CMD0_CMD);
-
/* Configure the BLOCK SIZE and BLOCK COUNT */
if ((1<<log2_block_size) != cmd->data->blksz) {
BUG_ON(cmd->data->blocks > 1);
@@ -569,13 +560,9 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
val = BF(log2_block_size, SSP_BLOCK_SIZE_BLOCK_SIZE) |
BF(cmd->data->blocks - 1, SSP_BLOCK_SIZE_BLOCK_COUNT);
__raw_writel(val, host->ssp_base + HW_SSP_BLOCK_SIZE);
- if (host->mmc->ios.bus_width & MMC_BUS_WIDTH_DDR)
- /* Enable the DDR mode */
- ssp_cmd0 |= BM_SSP_CMD0_DBL_DATA_RATE_EN;
- else
- ssp_cmd0 &= ~BM_SSP_CMD0_DBL_DATA_RATE_EN;
-
}
+ /* Configure the CMD0 */
+ ssp_cmd0 = BF(cmd->opcode, SSP_CMD0_CMD);
} else {
if ((1<<log2_block_size) != cmd->data->blksz) {
BUG_ON(cmd->data->blocks > 1);
@@ -818,9 +805,9 @@ static void mxs_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
dev_warn(host->dev,
"Platform does not support CMD pin pullup control\n");
- if ((ios->bus_width & ~MMC_BUS_WIDTH_DDR) == MMC_BUS_WIDTH_8)
+ if (ios->bus_width == MMC_BUS_WIDTH_8)
host->bus_width = 2;
- else if ((ios->bus_width & ~MMC_BUS_WIDTH_DDR) == MMC_BUS_WIDTH_4)
+ else if (ios->bus_width == MMC_BUS_WIDTH_4)
host->bus_width = 1;
else
host->bus_width = 0;
@@ -892,6 +879,7 @@ static void mxs_mmc_reset(struct mxs_mmc_host *host)
/* Configure SSP Control Register 1 */
ssp_ctrl1 =
BM_SSP_CTRL1_DMA_ENABLE |
+ BM_SSP_CTRL1_POLARITY |
BM_SSP_CTRL1_RECV_TIMEOUT_IRQ_EN |
BM_SSP_CTRL1_DATA_CRC_IRQ_EN |
BM_SSP_CTRL1_DATA_TIMEOUT_IRQ_EN |
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
index e55ac792d68c..c8c0a7e4f0af 100644
--- a/drivers/mmc/host/pxamci.c
+++ b/drivers/mmc/host/pxamci.c
@@ -694,14 +694,14 @@ static int pxamci_remove(struct platform_device *pdev)
if (mmc) {
struct pxamci_host *host = mmc_priv(mmc);
+ mmc_remove_host(mmc);
+
if (host->vcc)
regulator_put(host->vcc);
if (host->pdata && host->pdata->exit)
host->pdata->exit(&pdev->dev, mmc);
- mmc_remove_host(mmc);
-
pxamci_stop_clock(host);
writel(TXFIFO_WR_REQ|RXFIFO_RD_REQ|CLK_IS_OFF|STOP_CMD|
END_CMD_RES|PRG_DONE|DATA_TRAN_DONE,
diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index 61ea833e0908..94bb61e19047 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -282,16 +282,6 @@ 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
@@ -308,7 +298,6 @@ 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
diff --git a/drivers/mtd/chips/cfi_util.c b/drivers/mtd/chips/cfi_util.c
index 34d40e25d312..c5a84fda5410 100644
--- a/drivers/mtd/chips/cfi_util.c
+++ b/drivers/mtd/chips/cfi_util.c
@@ -81,6 +81,10 @@ void __xipram cfi_qry_mode_off(uint32_t base, struct map_info *map,
{
cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL);
cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL);
+ /* M29W128G flashes require an additional reset command
+ when exit qry mode */
+ if ((cfi->mfr == CFI_MFR_ST) && (cfi->id == 0x227E || cfi->id == 0x7E))
+ cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL);
}
EXPORT_SYMBOL_GPL(cfi_qry_mode_off);
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index 1a85f6d5543b..3fe91622b400 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -436,7 +436,7 @@ config MXC_NAND_LOW_LEVEL_ERASE
config MTD_NAND_GPMI_NFC
tristate "GPMI NAND Flash Controller driver"
- depends on MTD_NAND && (ARCH_MX23 || ARCH_MX28 || ARCH_MX50)
+ depends on MTD_NAND && (ARCH_MX23 || ARCH_MX28)
help
Enables NAND Flash support.
diff --git a/drivers/mtd/nand/gpmi-nfc/Makefile b/drivers/mtd/nand/gpmi-nfc/Makefile
index 9df1b6454e90..e3d5660735b6 100644
--- a/drivers/mtd/nand/gpmi-nfc/Makefile
+++ b/drivers/mtd/nand/gpmi-nfc/Makefile
@@ -4,7 +4,6 @@ gpmi-nfc-objs += gpmi-nfc-event-reporting.o
gpmi-nfc-objs += gpmi-nfc-hal-common.o
gpmi-nfc-objs += gpmi-nfc-hal-v0.o
gpmi-nfc-objs += gpmi-nfc-hal-v1.o
-gpmi-nfc-objs += gpmi-nfc-hal-v2.o
gpmi-nfc-objs += gpmi-nfc-rom-common.o
gpmi-nfc-objs += gpmi-nfc-rom-v0.o
gpmi-nfc-objs += gpmi-nfc-rom-v1.o
diff --git a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c
index 54df1f084509..0143f1c358ff 100644
--- a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c
+++ b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c
@@ -42,12 +42,8 @@ static struct gpmi_nfc_timing safe_timing = {
*/
static struct nfc_hal *(nfc_hals[]) = {
- /* i.mx23 */
&gpmi_nfc_hal_v0,
- /* i.mx28 */
&gpmi_nfc_hal_v1,
- /* i.mx50 */
- &gpmi_nfc_hal_v2,
};
/*
@@ -1255,54 +1251,40 @@ static void release_register_block(struct gpmi_nfc_data *this,
* @resource_name: The name of the resource.
* @interrupt_handler: A pointer to the function that will handle interrupts
* from this interrupt number.
- * @lno: A pointer to a variable that will receive the acquired
- * interrupt number(low part).
- * @hno: A pointer to a variable that will receive the acquired
- * interrupt number(high part).
+ * @interrupt_number: A pointer to a variable that will receive the acquired
+ * interrupt number.
*/
static int acquire_interrupt(
struct gpmi_nfc_data *this, const char *resource_name,
- irq_handler_t interrupt_handler, int *lno, int *hno)
+ irq_handler_t interrupt_handler, int *interrupt_number)
{
struct platform_device *pdev = this->pdev;
struct device *dev = this->dev;
int error = 0;
- struct resource *r;
int i;
/* Attempt to get information about the given resource. */
- r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, resource_name);
+ i = platform_get_irq_byname(pdev, resource_name);
- if (!r) {
+ if (i < 0) {
dev_err(dev, "Can't get resource information for '%s'\n",
resource_name);
return -ENXIO;
}
/* Attempt to own the interrupt. */
- for (i = r->start; i <= r->end; i++) {
- error = request_irq(i, interrupt_handler, 0,
- resource_name, this);
-
- if (error) {
- dev_err(dev, "Can't own %s\n", resource_name);
- /* Free all the irq's we've already acquired. */
+ error = request_irq(i, interrupt_handler, 0, resource_name, this);
- while ((i - r->start) >= 0) {
- free_irq(i, this);
- i--;
- }
-
- return -EIO;
- }
+ if (error) {
+ dev_err(dev, "Can't own %s\n", resource_name);
+ return -EIO;
}
/* If control arrives here, everything went fine. */
- *lno = r->start;
- *hno = r->end;
+ *interrupt_number = i;
return 0;
@@ -1314,12 +1296,9 @@ static int acquire_interrupt(
* @this: Per-device data.
* @interrupt_number: The interrupt number.
*/
-static void release_interrupt(struct gpmi_nfc_data *this,
- int low_interrupt_number, int high_interrupt_number)
+static void release_interrupt(struct gpmi_nfc_data *this, int interrupt_number)
{
- int i;
- for (i = low_interrupt_number; i <= high_interrupt_number; i++)
- free_irq(i, this);
+ free_irq(interrupt_number, this);
}
/**
@@ -1488,9 +1467,7 @@ static int acquire_resources(struct gpmi_nfc_data *this)
error = acquire_interrupt(this,
GPMI_NFC_BCH_INTERRUPT_RES_NAME,
- gpmi_nfc_bch_isr,
- &(resources->bch_low_interrupt),
- &(resources->bch_high_interrupt));
+ gpmi_nfc_bch_isr, &(resources->bch_interrupt));
if (error)
goto exit_bch_interrupt;
@@ -1508,9 +1485,7 @@ static int acquire_resources(struct gpmi_nfc_data *this)
error = acquire_interrupt(this,
GPMI_NFC_DMA_INTERRUPT_RES_NAME,
- gpmi_nfc_dma_isr,
- &(resources->dma_low_interrupt),
- &(resources->dma_high_interrupt));
+ gpmi_nfc_dma_isr, &(resources->dma_interrupt));
if (error)
goto exit_dma_interrupt;
@@ -1529,14 +1504,12 @@ static int acquire_resources(struct gpmi_nfc_data *this)
/* Control arrives here if something went wrong. */
exit_clock:
- release_interrupt(this,
- resources->dma_low_interrupt, resources->dma_high_interrupt);
+ release_interrupt(this, resources->dma_interrupt);
exit_dma_interrupt:
release_dma_channels(this,
resources->dma_low_channel, resources->dma_high_channel);
exit_dma_channels:
- release_interrupt(this,
- resources->bch_low_interrupt, resources->bch_high_interrupt);
+ release_interrupt(this, resources->bch_interrupt);
exit_bch_interrupt:
release_register_block(this, resources->bch_regs);
exit_bch_regs:
@@ -1559,12 +1532,10 @@ static void release_resources(struct gpmi_nfc_data *this)
release_clock(this, resources->clock);
release_register_block(this, resources->gpmi_regs);
release_register_block(this, resources->bch_regs);
- release_interrupt(this,
- resources->bch_low_interrupt, resources->bch_low_interrupt);
+ release_interrupt(this, resources->bch_interrupt);
release_dma_channels(this,
resources->dma_low_channel, resources->dma_high_channel);
- release_interrupt(this,
- resources->dma_low_interrupt, resources->dma_high_interrupt);
+ release_interrupt(this, resources->dma_interrupt);
}
/**
diff --git a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c
index 50ba771853a4..34505b8e6546 100644
--- a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c
+++ b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c
@@ -172,8 +172,8 @@ static int mil_incoming_buffer_dma_begin(struct gpmi_nfc_data *this,
* If we can, we want to use the caller's buffer directly for DMA. Check
* if the system will let us map them.
*/
- if (map_io_buffers && virt_addr_valid(destination) &&
- !((int)destination & 0x3) && 0)
+
+ if (map_io_buffers && virt_addr_valid(destination))
destination_phys =
dma_map_single(dev,
(void *) destination, length, DMA_FROM_DEVICE);
@@ -385,7 +385,6 @@ static void mil_select_chip(struct mtd_info *mtd, int chip)
gpmi_nfc_add_event("< mil_select_chip", -1);
} else if ((mil->current_chip >= 0) && (chip < 0)) {
gpmi_nfc_add_event("> mil_select_chip", 1);
- gpmi_nfc_add_event("> not disable clk", 1);
clk_disable(clock);
nfc->end(this);
gpmi_nfc_stop_event_trace("< mil_select_chip");
@@ -422,6 +421,7 @@ static void mil_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
gpmi_nfc_add_event("> mil_read_buf", 1);
/* Set up DMA. */
+
error = mil_incoming_buffer_dma_begin(this, buf, len,
mil->payload_virt, mil->payload_phys,
nfc_geo->payload_size_in_bytes,
@@ -1413,12 +1413,6 @@ static int mil_set_geometry(struct gpmi_nfc_data *this)
struct nfc_geometry *nfc_geo = &this->nfc_geometry;
struct mil *mil = &this->mil;
-
- /* Free the memory for read ID case */
- if (mil->page_buffer_virt && virt_addr_valid(mil->page_buffer_virt))
- dma_free_coherent(dev, nfc_geo->payload_size_in_bytes,
- mil->page_buffer_virt, mil->page_buffer_phys);
-
/* Set up the various layers of geometry, in this specific order. */
if (mil_set_physical_geometry(this))
@@ -2505,27 +2499,8 @@ int gpmi_nfc_mil_init(struct gpmi_nfc_data *this)
dma_alloc_coherent(dev,
MIL_COMMAND_BUFFER_SIZE, &mil->cmd_phys, GFP_DMA);
- if (!mil->cmd_virt) {
- error = -ENOMEM;
+ if (!mil->cmd_virt)
goto exit_cmd_allocation;
- }
-
-
- /* Allocate buf read ID case */
- this->nfc_geometry.payload_size_in_bytes = 1024;
- mil->page_buffer_virt =
- dma_alloc_coherent(dev,
- this->nfc_geometry.payload_size_in_bytes,
- &mil->page_buffer_phys, GFP_DMA);
-
- if (!mil->page_buffer_virt) {
- error = -ENOMEM;
- goto exit_buf_allocation;
- }
-
- /* Slice up the page buffer. */
- mil->payload_virt = mil->page_buffer_virt;
- mil->payload_phys = mil->page_buffer_phys;
/*
* Ask the NAND Flash system to scan for chips.
@@ -2574,14 +2549,8 @@ int gpmi_nfc_mil_init(struct gpmi_nfc_data *this)
exit_partitions:
nand_release(&mil->mtd);
exit_nand_scan:
- dma_free_coherent(dev,
- this->nfc_geometry.payload_size_in_bytes,
- mil->page_buffer_virt, mil->page_buffer_phys);
- mil->page_buffer_virt = 0;
- mil->page_buffer_phys = ~0;
-exit_buf_allocation:
dma_free_coherent(dev, MIL_COMMAND_BUFFER_SIZE,
- mil->cmd_virt, mil->cmd_phys);
+ mil->cmd_virt, mil->cmd_phys);
mil->cmd_virt = 0;
mil->cmd_phys = ~0;
exit_cmd_allocation:
diff --git a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h
index 9b0074532917..6f14b73dd93d 100644
--- a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h
+++ b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h
@@ -44,6 +44,7 @@
#include <mach/system.h>
#include <mach/dmaengine.h>
+#include <mach/device.h>
#include <mach/clock.h>
/* Driver header files. */
@@ -85,12 +86,10 @@
struct resources {
void *gpmi_regs;
void *bch_regs;
- unsigned int bch_low_interrupt;
- unsigned int bch_high_interrupt;
+ unsigned int bch_interrupt;
unsigned int dma_low_channel;
unsigned int dma_high_channel;
- unsigned int dma_low_interrupt;
- unsigned int dma_high_interrupt;
+ unsigned int dma_interrupt;
struct clk *clock;
};
@@ -626,7 +625,6 @@ extern int gpmi_nfc_compute_hardware_timing(struct gpmi_nfc_data *this,
extern struct nfc_hal gpmi_nfc_hal_v0;
extern struct nfc_hal gpmi_nfc_hal_v1;
-extern struct nfc_hal gpmi_nfc_hal_v2;
/* Boot ROM Helper Common Services */
diff --git a/drivers/mtd/nand/mxc_nd2.c b/drivers/mtd/nand/mxc_nd2.c
index 80533ac42e9c..5ace73501cbb 100644
--- a/drivers/mtd/nand/mxc_nd2.c
+++ b/drivers/mtd/nand/mxc_nd2.c
@@ -32,7 +32,6 @@
/* Global address Variables */
static void __iomem *nfc_axi_base, *nfc_ip_base;
-static int nfc_irq;
struct mxc_mtd_s {
struct mtd_info mtd;
@@ -40,7 +39,6 @@ struct mxc_mtd_s {
struct mtd_partition *parts;
struct device *dev;
int disable_bi_swap; /* disable bi swap */
- int clk_active;
};
static struct mxc_mtd_s *mxc_nand_data;
@@ -842,30 +840,6 @@ static int mxc_nand_verify_buf(struct mtd_info *mtd, const u_char * buf,
}
/*!
- * This function will enable NFC clock
- *
- */
-static inline void mxc_nand_clk_enable(void)
-{
- if (!mxc_nand_data->clk_active) {
- clk_enable(nfc_clk);
- mxc_nand_data->clk_active = 1;
- }
-}
-
-/*!
- * This function will disable NFC clock
- *
- */
-static inline void mxc_nand_clk_disable(void)
-{
- if (mxc_nand_data->clk_active) {
- clk_disable(nfc_clk);
- mxc_nand_data->clk_active = 0;
- }
-}
-
-/*!
* This function is used by upper layer for select and deselect of the NAND
* chip
*
@@ -878,14 +852,13 @@ static void mxc_nand_select_chip(struct mtd_info *mtd, int chip)
switch (chip) {
case -1:
/* Disable the NFC clock */
- mxc_nand_clk_disable();
-
+ clk_disable(nfc_clk);
break;
- case 0 ... NFC_GET_MAXCHIP_SP():
+ case 0 ... 7:
/* Enable the NFC clock */
- mxc_nand_clk_enable();
- NFC_SET_NFC_ACTIVE_CS(chip);
+ clk_enable(nfc_clk);
+ NFC_SET_NFC_ACTIVE_CS(chip);
break;
default:
@@ -1257,10 +1230,9 @@ static int mxc_get_resources(struct platform_device *pdev)
error = -ENXIO;
goto out_2;
}
- nfc_irq = r->start;
init_waitqueue_head(&irq_waitq);
- error = request_irq(nfc_irq, mxc_nfc_irq, 0, "mxc_nd", NULL);
+ error = request_irq(r->start, mxc_nfc_irq, 0, "mxc_nd", NULL);
if (error)
goto out_3;
@@ -1526,7 +1498,6 @@ static int __init mxcnd_probe(struct platform_device *pdev)
nfc_clk = clk_get(&pdev->dev, "nfc_clk");
clk_enable(nfc_clk);
- mxc_nand_data->clk_active = 1;
if (hardware_ecc) {
this->ecc.read_page = mxc_nand_read_page;
@@ -1622,13 +1593,13 @@ static int __exit mxcnd_remove(struct platform_device *pdev)
manage_sysfs_files(false);
mxc_free_buf();
- mxc_nand_clk_disable();
+ clk_disable(nfc_clk);
clk_put(nfc_clk);
platform_set_drvdata(pdev, NULL);
if (mxc_nand_data) {
nand_release(mtd);
- free_irq(nfc_irq, NULL);
+ free_irq(MXC_INT_NANDFC, NULL);
kfree(mxc_nand_data);
}
@@ -1653,7 +1624,7 @@ static int mxcnd_suspend(struct platform_device *pdev, pm_message_t state)
DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND2 : NAND suspend\n");
/* Disable the NFC clock */
- mxc_nand_clk_disable();
+ clk_disable(nfc_clk);
return 0;
}
@@ -1672,7 +1643,7 @@ static int mxcnd_resume(struct platform_device *pdev)
DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND2 : NAND resume\n");
/* Enable the NFC clock */
- mxc_nand_clk_enable();
+ clk_enable(nfc_clk);
return 0;
}
diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c
index 89bf85af642c..40b5658bdbe6 100644
--- a/drivers/mtd/nand/ndfc.c
+++ b/drivers/mtd/nand/ndfc.c
@@ -102,8 +102,8 @@ static int ndfc_calculate_ecc(struct mtd_info *mtd,
wmb();
ecc = in_be32(ndfc->ndfcbase + NDFC_ECC);
/* The NDFC uses Smart Media (SMC) bytes order */
- ecc_code[0] = p[2];
- ecc_code[1] = p[1];
+ ecc_code[0] = p[1];
+ ecc_code[1] = p[2];
ecc_code[2] = p[3];
return 0;
diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c
index 3e164f0c9295..62d6a78c4eee 100644
--- a/drivers/mtd/ofpart.c
+++ b/drivers/mtd/ofpart.c
@@ -46,21 +46,12 @@ 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) {
+ reg = of_get_property(pp, "reg", &len);
+ if (!reg) {
nr_parts--;
continue;
}
- reg = of_get_property(pp, "reg", &len);
- if (!reg || (len != 2 * sizeof(u32))) {
- of_node_put(pp);
- dev_err(dev, "Invalid 'reg' on %s\n", node->full_name);
- kfree(*pparts);
- *pparts = NULL;
- return -EINVAL;
- }
(*pparts)[i].offset = reg[0];
(*pparts)[i].size = reg[1];
@@ -75,6 +66,14 @@ int __devinit of_mtd_parse_partitions(struct device *dev,
i++;
}
+ if (!i) {
+ of_node_put(pp);
+ dev_err(dev, "No valid partition found on %s\n", node->full_name);
+ kfree(*pparts);
+ *pparts = NULL;
+ return -EINVAL;
+ }
+
return nr_parts;
}
EXPORT_SYMBOL(of_mtd_parse_partitions);
diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
index f237ddbb2713..111ea41c4ecd 100644
--- a/drivers/mtd/ubi/cdev.c
+++ b/drivers/mtd/ubi/cdev.c
@@ -853,7 +853,6 @@ static long ubi_cdev_ioctl(struct file *file, unsigned int cmd,
break;
}
- req.name[req.name_len] = '\0';
err = verify_mkvol_req(ubi, &req);
if (err)
break;
diff --git a/drivers/mxc/amd-gpu/Kconfig b/drivers/mxc/amd-gpu/Kconfig
index 629d8cbbc989..f4f442787deb 100644
--- a/drivers/mxc/amd-gpu/Kconfig
+++ b/drivers/mxc/amd-gpu/Kconfig
@@ -6,7 +6,7 @@ menu "MXC GPU support"
config MXC_AMD_GPU
tristate "MXC GPU support"
- depends on ARCH_MX35 || ARCH_MX51 || ARCH_MX53 || ARCH_MX50
+ depends on ARCH_MX35 || ARCH_MX51 || ARCH_MX53
---help---
Say Y to get the GPU driver support.
diff --git a/drivers/mxc/amd-gpu/Makefile b/drivers/mxc/amd-gpu/Makefile
index 84cf02e5b3a3..a661de4d6a76 100644
--- a/drivers/mxc/amd-gpu/Makefile
+++ b/drivers/mxc/amd-gpu/Makefile
@@ -25,7 +25,25 @@ gpu-objs += common/gsl_cmdstream.o \
common/gsl_yamato.o \
platform/hal/linux/gsl_linux_map.o \
platform/hal/linux/gsl_kmod.o \
- platform/hal/linux/gsl_hal.o \
platform/hal/linux/gsl_kmod_cleanup.o \
platform/hal/linux/misc.o \
os/kernel/src/linux/kos_lib.o
+ifeq ($(CONFIG_ARCH_MX5),y)
+EXTRA_CFLAGS += -DMX51=1 \
+ -I$(obj)/platform/hal/MX51 \
+ -I$(obj)/platform/hal/MX51/linux \
+ -I$(obj)/platform/hal/MX51/memcfg
+
+gpu-objs += platform/hal/MX51/linux/gsl_hal.o \
+ platform/hal/MX51/memcfg/gsl_memcfg.o
+endif
+
+ifeq ($(CONFIG_ARCH_MX35),y)
+EXTRA_CFLAGS += -DMX35=1 \
+ -I$(obj)/platform/hal/MX35 \
+ -I$(obj)/platform/hal/MX35/linux \
+ -I$(obj)/platform/hal/MX35/memcfg
+
+gpu-objs += platform/hal/MX35/linux/gsl_hal.o \
+ platform/hal/MX35/memcfg/gsl_memcfg.o
+endif
diff --git a/drivers/mxc/amd-gpu/common/gsl_device.c b/drivers/mxc/amd-gpu/common/gsl_device.c
index 537b277918c4..bcb557e69d6d 100644
--- a/drivers/mxc/amd-gpu/common/gsl_device.c
+++ b/drivers/mxc/amd-gpu/common/gsl_device.c
@@ -15,7 +15,7 @@
* 02110-1301, USA.
*
*/
-
+
#include "gsl.h"
#include "gsl_hal.h"
#ifdef _LINUX
@@ -55,19 +55,10 @@ kgsl_device_init(gsl_device_t *device, gsl_deviceid_t device_id)
{
int status = GSL_SUCCESS;
gsl_devconfig_t config;
- gsl_hal_t *hal = (gsl_hal_t *)gsl_driver.hal;
kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE,
"--> int kgsl_device_init(gsl_device_t *device=0x%08x, gsl_deviceid_t device_id=%D )\n", device, device_id );
- if ((GSL_DEVICE_YAMATO == device_id) && !(hal->has_z430)) {
- return GSL_FAILURE_NOTSUPPORTED;
- }
-
- if ((GSL_DEVICE_G12 == device_id) && !(hal->has_z160)) {
- return GSL_FAILURE_NOTSUPPORTED;
- }
-
if (device->flags & GSL_FLAGS_INITIALIZED)
{
kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE, "<-- kgsl_device_init. Return value %B\n", GSL_SUCCESS );
@@ -135,7 +126,7 @@ kgsl_device_init(gsl_device_t *device, gsl_deviceid_t device_id)
return (status);
}
-#ifndef _LINUX
+#ifndef _LINUX
// Create timestamp event
device->timestamp_event = kos_event_create(0);
if( !device->timestamp_event )
@@ -146,7 +137,7 @@ kgsl_device_init(gsl_device_t *device, gsl_deviceid_t device_id)
#else
// Create timestamp wait queue
init_waitqueue_head(&device->timestamp_waitq);
-#endif
+#endif
//
// Read the chip ID after the device has been initialized.
@@ -170,10 +161,6 @@ kgsl_device_close(gsl_device_t *device)
kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE,
"--> int kgsl_device_close(gsl_device_t *device=0x%08x )\n", device );
- if (!(device->flags & GSL_FLAGS_INITIALIZED)) {
- return status;
- }
-
/* make sure the device is stopped before close
kgsl_device_close is only called for last running caller process
*/
@@ -187,8 +174,12 @@ kgsl_device_close(gsl_device_t *device)
status = kgsl_cmdstream_close(device);
if( status != GSL_SUCCESS ) return status;
- if (device->ftbl.device_close) {
- status = device->ftbl.device_close(device);
+ if (device->flags & GSL_FLAGS_INITIALIZED)
+ {
+ if (device->ftbl.device_close)
+ {
+ status = device->ftbl.device_close(device);
+ }
}
// DumpX allocates memstore from MMU aperture
@@ -198,7 +189,7 @@ kgsl_device_close(gsl_device_t *device)
kgsl_sharedmem_free0(&device->memstore, GSL_CALLER_PROCESSID_GET());
}
-#ifndef _LINUX
+#ifndef _LINUX
// destroy timestamp event
if(device->timestamp_event)
{
@@ -208,10 +199,10 @@ kgsl_device_close(gsl_device_t *device)
}
#else
wake_up_interruptible_all(&(device->timestamp_waitq));
-#endif
+#endif
kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE, "<-- kgsl_device_close. Return value %B\n", status );
-
+
return (status);
}
@@ -434,27 +425,16 @@ kgsl_device_start(gsl_deviceid_t device_id, gsl_flags_t flags)
{
int status = GSL_FAILURE_NOTINITIALIZED;
gsl_device_t *device;
- gsl_hal_t *hal = (gsl_hal_t *)gsl_driver.hal;
kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE,
"--> int kgsl_device_start(gsl_deviceid_t device_id=%D, gsl_flags_t flags=%d)\n", device_id, flags );
GSL_API_MUTEX_LOCK();
- if ((GSL_DEVICE_G12 == device_id) && !(hal->has_z160)) {
- GSL_API_MUTEX_UNLOCK();
- return GSL_FAILURE_NOTSUPPORTED;
- }
-
- if ((GSL_DEVICE_YAMATO == device_id) && !(hal->has_z430)) {
- GSL_API_MUTEX_UNLOCK();
- return GSL_FAILURE_NOTSUPPORTED;
- }
-
device = &gsl_driver.device[device_id-1]; // device_id is 1 based
-
+
kgsl_device_active(device);
-
+
if (!(device->flags & GSL_FLAGS_INITIALIZED))
{
GSL_API_MUTEX_UNLOCK();
@@ -549,7 +529,7 @@ kgsl_device_idle(gsl_deviceid_t device_id, unsigned int timeout)
device = &gsl_driver.device[device_id-1]; // device_id is 1 based
kgsl_device_active(device);
-
+
if (device->ftbl.device_idle)
{
status = device->ftbl.device_idle(device, timeout);
diff --git a/drivers/mxc/amd-gpu/common/gsl_driver.c b/drivers/mxc/amd-gpu/common/gsl_driver.c
index b8c5170a1425..fd4bcc0df96a 100644
--- a/drivers/mxc/amd-gpu/common/gsl_driver.c
+++ b/drivers/mxc/amd-gpu/common/gsl_driver.c
@@ -198,12 +198,13 @@ kgsl_driver_entry(gsl_flags_t flags)
if (status == GSL_SUCCESS)
{
// init devices
- status = GSL_FAILURE;
for (i = 0; i < GSL_DEVICE_MAX; i++)
{
- if (kgsl_device_init(&gsl_driver.device[i], (gsl_deviceid_t)(i + 1)) == GSL_SUCCESS) {
- status = GSL_SUCCESS;
- }
+ status = kgsl_device_init(&gsl_driver.device[i], (gsl_deviceid_t)(i + 1));
+ if (status != GSL_SUCCESS)
+ {
+ break;
+ }
}
}
diff --git a/drivers/mxc/amd-gpu/common/gsl_g12.c b/drivers/mxc/amd-gpu/common/gsl_g12.c
index 14cfdb61b6a1..513f6728a842 100644
--- a/drivers/mxc/amd-gpu/common/gsl_g12.c
+++ b/drivers/mxc/amd-gpu/common/gsl_g12.c
@@ -91,8 +91,6 @@ typedef struct
static gsl_z1xx_t g_z1xx = {0};
-extern int z160_version;
-
//----------------------------------------------------------------------------
@@ -465,10 +463,6 @@ kgsl_g12_getproperty(gsl_device_t *device, gsl_property_type_t type, void *value
#ifndef GSL_NO_MMU
devinfo->mmu_enabled = kgsl_mmu_isenabled(&device->mmu);
#endif
- if (z160_version == 1)
- devinfo->high_precision = 1;
- else
- devinfo->high_precision = 0;
status = GSL_SUCCESS;
}
diff --git a/drivers/mxc/amd-gpu/common/gsl_yamato.c b/drivers/mxc/amd-gpu/common/gsl_yamato.c
index e52d4274c6a6..d74c9efe2f36 100644
--- a/drivers/mxc/amd-gpu/common/gsl_yamato.c
+++ b/drivers/mxc/amd-gpu/common/gsl_yamato.c
@@ -541,7 +541,6 @@ kgsl_yamato_getproperty(gsl_device_t *device, gsl_property_type_t type, void *va
devinfo->gmem_hostbaseaddr = device->gmemspace.mmio_virt_base;
devinfo->gmem_gpubaseaddr = device->gmemspace.gpu_base;
devinfo->gmem_sizebytes = device->gmemspace.sizebytes;
- devinfo->high_precision = 0;
status = GSL_SUCCESS;
}
diff --git a/drivers/mxc/amd-gpu/include/api/gsl_types.h b/drivers/mxc/amd-gpu/include/api/gsl_types.h
index 310c1a9f5d00..99f389deee84 100644
--- a/drivers/mxc/amd-gpu/include/api/gsl_types.h
+++ b/drivers/mxc/amd-gpu/include/api/gsl_types.h
@@ -267,7 +267,6 @@ typedef struct _gsl_devinfo_t {
unsigned int gmem_gpubaseaddr;
void * gmem_hostbaseaddr; // if gmem_hostbaseaddr is NULL, we would know its not mapped into mmio space
unsigned int gmem_sizebytes;
- unsigned int high_precision; /* mx50 z160 has higher gradient/texture precision */
} gsl_devinfo_t;
diff --git a/drivers/mxc/amd-gpu/include/gsl_driver.h b/drivers/mxc/amd-gpu/include/gsl_driver.h
index 42dff457dc49..1e1d43da431d 100644
--- a/drivers/mxc/amd-gpu/include/gsl_driver.h
+++ b/drivers/mxc/amd-gpu/include/gsl_driver.h
@@ -72,7 +72,6 @@ typedef struct _gsl_driver_t {
gsl_flags_t dmi_mode; // single, double, or triple buffering
int dmi_frame; // set to -1 when DMI is enabled
int dmi_max_frame; // indicates the maximum frame # that we will support
- int enable_mmu;
} gsl_driver_t;
diff --git a/drivers/mxc/amd-gpu/include/gsl_hal.h b/drivers/mxc/amd-gpu/include/gsl_hal.h
index fcf9f0891f16..8a8a10cfb862 100644
--- a/drivers/mxc/amd-gpu/include/gsl_hal.h
+++ b/drivers/mxc/amd-gpu/include/gsl_hal.h
@@ -122,15 +122,6 @@ typedef struct _gsl_shmemconfig_t
gsl_apertureconfig_t apertures[GSL_SHMEM_MAX_APERTURES];
} gsl_shmemconfig_t;
-typedef struct _gsl_hal_t {
- gsl_memregion_t z160_regspace;
- gsl_memregion_t z430_regspace;
- gsl_memregion_t memchunk;
- gsl_memregion_t memspace[GSL_SHMEM_MAX_APERTURES];
- unsigned int has_z160;
- unsigned int has_z430;
-} gsl_hal_t;
-
//////////////////////////////////////////////////////////////////////////////
// HAL API
@@ -141,6 +132,7 @@ KGSLHAL_API int kgsl_hal_getshmemconfig(gsl_shmemconfig_t *config);
KGSLHAL_API int kgsl_hal_getdevconfig(gsl_deviceid_t device_id, gsl_devconfig_t *config);
KGSLHAL_API int kgsl_hal_setpowerstate(gsl_deviceid_t device_id, int state, unsigned int value);
KGSLHAL_API gsl_chipid_t kgsl_hal_getchipid(gsl_deviceid_t device_id);
+KGSLHAL_API int kgsl_hal_getplatformtype(char *platform);
KGSLHAL_API int kgsl_hal_allocphysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[]);
KGSLHAL_API int kgsl_hal_freephysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[]);
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_buildconfig.h b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_buildconfig.h
new file mode 100644
index 000000000000..9cfe9fe5b3b8
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_buildconfig.h
@@ -0,0 +1,62 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Advanced Micro Devices nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef __GSL__BUILDCONFIG_H
+#define __GSL__BUILDCONFIG_H
+
+#define GSL_BLD_G12
+
+#define GSL_LOCKING_COURSEGRAIN
+#define GSL_MMU_TRANSLATION_ENABLED
+//#define GSL_MMU_PAGETABLE_PERPROCESS
+
+#if defined(_WIN32_WCE) && (_WIN32_WCE >= 600)
+#define GSL_DEVICE_SHADOW_MEMSTORE_TO_USER
+#endif
+
+//#define GSL_LOG
+
+#define GSL_STATS_MEM
+#define GSL_STATS_RINGBUFFER
+#define GSL_STATS_MMU
+
+#define GSL_RB_USE_MEM_RPTR
+#define GSL_RB_USE_MEM_TIMESTAMP
+//#define GSL_RB_USE_WPTR_POLLING
+
+
+#define GSL_CALLER_PROCESS_MAX 10
+#define GSL_SHMEM_MAX_APERTURES 3
+
+#ifdef _WIN32
+#ifndef _CRT_SECURE_NO_DEPRECATE
+#define _CRT_SECURE_NO_DEPRECATE
+#endif
+#endif // _WIN32
+
+#endif // __GSL__BUILDCONFIG_H
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_config.h b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_config.h
new file mode 100644
index 000000000000..58a38c608de9
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_config.h
@@ -0,0 +1,195 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Advanced Micro Devices nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef __GSL__CONFIG_H
+#define __GSL__CONFIG_H
+
+
+// ---------------------
+// G12 MH arbiter config
+// ---------------------
+static const REG_MH_ARBITER_CONFIG gsl_cfg_g12_mharb =
+{
+ 0x10, // SAME_PAGE_LIMIT
+ 0, // SAME_PAGE_GRANULARITY
+ 1, // L1_ARB_ENABLE
+ 1, // L1_ARB_HOLD_ENABLE
+ 0, // L2_ARB_CONTROL
+ 1, // PAGE_SIZE
+ 1, // TC_REORDER_ENABLE
+ 1, // TC_ARB_HOLD_ENABLE
+ 0, // IN_FLIGHT_LIMIT_ENABLE
+ 0x8, // IN_FLIGHT_LIMIT
+ 1, // CP_CLNT_ENABLE
+ 1, // VGT_CLNT_ENABLE
+ 1, // TC_CLNT_ENABLE
+ 1, // RB_CLNT_ENABLE
+ 1, // PA_CLNT_ENABLE
+};
+
+// -----------------------------
+// interrupt block register data
+// -----------------------------
+static const gsl_intrblock_reg_t gsl_cfg_intrblock_reg[GSL_INTR_BLOCK_COUNT] =
+{
+ { // Yamato MH
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ },
+ { // Yamato CP
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ },
+ { // Yamato RBBM
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ },
+ { // Yamato SQ
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ },
+ { // G12
+ GSL_INTR_BLOCK_G12,
+ GSL_INTR_G12_MH,
+#ifndef _Z180
+ GSL_INTR_G12_FBC,
+#else
+ GSL_INTR_G12_FIFO,
+#endif //_Z180
+ (ADDR_VGC_IRQSTATUS >> 2),
+ (ADDR_VGC_IRQSTATUS >> 2),
+ (ADDR_VGC_IRQENABLE >> 2)
+ },
+ { // G12 MH
+ GSL_INTR_BLOCK_G12_MH,
+ GSL_INTR_G12_MH_AXI_READ_ERROR,
+ GSL_INTR_G12_MH_MMU_PAGE_FAULT,
+ ADDR_MH_INTERRUPT_STATUS, // G12 MH offsets are considered to be dword based, therefore no down shift
+ ADDR_MH_INTERRUPT_CLEAR,
+ ADDR_MH_INTERRUPT_MASK
+ },
+};
+
+// -----------------------
+// interrupt mask bit data
+// -----------------------
+static const int gsl_cfg_intr_mask[GSL_INTR_COUNT] =
+{
+ 0,
+ 0,
+ 0,
+
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+
+ 0,
+ 0,
+ 0,
+
+ 0,
+ 0,
+
+ (1 << VGC_IRQENABLE_MH_FSHIFT),
+ (1 << VGC_IRQENABLE_G2D_FSHIFT),
+ (1 << VGC_IRQENABLE_FIFO_FSHIFT),
+#ifndef _Z180
+ (1 << VGC_IRQENABLE_FBC_FSHIFT),
+#endif
+ 0,
+ 0,
+ 0,
+};
+
+// -----------------
+// mmu register data
+// -----------------
+static const gsl_mmu_reg_t gsl_cfg_mmu_reg[GSL_DEVICE_MAX] =
+{
+ { // Yamato
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ },
+ { // G12 - MH offsets are considered to be dword based, therefore no down shift
+ ADDR_MH_MMU_CONFIG,
+ ADDR_MH_MMU_MPU_BASE,
+ ADDR_MH_MMU_MPU_END,
+ ADDR_MH_MMU_VA_RANGE,
+ ADDR_MH_MMU_PT_BASE,
+ ADDR_MH_MMU_PAGE_FAULT,
+ ADDR_MH_MMU_TRAN_ERROR,
+ ADDR_MH_MMU_INVALIDATE,
+ }
+};
+
+// -----------------
+// mh interrupt data
+// -----------------
+static const gsl_mh_intr_t gsl_cfg_mh_intr[GSL_DEVICE_MAX] =
+{
+ { // Yamato
+ 0,
+ 0,
+ 0,
+ },
+ { // G12
+ GSL_INTR_G12_MH_AXI_READ_ERROR,
+ GSL_INTR_G12_MH_AXI_WRITE_ERROR,
+ GSL_INTR_G12_MH_MMU_PAGE_FAULT,
+ }
+};
+
+#endif // __GSL__CONFIG_H
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_halconfig.h b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_halconfig.h
new file mode 100644
index 000000000000..011041236013
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_halconfig.h
@@ -0,0 +1,63 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Advanced Micro Devices nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef __GSL_HALCONFIG_H
+#define __GSL_HALCONFIG_H
+
+
+
+#define GSL_HAL_PLATFORM "i.MX35G"
+
+
+#define GSL_HAL_GPUBASE_GMEM 0x00100000 // 1MB
+#define GSL_HAL_GPUBASE_GMEM_PHYS 0x20000000 // 1MB
+
+#define GSL_HAL_GPUBASE_REG_YDX 0x30000000
+#define GSL_HAL_GPUBASE_REG_G12 0x20000000
+
+#define GSL_HAL_SIZE_REG_YDX 0x00020000 // 128KB
+#define GSL_HAL_SIZE_REG_G12 0x00001000 // 4KB
+#define GSL_HAL_SIZE_GMEM 0x00040000 // 256KB - 0 to 384KB in 128KB increments
+
+#if defined(_LINUX) && defined(GSL_MMU_TRANSLATION_ENABLED)
+#define GSL_HAL_SHMEM_SIZE_EMEM1 0x02400000 // 36MB
+#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00400000 // 4MB
+#define GSL_HAL_SHMEM_SIZE_PHYS 0x00400000 // 4MB
+#elif defined(_LINUX) //MX35 Linux can able to allocate only 4MB
+#define GSL_HAL_SHMEM_SIZE_EMEM1 0x00400000 // 4MB
+#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00200000 // 2MB
+#define GSL_HAL_SHMEM_SIZE_PHYS 0x00200000 // 2MB
+#else //Not possible to allocate 24 MB on WinCE
+#define GSL_HAL_SHMEM_SIZE_EMEM1 0x00D00000 // 13MB
+#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00200000 // 2MB
+#define GSL_HAL_SHMEM_SIZE_PHYS 0x00100000 // 1MB
+#endif
+
+#define MX35_G12_INTERRUPT 16
+
+#endif // __GSL_HALCONFIG_H
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/linux/gsl_hal.c b/drivers/mxc/amd-gpu/platform/hal/MX35/linux/gsl_hal.c
new file mode 100644
index 000000000000..294cd9eb5af9
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX35/linux/gsl_hal.c
@@ -0,0 +1,524 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+#include "gsl_hal.h"
+#include "gsl_halconfig.h"
+#include "gsl_linux_map.h"
+
+#include <linux/clk.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/vmalloc.h>
+
+#include <asm/atomic.h>
+#include <asm/uaccess.h>
+#include <asm/tlbflush.h>
+#include <asm/cacheflush.h>
+
+//////////////////////////////////////////////////////////////////////////////
+// constants
+//////////////////////////////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////////////////////
+// defines
+//////////////////////////////////////////////////////////////////////////////
+
+#define GSL_HAL_MEM1 0
+#define GSL_HAL_MEM2 1
+#define GSL_HAL_MEM3 2
+
+//#define GSL_HAL_DEBUG
+//////////////////////////////////////////////////////////////////////////////
+// types
+//////////////////////////////////////////////////////////////////////////////
+
+typedef struct _gsl_hal_t {
+ gsl_memregion_t z160_regspace;
+#if 0
+ gsl_memregion_t z430_regspace;
+#endif
+ gsl_memregion_t memchunk;
+ gsl_memregion_t memspace[GSL_SHMEM_MAX_APERTURES];
+} gsl_hal_t;
+
+//////////////////////////////////////////////////////////////////////////////
+// functions
+//////////////////////////////////////////////////////////////////////////////
+
+KGSLHAL_API int
+kgsl_hal_allocphysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[])
+{
+ //
+ // allocate physically contiguous memory
+ //
+
+ int i;
+ void *va;
+
+ va = (void*)gsl_linux_map_alloc(virtaddr, numpages*PAGE_SIZE);
+
+ if (!va)
+ return (GSL_FAILURE_OUTOFMEM);
+
+ for(i = 0; i < numpages; i++)
+ {
+ scattergatterlist[i] = page_to_phys(vmalloc_to_page(va));
+ va += PAGE_SIZE;
+ }
+
+ return (GSL_SUCCESS);
+}
+
+// ---------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_freephysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[])
+{
+ //
+ // free physical memory
+ //
+
+ gsl_linux_map_free(virtaddr);
+
+ return(GSL_SUCCESS);
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_init(void)
+{
+ gsl_hal_t *hal;
+ unsigned long totalsize, mem1size;
+ unsigned int va, pa;
+
+ if (gsl_driver.hal)
+ {
+ return (GSL_FAILURE_ALREADYINITIALIZED);
+ }
+
+ gsl_driver.hal = (void *)kos_malloc(sizeof(gsl_hal_t));
+
+ if (!gsl_driver.hal)
+ {
+ return (GSL_FAILURE_OUTOFMEM);
+ }
+
+ kos_memset(gsl_driver.hal, 0, sizeof(gsl_hal_t));
+
+
+ // overlay structure on hal memory
+ hal = (gsl_hal_t *) gsl_driver.hal;
+
+#if 0
+ // setup register space
+ hal->z430_regspace.mmio_phys_base = GSL_HAL_GPUBASE_REG_YDX;
+ hal->z430_regspace.sizebytes = GSL_HAL_SIZE_REG_YDX;
+ hal->z430_regspace.mmio_virt_base = (unsigned char*)ioremap(hal->z430_regspace.mmio_phys_base, hal->z430_regspace.sizebytes);
+
+ if (hal->z430_regspace.mmio_virt_base == NULL)
+ {
+ return (GSL_FAILURE_SYSTEMERROR);
+ }
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->z430_regspace.mmio_phys_base = 0x%p\n", __func__, (void*)hal->z430_regspace.mmio_phys_base);
+ printk(KERN_INFO "%s: hal->z430_regspace.mmio_virt_base = 0x%p\n", __func__, (void*)hal->z430_regspace.mmio_virt_base);
+ printk(KERN_INFO "%s: hal->z430_regspace.sizebytes = 0x%08x\n", __func__, hal->z430_regspace.sizebytes);
+#endif
+#endif
+
+ hal->z160_regspace.mmio_phys_base = GSL_HAL_GPUBASE_REG_G12;
+ hal->z160_regspace.sizebytes = GSL_HAL_SIZE_REG_G12;
+ hal->z160_regspace.mmio_virt_base = (unsigned char*)ioremap(hal->z160_regspace.mmio_phys_base, hal->z160_regspace.sizebytes);
+
+ if (hal->z160_regspace.mmio_virt_base == NULL)
+ {
+ return (GSL_FAILURE_SYSTEMERROR);
+ }
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->z160_regspace.mmio_phys_base = 0x%p\n", __func__, (void*)hal->z160_regspace.mmio_phys_base);
+ printk(KERN_INFO "%s: hal->z160_regspace.mmio_virt_base = 0x%p\n", __func__, (void*)hal->z160_regspace.mmio_virt_base);
+ printk(KERN_INFO "%s: hal->z160_regspace.sizebytes = 0x%08x\n", __func__, hal->z160_regspace.sizebytes);
+#endif
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ totalsize = GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS;
+ mem1size = GSL_HAL_SHMEM_SIZE_EMEM1;
+#else
+ totalsize = GSL_HAL_SHMEM_SIZE_EMEM1 + GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS;
+ mem1size = GSL_HAL_SHMEM_SIZE_EMEM1;
+#endif
+
+ // allocate a single chunk of physical memory
+ va = (unsigned int)dma_alloc_coherent(0, totalsize, (dma_addr_t *)&pa, GFP_DMA | GFP_KERNEL);
+
+ if (va)
+ {
+ kos_memset((void *)va, 0, totalsize);
+
+ hal->memchunk.mmio_virt_base = (void *)va;
+ hal->memchunk.mmio_phys_base = pa;
+ hal->memchunk.sizebytes = totalsize;
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->memchunk.mmio_phys_base = 0x%p\n", __func__, (void*)hal->memchunk.mmio_phys_base);
+ printk(KERN_INFO "%s: hal->memchunk.mmio_virt_base = 0x%p\n", __func__, (void*)hal->memchunk.mmio_virt_base);
+ printk(KERN_INFO "%s: hal->memchunk.sizebytes = 0x%08x\n", __func__, hal->memchunk.sizebytes);
+#endif
+
+ hal->memspace[GSL_HAL_MEM2].mmio_virt_base = (void *) va;
+ hal->memspace[GSL_HAL_MEM2].gpu_base = pa;
+ hal->memspace[GSL_HAL_MEM2].sizebytes = GSL_HAL_SHMEM_SIZE_EMEM2;
+ va += GSL_HAL_SHMEM_SIZE_EMEM2;
+ pa += GSL_HAL_SHMEM_SIZE_EMEM2;
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM2].gpu_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM2].mmio_virt_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM2].sizebytes);
+#endif
+
+ hal->memspace[GSL_HAL_MEM3].mmio_virt_base = (void *) va;
+ hal->memspace[GSL_HAL_MEM3].gpu_base = pa;
+ hal->memspace[GSL_HAL_MEM3].sizebytes = GSL_HAL_SHMEM_SIZE_PHYS;
+ va += GSL_HAL_SHMEM_SIZE_PHYS;
+ pa += GSL_HAL_SHMEM_SIZE_PHYS;
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM3].gpu_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM3].mmio_virt_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM3].sizebytes);
+#endif
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ gsl_linux_map_init();
+ hal->memspace[GSL_HAL_MEM1].mmio_virt_base = (void *)GSL_LINUX_MAP_RANGE_START;
+ hal->memspace[GSL_HAL_MEM1].gpu_base = GSL_LINUX_MAP_RANGE_START;
+ hal->memspace[GSL_HAL_MEM1].sizebytes = mem1size;
+#else
+ hal->memspace[GSL_HAL_MEM1].mmio_virt_base = (void *) va;
+ hal->memspace[GSL_HAL_MEM1].gpu_base = pa;
+ hal->memspace[GSL_HAL_MEM1].sizebytes = mem1size;
+#endif
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM1].gpu_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM1].mmio_virt_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM1].sizebytes);
+#endif
+ }
+ else
+ {
+ kgsl_hal_close();
+ return (GSL_FAILURE_SYSTEMERROR);
+ }
+
+ return GSL_SUCCESS;
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_close(void)
+{
+ gsl_hal_t *hal;
+
+ if (gsl_driver.hal)
+ {
+ // overlay structure on hal memory
+ hal = (gsl_hal_t *) gsl_driver.hal;
+
+ // unmap registers
+#if 0
+ if (hal->z430_regspace.mmio_virt_base)
+ {
+ iounmap(hal->z430_regspace.mmio_virt_base);
+ }
+#endif
+ if (hal->z160_regspace.mmio_virt_base)
+ {
+ iounmap(hal->z160_regspace.mmio_virt_base);
+ }
+
+ // free physical block
+ if (hal->memchunk.mmio_virt_base)
+ {
+ dma_free_coherent(0, hal->memchunk.sizebytes, hal->memchunk.mmio_virt_base, hal->memchunk.mmio_phys_base);
+ }
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ gsl_linux_map_destroy();
+#endif
+
+ // release hal struct
+ kos_memset(hal, 0, sizeof(gsl_hal_t));
+ kos_free(gsl_driver.hal);
+ gsl_driver.hal = NULL;
+ }
+
+ return (GSL_SUCCESS);
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_getshmemconfig(gsl_shmemconfig_t *config)
+{
+ int status = GSL_FAILURE_DEVICEERROR;
+ gsl_hal_t *hal = (gsl_hal_t *) gsl_driver.hal;
+
+ kos_memset(config, 0, sizeof(gsl_shmemconfig_t));
+
+ if (hal)
+ {
+ config->numapertures = GSL_SHMEM_MAX_APERTURES;
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ config->apertures[0].id = GSL_APERTURE_MMU;
+#else
+ config->apertures[0].id = GSL_APERTURE_EMEM;
+#endif
+ config->apertures[0].channel = GSL_CHANNEL_1;
+ config->apertures[0].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM1].mmio_virt_base;
+ config->apertures[0].gpubase = hal->memspace[GSL_HAL_MEM1].gpu_base;
+ config->apertures[0].sizebytes = hal->memspace[GSL_HAL_MEM1].sizebytes;
+
+ config->apertures[1].id = GSL_APERTURE_EMEM;
+ config->apertures[1].channel = GSL_CHANNEL_2;
+ config->apertures[1].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM2].mmio_virt_base;
+ config->apertures[1].gpubase = hal->memspace[GSL_HAL_MEM2].gpu_base;
+ config->apertures[1].sizebytes = hal->memspace[GSL_HAL_MEM2].sizebytes;
+
+ config->apertures[2].id = GSL_APERTURE_PHYS;
+ config->apertures[2].channel = GSL_CHANNEL_1;
+ config->apertures[2].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM3].mmio_virt_base;
+ config->apertures[2].gpubase = hal->memspace[GSL_HAL_MEM3].gpu_base;
+ config->apertures[2].sizebytes = hal->memspace[GSL_HAL_MEM3].sizebytes;
+
+ status = GSL_SUCCESS;
+ }
+
+ return (status);
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_getdevconfig(gsl_deviceid_t device_id, gsl_devconfig_t *config)
+{
+ int status = GSL_FAILURE_DEVICEERROR;
+ gsl_hal_t *hal = (gsl_hal_t *) gsl_driver.hal;
+
+ kos_memset(config, 0, sizeof(gsl_devconfig_t));
+
+ if (hal)
+ {
+ switch (device_id)
+ {
+ case GSL_DEVICE_YAMATO:
+ {
+#if 0
+ mh_mmu_config_u mmu_config = {0};
+
+ config->gmemspace.gpu_base = 0;
+ config->gmemspace.mmio_virt_base = 0;
+ config->gmemspace.mmio_phys_base = 0;
+ config->gmemspace.sizebytes = GSL_HAL_SIZE_GMEM;
+
+ config->regspace.gpu_base = 0;
+ config->regspace.mmio_virt_base = (unsigned char *)hal->z430_regspace.mmio_virt_base;
+ config->regspace.mmio_phys_base = (unsigned int) hal->z430_regspace.mmio_phys_base;
+ config->regspace.sizebytes = GSL_HAL_SIZE_REG_YDX;
+
+ mmu_config.f.mmu_enable = 1;
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ mmu_config.f.split_mode_enable = 0;
+ mmu_config.f.rb_w_clnt_behavior = 1;
+ mmu_config.f.cp_w_clnt_behavior = 1;
+ mmu_config.f.cp_r0_clnt_behavior = 1;
+ mmu_config.f.cp_r1_clnt_behavior = 1;
+ mmu_config.f.cp_r2_clnt_behavior = 1;
+ mmu_config.f.cp_r3_clnt_behavior = 1;
+ mmu_config.f.cp_r4_clnt_behavior = 1;
+ mmu_config.f.vgt_r0_clnt_behavior = 1;
+ mmu_config.f.vgt_r1_clnt_behavior = 1;
+ mmu_config.f.tc_r_clnt_behavior = 1;
+ mmu_config.f.pa_w_clnt_behavior = 1;
+#endif // GSL_MMU_TRANSLATION_ENABLED
+
+ config->mmu_config = mmu_config.val;
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ config->va_base = hal->memspace[GSL_HAL_MEM1].gpu_base;
+ config->va_range = hal->memspace[GSL_HAL_MEM1].sizebytes;
+#else
+ config->va_base = 0x00000000;
+ config->va_range = 0x00000000;
+#endif // GSL_MMU_TRANSLATION_ENABLED
+
+ // turn off memory protection unit by setting acceptable physical address range to include all pages
+ config->mpu_base = 0x00000000; // hal->memchunk.mmio_virt_base;
+ config->mpu_range = 0xFFFFF000; // hal->memchunk.sizebytes;
+
+ status = GSL_SUCCESS;
+#endif
+ break;
+ }
+
+ case GSL_DEVICE_G12:
+ {
+#ifndef GSL_MMU_TRANSLATION_ENABLED
+ unsigned int mmu_config = {0};
+#endif
+ config->regspace.gpu_base = 0;
+ config->regspace.mmio_virt_base = (unsigned char *)hal->z160_regspace.mmio_virt_base;
+ config->regspace.mmio_phys_base = (unsigned int) hal->z160_regspace.mmio_phys_base;
+ config->regspace.sizebytes = GSL_HAL_SIZE_REG_G12;
+
+
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ config->mmu_config = 0x00555551;
+ config->va_base = hal->memspace[GSL_HAL_MEM1].gpu_base;
+ config->va_range = hal->memspace[GSL_HAL_MEM1].sizebytes;
+#else
+ config->mmu_config = mmu_config;
+ config->va_base = 0x00000000;
+ config->va_range = 0x00000000;
+#endif // GSL_MMU_TRANSLATION_ENABLED
+
+ config->mpu_base = 0x00000000; //(unsigned int) hal->memchunk.mmio_virt_base;
+ config->mpu_range = 0xFFFFF000; //hal->memchunk.sizebytes;
+
+ status = GSL_SUCCESS;
+ break;
+ }
+
+ default:
+
+ break;
+ }
+ }
+
+ return (status);
+}
+
+//----------------------------------------------------------------------------
+//
+// kgsl_hal_getchipid
+//
+// The proper platform method, build from RBBM_PERIPHIDx and RBBM_PATCH_RELEASE
+//
+KGSLHAL_API gsl_chipid_t
+kgsl_hal_getchipid(gsl_deviceid_t device_id)
+{
+ return (0);
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_getplatformtype(char *platform)
+{
+ if (gsl_driver.hal)
+ {
+ kos_strcpy(platform, GSL_HAL_PLATFORM);
+ return (GSL_SUCCESS);
+ }
+ else
+ {
+ return (GSL_FAILURE_NOTINITIALIZED);
+ }
+}
+
+//---------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_setpowerstate(gsl_deviceid_t device_id, int state, unsigned int value)
+{
+ gsl_device_t *device = &gsl_driver.device[device_id-1]; // device_id is 1 based
+ struct clk *gpu_clk = 0;
+
+ // unreferenced formal parameters
+ (void) value;
+
+ switch (device_id)
+ {
+ case GSL_DEVICE_G12:
+ gpu_clk = clk_get(0, "gpu2d_clk");
+ break;
+ default:
+ return (GSL_FAILURE_DEVICEERROR);
+ }
+
+ if (!gpu_clk)
+ return (GSL_FAILURE_DEVICEERROR);
+
+ switch (state)
+ {
+ case GSL_PWRFLAGS_CLK_ON:
+ break;
+ case GSL_PWRFLAGS_POWER_ON:
+ clk_enable(gpu_clk);
+ kgsl_device_autogate_init(&gsl_driver.device[device_id-1]);
+ break;
+ case GSL_PWRFLAGS_CLK_OFF:
+ break;
+ case GSL_PWRFLAGS_POWER_OFF:
+ if (device->ftbl.device_idle(device, GSL_TIMEOUT_DEFAULT) != GSL_SUCCESS)
+ {
+ return (GSL_FAILURE_DEVICEERROR);
+ }
+ kgsl_device_autogate_exit(&gsl_driver.device[device_id-1]);
+ clk_disable(gpu_clk);
+ break;
+ default:
+ break;
+ }
+
+ return (GSL_SUCCESS);
+}
+
+KGSLHAL_API int kgsl_clock(gsl_deviceid_t dev, int enable)
+{
+ struct clk *gpu_clk = 0;
+
+ switch (dev)
+ {
+ case GSL_DEVICE_G12:
+ gpu_clk = clk_get(0, "gpu2d_clk");
+ break;
+ default:
+ printk(KERN_ERR "GPU device %d is invalid!\n", dev);
+ return (GSL_FAILURE_DEVICEERROR);
+ }
+
+ if (IS_ERR(gpu_clk)) {
+ printk(KERN_ERR "%s: GPU clock get failed!\n", __func__);
+ return (GSL_FAILURE_DEVICEERROR);
+ }
+
+ if (enable)
+ clk_enable(gpu_clk);
+ else
+ clk_disable(gpu_clk);
+
+ return (GSL_SUCCESS);
+}
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.c b/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.c
new file mode 100644
index 000000000000..f3ca6191d7c2
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.c
@@ -0,0 +1,31 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+#include "kos_libapi.h"
+
+//
+// Return the maximum amount of memory that can be allocated to the Z160. This number
+// will be constrained to 2MB as a minimum and the original hardcoded value for the caller
+// as a maximum. If the return value is outside of this range, then the original value in
+// the caller will be used. For this reason, returning 0 is used to signify to use the
+// original value as the default.
+//
+KOS_DLLEXPORT unsigned long kgsl_get_z160_memory_amount(void)
+{
+ return(0);
+}
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.h b/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.h
new file mode 100644
index 000000000000..164a17c925c4
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.h
@@ -0,0 +1,41 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Advanced Micro Devices nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef GSL_MEMCFG_H
+#define GSL_MEMCFG_H
+
+//
+// Return the maximum amount of memory that can be allocated to the Z430. This number
+// will be constrained to 2MB as a minimum and the original hardcoded value for the caller
+// as a maximum. If the return value is outside of this range, then the original value in
+// the caller will be used. For this reason, returning 0 is used to signify to use the
+// original value as the default.
+//
+KOS_DLLEXPORT unsigned long kgsl_get_z160_memory_amount(void);
+
+#endif
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_buildconfig.h b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_buildconfig.h
new file mode 100644
index 000000000000..82824f511d5e
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_buildconfig.h
@@ -0,0 +1,62 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Advanced Micro Devices nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef __GSL__BUILDCONFIG_H
+#define __GSL__BUILDCONFIG_H
+
+#define GSL_BLD_YAMATO
+#define GSL_BLD_G12
+
+#define GSL_LOCKING_COURSEGRAIN
+
+#define GSL_STATS_MEM
+#define GSL_STATS_RINGBUFFER
+#define GSL_STATS_MMU
+
+#define GSL_RB_USE_MEM_RPTR
+#define GSL_RB_USE_MEM_TIMESTAMP
+#define GSL_RB_TIMESTAMP_INTERUPT
+//#define GSL_RB_USE_WPTR_POLLING
+
+#if defined(_WIN32_WCE) && (_WIN32_WCE >= 600)
+#define GSL_DEVICE_SHADOW_MEMSTORE_TO_USER
+#endif
+
+//#define GSL_MMU_TRANSLATION_ENABLED
+//#define GSL_MMU_PAGETABLE_PERPROCESS
+
+#define GSL_CALLER_PROCESS_MAX 10
+#define GSL_SHMEM_MAX_APERTURES 3
+
+#ifdef _WIN32
+#ifndef _CRT_SECURE_NO_DEPRECATE
+#define _CRT_SECURE_NO_DEPRECATE
+#endif
+#endif // _WIN32
+
+#endif // __GSL__BUILDCONFIG_H
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_config.h b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_config.h
new file mode 100644
index 000000000000..6fad1d01277f
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_config.h
@@ -0,0 +1,222 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Advanced Micro Devices nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef __GSL__CONFIG_H
+#define __GSL__CONFIG_H
+
+// ------------------------
+// Yamato ringbuffer config
+// ------------------------
+static const unsigned int gsl_cfg_rb_sizelog2quadwords = GSL_RB_SIZE_32K;
+static const unsigned int gsl_cfg_rb_blksizequadwords = GSL_RB_SIZE_16;
+
+// ------------------------
+// Yamato MH arbiter config
+// ------------------------
+static const mh_arbiter_config_t gsl_cfg_yamato_mharb =
+{
+ 0x10, // same_page_limit
+ 0, // same_page_granularity
+ 1, // l1_arb_enable
+ 1, // l1_arb_hold_enable
+ 0, // l2_arb_control
+ 1, // page_size
+ 1, // tc_reorder_enable
+ 1, // tc_arb_hold_enable
+ 1, // in_flight_limit_enable
+ 0x8, // in_flight_limit
+ 1, // cp_clnt_enable
+ 1, // vgt_clnt_enable
+ 1, // tc_clnt_enable
+ 1, // rb_clnt_enable
+ 1, // pa_clnt_enable
+};
+
+// ---------------------
+// G12 MH arbiter config
+// ---------------------
+static const REG_MH_ARBITER_CONFIG gsl_cfg_g12_mharb =
+{
+ 0x10, // SAME_PAGE_LIMIT
+ 0, // SAME_PAGE_GRANULARITY
+ 1, // L1_ARB_ENABLE
+ 1, // L1_ARB_HOLD_ENABLE
+ 0, // L2_ARB_CONTROL
+ 1, // PAGE_SIZE
+ 1, // TC_REORDER_ENABLE
+ 1, // TC_ARB_HOLD_ENABLE
+ 0, // IN_FLIGHT_LIMIT_ENABLE
+ 0x8, // IN_FLIGHT_LIMIT
+ 1, // CP_CLNT_ENABLE
+ 1, // VGT_CLNT_ENABLE
+ 1, // TC_CLNT_ENABLE
+ 1, // RB_CLNT_ENABLE
+ 1, // PA_CLNT_ENABLE
+};
+
+// -----------------------------
+// interrupt block register data
+// -----------------------------
+static const gsl_intrblock_reg_t gsl_cfg_intrblock_reg[GSL_INTR_BLOCK_COUNT] =
+{
+ { // Yamato MH
+ GSL_INTR_BLOCK_YDX_MH,
+ GSL_INTR_YDX_MH_AXI_READ_ERROR,
+ GSL_INTR_YDX_MH_MMU_PAGE_FAULT,
+ mmMH_INTERRUPT_STATUS,
+ mmMH_INTERRUPT_CLEAR,
+ mmMH_INTERRUPT_MASK
+ },
+ { // Yamato CP
+ GSL_INTR_BLOCK_YDX_CP,
+ GSL_INTR_YDX_CP_SW_INT,
+ GSL_INTR_YDX_CP_RING_BUFFER,
+ mmCP_INT_STATUS,
+ mmCP_INT_ACK,
+ mmCP_INT_CNTL
+ },
+ { // Yamato RBBM
+ GSL_INTR_BLOCK_YDX_RBBM,
+ GSL_INTR_YDX_RBBM_READ_ERROR,
+ GSL_INTR_YDX_RBBM_GUI_IDLE,
+ mmRBBM_INT_STATUS,
+ mmRBBM_INT_ACK,
+ mmRBBM_INT_CNTL
+ },
+ { // Yamato SQ
+ GSL_INTR_BLOCK_YDX_SQ,
+ GSL_INTR_YDX_SQ_PS_WATCHDOG,
+ GSL_INTR_YDX_SQ_VS_WATCHDOG,
+ mmSQ_INT_STATUS,
+ mmSQ_INT_ACK,
+ mmSQ_INT_CNTL
+ },
+ { // G12
+ GSL_INTR_BLOCK_G12,
+ GSL_INTR_G12_MH,
+#ifndef _Z180
+ GSL_INTR_G12_FBC,
+#else
+ GSL_INTR_G12_FIFO,
+#endif //_Z180
+ (ADDR_VGC_IRQSTATUS >> 2),
+ (ADDR_VGC_IRQSTATUS >> 2),
+ (ADDR_VGC_IRQENABLE >> 2)
+ },
+ { // G12 MH
+ GSL_INTR_BLOCK_G12_MH,
+ GSL_INTR_G12_MH_AXI_READ_ERROR,
+ GSL_INTR_G12_MH_MMU_PAGE_FAULT,
+ ADDR_MH_INTERRUPT_STATUS, // G12 MH offsets are considered to be dword based, therefore no down shift
+ ADDR_MH_INTERRUPT_CLEAR,
+ ADDR_MH_INTERRUPT_MASK
+ },
+};
+
+// -----------------------
+// interrupt mask bit data
+// -----------------------
+static const int gsl_cfg_intr_mask[GSL_INTR_COUNT] =
+{
+ MH_INTERRUPT_MASK__AXI_READ_ERROR,
+ MH_INTERRUPT_MASK__AXI_WRITE_ERROR,
+ MH_INTERRUPT_MASK__MMU_PAGE_FAULT,
+
+ CP_INT_CNTL__SW_INT_MASK,
+ CP_INT_CNTL__T0_PACKET_IN_IB_MASK,
+ CP_INT_CNTL__OPCODE_ERROR_MASK,
+ CP_INT_CNTL__PROTECTED_MODE_ERROR_MASK,
+ CP_INT_CNTL__RESERVED_BIT_ERROR_MASK,
+ CP_INT_CNTL__IB_ERROR_MASK,
+ CP_INT_CNTL__IB2_INT_MASK,
+ CP_INT_CNTL__IB1_INT_MASK,
+ CP_INT_CNTL__RB_INT_MASK,
+
+ RBBM_INT_CNTL__RDERR_INT_MASK,
+ RBBM_INT_CNTL__DISPLAY_UPDATE_INT_MASK,
+ RBBM_INT_CNTL__GUI_IDLE_INT_MASK,
+
+ SQ_INT_CNTL__PS_WATCHDOG_MASK,
+ SQ_INT_CNTL__VS_WATCHDOG_MASK,
+
+ (1 << VGC_IRQENABLE_MH_FSHIFT),
+ (1 << VGC_IRQENABLE_G2D_FSHIFT),
+ (1 << VGC_IRQENABLE_FIFO_FSHIFT),
+#ifndef _Z180
+ (1 << VGC_IRQENABLE_FBC_FSHIFT),
+#endif
+ (1 << MH_INTERRUPT_MASK_AXI_READ_ERROR_FSHIFT),
+ (1 << MH_INTERRUPT_MASK_AXI_WRITE_ERROR_FSHIFT),
+ (1 << MH_INTERRUPT_MASK_MMU_PAGE_FAULT_FSHIFT),
+};
+
+// -----------------
+// mmu register data
+// -----------------
+static const gsl_mmu_reg_t gsl_cfg_mmu_reg[GSL_DEVICE_MAX] =
+{
+ { // Yamato
+ mmMH_MMU_CONFIG,
+ mmMH_MMU_MPU_BASE,
+ mmMH_MMU_MPU_END,
+ mmMH_MMU_VA_RANGE,
+ mmMH_MMU_PT_BASE,
+ mmMH_MMU_PAGE_FAULT,
+ mmMH_MMU_TRAN_ERROR,
+ mmMH_MMU_INVALIDATE,
+ },
+ { // G12 - MH offsets are considered to be dword based, therefore no down shift
+ ADDR_MH_MMU_CONFIG,
+ ADDR_MH_MMU_MPU_BASE,
+ ADDR_MH_MMU_MPU_END,
+ ADDR_MH_MMU_VA_RANGE,
+ ADDR_MH_MMU_PT_BASE,
+ ADDR_MH_MMU_PAGE_FAULT,
+ ADDR_MH_MMU_TRAN_ERROR,
+ ADDR_MH_MMU_INVALIDATE,
+ }
+};
+
+// -----------------
+// mh interrupt data
+// -----------------
+static const gsl_mh_intr_t gsl_cfg_mh_intr[GSL_DEVICE_MAX] =
+{
+ { // Yamato
+ GSL_INTR_YDX_MH_AXI_READ_ERROR,
+ GSL_INTR_YDX_MH_AXI_WRITE_ERROR,
+ GSL_INTR_YDX_MH_MMU_PAGE_FAULT,
+ },
+ { // G12
+ GSL_INTR_G12_MH_AXI_READ_ERROR,
+ GSL_INTR_G12_MH_AXI_WRITE_ERROR,
+ GSL_INTR_G12_MH_MMU_PAGE_FAULT,
+ }
+};
+
+#endif // __GSL__CONFIG_H
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_halconfig.h b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_halconfig.h
new file mode 100644
index 000000000000..589c56fa9bfa
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_halconfig.h
@@ -0,0 +1,58 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Advanced Micro Devices nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef __GSL_HALCONFIG_H
+#define __GSL_HALCONFIG_H
+
+
+#define GSL_HAL_PLATFORM "i.MX51"
+
+#define GSL_HAL_GPUBASE_GMEM 0x00100000 // 1MB
+#define GSL_HAL_GPUBASE_GMEM_PHYS 0x20000000 // 1MB
+
+#define GSL_HAL_GPUBASE_REG_YDX 0x30000000
+#define GSL_HAL_GPUBASE_REG_G12 0xD0000000
+
+#define GSL_HAL_SIZE_REG_YDX 0x00020000 // 128KB
+#define GSL_HAL_SIZE_REG_G12 0x00001000 // 4KB
+#define GSL_HAL_SIZE_GMEM 0x00020000 // 128KB - 0 to 384KB in 128KB increments
+
+#if defined(GSL_MMU_TRANSLATION_ENABLED)
+#define GSL_HAL_SHMEM_SIZE_EMEM1 0x02400000 // 36MB
+#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00400000 // 4MB
+#define GSL_HAL_SHMEM_SIZE_PHYS 0x00400000 // 4MB
+#else
+#define GSL_HAL_SHMEM_SIZE_EMEM1 0x00D00000 // 13MB
+#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00200000 // 2MB
+#define GSL_HAL_SHMEM_SIZE_PHYS 0x00100000 // 1MB
+#endif
+
+#define MX51_G12_INTERRUPT 84 // Interrupt line taken from Reference Manual
+#define MX51_YDX_INTERRUPT 12 // Interrupt line taken from Reference Manual
+
+#endif // __GSL_HALCONFIG_H
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/linux/gsl_hal.c b/drivers/mxc/amd-gpu/platform/hal/MX51/linux/gsl_hal.c
new file mode 100644
index 000000000000..965416b59ec1
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX51/linux/gsl_hal.c
@@ -0,0 +1,598 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+#include "gsl_hal.h"
+#include "gsl_halconfig.h"
+#include "gsl_memcfg.h"
+#include "gsl_linux_map.h"
+
+#include <linux/clk.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/vmalloc.h>
+
+#include <asm/atomic.h>
+#include <asm/uaccess.h>
+#include <asm/tlbflush.h>
+#include <asm/cacheflush.h>
+
+//////////////////////////////////////////////////////////////////////////////
+// constants
+//////////////////////////////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////////////////////
+// defines
+//////////////////////////////////////////////////////////////////////////////
+
+#define GSL_HAL_MEM1 0
+#define GSL_HAL_MEM2 1
+#define GSL_HAL_MEM3 2
+
+//#define GSL_HAL_DEBUG
+
+//////////////////////////////////////////////////////////////////////////////
+// types
+//////////////////////////////////////////////////////////////////////////////
+
+typedef struct _gsl_hal_t {
+ gsl_memregion_t z160_regspace;
+ gsl_memregion_t z430_regspace;
+ gsl_memregion_t memchunk;
+ gsl_memregion_t memspace[GSL_SHMEM_MAX_APERTURES];
+} gsl_hal_t;
+
+extern phys_addr_t gpu_2d_regbase;
+extern int gpu_2d_regsize;
+extern phys_addr_t gpu_3d_regbase;
+extern int gpu_3d_regsize;
+extern int gmem_size;
+extern phys_addr_t gpu_reserved_mem;
+extern int gpu_reserved_mem_size;
+
+//////////////////////////////////////////////////////////////////////////////
+// functions
+//////////////////////////////////////////////////////////////////////////////
+
+KGSLHAL_API int
+kgsl_hal_allocphysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[])
+{
+ //
+ // allocate physically contiguous memory
+ //
+
+ int i;
+ void *va;
+
+ va = gsl_linux_map_alloc(virtaddr, numpages*PAGE_SIZE);
+
+ if (!va)
+ return (GSL_FAILURE_OUTOFMEM);
+
+ for(i = 0; i < numpages; i++)
+ {
+ scattergatterlist[i] = page_to_phys(vmalloc_to_page(va));
+ va += PAGE_SIZE;
+ }
+
+ return (GSL_SUCCESS);
+}
+
+// ---------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_freephysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[])
+{
+ //
+ // free physical memory
+ //
+
+ gsl_linux_map_free(virtaddr);
+
+ return(GSL_SUCCESS);
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_init(void)
+{
+ gsl_hal_t *hal;
+ unsigned long totalsize, mem1size;
+ unsigned int va, pa;
+
+ if (gsl_driver.hal)
+ {
+ return (GSL_FAILURE_ALREADYINITIALIZED);
+ }
+
+ gsl_driver.hal = (void *)kos_malloc(sizeof(gsl_hal_t));
+
+ if (!gsl_driver.hal)
+ {
+ return (GSL_FAILURE_OUTOFMEM);
+ }
+
+ kos_memset(gsl_driver.hal, 0, sizeof(gsl_hal_t));
+
+
+ // overlay structure on hal memory
+ hal = (gsl_hal_t *) gsl_driver.hal;
+
+ // setup register space
+ if(gpu_3d_regbase && gpu_3d_regsize){
+ hal->z430_regspace.mmio_phys_base = gpu_3d_regbase;
+ hal->z430_regspace.sizebytes = gpu_3d_regsize;
+ }else{
+ hal->z430_regspace.mmio_phys_base = GSL_HAL_GPUBASE_REG_YDX;
+ hal->z430_regspace.sizebytes = GSL_HAL_SIZE_REG_YDX;
+ }
+ hal->z430_regspace.mmio_virt_base = (unsigned char*)ioremap(hal->z430_regspace.mmio_phys_base, hal->z430_regspace.sizebytes);
+
+ if (hal->z430_regspace.mmio_virt_base == NULL)
+ {
+ return (GSL_FAILURE_SYSTEMERROR);
+ }
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->z430_regspace.mmio_phys_base = 0x%p\n", __func__, (void*)hal->z430_regspace.mmio_phys_base);
+ printk(KERN_INFO "%s: hal->z430_regspace.mmio_virt_base = 0x%p\n", __func__, (void*)hal->z430_regspace.mmio_virt_base);
+ printk(KERN_INFO "%s: hal->z430_regspace.sizebytes = 0x%08x\n", __func__, hal->z430_regspace.sizebytes);
+#endif
+
+ if(gpu_2d_regbase && gpu_2d_regsize){
+ hal->z160_regspace.mmio_phys_base = gpu_2d_regbase;
+ hal->z160_regspace.sizebytes = gpu_2d_regsize;
+ }else{
+ hal->z160_regspace.mmio_phys_base = GSL_HAL_GPUBASE_REG_G12;
+ hal->z160_regspace.sizebytes = GSL_HAL_SIZE_REG_G12;
+ }
+ hal->z160_regspace.mmio_virt_base = (unsigned char*)ioremap(hal->z160_regspace.mmio_phys_base, hal->z160_regspace.sizebytes);
+
+ if (hal->z160_regspace.mmio_virt_base == NULL)
+ {
+ return (GSL_FAILURE_SYSTEMERROR);
+ }
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->z160_regspace.mmio_phys_base = 0x%p\n", __func__, (void*)hal->z160_regspace.mmio_phys_base);
+ printk(KERN_INFO "%s: hal->z160_regspace.mmio_virt_base = 0x%p\n", __func__, (void*)hal->z160_regspace.mmio_virt_base);
+ printk(KERN_INFO "%s: hal->z160_regspace.sizebytes = 0x%08x\n", __func__, hal->z160_regspace.sizebytes);
+#endif
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ totalsize = GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS;
+ mem1size = GSL_HAL_SHMEM_SIZE_EMEM1;
+ if (gpu_reserved_mem && gpu_reserved_mem_size >= totalsize)
+ {
+ pa = gpu_reserved_mem;
+ va = (unsigned int)ioremap(gpu_reserved_mem, totalsize);
+ }
+ else
+ {
+ va = (unsigned int)dma_alloc_coherent(0, totalsize, (dma_addr_t *)&pa, GFP_DMA | GFP_KERNEL);
+ }
+#else
+ if(gpu_reserved_mem && gpu_reserved_mem_size >= SZ_8M){
+ totalsize = gpu_reserved_mem_size;
+ pa = gpu_reserved_mem;
+ va = (unsigned int)ioremap(gpu_reserved_mem, gpu_reserved_mem_size);
+ }else{
+ gpu_reserved_mem = 0;
+ totalsize = GSL_HAL_SHMEM_SIZE_EMEM1 + GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS;
+ va = (unsigned int)dma_alloc_coherent(0, totalsize, (dma_addr_t *)&pa, GFP_DMA | GFP_KERNEL);
+ }
+ mem1size = totalsize - (GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS);
+#endif
+
+ if (va)
+ {
+ kos_memset((void *)va, 0, totalsize);
+
+ hal->memchunk.mmio_virt_base = (void *)va;
+ hal->memchunk.mmio_phys_base = pa;
+ hal->memchunk.sizebytes = totalsize;
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->memchunk.mmio_phys_base = 0x%p\n", __func__, (void*)hal->memchunk.mmio_phys_base);
+ printk(KERN_INFO "%s: hal->memchunk.mmio_virt_base = 0x%p\n", __func__, (void*)hal->memchunk.mmio_virt_base);
+ printk(KERN_INFO "%s: hal->memchunk.sizebytes = 0x%08x\n", __func__, hal->memchunk.sizebytes);
+#endif
+
+ hal->memspace[GSL_HAL_MEM2].mmio_virt_base = (void *) va;
+ hal->memspace[GSL_HAL_MEM2].gpu_base = pa;
+ hal->memspace[GSL_HAL_MEM2].sizebytes = GSL_HAL_SHMEM_SIZE_EMEM2;
+ va += GSL_HAL_SHMEM_SIZE_EMEM2;
+ pa += GSL_HAL_SHMEM_SIZE_EMEM2;
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM2].gpu_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM2].mmio_virt_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM2].sizebytes);
+#endif
+
+ hal->memspace[GSL_HAL_MEM3].mmio_virt_base = (void *) va;
+ hal->memspace[GSL_HAL_MEM3].gpu_base = pa;
+ hal->memspace[GSL_HAL_MEM3].sizebytes = GSL_HAL_SHMEM_SIZE_PHYS;
+ va += GSL_HAL_SHMEM_SIZE_PHYS;
+ pa += GSL_HAL_SHMEM_SIZE_PHYS;
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM3].gpu_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM3].mmio_virt_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM3].sizebytes);
+#endif
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ gsl_linux_map_init();
+ hal->memspace[GSL_HAL_MEM1].mmio_virt_base = (void *)GSL_LINUX_MAP_RANGE_START;
+ hal->memspace[GSL_HAL_MEM1].gpu_base = GSL_LINUX_MAP_RANGE_START;
+ hal->memspace[GSL_HAL_MEM1].sizebytes = mem1size;
+#else
+ hal->memspace[GSL_HAL_MEM1].mmio_virt_base = (void *) va;
+ hal->memspace[GSL_HAL_MEM1].gpu_base = pa;
+ hal->memspace[GSL_HAL_MEM1].sizebytes = mem1size;
+#endif
+
+#ifdef GSL_HAL_DEBUG
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM1].gpu_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM1].mmio_virt_base);
+ printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM1].sizebytes);
+#endif
+ }
+ else
+ {
+ kgsl_hal_close();
+ return (GSL_FAILURE_SYSTEMERROR);
+ }
+
+ return GSL_SUCCESS;
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_close(void)
+{
+ gsl_hal_t *hal;
+
+ if (gsl_driver.hal)
+ {
+ // overlay structure on hal memory
+ hal = (gsl_hal_t *) gsl_driver.hal;
+
+ // unmap registers
+ if (hal->z430_regspace.mmio_virt_base)
+ {
+ iounmap(hal->z430_regspace.mmio_virt_base);
+ }
+ if (hal->z160_regspace.mmio_virt_base)
+ {
+ iounmap(hal->z160_regspace.mmio_virt_base);
+ }
+
+ // free physical block
+ if (hal->memchunk.mmio_virt_base && gpu_reserved_mem)
+ {
+ iounmap(hal->memchunk.mmio_virt_base);
+ }
+ else
+ {
+ dma_free_coherent(0, hal->memchunk.sizebytes, hal->memchunk.mmio_virt_base, hal->memchunk.mmio_phys_base);
+ }
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ gsl_linux_map_destroy();
+#endif
+
+ // release hal struct
+ kos_memset(hal, 0, sizeof(gsl_hal_t));
+ kos_free(gsl_driver.hal);
+ gsl_driver.hal = NULL;
+ }
+
+ return (GSL_SUCCESS);
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_getshmemconfig(gsl_shmemconfig_t *config)
+{
+ int status = GSL_FAILURE_DEVICEERROR;
+ gsl_hal_t *hal = (gsl_hal_t *) gsl_driver.hal;
+
+ kos_memset(config, 0, sizeof(gsl_shmemconfig_t));
+
+ if (hal)
+ {
+ config->numapertures = GSL_SHMEM_MAX_APERTURES;
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ config->apertures[0].id = GSL_APERTURE_MMU;
+#else
+ config->apertures[0].id = GSL_APERTURE_EMEM;
+#endif
+ config->apertures[0].channel = GSL_CHANNEL_1;
+ config->apertures[0].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM1].mmio_virt_base;
+ config->apertures[0].gpubase = hal->memspace[GSL_HAL_MEM1].gpu_base;
+ config->apertures[0].sizebytes = hal->memspace[GSL_HAL_MEM1].sizebytes;
+
+ config->apertures[1].id = GSL_APERTURE_EMEM;
+ config->apertures[1].channel = GSL_CHANNEL_2;
+ config->apertures[1].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM2].mmio_virt_base;
+ config->apertures[1].gpubase = hal->memspace[GSL_HAL_MEM2].gpu_base;
+ config->apertures[1].sizebytes = hal->memspace[GSL_HAL_MEM2].sizebytes;
+
+ config->apertures[2].id = GSL_APERTURE_PHYS;
+ config->apertures[2].channel = GSL_CHANNEL_1;
+ config->apertures[2].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM3].mmio_virt_base;
+ config->apertures[2].gpubase = hal->memspace[GSL_HAL_MEM3].gpu_base;
+ config->apertures[2].sizebytes = hal->memspace[GSL_HAL_MEM3].sizebytes;
+
+ status = GSL_SUCCESS;
+ }
+
+ return (status);
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_getdevconfig(gsl_deviceid_t device_id, gsl_devconfig_t *config)
+{
+ int status = GSL_FAILURE_DEVICEERROR;
+ gsl_hal_t *hal = (gsl_hal_t *) gsl_driver.hal;
+
+ kos_memset(config, 0, sizeof(gsl_devconfig_t));
+
+ if (hal)
+ {
+ switch (device_id)
+ {
+ case GSL_DEVICE_YAMATO:
+ {
+ mh_mmu_config_u mmu_config = {0};
+
+ config->gmemspace.gpu_base = 0;
+ config->gmemspace.mmio_virt_base = 0;
+ config->gmemspace.mmio_phys_base = 0;
+ if(gmem_size){
+ config->gmemspace.sizebytes = gmem_size;
+ }else{
+ config->gmemspace.sizebytes = GSL_HAL_SIZE_GMEM;
+ }
+
+ config->regspace.gpu_base = 0;
+ config->regspace.mmio_virt_base = (unsigned char *)hal->z430_regspace.mmio_virt_base;
+ config->regspace.mmio_phys_base = (unsigned int) hal->z430_regspace.mmio_phys_base;
+ config->regspace.sizebytes = GSL_HAL_SIZE_REG_YDX;
+
+ mmu_config.f.mmu_enable = 1;
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ mmu_config.f.split_mode_enable = 0;
+ mmu_config.f.rb_w_clnt_behavior = 1;
+ mmu_config.f.cp_w_clnt_behavior = 1;
+ mmu_config.f.cp_r0_clnt_behavior = 1;
+ mmu_config.f.cp_r1_clnt_behavior = 1;
+ mmu_config.f.cp_r2_clnt_behavior = 1;
+ mmu_config.f.cp_r3_clnt_behavior = 1;
+ mmu_config.f.cp_r4_clnt_behavior = 1;
+ mmu_config.f.vgt_r0_clnt_behavior = 1;
+ mmu_config.f.vgt_r1_clnt_behavior = 1;
+ mmu_config.f.tc_r_clnt_behavior = 1;
+ mmu_config.f.pa_w_clnt_behavior = 1;
+#endif // GSL_MMU_TRANSLATION_ENABLED
+
+ config->mmu_config = mmu_config.val;
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ config->va_base = hal->memspace[GSL_HAL_MEM1].gpu_base;
+ config->va_range = hal->memspace[GSL_HAL_MEM1].sizebytes;
+#else
+ config->va_base = 0x00000000;
+ config->va_range = 0x00000000;
+#endif // GSL_MMU_TRANSLATION_ENABLED
+
+ // turn off memory protection unit by setting acceptable physical address range to include all pages
+ config->mpu_base = 0x00000000; // hal->memchunk.mmio_virt_base;
+ config->mpu_range = 0xFFFFF000; // hal->memchunk.sizebytes;
+
+ status = GSL_SUCCESS;
+ break;
+ }
+
+ case GSL_DEVICE_G12:
+ {
+ mh_mmu_config_u mmu_config = {0};
+
+ config->regspace.gpu_base = 0;
+ config->regspace.mmio_virt_base = (unsigned char *)hal->z160_regspace.mmio_virt_base;
+ config->regspace.mmio_phys_base = (unsigned int) hal->z160_regspace.mmio_phys_base;
+ config->regspace.sizebytes = GSL_HAL_SIZE_REG_G12;
+
+ mmu_config.f.mmu_enable = 1;
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ config->mmu_config = 0x00555551;
+ config->va_base = hal->memspace[GSL_HAL_MEM1].gpu_base;
+ config->va_range = hal->memspace[GSL_HAL_MEM1].sizebytes;
+#else
+ config->mmu_config = mmu_config.val;
+ config->va_base = 0x00000000;
+ config->va_range = 0x00000000;
+#endif // GSL_MMU_TRANSLATION_ENABLED
+
+ config->mpu_base = 0x00000000; //(unsigned int) hal->memchunk.mmio_virt_base;
+ config->mpu_range = 0xFFFFF000; //hal->memchunk.sizebytes;
+
+ status = GSL_SUCCESS;
+ break;
+ }
+
+ default:
+
+ break;
+ }
+ }
+
+ return (status);
+}
+
+//----------------------------------------------------------------------------
+//
+// kgsl_hal_getchipid
+//
+// The proper platform method, build from RBBM_PERIPHIDx and RBBM_PATCH_RELEASE
+//
+KGSLHAL_API gsl_chipid_t
+kgsl_hal_getchipid(gsl_deviceid_t device_id)
+{
+ gsl_device_t *device = &gsl_driver.device[device_id-1];
+ gsl_chipid_t chipid;
+ unsigned int coreid, majorid, minorid, patchid, revid;
+
+ // YDX
+ device->ftbl.device_regread(device, mmRBBM_PERIPHID1, &coreid);
+ coreid &= 0xF;
+
+ // 2.
+ device->ftbl.device_regread(device, mmRBBM_PERIPHID2, &majorid);
+ majorid = (majorid >> 4) & 0xF;
+
+ device->ftbl.device_regread(device, mmRBBM_PATCH_RELEASE, &revid);
+
+ // 2.
+ minorid = ((revid >> 0) & 0xFF); // this is a 16bit field, but extremely unlikely it would ever get this high
+
+ // 1
+ patchid = ((revid >> 16) & 0xFF);
+
+ chipid = ((coreid << 24) | (majorid << 16) | (minorid << 8) | (patchid << 0));
+
+ return (chipid);
+}
+
+//----------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_getplatformtype(char *platform)
+{
+ if (gsl_driver.hal)
+ {
+ kos_strcpy(platform, GSL_HAL_PLATFORM);
+ return (GSL_SUCCESS);
+ }
+ else
+ {
+ return (GSL_FAILURE_NOTINITIALIZED);
+ }
+}
+
+//---------------------------------------------------------------------------
+
+KGSLHAL_API int
+kgsl_hal_setpowerstate(gsl_deviceid_t device_id, int state, unsigned int value)
+{
+ gsl_device_t *device = &gsl_driver.device[device_id-1];
+ struct clk *gpu_clk = 0;
+ struct clk *garb_clk = clk_get(0, "garb_clk");
+ struct clk *emi_garb_clk = clk_get(0, "emi_garb_clk");
+
+ // unreferenced formal parameters
+ (void) value;
+
+ switch (device_id)
+ {
+ case GSL_DEVICE_G12:
+ gpu_clk = clk_get(0, "gpu2d_clk");
+ break;
+ case GSL_DEVICE_YAMATO:
+ gpu_clk = clk_get(0, "gpu3d_clk");
+ break;
+ default:
+ return (GSL_FAILURE_DEVICEERROR);
+ }
+
+ if (!gpu_clk)
+ return (GSL_FAILURE_DEVICEERROR);
+
+ switch (state)
+ {
+ case GSL_PWRFLAGS_CLK_ON:
+ break;
+ case GSL_PWRFLAGS_POWER_ON:
+ clk_enable(gpu_clk);
+ clk_enable(garb_clk);
+ clk_enable(emi_garb_clk);
+ kgsl_device_autogate_init(&gsl_driver.device[device_id-1]);
+ break;
+ case GSL_PWRFLAGS_CLK_OFF:
+ break;
+ case GSL_PWRFLAGS_POWER_OFF:
+ if (device->ftbl.device_idle(device, GSL_TIMEOUT_DEFAULT) != GSL_SUCCESS)
+ {
+ return (GSL_FAILURE_DEVICEERROR);
+ }
+ kgsl_device_autogate_exit(&gsl_driver.device[device_id-1]);
+ clk_disable(gpu_clk);
+ clk_disable(garb_clk);
+ clk_disable(emi_garb_clk);
+ break;
+ default:
+ break;
+ }
+
+ return (GSL_SUCCESS);
+}
+
+KGSLHAL_API int kgsl_clock(gsl_deviceid_t dev, int enable)
+{
+ struct clk *gpu_clk;
+ struct clk *garb_clk = clk_get(0, "garb_clk");
+ struct clk *emi_garb_clk = clk_get(0, "emi_garb_clk");
+
+ switch (dev)
+ {
+ case GSL_DEVICE_G12:
+ gpu_clk = clk_get(0, "gpu2d_clk");
+ break;
+ case GSL_DEVICE_YAMATO:
+ gpu_clk = clk_get(0, "gpu3d_clk");
+ break;
+ default:
+ printk(KERN_ERR "GPU device %d is invalid!\n", dev);
+ return (GSL_FAILURE_DEVICEERROR);
+ }
+
+ if (IS_ERR(gpu_clk)) {
+ printk(KERN_ERR "%s: GPU clock get failed!\n", __func__);
+ return (GSL_FAILURE_DEVICEERROR);
+ }
+
+ if (enable) {
+ clk_enable(gpu_clk);
+ clk_enable(garb_clk);
+ clk_enable(emi_garb_clk);
+ } else {
+ clk_disable(gpu_clk);
+ clk_disable(garb_clk);
+ clk_disable(emi_garb_clk);
+ }
+
+ return (GSL_SUCCESS);
+}
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.c b/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.c
new file mode 100644
index 000000000000..93fab327a830
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.c
@@ -0,0 +1,31 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+#include "kos_libapi.h"
+
+//
+// Return the maximum amount of memory that can be allocated to the Z430. This number
+// will be constrained to 2MB as a minimum and the original hardcoded value for the caller
+// as a maximum. If the return value is outside of this range, then the original value in
+// the caller will be used. For this reason, returning 0 is used to signify to use the
+// original value as the default.
+//
+KOS_DLLEXPORT unsigned long kgsl_get_z430_memory_amount(void)
+{
+ return(0);
+}
diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.h b/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.h
new file mode 100644
index 000000000000..e68387f1609a
--- /dev/null
+++ b/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.h
@@ -0,0 +1,40 @@
+/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Advanced Micro Devices nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef GSL_MEMCFG_H
+#define GSL_MEMCFG_H
+
+//
+// Return the maximum amount of memory that can be allocated to the Z430. This number
+// will be constrained to 2MB as a minimum and the original hardcoded value for the caller
+// as a maximum. If the return value is outside of this range, then the original value in
+// the caller will be used. For this reason, returning 0 is used to signify to use the
+// original value as the default.
+//
+KOS_DLLEXPORT unsigned long kgsl_get_z430_memory_amount(void);
+#endif
diff --git a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h
index 305b2ee9066d..65eadb1e79cf 100644
--- a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h
+++ b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h
@@ -40,9 +40,14 @@
OSINLINE void
kgsl_hwaccess_memread(void *dst, unsigned int gpubase, unsigned int gpuoffset, unsigned int sizebytes, unsigned int touserspace)
{
- if (gsl_driver.enable_mmu && (gpubase >= GSL_LINUX_MAP_RANGE_START) && (gpubase < GSL_LINUX_MAP_RANGE_END)) {
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ if(gpubase >= GSL_LINUX_MAP_RANGE_START && gpubase < GSL_LINUX_MAP_RANGE_END)
+ {
gsl_linux_map_read(dst, gpubase+gpuoffset, sizebytes, touserspace);
- } else {
+ }
+ else
+#endif
+ {
mb();
dsb();
if (touserspace)
@@ -66,9 +71,14 @@ kgsl_hwaccess_memread(void *dst, unsigned int gpubase, unsigned int gpuoffset, u
OSINLINE void
kgsl_hwaccess_memwrite(unsigned int gpubase, unsigned int gpuoffset, void *src, unsigned int sizebytes, unsigned int fromuserspace)
{
- if (gsl_driver.enable_mmu && (gpubase >= GSL_LINUX_MAP_RANGE_START) && (gpubase < GSL_LINUX_MAP_RANGE_END)) {
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ if(gpubase >= GSL_LINUX_MAP_RANGE_START && gpubase < GSL_LINUX_MAP_RANGE_END)
+ {
gsl_linux_map_write(src, gpubase+gpuoffset, sizebytes, fromuserspace);
- } else {
+ }
+ else
+#endif
+ {
mb();
dsb();
if (fromuserspace)
@@ -92,9 +102,12 @@ kgsl_hwaccess_memwrite(unsigned int gpubase, unsigned int gpuoffset, void *src,
OSINLINE void
kgsl_hwaccess_memset(unsigned int gpubase, unsigned int gpuoffset, unsigned int value, unsigned int sizebytes)
{
- if (gsl_driver.enable_mmu && (gpubase >= GSL_LINUX_MAP_RANGE_START) && (gpubase < GSL_LINUX_MAP_RANGE_END)) {
- gsl_linux_map_set(gpuoffset+gpubase, value, sizebytes);
- } else {
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ if(gpubase >= GSL_LINUX_MAP_RANGE_START && gpubase < GSL_LINUX_MAP_RANGE_END)
+ gsl_linux_map_set(gpuoffset+gpubase, value, sizebytes);
+ else
+#endif
+ {
mb();
dsb();
kos_memset((void *)(gpubase + gpuoffset), value, sizebytes);
diff --git a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c
index bef8684ad131..30f783e1cf12 100644
--- a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c
+++ b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c
@@ -39,7 +39,7 @@
#include <linux/platform_device.h>
#include <linux/vmalloc.h>
-int gpu_2d_irq, gpu_3d_irq;
+static int gpu_2d_irq, gpu_3d_irq;
phys_addr_t gpu_2d_regbase;
int gpu_2d_regsize;
@@ -48,7 +48,6 @@ int gpu_3d_regsize;
int gmem_size;
phys_addr_t gpu_reserved_mem;
int gpu_reserved_mem_size;
-int z160_version;
static ssize_t gsl_kmod_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr);
static ssize_t gsl_kmod_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr);
@@ -58,7 +57,9 @@ static int gsl_kmod_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
static int gsl_kmod_open(struct inode *inode, struct file *fd);
static int gsl_kmod_release(struct inode *inode, struct file *fd);
static irqreturn_t z160_irq_handler(int irq, void *dev_id);
+#if defined(MX51)
static irqreturn_t z430_irq_handler(int irq, void *dev_id);
+#endif
static int gsl_kmod_major;
static struct class *gsl_kmod_class;
@@ -633,24 +634,34 @@ static int gsl_kmod_mmap(struct file *fd, struct vm_area_struct *vma)
unsigned long pfn = vma->vm_pgoff;
unsigned long size = vma->vm_end - vma->vm_start;
unsigned long prot = pgprot_writecombine(vma->vm_page_prot);
- unsigned long addr = vma->vm_pgoff << PAGE_SHIFT;
- void *va = NULL;
-
- if (gsl_driver.enable_mmu && (addr < GSL_LINUX_MAP_RANGE_END) && (addr >= GSL_LINUX_MAP_RANGE_START)) {
- va = gsl_linux_map_find(addr);
- while (size > 0) {
- if (remap_pfn_range(vma, start, vmalloc_to_pfn(va), PAGE_SIZE, prot)) {
- return -EAGAIN;
- }
- start += PAGE_SIZE;
- va += PAGE_SIZE;
- size -= PAGE_SIZE;
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ unsigned long addr = vma->vm_pgoff << PAGE_SHIFT;
+ void *va;
+#endif
+
+#ifdef GSL_MMU_TRANSLATION_ENABLED
+ if (addr < GSL_LINUX_MAP_RANGE_END && addr >= GSL_LINUX_MAP_RANGE_START)
+ {
+ va = gsl_linux_map_find(addr);
+ while (size > 0)
+ {
+ if (remap_pfn_range(vma, start, vmalloc_to_pfn(va), PAGE_SIZE, prot))
+ {
+ return -EAGAIN;
+ }
+ start += PAGE_SIZE;
+ va += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
}
- } else {
- if (remap_pfn_range(vma, start, pfn, size, prot)) {
- status = -EAGAIN;
+ else
+#endif
+ {
+ if (remap_pfn_range(vma, start, pfn, size, prot))
+ {
+ status = -EAGAIN;
+ }
}
- }
vma->vm_ops = &gsl_kmod_vmops;
@@ -742,11 +753,13 @@ static irqreturn_t z160_irq_handler(int irq, void *dev_id)
return IRQ_HANDLED;
}
+#if defined(MX51)
static irqreturn_t z430_irq_handler(int irq, void *dev_id)
{
kgsl_intr_isr();
return IRQ_HANDLED;
}
+#endif
static int gpu_probe(struct platform_device *pdev)
{
@@ -754,11 +767,6 @@ static int gpu_probe(struct platform_device *pdev)
struct resource *res;
struct device *dev;
- if (pdev->dev.platform_data)
- z160_version = *((int *)(pdev->dev.platform_data));
- else
- z160_version = 0;
-
for(i = 0; i < 2; i++){
res = platform_get_resource(pdev, IORESOURCE_IRQ, i);
if (!res) {
@@ -803,26 +811,24 @@ static int gpu_probe(struct platform_device *pdev)
}
}
- if (gpu_3d_irq > 0)
+ if (kgsl_driver_init() != GSL_SUCCESS)
{
- if (request_irq(gpu_3d_irq, z430_irq_handler, 0, "ydx", NULL) < 0) {
- printk(KERN_ERR "%s: request_irq error\n", __func__);
- gpu_3d_irq = 0;
- goto request_irq_error;
- }
+ printk(KERN_ERR "%s: kgsl_driver_init error\n", __func__);
+ goto kgsl_driver_init_error;
}
- if (gpu_2d_irq > 0)
+#if defined(MX51)
+ if (request_irq(gpu_3d_irq, z430_irq_handler, 0, "ydx", NULL) < 0)
{
- if (request_irq(gpu_2d_irq, z160_irq_handler, 0, "g12", NULL) < 0) {
- printk(KERN_ERR "2D Acceleration Enabled, OpenVG Disabled!\n");
- gpu_2d_irq = 0;
- }
+ printk(KERN_ERR "%s: request_irq error\n", __func__);
+ goto request_irq_error;
}
+#endif
- if (kgsl_driver_init() != GSL_SUCCESS) {
- printk(KERN_ERR "%s: kgsl_driver_init error\n", __func__);
- goto kgsl_driver_init_error;
+ if (request_irq(gpu_2d_irq, z160_irq_handler, 0, "g12", NULL) < 0)
+ {
+ printk(KERN_ERR "2D Acceleration Enabled, OpenVG Disabled!\n");
+ gpu_2d_irq = 0;
}
gsl_kmod_major = register_chrdev(0, "gsl_kmod", &gsl_kmod_fops);
@@ -862,15 +868,9 @@ class_create_error:
register_chrdev_error:
unregister_chrdev(gsl_kmod_major, "gsl_kmod");
+request_irq_error:
kgsl_driver_init_error:
kgsl_driver_close();
- if (gpu_2d_irq > 0) {
- free_irq(gpu_2d_irq, NULL);
- }
- if (gpu_3d_irq > 0) {
- free_irq(gpu_3d_irq, NULL);
- }
-request_irq_error:
return 0; // TODO: return proper error code
}
@@ -879,7 +879,7 @@ static int gpu_remove(struct platform_device *pdev)
device_destroy(gsl_kmod_class, MKDEV(gsl_kmod_major, 0));
class_destroy(gsl_kmod_class);
unregister_chrdev(gsl_kmod_major, "gsl_kmod");
-
+#if defined(MX51)
if (gpu_3d_irq)
{
free_irq(gpu_3d_irq, NULL);
@@ -889,7 +889,12 @@ static int gpu_remove(struct platform_device *pdev)
{
free_irq(gpu_2d_irq, NULL);
}
-
+#elif defined(MX35)
+ if (gpu_2d_irq)
+ {
+ free_irq(gpu_2d_irq, NULL);
+ }
+#endif
kgsl_driver_close();
return 0;
}
@@ -960,5 +965,9 @@ static void __exit gsl_kmod_exit(void)
module_init(gsl_kmod_init);
module_exit(gsl_kmod_exit);
MODULE_AUTHOR("Advanced Micro Devices");
-MODULE_DESCRIPTION("AMD graphics core driver for i.MX");
+#if defined(MX51)
+MODULE_DESCRIPTION("AMD 2D/3D graphics core driver for i.MX51");
+#elif defined(MX35)
+MODULE_DESCRIPTION("AMD 2D graphics core driver for i.MX35");
+#endif
MODULE_LICENSE("GPL v2");
diff --git a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h
index ebbe94a75e10..0469d2b912be 100644
--- a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h
+++ b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h
@@ -32,7 +32,7 @@
#include "gsl_halconfig.h"
#define GSL_LINUX_MAP_RANGE_START (1024*1024)
-#define GSL_LINUX_MAP_RANGE_END (GSL_LINUX_MAP_RANGE_START+GSL_HAL_SHMEM_SIZE_EMEM1_MMU)
+#define GSL_LINUX_MAP_RANGE_END (GSL_LINUX_MAP_RANGE_START+GSL_HAL_SHMEM_SIZE_EMEM1)
int gsl_linux_map_init(void);
void *gsl_linux_map_alloc(unsigned int gpu_addr, unsigned int size);
diff --git a/drivers/mxc/ipu3/ipu_capture.c b/drivers/mxc/ipu3/ipu_capture.c
index b9967135eac1..e801705f8fe9 100644
--- a/drivers/mxc/ipu3/ipu_capture.c
+++ b/drivers/mxc/ipu3/ipu_capture.c
@@ -26,7 +26,6 @@
#include <linux/delay.h>
#include <linux/ipu.h>
#include <linux/clk.h>
-#include <mach/mxc_dvfs.h>
#include "ipu_prv.h"
#include "ipu_regs.h"
@@ -94,12 +93,6 @@ ipu_csi_init_interface(uint16_t width, uint16_t height, uint32_t pixel_fmt,
cfg_param.force_eof << CSI_SENS_CONF_FORCE_EOF_SHIFT |
cfg_param.data_en_pol << CSI_SENS_CONF_DATA_EN_POL_SHIFT;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
__raw_writel(data, CSI_SENS_CONF(csi));
@@ -185,13 +178,36 @@ int _ipu_csi_mclk_set(uint32_t pixel_clk, uint32_t csi)
*/
int ipu_csi_enable_mclk(int csi, bool flag, bool wait)
{
+ struct clk *clk;
if (flag) {
- clk_enable(g_csi_clk[csi]);
+ if (cpu_is_mx53()) {
+ if (csi == 0) {
+ clk = clk_get(NULL, "ssi_ext1_clk");
+ clk_enable(clk);
+ clk_put(clk);
+ } else {
+ pr_err("invalid csi num %d\n", csi);
+ return -EINVAL;
+ }
+ } else
+ // CCWMX51 - Both CSIs from master clock 0
+ clk_enable(g_csi_clk[0]);
if (wait == true)
msleep(10);
} else {
- clk_disable(g_csi_clk[csi]);
+ if (cpu_is_mx53()) {
+ if (csi == 0) {
+ clk = clk_get(NULL, "ssi_ext1_clk");
+ clk_disable(clk);
+ clk_put(clk);
+ } else {
+ pr_err("invalid csi num %d\n", csi);
+ return -EINVAL;
+ }
+ } else
+ // CCWMX51 - Both CSIs from master clock 0
+ clk_disable(g_csi_clk[0]);
}
return 0;
@@ -210,12 +226,6 @@ void ipu_csi_get_window_size(uint32_t *width, uint32_t *height, uint32_t csi)
uint32_t reg;
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
reg = __raw_readl(CSI_ACT_FRM_SIZE(csi));
@@ -237,12 +247,6 @@ void ipu_csi_set_window_size(uint32_t width, uint32_t height, uint32_t csi)
{
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
__raw_writel((width - 1) | (height - 1) << 16, CSI_ACT_FRM_SIZE(csi));
@@ -263,12 +267,6 @@ void ipu_csi_set_window_pos(uint32_t left, uint32_t top, uint32_t csi)
uint32_t temp;
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_OUT_FRM_CTRL(csi));
@@ -291,12 +289,6 @@ void _ipu_csi_horizontal_downsize_enable(uint32_t csi)
uint32_t temp;
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_OUT_FRM_CTRL(csi));
@@ -317,12 +309,6 @@ void _ipu_csi_horizontal_downsize_disable(uint32_t csi)
uint32_t temp;
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_OUT_FRM_CTRL(csi));
@@ -343,12 +329,6 @@ void _ipu_csi_vertical_downsize_enable(uint32_t csi)
uint32_t temp;
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_OUT_FRM_CTRL(csi));
@@ -369,12 +349,6 @@ void _ipu_csi_vertical_downsize_disable(uint32_t csi)
uint32_t temp;
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_OUT_FRM_CTRL(csi));
@@ -401,12 +375,6 @@ void ipu_csi_set_test_generator(bool active, uint32_t r_value,
uint32_t temp;
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_TST_CTRL(csi));
@@ -442,12 +410,6 @@ void _ipu_csi_ccir_err_detection_enable(uint32_t csi)
{
uint32_t temp;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
temp = __raw_readl(CSI_CCIR_CODE_1(csi));
temp |= CSI_CCIR_ERR_DET_EN;
__raw_writel(temp, CSI_CCIR_CODE_1(csi));
@@ -464,12 +426,6 @@ void _ipu_csi_ccir_err_detection_disable(uint32_t csi)
{
uint32_t temp;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
temp = __raw_readl(CSI_CCIR_CODE_1(csi));
temp &= ~CSI_CCIR_ERR_DET_EN;
__raw_writel(temp, CSI_CCIR_CODE_1(csi));
@@ -495,12 +451,6 @@ int _ipu_csi_set_mipi_di(uint32_t num, uint32_t di_val, uint32_t csi)
goto err;
}
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_MIPI_DI(csi));
@@ -558,12 +508,6 @@ int _ipu_csi_set_skip_isp(uint32_t skip, uint32_t max_ratio, uint32_t csi)
goto err;
}
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_SKIP(csi));
@@ -601,12 +545,6 @@ int _ipu_csi_set_skip_smfc(uint32_t skip, uint32_t max_ratio,
goto err;
}
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(CSI_SKIP(csi));
@@ -674,12 +612,6 @@ void _ipu_smfc_set_wmc(ipu_channel_t channel, bool set, uint32_t level)
uint32_t temp;
unsigned long lock_flags;
- if (g_ipu_clk_enabled == false) {
- stop_dvfs_per();
- g_ipu_clk_enabled = true;
- clk_enable(g_ipu_clk);
- }
-
spin_lock_irqsave(&ipu_lock, lock_flags);
temp = __raw_readl(SMFC_WMC);
diff --git a/drivers/mxc/ipu3/ipu_common.c b/drivers/mxc/ipu3/ipu_common.c
index b1b8a8b39ae1..eae3b549d765 100644
--- a/drivers/mxc/ipu3/ipu_common.c
+++ b/drivers/mxc/ipu3/ipu_common.c
@@ -354,8 +354,8 @@ static int ipu_probe(struct platform_device *pdev)
g_di_clk[0] = plat_data->di_clk[0];
g_di_clk[1] = plat_data->di_clk[1];
- g_csi_clk[0] = plat_data->csi_clk[0];
- g_csi_clk[1] = plat_data->csi_clk[1];
+ g_csi_clk[0] = clk_get(&pdev->dev, "csi_mclk1");
+ g_csi_clk[1] = clk_get(&pdev->dev, "csi_mclk2");
__raw_writel(0x807FFFFF, IPU_MEM_RST);
while (__raw_readl(IPU_MEM_RST) & 0x80000000) ;
@@ -1883,29 +1883,29 @@ int32_t ipu_disable_channel(ipu_channel_t channel, bool wait_for_stop)
if ((channel == MEM_BG_SYNC) || (channel == MEM_FG_SYNC) ||
(channel == MEM_DC_SYNC)) {
- if (channel == MEM_FG_SYNC)
- ipu_disp_set_window_pos(channel, 0, 0);
+ int timeout = 50;
+ int irq;
_ipu_dp_dc_disable(channel, false);
/*
- * wait for BG channel EOF then disable FG-IDMAC,
- * it avoid FG NFB4EOF error.
+ * wait for display channel EOF then disable IDMAC,
+ * it avoid NFB4EOF error.
*/
- if (channel == MEM_FG_SYNC) {
- int timeout = 50;
-
- __raw_writel(IPUIRQ_2_MASK(IPU_IRQ_BG_SYNC_EOF),
- IPUIRQ_2_STATREG(IPU_IRQ_BG_SYNC_EOF));
- while ((__raw_readl(IPUIRQ_2_STATREG(IPU_IRQ_BG_SYNC_EOF)) &
- IPUIRQ_2_MASK(IPU_IRQ_BG_SYNC_EOF)) == 0) {
- msleep(10);
- timeout -= 10;
- if (timeout <= 0) {
- dev_err(g_ipu_dev, "warning: wait for bg sync eof timeout\n");
- break;
- }
- }
+ if (channel == MEM_BG_SYNC)
+ irq = IPU_IRQ_BG_SYNC_EOF;
+ if (channel == MEM_FG_SYNC)
+ irq = IPU_IRQ_FG_SYNC_EOF;
+ else
+ irq = IPU_IRQ_DC_SYNC_EOF;
+ __raw_writel(IPUIRQ_2_MASK(irq),
+ IPUIRQ_2_STATREG(irq));
+ while ((__raw_readl(IPUIRQ_2_STATREG(irq)) &
+ IPUIRQ_2_MASK(irq)) == 0) {
+ msleep(10);
+ timeout -= 10;
+ if (timeout <= 0)
+ break;
}
} else if (wait_for_stop) {
while (idma_is_set(IDMAC_CHA_BUSY, in_dma) ||
diff --git a/drivers/mxc/ipu3/ipu_disp.c b/drivers/mxc/ipu3/ipu_disp.c
index 14dde404990b..7ce04d8bca9e 100644
--- a/drivers/mxc/ipu3/ipu_disp.c
+++ b/drivers/mxc/ipu3/ipu_disp.c
@@ -318,34 +318,22 @@ static void _ipu_dc_map_clear(int map)
}
static void _ipu_dc_write_tmpl(int word, u32 opcode, u32 operand, int map,
- int wave, int glue, int sync, int stop)
+ int wave, int glue, int sync)
{
u32 reg;
-
- if (opcode == WRG) {
- reg = sync;
- reg |= (glue << 4);
- reg |= (++wave << 11);
- reg |= ((operand & 0x1FFFF) << 15);
- __raw_writel(reg, ipu_dc_tmpl_reg + word * 2);
-
- reg = (operand >> 17);
- reg |= opcode << 7;
- reg |= (stop << 9);
- __raw_writel(reg, ipu_dc_tmpl_reg + word * 2 + 1);
- } else {
- reg = sync;
- reg |= (glue << 4);
- reg |= (++wave << 11);
- reg |= (++map << 15);
- reg |= (operand << 20) & 0xFFF00000;
- __raw_writel(reg, ipu_dc_tmpl_reg + word * 2);
-
- reg = (operand >> 12);
- reg |= opcode << 4;
- reg |= (stop << 9);
- __raw_writel(reg, ipu_dc_tmpl_reg + word * 2 + 1);
- }
+ int stop = 1;
+
+ reg = sync;
+ reg |= (glue << 4);
+ reg |= (++wave << 11);
+ reg |= (++map << 15);
+ reg |= (operand << 20) & 0xFFF00000;
+ __raw_writel(reg, ipu_dc_tmpl_reg + word * 2);
+
+ reg = (operand >> 12);
+ reg |= opcode << 4;
+ reg |= (stop << 9);
+ __raw_writel(reg, ipu_dc_tmpl_reg + word * 2 + 1);
}
static void _ipu_dc_link_event(int chan, int event, int addr, int priority)
@@ -735,26 +723,6 @@ static bool dc_swap;
static irqreturn_t dc_irq_handler(int irq, void *dev_id)
{
struct completion *comp = dev_id;
- uint32_t reg;
- uint32_t dc_chan;
-
- if (irq == IPU_IRQ_DC_FC_1)
- dc_chan = 1;
- else
- dc_chan = 5;
-
- if (!dc_swap) {
- reg = __raw_readl(DC_WR_CH_CONF(dc_chan));
- reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK;
- __raw_writel(reg, DC_WR_CH_CONF(dc_chan));
-
- reg = __raw_readl(IPU_DISP_GEN);
- if (g_dc_di_assignment[dc_chan])
- reg &= ~DI1_COUNTER_RELEASE;
- else
- reg &= ~DI0_COUNTER_RELEASE;
- __raw_writel(reg, IPU_DISP_GEN);
- }
complete(comp);
return IRQ_HANDLED;
@@ -838,6 +806,19 @@ void _ipu_dp_dc_disable(ipu_channel_t channel, bool swap)
__raw_writel(reg, DC_WR_CH_CONF(dc_chan));
spin_unlock_irqrestore(&ipu_lock, lock_flags);
} else {
+ spin_lock_irqsave(&ipu_lock, lock_flags);
+ reg = __raw_readl(DC_WR_CH_CONF(dc_chan));
+ reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK;
+ __raw_writel(reg, DC_WR_CH_CONF(dc_chan));
+
+ reg = __raw_readl(IPU_DISP_GEN);
+ if (g_dc_di_assignment[dc_chan])
+ reg &= ~DI1_COUNTER_RELEASE;
+ else
+ reg &= ~DI0_COUNTER_RELEASE;
+ __raw_writel(reg, IPU_DISP_GEN);
+
+ spin_unlock_irqrestore(&ipu_lock, lock_flags);
/* Clock is already off because it must be done quickly, but
we need to fix the ref count */
clk_disable(g_pixel_clk[g_dc_di_assignment[dc_chan]]);
@@ -1062,13 +1043,9 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk,
dev_dbg(g_ipu_dev, "pixel clk = %d\n", pixel_clk);
if (sig.ext_clk) {
- /*
- * Set the PLL to be an even multiple of the pixel clock.
- * Not round div for tvout and ldb.
- * Did not consider both DI come from the same ext clk, if
- * meet such case, ext clk rate should be set specially.
- */
- if (clk_get_usecount(g_pixel_clk[disp]) == 0) {
+ /* Set the PLL to be an even multiple of the pixel clock. not round div for tvout*/
+ if ((clk_get_usecount(g_pixel_clk[0]) == 0) &&
+ (clk_get_usecount(g_pixel_clk[1]) == 0)) {
di_parent = clk_get_parent(g_di_clk[disp]);
if (strcmp(di_parent->name, "tve_clk") != 0 &&
strcmp(di_parent->name, "ldb_di0_clk") != 0 &&
@@ -1117,7 +1094,7 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk,
di_gen = __raw_readl(DI_GENERAL(disp));
if (sig.interlaced) {
- if (g_ipu_hw_rev >= 2) {
+ if (cpu_is_mx51_rev(CHIP_REV_2_0)) {
/* Setup internal HSYNC waveform */
_ipu_di_sync_config(
disp, /* display */
@@ -1357,7 +1334,7 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk,
}
/* Init template microcode */
- _ipu_dc_write_tmpl(0, WROD(0), 0, map, SYNC_WAVE, 0, 8, 1);
+ _ipu_dc_write_tmpl(0, WROD(0), 0, map, SYNC_WAVE, 0, 8);
if (sig.Hsync_pol)
di_gen |= DI_GEN_POLARITY_3;
@@ -1424,27 +1401,27 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk,
(pixel_fmt == IPU_PIX_FMT_UYVY) ||
(pixel_fmt == IPU_PIX_FMT_YVYU) ||
(pixel_fmt == IPU_PIX_FMT_VYUY)) {
- _ipu_dc_write_tmpl(8, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5, 1);
- _ipu_dc_write_tmpl(9, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1);
+ _ipu_dc_write_tmpl(8, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5);
+ _ipu_dc_write_tmpl(9, WROD(0), 0, map, SYNC_WAVE, 0, 5);
/* configure user events according to DISP NUM */
__raw_writel((width - 1), DC_UGDE_3(disp));
}
- _ipu_dc_write_tmpl(2, WROD(0), 0, map, SYNC_WAVE, 8, 5, 1);
- _ipu_dc_write_tmpl(3, WRG, 0, map, SYNC_WAVE, 4, 5, 1);
- _ipu_dc_write_tmpl(4, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1);
+ _ipu_dc_write_tmpl(2, WROD(0), 0, map, SYNC_WAVE, 8, 5);
+ _ipu_dc_write_tmpl(3, WROD(0), 0, map, SYNC_WAVE, 4, 5);
+ _ipu_dc_write_tmpl(4, WROD(0), 0, map, SYNC_WAVE, 0, 5);
} else {
if ((pixel_fmt == IPU_PIX_FMT_YUYV) ||
(pixel_fmt == IPU_PIX_FMT_UYVY) ||
(pixel_fmt == IPU_PIX_FMT_YVYU) ||
(pixel_fmt == IPU_PIX_FMT_VYUY)) {
- _ipu_dc_write_tmpl(10, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5, 1);
- _ipu_dc_write_tmpl(11, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1);
+ _ipu_dc_write_tmpl(10, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5);
+ _ipu_dc_write_tmpl(11, WROD(0), 0, map, SYNC_WAVE, 0, 5);
/* configure user events according to DISP NUM */
__raw_writel(width - 1, DC_UGDE_3(disp));
}
- _ipu_dc_write_tmpl(5, WROD(0), 0, map, SYNC_WAVE, 8, 5, 1);
- _ipu_dc_write_tmpl(6, WRG, 0, map, SYNC_WAVE, 4, 5, 1);
- _ipu_dc_write_tmpl(7, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1);
+ _ipu_dc_write_tmpl(5, WROD(0), 0, map, SYNC_WAVE, 8, 5);
+ _ipu_dc_write_tmpl(6, WROD(0), 0, map, SYNC_WAVE, 4, 5);
+ _ipu_dc_write_tmpl(7, WROD(0), 0, map, SYNC_WAVE, 0, 5);
}
if (sig.Hsync_pol)
@@ -1531,7 +1508,7 @@ int ipu_init_async_panel(int disp, int type, uint32_t cycle_time,
_ipu_di_data_pin_config(disp, ASYNC_SER_WAVE, DI_PIN_SER_RS,
2, 0, 0);
- _ipu_dc_write_tmpl(0x64, WROD(0), 0, map, ASYNC_SER_WAVE, 0, 0, 1);
+ _ipu_dc_write_tmpl(0x64, WROD(0), 0, map, ASYNC_SER_WAVE, 0, 0);
/* Configure DC for serial panel */
__raw_writel(0x14, DC_DISP_CONF1(DC_DISP_ID_SERIAL));
@@ -1808,39 +1785,6 @@ int32_t ipu_disp_set_window_pos(ipu_channel_t channel, int16_t x_pos,
}
EXPORT_SYMBOL(ipu_disp_set_window_pos);
-int32_t ipu_disp_get_window_pos(ipu_channel_t channel, int16_t *x_pos,
- int16_t *y_pos)
-{
- u32 reg;
- unsigned long lock_flags;
- uint32_t flow = 0;
-
- if (channel == MEM_FG_SYNC)
- flow = DP_SYNC;
- else if (channel == MEM_FG_ASYNC0)
- flow = DP_ASYNC0;
- else if (channel == MEM_FG_ASYNC1)
- flow = DP_ASYNC1;
- else
- return -EINVAL;
-
- if (!g_ipu_clk_enabled)
- clk_enable(g_ipu_clk);
- spin_lock_irqsave(&ipu_lock, lock_flags);
-
- reg = __raw_readl(DP_FG_POS(flow));
-
- *x_pos = (reg >> 16) & 0x7FF;
- *y_pos = reg & 0x7FF;
-
- spin_unlock_irqrestore(&ipu_lock, lock_flags);
- if (!g_ipu_clk_enabled)
- clk_disable(g_ipu_clk);
-
- return 0;
-}
-EXPORT_SYMBOL(ipu_disp_get_window_pos);
-
void ipu_disp_direct_write(ipu_channel_t channel, u32 value, u32 offset)
{
if (channel == DIRECT_ASYNC0)
diff --git a/drivers/mxc/ipu3/ipu_regs.h b/drivers/mxc/ipu3/ipu_regs.h
index 4a78e14df560..19fde8846aa7 100644
--- a/drivers/mxc/ipu3/ipu_regs.h
+++ b/drivers/mxc/ipu3/ipu_regs.h
@@ -664,6 +664,5 @@ enum di_sync_wave {
/* DC template opcodes */
#define WROD(lf) (0x18 | (lf << 1))
-#define WRG (0x01)
#endif
diff --git a/drivers/mxc/vpu/mxc_vpu.c b/drivers/mxc/vpu/mxc_vpu.c
index 9fc25edc33fa..f62e3d46a67c 100644
--- a/drivers/mxc/vpu/mxc_vpu.c
+++ b/drivers/mxc/vpu/mxc_vpu.c
@@ -73,7 +73,6 @@ static struct vpu_mem_desc user_data_mem = { 0 };
static struct vpu_mem_desc share_mem = { 0 };
static void __iomem *vpu_base;
-static int vpu_irq;
static u32 phy_vpu_base_addr;
static struct mxc_vpu_platform_data *vpu_plat;
@@ -540,7 +539,7 @@ static int vpu_map_mem(struct file *fp, struct vm_area_struct *vm)
request_size);
vm->vm_flags |= VM_IO | VM_RESERVED;
- vm->vm_page_prot = pgprot_writecombine(vm->vm_page_prot);
+ vm->vm_page_prot = pgprot_noncached(vm->vm_page_prot);
return remap_pfn_range(vm, vm->vm_start, vm->vm_pgoff,
request_size, vm->vm_page_prot) ? -EAGAIN : 0;
@@ -636,9 +635,8 @@ static int vpu_dev_probe(struct platform_device *pdev)
err = -ENXIO;
goto err_out_class;
}
- vpu_irq = res->start;
- err = request_irq(vpu_irq, vpu_irq_handler, 0, "VPU_CODEC_IRQ",
+ err = request_irq(res->start, vpu_irq_handler, 0, "VPU_CODEC_IRQ",
(void *)(&vpu_data));
if (err)
goto err_out_class;
@@ -662,7 +660,6 @@ static int vpu_dev_probe(struct platform_device *pdev)
static int vpu_dev_remove(struct platform_device *pdev)
{
- free_irq(vpu_irq, &vpu_data);
iounmap(vpu_base);
iram_free(iram.start, VPU_IRAM_SIZE);
@@ -693,9 +690,7 @@ static int vpu_suspend(struct platform_device *pdev, pm_message_t state)
for (i = 0; i < vpu_clk_usercount; i++)
clk_disable(vpu_clk);
- if (!cpu_is_mx37())
- return 0;
- else {
+ if (!cpu_is_mx53()) {
clk_enable(vpu_clk);
if (bitwork_mem.cpu_addr != 0) {
SAVE_WORK_REGS;
@@ -711,7 +706,8 @@ static int vpu_suspend(struct platform_device *pdev, pm_message_t state)
clk_disable(vpu_clk);
}
- mxc_pg_enable(pdev);
+ if (cpu_is_mx37() || cpu_is_mx51())
+ mxc_pg_enable(pdev);
return 0;
@@ -725,10 +721,11 @@ static int vpu_resume(struct platform_device *pdev)
{
int i;
- if (cpu_is_mx37())
+ if (cpu_is_mx37() || cpu_is_mx51())
mxc_pg_disable(pdev);
- else
- goto recover_clk;
+
+ if (cpu_is_mx53())
+ goto recover_clk;
clk_enable(vpu_clk);
if (bitwork_mem.cpu_addr != 0) {
@@ -799,7 +796,6 @@ recover_clk:
/* Recover vpu clock */
for (i = 0; i < vpu_clk_usercount; i++)
clk_enable(vpu_clk);
- printk("vpu_resume end\n");
return 0;
}
@@ -832,6 +828,7 @@ static int __init vpu_init(void)
static void __exit vpu_exit(void)
{
+ free_irq(MXC_INT_VPU, (void *)(&vpu_data));
if (vpu_major > 0) {
device_destroy(vpu_class, MKDEV(vpu_major, 0));
class_destroy(vpu_class);
diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c
index 08419ee10290..12bfc447a896 100644
--- a/drivers/net/acenic.c
+++ b/drivers/net/acenic.c
@@ -1209,7 +1209,8 @@ static int __devinit ace_init(struct net_device *dev)
memset(ap->info, 0, sizeof(struct ace_info));
memset(ap->skb, 0, sizeof(struct ace_skb));
- if (ace_load_firmware(dev))
+ ecode = ace_load_firmware(dev);
+ if (ecode)
goto init_error;
ap->fw_running = 0;
diff --git a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c
index 78cea5e80b1d..bf9ab65d27a4 100644
--- a/drivers/net/appletalk/ipddp.c
+++ b/drivers/net/appletalk/ipddp.c
@@ -176,8 +176,7 @@ static int ipddp_xmit(struct sk_buff *skb, struct net_device *dev)
dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len;
- if(aarp_send_ddp(rt->dev, skb, &rt->at, NULL) < 0)
- dev_kfree_skb(skb);
+ aarp_send_ddp(rt->dev, skb, &rt->at, NULL);
spin_unlock(&ipddp_route_lock);
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c
index d3c734f4d679..2f6ae784a36f 100644
--- a/drivers/net/au1000_eth.c
+++ b/drivers/net/au1000_eth.c
@@ -1089,7 +1089,14 @@ static struct net_device * au1000_probe(int port_num)
return NULL;
}
- if ((err = register_netdev(dev)) != 0) {
+ dev->base_addr = base;
+ dev->irq = irq;
+ dev->netdev_ops = &au1000_netdev_ops;
+ SET_ETHTOOL_OPS(dev, &au1000_ethtool_ops);
+ dev->watchdog_timeo = ETH_TX_TIMEOUT;
+
+ err = register_netdev(dev);
+ if (err != 0) {
printk(KERN_ERR "%s: Cannot register net device, error %d\n",
DRV_NAME, err);
free_netdev(dev);
@@ -1207,12 +1214,6 @@ static struct net_device * au1000_probe(int port_num)
aup->tx_db_inuse[i] = pDB;
}
- dev->base_addr = base;
- dev->irq = irq;
- dev->netdev_ops = &au1000_netdev_ops;
- SET_ETHTOOL_OPS(dev, &au1000_ethtool_ops);
- dev->watchdog_timeo = ETH_TX_TIMEOUT;
-
/*
* The boot code uses the ethernet controller, so reset it to start
* fresh. au1000_init() expects that the device is in reset state.
diff --git a/drivers/net/b44.c b/drivers/net/b44.c
index bafca672ea7d..351a258dccd6 100644
--- a/drivers/net/b44.c
+++ b/drivers/net/b44.c
@@ -913,9 +913,6 @@ static irqreturn_t b44_interrupt(int irq, void *dev_id)
bp->istat = istat;
__b44_disable_ints(bp);
__napi_schedule(&bp->napi);
- } else {
- printk(KERN_ERR PFX "%s: Error, poll already scheduled\n",
- dev->name);
}
irq_ack:
@@ -1505,8 +1502,7 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)
for (k = 0; k< ethaddr_bytes; k++) {
ppattern[offset + magicsync +
(j * ETH_ALEN) + k] = macaddr[k];
- len++;
- set_bit(len, (unsigned long *) pmask);
+ set_bit(len++, (unsigned long *) pmask);
}
}
return len - 1;
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index aa1be1feceed..bcd8df92dec7 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -691,7 +691,7 @@ static int bond_check_dev_link(struct bonding *bond,
struct net_device *slave_dev, int reporting)
{
const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
- static int (*ioctl)(struct net_device *, struct ifreq *, int);
+ int (*ioctl)(struct net_device *, struct ifreq *, int);
struct ifreq ifr;
struct mii_ioctl_data *mii;
@@ -3707,10 +3707,10 @@ static int bond_xmit_hash_policy_l23(struct sk_buff *skb,
if (skb->protocol == htons(ETH_P_IP)) {
return ((ntohl(iph->saddr ^ iph->daddr) & 0xffff) ^
- (data->h_dest[5] ^ bond_dev->dev_addr[5])) % count;
+ (data->h_dest[5] ^ data->h_source[5])) % count;
}
- return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count;
+ return (data->h_dest[5] ^ data->h_source[5]) % count;
}
/*
@@ -3737,7 +3737,7 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb,
}
- return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count;
+ return (data->h_dest[5] ^ data->h_source[5]) % count;
}
/*
@@ -3748,7 +3748,7 @@ static int bond_xmit_hash_policy_l2(struct sk_buff *skb,
{
struct ethhdr *data = (struct ethhdr *)skb->data;
- return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count;
+ return (data->h_dest[5] ^ data->h_source[5]) % count;
}
/*-------------------------- Device entry points ----------------------------*/
diff --git a/drivers/net/can/flexcan/mbm.c b/drivers/net/can/flexcan/mbm.c
index c846d97daadb..42266e719ce3 100644
--- a/drivers/net/can/flexcan/mbm.c
+++ b/drivers/net/can/flexcan/mbm.c
@@ -294,7 +294,7 @@ int flexcan_mbm_xmit(struct flexcan_device *flexcan, struct can_frame *frame)
hwmb[i].mb_id = (frame->can_id & CAN_SFF_MASK) << 18;
}
- hwmb[i].mb_cs &= ~MB_CS_LENGTH_MASK;
+ hwmb[i].mb_cs &= MB_CS_LENGTH_MASK;
hwmb[i].mb_cs |= frame->can_dlc << MB_CS_LENGTH_OFFSET;
flexcan_memcpy(hwmb[i].mb_data, frame->data, frame->can_dlc);
hwmb[i].mb_cs &= ~MB_CS_CODE_MASK;
diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c
index a10c1d7b3b0a..460bb886fbdf 100644
--- a/drivers/net/can/vcan.c
+++ b/drivers/net/can/vcan.c
@@ -80,7 +80,7 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev)
skb->dev = dev;
skb->ip_summed = CHECKSUM_UNNECESSARY;
- netif_rx(skb);
+ netif_rx_ni(skb);
}
static int vcan_tx(struct sk_buff *skb, struct net_device *dev)
diff --git a/drivers/net/e100.c b/drivers/net/e100.c
index 3a6735dc9f6a..c786e6a96eae 100644
--- a/drivers/net/e100.c
+++ b/drivers/net/e100.c
@@ -156,6 +156,7 @@
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/dma-mapping.h>
+#include <linux/dmapool.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/mii.h>
@@ -601,6 +602,7 @@ struct nic {
struct mem *mem;
dma_addr_t dma_addr;
+ struct pci_pool *cbs_pool;
dma_addr_t cbs_dma_addr;
u8 adaptive_ifs;
u8 tx_threshold;
@@ -1779,9 +1781,7 @@ static void e100_clean_cbs(struct nic *nic)
nic->cb_to_clean = nic->cb_to_clean->next;
nic->cbs_avail++;
}
- pci_free_consistent(nic->pdev,
- sizeof(struct cb) * nic->params.cbs.count,
- nic->cbs, nic->cbs_dma_addr);
+ pci_pool_free(nic->cbs_pool, nic->cbs, nic->cbs_dma_addr);
nic->cbs = NULL;
nic->cbs_avail = 0;
}
@@ -1799,10 +1799,11 @@ static int e100_alloc_cbs(struct nic *nic)
nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = NULL;
nic->cbs_avail = 0;
- nic->cbs = pci_alloc_consistent(nic->pdev,
- sizeof(struct cb) * count, &nic->cbs_dma_addr);
+ nic->cbs = pci_pool_alloc(nic->cbs_pool, GFP_KERNEL,
+ &nic->cbs_dma_addr);
if (!nic->cbs)
return -ENOMEM;
+ memset(nic->cbs, 0, count * sizeof(struct cb));
for (cb = nic->cbs, i = 0; i < count; cb++, i++) {
cb->next = (i + 1 < count) ? cb + 1 : nic->cbs;
@@ -1811,7 +1812,6 @@ static int e100_alloc_cbs(struct nic *nic)
cb->dma_addr = nic->cbs_dma_addr + i * sizeof(struct cb);
cb->link = cpu_to_le32(nic->cbs_dma_addr +
((i+1) % count) * sizeof(struct cb));
- cb->skb = NULL;
}
nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = nic->cbs;
@@ -2827,7 +2827,11 @@ static int __devinit e100_probe(struct pci_dev *pdev,
DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
goto err_out_free;
}
-
+ nic->cbs_pool = pci_pool_create(netdev->name,
+ nic->pdev,
+ nic->params.cbs.count * sizeof(struct cb),
+ sizeof(u32),
+ 0);
DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, MAC addr %pM\n",
(unsigned long long)pci_resource_start(pdev, use_io ? 1 : 0),
pdev->irq, netdev->dev_addr);
@@ -2857,6 +2861,7 @@ static void __devexit e100_remove(struct pci_dev *pdev)
unregister_netdev(netdev);
e100_free(nic);
pci_iounmap(pdev, nic->csr);
+ pci_pool_destroy(nic->cbs_pool);
free_netdev(netdev);
pci_release_regions(pdev);
pci_disable_device(pdev);
diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c
index b53b40ba88a8..d1e0563a67df 100644
--- a/drivers/net/e1000e/82571.c
+++ b/drivers/net/e1000e/82571.c
@@ -1803,7 +1803,7 @@ struct e1000_info e1000_82574_info = {
| FLAG_HAS_AMT
| FLAG_HAS_CTRLEXT_ON_LOAD,
.pba = 20,
- .max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN,
+ .max_hw_frame_size = DEFAULT_JUMBO,
.get_variants = e1000_get_variants_82571,
.mac_ops = &e82571_mac_ops,
.phy_ops = &e82_phy_ops_bm,
@@ -1820,7 +1820,7 @@ struct e1000_info e1000_82583_info = {
| FLAG_HAS_AMT
| FLAG_HAS_CTRLEXT_ON_LOAD,
.pba = 20,
- .max_hw_frame_size = DEFAULT_JUMBO,
+ .max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN,
.get_variants = e1000_get_variants_82571,
.mac_ops = &e82571_mac_ops,
.phy_ops = &e82_phy_ops_bm,
diff --git a/drivers/net/fec.c b/drivers/net/fec.c
index 206be36f0d19..d8817aad351f 100644
--- a/drivers/net/fec.c
+++ b/drivers/net/fec.c
@@ -296,17 +296,6 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
bufaddr = fep->tx_bounce[index];
}
- if (fep->ptimer_present) {
- if (fec_ptp_do_txstamp(skb))
- estatus = BD_ENET_TX_TS;
- else
- estatus = 0;
-#ifdef CONFIG_FEC_1588
- bdp->cbd_esc = (estatus | BD_ENET_TX_INT);
- bdp->cbd_bdu = 0;
-#endif
- }
-
#ifdef CONFIG_ARCH_MXS
swap_buffer(bufaddr, skb->len);
#endif
@@ -329,6 +318,16 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
| BD_ENET_TX_LAST | BD_ENET_TX_TC);
bdp->cbd_sc = status;
+ if (fep->ptimer_present) {
+ if (fec_ptp_do_txstamp(skb))
+ estatus = BD_ENET_TX_TS;
+ else
+ estatus = 0;
+#ifdef CONFIG_FEC_1588
+ bdp->cbd_esc = (estatus | BD_ENET_TX_INT);
+ bdp->cbd_bdu = 0;
+#endif
+ }
dev->trans_start = jiffies;
/* Trigger transmission start */
@@ -808,7 +807,7 @@ static struct mii_bus *fec_enet_mii_init(struct platform_device *pdev)
{
struct net_device *dev = platform_get_drvdata(pdev);
struct fec_enet_private *fep = netdev_priv(dev);
- struct fec_platform_data *pdata;
+ struct fec_enet_platform_data *pdata;
int err = -ENXIO, i;
fep->mii_timeout = 0;
@@ -837,7 +836,6 @@ static struct mii_bus *fec_enet_mii_init(struct platform_device *pdev)
fep->mii_bus->priv = fep;
fep->mii_bus->parent = &pdev->dev;
pdata = pdev->dev.platform_data;
- fep->mii_bus->phy_mask = pdata->phy_mask;
fep->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
if (!fep->mii_bus->irq) {
@@ -1412,15 +1410,6 @@ fec_stop(struct net_device *dev)
writel(1, fep->hwp + FEC_ECNTRL);
udelay(10);
-#ifdef CONFIG_ARCH_MXS
- /* Check MII or RMII */
- if (fep->phy_interface == PHY_INTERFACE_MODE_RMII)
- writel(readl(fep->hwp + FEC_R_CNTRL) | 0x100,
- fep->hwp + FEC_R_CNTRL);
- else
- writel(readl(fep->hwp + FEC_R_CNTRL) & ~0x100,
- fep->hwp + FEC_R_CNTRL);
-#endif
/* Clear outstanding MII command interrupts. */
writel(FEC_ENET_MII, fep->hwp + FEC_IEVENT);
@@ -1496,18 +1485,6 @@ fec_probe(struct platform_device *pdev)
fep->phy_interface = pdata->phy;
if (pdata->init && pdata->init())
goto failed_platform_init;
-
- /*
- * The priority for getting MAC address is:
- * (1) kernel command line fec_mac = xx:xx:xx...
- * (2) platform data mac field got from fuse etc
- * (3) bootloader set the FEC mac register
- */
-
- if (!is_valid_ether_addr(fec_mac_default) &&
- pdata->mac && is_valid_ether_addr(pdata->mac))
- memcpy(fec_mac_default, pdata->mac,
- sizeof(fec_mac_default));
} else
fep->phy_interface = PHY_INTERFACE_MODE_MII;
diff --git a/drivers/net/fec_1588.c b/drivers/net/fec_1588.c
index c4bf278c7f19..37b1b01778fd 100644
--- a/drivers/net/fec_1588.c
+++ b/drivers/net/fec_1588.c
@@ -178,19 +178,12 @@ void fec_ptp_stop(struct fec_ptp_private *priv)
static void fec_get_curr_cnt(struct fec_ptp_private *priv,
struct ptp_rtc_time *curr_time)
{
- u32 tempval;
-
- writel(FEC_T_CTRL_CAPTURE, priv->hwp + FEC_ATIME_CTRL);
writel(FEC_T_CTRL_CAPTURE, priv->hwp + FEC_ATIME_CTRL);
curr_time->rtc_time.nsec = readl(priv->hwp + FEC_ATIME);
curr_time->rtc_time.sec = priv->prtc;
-
writel(FEC_T_CTRL_CAPTURE, priv->hwp + FEC_ATIME_CTRL);
- tempval = readl(priv->hwp + FEC_ATIME);
- if (tempval < curr_time->rtc_time.nsec) {
- curr_time->rtc_time.nsec = tempval;
- curr_time->rtc_time.sec = priv->prtc;
- }
+ if (readl(priv->hwp + FEC_ATIME) < curr_time->rtc_time.nsec)
+ curr_time->rtc_time.sec++;
}
/* Set the 1588 timer counter registers */
@@ -221,7 +214,7 @@ int fec_ptp_do_txstamp(struct sk_buff *skb)
return 0;
udph = udp_hdr(skb);
- if (udph != NULL && ntohs(udph->source) == 319)
+ if (udph != NULL && udph->source == 319)
return 1;
}
@@ -254,13 +247,13 @@ void fec_ptp_store_rxstamp(struct fec_ptp_private *priv,
return;
udph = (struct udphdr *)(skb->data + FEC_PTP_UDP_OFFS);
- if (ntohs(udph->source) != 319)
+ if (udph->source != 319)
return;
seq_id = *((u16 *)(skb->data + FEC_PTP_SEQ_ID_OFFS));
control = *((u8 *)(skb->data + FEC_PTP_CTRL_OFFS));
- tmp_rx_time.key = ntohs(seq_id);
+ tmp_rx_time.key = seq_id;
tmp_rx_time.ts_time.sec = fpp->prtc;
tmp_rx_time.ts_time.nsec = bdp->ts;
@@ -377,75 +370,6 @@ static uint8_t fec_get_rx_time(struct fec_ptp_private *priv,
}
}
-static void fec_handle_ptpdrift(struct ptp_set_comp *comp,
- struct ptp_time_correct *ptc)
-{
- u32 ndrift;
- u32 i;
- u32 tmp, tmp_ns, tmp_prid;
- u32 min_ns, min_prid, miss_ns;
-
- ndrift = comp->drift;
- if (ndrift == 0) {
- ptc->corr_inc = 0;
- ptc->corr_period = 0;
- return;
- }
-
- if (ndrift >= FEC_ATIME_40MHZ) {
- ptc->corr_inc = (u32)(ndrift / FEC_ATIME_40MHZ);
- ptc->corr_period = 1;
- return;
- }
-
- min_ns = 1;
- tmp = FEC_ATIME_40MHZ % ndrift;
- tmp_prid = (u32)(FEC_ATIME_40MHZ / ndrift);
- min_prid = tmp_prid;
- miss_ns = tmp / tmp_prid;
- for (i = 2; i <= FEC_T_INC_40MHZ; i++) {
- tmp = (FEC_ATIME_40MHZ * i) % ndrift;
- tmp_prid = (FEC_ATIME_40MHZ * i) / ndrift;
- tmp_ns = tmp / tmp_prid;
- if (tmp_ns <= 10) {
- min_ns = i;
- min_prid = tmp_prid;
- break;
- }
- if (tmp_ns < miss_ns) {
- min_ns = i;
- min_prid = tmp_prid;
- miss_ns = tmp_ns;
- }
- }
-
- ptc->corr_inc = min_ns;
- ptc->corr_period = min_prid;
-}
-
-static void fec_set_drift(struct fec_ptp_private *priv,
- struct ptp_set_comp *comp)
-{
- struct ptp_time_correct tc;
- struct fec_ptp_private *fpp = priv;
- u32 tmp, corr_ns;
-
- fec_handle_ptpdrift(comp, &tc);
- if (tc.corr_inc == 0)
- return;
-
- if (comp->o_ops == TRUE)
- corr_ns = FEC_T_INC_40MHZ + tc.corr_inc;
- else
- corr_ns = FEC_T_INC_40MHZ - tc.corr_inc;
-
- tmp = readl(fpp->hwp + FEC_ATIME_INC) & FEC_T_INC_MASK;
- tmp |= corr_ns << FEC_T_INC_CORR_OFFSET;
- writel(tmp, fpp->hwp + FEC_ATIME_INC);
-
- writel(tc.corr_period, fpp->hwp + FEC_ATIME_CORR);
-}
-
static int ptp_open(struct inode *inode, struct file *file)
{
return 0;
@@ -466,7 +390,6 @@ static int ptp_ioctl(
struct ptp_rtc_time curr_time;
struct ptp_time rx_time, tx_time;
struct ptp_ts_data *p_ts;
- struct ptp_set_comp *p_comp;
struct fec_ptp_private *priv;
unsigned int minor = MINOR(inode->i_rdev);
int retval = 0;
@@ -509,11 +432,10 @@ static int ptp_ioctl(
priv->rx_time_pdel_resp.tail = 0;
break;
case PTP_SET_COMPENSATION:
- p_comp = (struct ptp_set_comp *)arg;
- fec_set_drift(priv, p_comp);
+ /* TBD */
break;
case PTP_GET_ORIG_COMP:
- ((struct ptp_get_comp *)arg)->dw_origcomp = FEC_PTP_ORIG_COMP;
+ /* TBD */
break;
default:
return -EINVAL;
diff --git a/drivers/net/fec_1588.h b/drivers/net/fec_1588.h
index 800ff310668f..a503527eadbb 100644
--- a/drivers/net/fec_1588.h
+++ b/drivers/net/fec_1588.h
@@ -24,9 +24,6 @@
#include <linux/circ_buf.h>
-#define FALSE 0
-#define TRUE 1
-
/* FEC 1588 register bits */
#define FEC_T_CTRL_CAPTURE 0x00000800
#define FEC_T_CTRL_RESTART 0x00000200
@@ -35,11 +32,8 @@
#define FEC_T_INC_MASK 0x0000007f
#define FEC_T_INC_OFFSET 0
-#define FEC_T_INC_CORR_MASK 0x00007f00
-#define FEC_T_INC_CORR_OFFSET 8
#define FEC_T_INC_40MHZ 25
-#define FEC_ATIME_40MHZ 40000000
#define FEC_T_PERIOD_ONE_SEC 0x3B9ACA00
@@ -58,7 +52,7 @@
#define PTP_MSG_ALL_OTHER 0x5
#define PTP_GET_TX_TIMESTAMP 0x1
-#define PTP_GET_RX_TIMESTAMP 0x9
+#define PTP_GET_RX_TIMESTAMP 0x2
#define PTP_SET_RTC_TIME 0x3
#define PTP_SET_COMPENSATION 0x4
#define PTP_GET_CURRENT_TIME 0x5
@@ -70,15 +64,13 @@
#define PTP_GET_RX_TIMESTAMP_PDELAY_RESP 0xD
#define FEC_PTP_DOMAIN_DLFT 0xe0000181
-#define FEC_PTP_IP_OFFS 0x0
-#define FEC_PTP_UDP_OFFS 0x14
-#define FEC_PTP_MSG_TYPE_OFFS 0x1C
-#define FEC_PTP_SEQ_ID_OFFS 0x3A
-#define FEC_PTP_CTRL_OFFS 0x3C
+#define FEC_PTP_IP_OFFS 0xE
+#define FEC_PTP_UDP_OFFS 0x22
+#define FEC_PTP_MSG_TYPE_OFFS 0x2A
+#define FEC_PTP_SEQ_ID_OFFS 0x48
+#define FEC_PTP_CTRL_OFFS 0x4A
#define FEC_PACKET_TYPE_UDP 0x11
-#define FEC_PTP_ORIG_COMP 0x15555555
-
/* PTP standard time representation structure */
struct ptp_time{
u64 sec; /* seconds */
@@ -110,31 +102,6 @@ struct ptp_rtc_time {
struct ptp_time rtc_time;
};
-/* interface for PTP driver command SET_COMPENSATION */
-struct ptp_set_comp {
- u32 drift;
- bool o_ops;
-};
-
-/* interface for PTP driver command GET_ORIG_COMP */
-struct ptp_get_comp {
- /* the initial compensation value */
- u32 dw_origcomp;
- /* the minimum compensation value */
- u32 dw_mincomp;
- /*the max compensation value*/
- u32 dw_maxcomp;
- /*the min drift applying min compensation value in ppm*/
- u32 dw_mindrift;
- /*the max drift applying max compensation value in ppm*/
- u32 dw_maxdrift;
-};
-
-struct ptp_time_correct {
- u32 corr_period;
- u32 corr_inc;
-};
-
/* PTP message version */
#define PTP_1588_MSG_VER_1 1
#define PTP_1588_MSG_VER_2 2
diff --git a/drivers/net/fec_switch.c b/drivers/net/fec_switch.c
index 0485349dcd76..f2c78e439278 100644
--- a/drivers/net/fec_switch.c
+++ b/drivers/net/fec_switch.c
@@ -131,13 +131,9 @@ static void *swap_buffer(void *bufaddr, int len)
/*last read entry from learning interface*/
struct eswPortInfo g_info;
-#ifdef USE_DEFAULT_SWITCH_PORT0_MAC
static unsigned char switch_mac_default[] = {
0x00, 0x08, 0x02, 0x6B, 0xA3, 0x1A,
};
-#else
-static unsigned char switch_mac_default[ETH_ALEN];
-#endif
static void switch_request_intrs(struct net_device *dev,
irqreturn_t switch_net_irq_handler(int irq, void *private),
@@ -3704,19 +3700,6 @@ static int __init switch_enet_init(struct net_device *dev,
fep->phy_interface = plat->fec_enet->phy;
if (plat->fec_enet->init && plat->fec_enet->init())
return -EIO;
-
- /*
- * The priority for getting MAC address is:
- * (1) kernel command line fec_mac = xx:xx:xx...
- * (2) platform data mac field got from fuse etc
- * (3) bootloader set the FEC mac register
- */
-
- if (!is_valid_ether_addr(switch_mac_default) &&
- plat->fec_enet->mac &&
- is_valid_ether_addr(plat->fec_enet->mac))
- memcpy(switch_mac_default, plat->fec_enet->mac,
- sizeof(switch_mac_default));
} else
fep->phy_interface = PHY_INTERFACE_MODE_MII;
diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c
index e44215cb1882..9048718aff1b 100644
--- a/drivers/net/iseries_veth.c
+++ b/drivers/net/iseries_veth.c
@@ -495,7 +495,7 @@ static void veth_take_cap_ack(struct veth_lpar_connection *cnx,
cnx->remote_lp);
} else {
memcpy(&cnx->cap_ack_event, event,
- sizeof(&cnx->cap_ack_event));
+ sizeof(cnx->cap_ack_event));
cnx->state |= VETH_STATE_GOTCAPACK;
veth_kick_statemachine(cnx);
}
diff --git a/drivers/net/mlx4/eq.c b/drivers/net/mlx4/eq.c
index b9ceddde46c0..4ff665c0f144 100644
--- a/drivers/net/mlx4/eq.c
+++ b/drivers/net/mlx4/eq.c
@@ -526,48 +526,6 @@ static void mlx4_unmap_clr_int(struct mlx4_dev *dev)
iounmap(priv->clr_base);
}
-int mlx4_map_eq_icm(struct mlx4_dev *dev, u64 icm_virt)
-{
- struct mlx4_priv *priv = mlx4_priv(dev);
- int ret;
-
- /*
- * We assume that mapping one page is enough for the whole EQ
- * context table. This is fine with all current HCAs, because
- * we only use 32 EQs and each EQ uses 64 bytes of context
- * memory, or 1 KB total.
- */
- priv->eq_table.icm_virt = icm_virt;
- priv->eq_table.icm_page = alloc_page(GFP_HIGHUSER);
- if (!priv->eq_table.icm_page)
- return -ENOMEM;
- priv->eq_table.icm_dma = pci_map_page(dev->pdev, priv->eq_table.icm_page, 0,
- PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
- if (pci_dma_mapping_error(dev->pdev, priv->eq_table.icm_dma)) {
- __free_page(priv->eq_table.icm_page);
- return -ENOMEM;
- }
-
- ret = mlx4_MAP_ICM_page(dev, priv->eq_table.icm_dma, icm_virt);
- if (ret) {
- pci_unmap_page(dev->pdev, priv->eq_table.icm_dma, PAGE_SIZE,
- PCI_DMA_BIDIRECTIONAL);
- __free_page(priv->eq_table.icm_page);
- }
-
- return ret;
-}
-
-void mlx4_unmap_eq_icm(struct mlx4_dev *dev)
-{
- struct mlx4_priv *priv = mlx4_priv(dev);
-
- mlx4_UNMAP_ICM(dev, priv->eq_table.icm_virt, 1);
- pci_unmap_page(dev->pdev, priv->eq_table.icm_dma, PAGE_SIZE,
- PCI_DMA_BIDIRECTIONAL);
- __free_page(priv->eq_table.icm_page);
-}
-
int mlx4_alloc_eq_table(struct mlx4_dev *dev)
{
struct mlx4_priv *priv = mlx4_priv(dev);
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index dac621b1e9fc..8e8b79fed508 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -525,7 +525,10 @@ static int mlx4_init_icm(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap,
goto err_unmap_aux;
}
- err = mlx4_map_eq_icm(dev, init_hca->eqc_base);
+ err = mlx4_init_icm_table(dev, &priv->eq_table.table,
+ init_hca->eqc_base, dev_cap->eqc_entry_sz,
+ dev->caps.num_eqs, dev->caps.num_eqs,
+ 0, 0);
if (err) {
mlx4_err(dev, "Failed to map EQ context memory, aborting.\n");
goto err_unmap_cmpt;
@@ -668,7 +671,7 @@ err_unmap_mtt:
mlx4_cleanup_icm_table(dev, &priv->mr_table.mtt_table);
err_unmap_eq:
- mlx4_unmap_eq_icm(dev);
+ mlx4_cleanup_icm_table(dev, &priv->eq_table.table);
err_unmap_cmpt:
mlx4_cleanup_icm_table(dev, &priv->eq_table.cmpt_table);
@@ -698,11 +701,11 @@ static void mlx4_free_icms(struct mlx4_dev *dev)
mlx4_cleanup_icm_table(dev, &priv->qp_table.qp_table);
mlx4_cleanup_icm_table(dev, &priv->mr_table.dmpt_table);
mlx4_cleanup_icm_table(dev, &priv->mr_table.mtt_table);
+ mlx4_cleanup_icm_table(dev, &priv->eq_table.table);
mlx4_cleanup_icm_table(dev, &priv->eq_table.cmpt_table);
mlx4_cleanup_icm_table(dev, &priv->cq_table.cmpt_table);
mlx4_cleanup_icm_table(dev, &priv->srq_table.cmpt_table);
mlx4_cleanup_icm_table(dev, &priv->qp_table.cmpt_table);
- mlx4_unmap_eq_icm(dev);
mlx4_UNMAP_ICM_AUX(dev);
mlx4_free_icm(dev, priv->fw.aux_icm, 0);
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index 5bd79c2b184f..bc72d6e4919b 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -205,9 +205,7 @@ struct mlx4_eq_table {
void __iomem **uar_map;
u32 clr_mask;
struct mlx4_eq *eq;
- u64 icm_virt;
- struct page *icm_page;
- dma_addr_t icm_dma;
+ struct mlx4_icm_table table;
struct mlx4_icm_table cmpt_table;
int have_irq;
u8 inta_pin;
@@ -373,9 +371,6 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
struct mlx4_dev_cap *dev_cap,
struct mlx4_init_hca_param *init_hca);
-int mlx4_map_eq_icm(struct mlx4_dev *dev, u64 icm_virt);
-void mlx4_unmap_eq_icm(struct mlx4_dev *dev);
-
int mlx4_cmd_init(struct mlx4_dev *dev);
void mlx4_cmd_cleanup(struct mlx4_dev *dev);
void mlx4_cmd_event(struct mlx4_dev *dev, u16 token, u8 status, u64 out_param);
diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c
index 01f9432c31ef..98bff5ada09a 100644
--- a/drivers/net/sfc/rx.c
+++ b/drivers/net/sfc/rx.c
@@ -444,7 +444,8 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue,
* the appropriate LRO method
*/
static void efx_rx_packet_lro(struct efx_channel *channel,
- struct efx_rx_buffer *rx_buf)
+ struct efx_rx_buffer *rx_buf,
+ bool checksummed)
{
struct napi_struct *napi = &channel->napi_str;
@@ -466,7 +467,8 @@ static void efx_rx_packet_lro(struct efx_channel *channel,
skb->len = rx_buf->len;
skb->data_len = rx_buf->len;
skb->truesize += rx_buf->len;
- skb->ip_summed = CHECKSUM_UNNECESSARY;
+ skb->ip_summed =
+ checksummed ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE;
napi_gro_frags(napi);
@@ -475,6 +477,7 @@ out:
rx_buf->page = NULL;
} else {
EFX_BUG_ON_PARANOID(!rx_buf->skb);
+ EFX_BUG_ON_PARANOID(!checksummed);
napi_gro_receive(napi, rx_buf->skb);
rx_buf->skb = NULL;
@@ -570,7 +573,7 @@ void __efx_rx_packet(struct efx_channel *channel,
}
if (likely(checksummed || rx_buf->page)) {
- efx_rx_packet_lro(channel, rx_buf);
+ efx_rx_packet_lro(channel, rx_buf, checksummed);
goto done;
}
diff --git a/drivers/net/sfc/tx.c b/drivers/net/sfc/tx.c
index 14a14788566c..d36a2894f005 100644
--- a/drivers/net/sfc/tx.c
+++ b/drivers/net/sfc/tx.c
@@ -823,8 +823,6 @@ static void efx_enqueue_unwind(struct efx_tx_queue *tx_queue)
tx_queue->efx->type->txd_ring_mask];
efx_tsoh_free(tx_queue, buffer);
EFX_BUG_ON_PARANOID(buffer->skb);
- buffer->len = 0;
- buffer->continuation = true;
if (buffer->unmap_len) {
unmap_addr = (buffer->dma_addr + buffer->len -
buffer->unmap_len);
@@ -838,6 +836,8 @@ static void efx_enqueue_unwind(struct efx_tx_queue *tx_queue)
PCI_DMA_TODEVICE);
buffer->unmap_len = 0;
}
+ buffer->len = 0;
+ buffer->continuation = true;
}
}
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index 0a551d8f5d95..329f447f5bf7 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -1455,7 +1455,6 @@ static int sky2_up(struct net_device *dev)
if (ramsize > 0) {
u32 rxspace;
- hw->flags |= SKY2_HW_RAM_BUFFER;
pr_debug(PFX "%s: ram buffer %dK\n", dev->name, ramsize);
if (ramsize < 16)
rxspace = ramsize / 2;
@@ -2942,6 +2941,9 @@ static int __devinit sky2_init(struct sky2_hw *hw)
++hw->ports;
}
+ if (sky2_read8(hw, B2_E_0))
+ hw->flags |= SKY2_HW_RAM_BUFFER;
+
return 0;
}
@@ -4526,6 +4528,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
goto err_out_free_netdev;
}
+ netif_carrier_off(dev);
+
netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT);
err = request_irq(pdev->irq, sky2_intr,
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c
index 7567f510eff5..d8ed1b63da78 100644
--- a/drivers/net/smc91x.c
+++ b/drivers/net/smc91x.c
@@ -2283,7 +2283,7 @@ static int __devinit smc_drv_probe(struct platform_device *pdev)
ndev->irq = ires->start;
- if (ires->flags & IRQF_TRIGGER_MASK)
+ if (irq_flags == -1 || ires->flags & IRQF_TRIGGER_MASK)
irq_flags = ires->flags & IRQF_TRIGGER_MASK;
ret = smc_request_attrib(pdev, ndev);
diff --git a/drivers/net/smsc9420.c b/drivers/net/smsc9420.c
index 60abdb1081ad..97ababd189c6 100644
--- a/drivers/net/smsc9420.c
+++ b/drivers/net/smsc9420.c
@@ -252,6 +252,9 @@ static int smsc9420_ethtool_get_settings(struct net_device *dev,
{
struct smsc9420_pdata *pd = netdev_priv(dev);
+ if (!pd->phy_dev)
+ return -ENODEV;
+
cmd->maxtxpkt = 1;
cmd->maxrxpkt = 1;
return phy_ethtool_gset(pd->phy_dev, cmd);
@@ -262,6 +265,9 @@ static int smsc9420_ethtool_set_settings(struct net_device *dev,
{
struct smsc9420_pdata *pd = netdev_priv(dev);
+ if (!pd->phy_dev)
+ return -ENODEV;
+
return phy_ethtool_sset(pd->phy_dev, cmd);
}
@@ -290,6 +296,10 @@ static void smsc9420_ethtool_set_msglevel(struct net_device *netdev, u32 data)
static int smsc9420_ethtool_nway_reset(struct net_device *netdev)
{
struct smsc9420_pdata *pd = netdev_priv(netdev);
+
+ if (!pd->phy_dev)
+ return -ENODEV;
+
return phy_start_aneg(pd->phy_dev);
}
@@ -312,6 +322,10 @@ smsc9420_ethtool_getregs(struct net_device *dev, struct ethtool_regs *regs,
for (i = 0; i < 0x100; i += (sizeof(u32)))
data[j++] = smsc9420_reg_read(pd, i);
+ // cannot read phy registers if the net device is down
+ if (!phy_dev)
+ return;
+
for (i = 0; i <= 31; i++)
data[j++] = smsc9420_mii_read(phy_dev->bus, phy_dev->addr, i);
}
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 42b6c6319bc2..156f59b25191 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -943,8 +943,6 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
char *name;
unsigned long flags = 0;
- err = -EINVAL;
-
if (!capable(CAP_NET_ADMIN))
return -EPERM;
@@ -958,7 +956,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
flags |= TUN_TAP_DEV;
name = "tap%d";
} else
- goto failed;
+ return -EINVAL;
if (*ifr->ifr_name)
name = ifr->ifr_name;
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index f8c6d7ea7264..9e1fc2968cf1 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -1362,7 +1362,7 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp)
/* reset the rts and dtr */
/* do the actual close */
serial->open_count--;
- kref_put(&serial->parent->ref, hso_serial_ref_free);
+
if (serial->open_count <= 0) {
serial->open_count = 0;
spin_lock_irq(&serial->serial_lock);
@@ -1382,6 +1382,8 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp)
usb_autopm_put_interface(serial->parent->interface);
mutex_unlock(&serial->parent->mutex);
+
+ kref_put(&serial->parent->ref, hso_serial_ref_free);
}
/* close the requested serial port */
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c
index 1f9ec29fce50..65a43c8e76b5 100644
--- a/drivers/net/usb/kaweth.c
+++ b/drivers/net/usb/kaweth.c
@@ -263,6 +263,7 @@ static int kaweth_control(struct kaweth_device *kaweth,
int timeout)
{
struct usb_ctrlrequest *dr;
+ int retval;
dbg("kaweth_control()");
@@ -278,18 +279,21 @@ static int kaweth_control(struct kaweth_device *kaweth,
return -ENOMEM;
}
- dr->bRequestType= requesttype;
+ dr->bRequestType = requesttype;
dr->bRequest = request;
dr->wValue = cpu_to_le16(value);
dr->wIndex = cpu_to_le16(index);
dr->wLength = cpu_to_le16(size);
- return kaweth_internal_control_msg(kaweth->dev,
- pipe,
- dr,
- data,
- size,
- timeout);
+ retval = kaweth_internal_control_msg(kaweth->dev,
+ pipe,
+ dr,
+ data,
+ size,
+ timeout);
+
+ kfree(dr);
+ return retval;
}
/****************************************************************
diff --git a/drivers/net/usb/rtl8150.c b/drivers/net/usb/rtl8150.c
index fcc6fa0905d1..18686839cd12 100644
--- a/drivers/net/usb/rtl8150.c
+++ b/drivers/net/usb/rtl8150.c
@@ -324,7 +324,7 @@ static int rtl8150_set_mac_address(struct net_device *netdev, void *p)
dbg("%02X:", netdev->dev_addr[i]);
dbg("%02X\n", netdev->dev_addr[i]);
/* Set the IDR registers. */
- set_registers(dev, IDR, sizeof(netdev->dev_addr), netdev->dev_addr);
+ set_registers(dev, IDR, netdev->addr_len, netdev->dev_addr);
#ifdef EEPROM_WRITE
{
u8 cr;
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index fe045896406b..df49d0daaa16 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -1232,7 +1232,7 @@ static const struct driver_info smsc95xx_info = {
.rx_fixup = smsc95xx_rx_fixup,
.tx_fixup = smsc95xx_tx_fixup,
.status = smsc95xx_status,
- .flags = FLAG_ETHER,
+ .flags = FLAG_ETHER | FLAG_SEND_ZLP,
};
static const struct usb_device_id products[] = {
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index edfd9e10ceba..d49df7352017 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -988,7 +988,7 @@ int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
* NOTE: strictly conforming cdc-ether devices should expect
* the ZLP here, but ignore the one-byte packet.
*/
- if ((length % dev->maxpacket) == 0) {
+ if (!(info->flags & FLAG_SEND_ZLP) && (length % dev->maxpacket) == 0) {
urb->transfer_buffer_length++;
if (skb_tailroom(skb)) {
skb->data[skb->len] = 0;
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index 8ce5e4cee168..374f74702156 100644
--- a/drivers/net/wireless/airo.c
+++ b/drivers/net/wireless/airo.c
@@ -5249,11 +5249,7 @@ static int set_wep_key(struct airo_info *ai, u16 index, const char *key,
WepKeyRid wkr;
int rc;
- if (keylen == 0) {
- airo_print_err(ai->dev->name, "%s: key length to set was zero",
- __func__);
- return -1;
- }
+ WARN_ON(keylen == 0);
memset(&wkr, 0, sizeof(wkr));
wkr.len = cpu_to_le16(sizeof(wkr));
@@ -6399,11 +6395,7 @@ static int airo_set_encode(struct net_device *dev,
if (dwrq->length > MIN_KEY_SIZE)
key.len = MAX_KEY_SIZE;
else
- if (dwrq->length > 0)
- key.len = MIN_KEY_SIZE;
- else
- /* Disable the key */
- key.len = 0;
+ key.len = MIN_KEY_SIZE;
/* Check if the key is not marked as invalid */
if(!(dwrq->flags & IW_ENCODE_NOKEY)) {
/* Cleanup */
@@ -6584,12 +6576,22 @@ static int airo_set_encodeext(struct net_device *dev,
default:
return -EINVAL;
}
- /* Send the key to the card */
- rc = set_wep_key(local, idx, key.key, key.len, perm, 1);
- if (rc < 0) {
- airo_print_err(local->dev->name, "failed to set WEP key"
- " at index %d: %d.", idx, rc);
- return rc;
+ if (key.len == 0) {
+ rc = set_wep_tx_idx(local, idx, perm, 1);
+ if (rc < 0) {
+ airo_print_err(local->dev->name,
+ "failed to set WEP transmit index to %d: %d.",
+ idx, rc);
+ return rc;
+ }
+ } else {
+ rc = set_wep_key(local, idx, key.key, key.len, perm, 1);
+ if (rc < 0) {
+ airo_print_err(local->dev->name,
+ "failed to set WEP key at index %d: %d.",
+ idx, rc);
+ return rc;
+ }
}
}
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c
index 007eb85fc67e..1084ca69835f 100644
--- a/drivers/net/wireless/ath/ar9170/usb.c
+++ b/drivers/net/wireless/ath/ar9170/usb.c
@@ -64,6 +64,8 @@ static struct usb_device_id ar9170_usb_ids[] = {
{ USB_DEVICE(0x0cf3, 0x9170) },
/* Atheros TG121N */
{ USB_DEVICE(0x0cf3, 0x1001) },
+ /* TP-Link TL-WN821N v2 */
+ { USB_DEVICE(0x0cf3, 0x1002) },
/* Cace Airpcap NX */
{ USB_DEVICE(0xcace, 0x0300) },
/* D-Link DWA 160A */
diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
index 6358233bac99..778baf7de231 100644
--- a/drivers/net/wireless/ath/ath5k/ath5k.h
+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
@@ -1164,6 +1164,7 @@ extern void ath5k_unregister_leds(struct ath5k_softc *sc);
/* Reset Functions */
extern int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial);
+extern int ath5k_hw_on_hold(struct ath5k_hw *ah);
extern int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, struct ieee80211_channel *channel, bool change_channel);
/* Power management functions */
extern int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, bool set_chip, u16 sleep_duration);
diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c
index c41ef58393e7..605b8f67dbe0 100644
--- a/drivers/net/wireless/ath/ath5k/attach.c
+++ b/drivers/net/wireless/ath/ath5k/attach.c
@@ -145,7 +145,7 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version)
goto err_free;
/* Bring device out of sleep and reset it's units */
- ret = ath5k_hw_nic_wakeup(ah, CHANNEL_B, true);
+ ret = ath5k_hw_nic_wakeup(ah, 0, true);
if (ret)
goto err_free;
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 029c1bc7468f..753f50e8d84f 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -666,7 +666,6 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state)
ath5k_led_off(sc);
- free_irq(pdev->irq, sc);
pci_save_state(pdev);
pci_disable_device(pdev);
pci_set_power_state(pdev, PCI_D3hot);
@@ -694,18 +693,8 @@ ath5k_pci_resume(struct pci_dev *pdev)
*/
pci_write_config_byte(pdev, 0x41, 0);
- err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc);
- if (err) {
- ATH5K_ERR(sc, "request_irq failed\n");
- goto err_no_irq;
- }
-
ath5k_led_enable(sc);
return 0;
-
-err_no_irq:
- pci_disable_device(pdev);
- return err;
}
#endif /* CONFIG_PM */
@@ -2445,27 +2434,29 @@ ath5k_stop_hw(struct ath5k_softc *sc)
ret = ath5k_stop_locked(sc);
if (ret == 0 && !test_bit(ATH_STAT_INVALID, sc->status)) {
/*
- * Set the chip in full sleep mode. Note that we are
- * careful to do this only when bringing the interface
- * completely to a stop. When the chip is in this state
- * it must be carefully woken up or references to
- * registers in the PCI clock domain may freeze the bus
- * (and system). This varies by chip and is mostly an
- * issue with newer parts that go to sleep more quickly.
- */
- if (sc->ah->ah_mac_srev >= 0x78) {
- /*
- * XXX
- * don't put newer MAC revisions > 7.8 to sleep because
- * of the above mentioned problems
- */
- ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "mac version > 7.8, "
- "not putting device to sleep\n");
- } else {
- ATH5K_DBG(sc, ATH5K_DEBUG_RESET,
- "putting device to full sleep\n");
- ath5k_hw_set_power(sc->ah, AR5K_PM_FULL_SLEEP, true, 0);
- }
+ * Don't set the card in full sleep mode!
+ *
+ * a) When the device is in this state it must be carefully
+ * woken up or references to registers in the PCI clock
+ * domain may freeze the bus (and system). This varies
+ * by chip and is mostly an issue with newer parts
+ * (madwifi sources mentioned srev >= 0x78) that go to
+ * sleep more quickly.
+ *
+ * b) On older chips full sleep results a weird behaviour
+ * during wakeup. I tested various cards with srev < 0x78
+ * and they don't wake up after module reload, a second
+ * module reload is needed to bring the card up again.
+ *
+ * Until we figure out what's going on don't enable
+ * full chip reset on any chip (this is what Legacy HAL
+ * and Sam's HAL do anyway). Instead Perform a full reset
+ * on the device (same as initial state after attach) and
+ * leave it idle (keep MAC/BB on warm reset) */
+ ret = ath5k_hw_on_hold(sc->ah);
+
+ ATH5K_DBG(sc, ATH5K_DEBUG_RESET,
+ "putting device to sleep\n");
}
ath5k_txbuf_free(sc, sc->bbuf);
@@ -2676,7 +2667,7 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan)
sc->curchan = chan;
sc->curband = &sc->sbands[chan->band];
}
- ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, true);
+ ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, chan != NULL);
if (ret) {
ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret);
goto err;
diff --git a/drivers/net/wireless/ath/ath5k/eeprom.c b/drivers/net/wireless/ath/ath5k/eeprom.c
index c56b494d417a..5eded5a0d452 100644
--- a/drivers/net/wireless/ath/ath5k/eeprom.c
+++ b/drivers/net/wireless/ath/ath5k/eeprom.c
@@ -97,6 +97,7 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
int ret;
u16 val;
+ u32 cksum, offset, eep_max = AR5K_EEPROM_INFO_MAX;
/*
* Read values from EEPROM and store them in the capability structure
@@ -111,20 +112,44 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
if (ah->ah_ee_version < AR5K_EEPROM_VERSION_3_0)
return 0;
-#ifdef notyet
/*
* Validate the checksum of the EEPROM date. There are some
* devices with invalid EEPROMs.
*/
- for (cksum = 0, offset = 0; offset < AR5K_EEPROM_INFO_MAX; offset++) {
+ AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_UPPER, val);
+ if (val) {
+ eep_max = (val & AR5K_EEPROM_SIZE_UPPER_MASK) <<
+ AR5K_EEPROM_SIZE_ENDLOC_SHIFT;
+ AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_LOWER, val);
+ eep_max = (eep_max | val) - AR5K_EEPROM_INFO_BASE;
+
+ /*
+ * Fail safe check to prevent stupid loops due
+ * to busted EEPROMs. XXX: This value is likely too
+ * big still, waiting on a better value.
+ */
+ if (eep_max > (3 * AR5K_EEPROM_INFO_MAX)) {
+ ATH5K_ERR(ah->ah_sc, "Invalid max custom EEPROM size: "
+ "%d (0x%04x) max expected: %d (0x%04x)\n",
+ eep_max, eep_max,
+ 3 * AR5K_EEPROM_INFO_MAX,
+ 3 * AR5K_EEPROM_INFO_MAX);
+ return -EIO;
+ }
+ }
+
+ for (cksum = 0, offset = 0; offset < eep_max; offset++) {
AR5K_EEPROM_READ(AR5K_EEPROM_INFO(offset), val);
cksum ^= val;
}
if (cksum != AR5K_EEPROM_INFO_CKSUM) {
- ATH5K_ERR(ah->ah_sc, "Invalid EEPROM checksum 0x%04x\n", cksum);
+ ATH5K_ERR(ah->ah_sc, "Invalid EEPROM "
+ "checksum: 0x%04x eep_max: 0x%04x (%s)\n",
+ cksum, eep_max,
+ eep_max == AR5K_EEPROM_INFO_MAX ?
+ "default size" : "custom size");
return -EIO;
}
-#endif
AR5K_EEPROM_READ_HDR(AR5K_EEPROM_ANT_GAIN(ah->ah_ee_version),
ee_ant_gain);
diff --git a/drivers/net/wireless/ath/ath5k/eeprom.h b/drivers/net/wireless/ath/ath5k/eeprom.h
index 64be73a5edae..020bc4c75ef0 100644
--- a/drivers/net/wireless/ath/ath5k/eeprom.h
+++ b/drivers/net/wireless/ath/ath5k/eeprom.h
@@ -34,6 +34,14 @@
#define AR5K_EEPROM_RFKILL_POLARITY_S 1
#define AR5K_EEPROM_REG_DOMAIN 0x00bf /* EEPROM regdom */
+
+/* FLASH(EEPROM) Defines for AR531X chips */
+#define AR5K_EEPROM_SIZE_LOWER 0x1b /* size info -- lower */
+#define AR5K_EEPROM_SIZE_UPPER 0x1c /* size info -- upper */
+#define AR5K_EEPROM_SIZE_UPPER_MASK 0xfff0
+#define AR5K_EEPROM_SIZE_UPPER_SHIFT 4
+#define AR5K_EEPROM_SIZE_ENDLOC_SHIFT 12
+
#define AR5K_EEPROM_CHECKSUM 0x00c0 /* EEPROM checksum */
#define AR5K_EEPROM_INFO_BASE 0x00c0 /* EEPROM header */
#define AR5K_EEPROM_INFO_MAX (0x400 - AR5K_EEPROM_INFO_BASE)
diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c
index a876ca8d69ef..5c0e31b197a0 100644
--- a/drivers/net/wireless/ath/ath5k/phy.c
+++ b/drivers/net/wireless/ath/ath5k/phy.c
@@ -740,13 +740,22 @@ int ath5k_hw_rfregs_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
AR5K_RF_XPD_GAIN, true);
} else {
- /* TODO: Set high and low gain bits */
- ath5k_hw_rfb_op(ah, rf_regs,
- ee->ee_x_gain[ee_mode],
+ u8 *pdg_curve_to_idx = ee->ee_pdc_to_idx[ee_mode];
+ if (ee->ee_pd_gains[ee_mode] > 1) {
+ ath5k_hw_rfb_op(ah, rf_regs,
+ pdg_curve_to_idx[0],
AR5K_RF_PD_GAIN_LO, true);
- ath5k_hw_rfb_op(ah, rf_regs,
- ee->ee_x_gain[ee_mode],
+ ath5k_hw_rfb_op(ah, rf_regs,
+ pdg_curve_to_idx[1],
AR5K_RF_PD_GAIN_HI, true);
+ } else {
+ ath5k_hw_rfb_op(ah, rf_regs,
+ pdg_curve_to_idx[0],
+ AR5K_RF_PD_GAIN_LO, true);
+ ath5k_hw_rfb_op(ah, rf_regs,
+ pdg_curve_to_idx[0],
+ AR5K_RF_PD_GAIN_HI, true);
+ }
/* Lower synth voltage on Rev 2 */
ath5k_hw_rfb_op(ah, rf_regs, 2,
@@ -1897,8 +1906,9 @@ ath5k_get_linear_pcdac_min(const u8 *stepL, const u8 *stepR,
s16 min_pwrL, min_pwrR;
s16 pwr_i;
- if (WARN_ON(stepL[0] == stepL[1] || stepR[0] == stepR[1]))
- return 0;
+ /* Some vendors write the same pcdac value twice !!! */
+ if (stepL[0] == stepL[1] || stepR[0] == stepR[1])
+ return max(pwrL[0], pwrR[0]);
if (pwrL[0] == pwrL[1])
min_pwrL = pwrL[0];
@@ -2921,8 +2931,6 @@ ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel,
ATH5K_ERR(ah->ah_sc, "invalid tx power: %u\n", txpower);
return -EINVAL;
}
- if (txpower == 0)
- txpower = AR5K_TUNE_DEFAULT_TXPOWER;
/* Reset TX power values */
memset(&ah->ah_txpower, 0, sizeof(ah->ah_txpower));
diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c
index bd0a97a38d34..4980621b0239 100644
--- a/drivers/net/wireless/ath/ath5k/reset.c
+++ b/drivers/net/wireless/ath/ath5k/reset.c
@@ -258,29 +258,35 @@ int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode,
if (!set_chip)
goto commit;
- /* Preserve sleep duration */
data = ath5k_hw_reg_read(ah, AR5K_SLEEP_CTL);
+
+ /* If card is down we 'll get 0xffff... so we
+ * need to clean this up before we write the register
+ */
if (data & 0xffc00000)
data = 0;
else
- data = data & 0xfffcffff;
+ /* Preserve sleep duration etc */
+ data = data & ~AR5K_SLEEP_CTL_SLE;
- ath5k_hw_reg_write(ah, data, AR5K_SLEEP_CTL);
+ ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE,
+ AR5K_SLEEP_CTL);
udelay(15);
- for (i = 50; i > 0; i--) {
+ for (i = 200; i > 0; i--) {
/* Check if the chip did wake up */
if ((ath5k_hw_reg_read(ah, AR5K_PCICFG) &
AR5K_PCICFG_SPWR_DN) == 0)
break;
/* Wait a bit and retry */
- udelay(200);
- ath5k_hw_reg_write(ah, data, AR5K_SLEEP_CTL);
+ udelay(50);
+ ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE,
+ AR5K_SLEEP_CTL);
}
/* Fail if the chip didn't wake up */
- if (i <= 0)
+ if (i == 0)
return -EIO;
break;
@@ -297,6 +303,64 @@ commit:
}
/*
+ * Put device on hold
+ *
+ * Put MAC and Baseband on warm reset and
+ * keep that state (don't clean sleep control
+ * register). After this MAC and Baseband are
+ * disabled and a full reset is needed to come
+ * back. This way we save as much power as possible
+ * without puting the card on full sleep.
+ */
+int ath5k_hw_on_hold(struct ath5k_hw *ah)
+{
+ struct pci_dev *pdev = ah->ah_sc->pdev;
+ u32 bus_flags;
+ int ret;
+
+ /* Make sure device is awake */
+ ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0);
+ if (ret) {
+ ATH5K_ERR(ah->ah_sc, "failed to wakeup the MAC Chip\n");
+ return ret;
+ }
+
+ /*
+ * Put chipset on warm reset...
+ *
+ * Note: puting PCI core on warm reset on PCI-E cards
+ * results card to hang and always return 0xffff... so
+ * we ingore that flag for PCI-E cards. On PCI cards
+ * this flag gets cleared after 64 PCI clocks.
+ */
+ bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI;
+
+ if (ah->ah_version == AR5K_AR5210) {
+ ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
+ AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA |
+ AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI);
+ mdelay(2);
+ } else {
+ ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
+ AR5K_RESET_CTL_BASEBAND | bus_flags);
+ }
+
+ if (ret) {
+ ATH5K_ERR(ah->ah_sc, "failed to put device on warm reset\n");
+ return -EIO;
+ }
+
+ /* ...wakeup again!*/
+ ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0);
+ if (ret) {
+ ATH5K_ERR(ah->ah_sc, "failed to put device on hold\n");
+ return ret;
+ }
+
+ return ret;
+}
+
+/*
* Bring up MAC + PHY Chips and program PLL
* TODO: Half/Quarter rate support
*/
@@ -319,6 +383,50 @@ int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial)
return ret;
}
+ /*
+ * Put chipset on warm reset...
+ *
+ * Note: puting PCI core on warm reset on PCI-E cards
+ * results card to hang and always return 0xffff... so
+ * we ingore that flag for PCI-E cards. On PCI cards
+ * this flag gets cleared after 64 PCI clocks.
+ */
+ bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI;
+
+ if (ah->ah_version == AR5K_AR5210) {
+ ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
+ AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA |
+ AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI);
+ mdelay(2);
+ } else {
+ ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
+ AR5K_RESET_CTL_BASEBAND | bus_flags);
+ }
+
+ if (ret) {
+ ATH5K_ERR(ah->ah_sc, "failed to reset the MAC Chip\n");
+ return -EIO;
+ }
+
+ /* ...wakeup again!...*/
+ ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0);
+ if (ret) {
+ ATH5K_ERR(ah->ah_sc, "failed to resume the MAC Chip\n");
+ return ret;
+ }
+
+ /* ...clear reset control register and pull device out of
+ * warm reset */
+ if (ath5k_hw_nic_reset(ah, 0)) {
+ ATH5K_ERR(ah->ah_sc, "failed to warm reset the MAC Chip\n");
+ return -EIO;
+ }
+
+ /* On initialization skip PLL programming since we don't have
+ * a channel / mode set yet */
+ if (initial)
+ return 0;
+
if (ah->ah_version != AR5K_AR5210) {
/*
* Get channel mode flags
@@ -384,39 +492,6 @@ int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial)
AR5K_PHY_TURBO);
}
- /* reseting PCI on PCI-E cards results card to hang
- * and always return 0xffff... so we ingore that flag
- * for PCI-E cards */
- bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI;
-
- /* Reset chipset */
- if (ah->ah_version == AR5K_AR5210) {
- ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
- AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA |
- AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI);
- mdelay(2);
- } else {
- ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
- AR5K_RESET_CTL_BASEBAND | bus_flags);
- }
- if (ret) {
- ATH5K_ERR(ah->ah_sc, "failed to reset the MAC Chip\n");
- return -EIO;
- }
-
- /* ...wakeup again!*/
- ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0);
- if (ret) {
- ATH5K_ERR(ah->ah_sc, "failed to resume the MAC Chip\n");
- return ret;
- }
-
- /* ...final warm reset */
- if (ath5k_hw_nic_reset(ah, 0)) {
- ATH5K_ERR(ah->ah_sc, "failed to warm reset the MAC Chip\n");
- return -EIO;
- }
-
if (ah->ah_version != AR5K_AR5210) {
/* ...update PLL if needed */
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
index 40448067e4cc..7797166a0cdb 100644
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
@@ -117,6 +117,7 @@
#define B43_MMIO_TSF_2 0x636 /* core rev < 3 only */
#define B43_MMIO_TSF_3 0x638 /* core rev < 3 only */
#define B43_MMIO_RNG 0x65A
+#define B43_MMIO_IFSSLOT 0x684 /* Interframe slot time */
#define B43_MMIO_IFSCTL 0x688 /* Interframe space control */
#define B43_MMIO_IFSCTL_USE_EDCF 0x0004
#define B43_MMIO_POWERUP_DELAY 0x6A8
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
index 7964cc32b258..32e9513bbc0b 100644
--- a/drivers/net/wireless/b43/dma.c
+++ b/drivers/net/wireless/b43/dma.c
@@ -1158,8 +1158,9 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot)
}
static int dma_tx_fragment(struct b43_dmaring *ring,
- struct sk_buff *skb)
+ struct sk_buff **in_skb)
{
+ struct sk_buff *skb = *in_skb;
const struct b43_dma_ops *ops = ring->ops;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
u8 *header;
@@ -1225,8 +1226,14 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
}
memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len);
+ memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb));
+ bounce_skb->dev = skb->dev;
+ skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb));
+ info = IEEE80211_SKB_CB(bounce_skb);
+
dev_kfree_skb_any(skb);
skb = bounce_skb;
+ *in_skb = bounce_skb;
meta->skb = skb;
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
@@ -1334,13 +1341,22 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb)
spin_lock_irqsave(&ring->lock, flags);
B43_WARN_ON(!ring->tx);
- /* Check if the queue was stopped in mac80211,
- * but we got called nevertheless.
- * That would be a mac80211 bug. */
- B43_WARN_ON(ring->stopped);
- if (unlikely(free_slots(ring) < TX_SLOTS_PER_FRAME)) {
- b43warn(dev->wl, "DMA queue overflow\n");
+ if (unlikely(ring->stopped)) {
+ /* We get here only because of a bug in mac80211.
+ * Because of a race, one packet may be queued after
+ * the queue is stopped, thus we got called when we shouldn't.
+ * For now, just refuse the transmit. */
+ if (b43_debug(dev, B43_DBG_DMAVERBOSE))
+ b43err(dev->wl, "Packet after queue stopped\n");
+ err = -ENOSPC;
+ goto out_unlock;
+ }
+
+ if (unlikely(WARN_ON(free_slots(ring) < TX_SLOTS_PER_FRAME))) {
+ /* If we get here, we have a real error with the queue
+ * full, but queues not stopped. */
+ b43err(dev->wl, "DMA queue overflow\n");
err = -ENOSPC;
goto out_unlock;
}
@@ -1350,7 +1366,11 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb)
* static, so we don't need to store it per frame. */
ring->queue_prio = skb_get_queue_mapping(skb);
- err = dma_tx_fragment(ring, skb);
+ /* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing
+ * into the skb data or cb now. */
+ hdr = NULL;
+ info = NULL;
+ err = dma_tx_fragment(ring, &skb);
if (unlikely(err == -ENOKEY)) {
/* Drop this packet, as we don't have the encryption key
* anymore and must not transmit it unencrypted. */
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index e71c8d9cd706..82fb9d48fa55 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -664,10 +664,17 @@ static void b43_upload_card_macaddress(struct b43_wldev *dev)
static void b43_set_slot_time(struct b43_wldev *dev, u16 slot_time)
{
/* slot_time is in usec. */
- if (dev->phy.type != B43_PHYTYPE_G)
+ /* This test used to exit for all but a G PHY. */
+ if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ)
return;
- b43_write16(dev, 0x684, 510 + slot_time);
- b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time);
+ b43_write16(dev, B43_MMIO_IFSSLOT, 510 + slot_time);
+ /* Shared memory location 0x0010 is the slot time and should be
+ * set to slot_time; however, this register is initially 0 and changing
+ * the value adversely affects the transmit rate for BCM4311
+ * devices. Until this behavior is unterstood, delete this step
+ *
+ * b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time);
+ */
}
static void b43_short_slot_timing_enable(struct b43_wldev *dev)
diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c
index 31e55999893f..dcde92d682ce 100644
--- a/drivers/net/wireless/b43/rfkill.c
+++ b/drivers/net/wireless/b43/rfkill.c
@@ -33,7 +33,8 @@ bool b43_is_hw_radio_enabled(struct b43_wldev *dev)
& B43_MMIO_RADIO_HWENABLED_HI_MASK))
return 1;
} else {
- if (b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO)
+ if (b43_status(dev) >= B43_STAT_STARTED &&
+ b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO)
& B43_MMIO_RADIO_HWENABLED_LO_MASK)
return 1;
}
diff --git a/drivers/net/wireless/b43legacy/rfkill.c b/drivers/net/wireless/b43legacy/rfkill.c
index 8783022db11e..d579df72b783 100644
--- a/drivers/net/wireless/b43legacy/rfkill.c
+++ b/drivers/net/wireless/b43legacy/rfkill.c
@@ -34,6 +34,13 @@ bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev)
& B43legacy_MMIO_RADIO_HWENABLED_HI_MASK))
return 1;
} else {
+ /* To prevent CPU fault on PPC, do not read a register
+ * unless the interface is started; however, on resume
+ * for hibernation, this routine is entered early. When
+ * that happens, unconditionally return TRUE.
+ */
+ if (b43legacy_status(dev) < B43legacy_STAT_STARTED)
+ return 1;
if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO)
& B43legacy_MMIO_RADIO_HWENABLED_LO_MASK)
return 1;
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c
index 6fe122f18c0d..eb57d1ea361f 100644
--- a/drivers/net/wireless/hostap/hostap_main.c
+++ b/drivers/net/wireless/hostap/hostap_main.c
@@ -875,15 +875,16 @@ void hostap_setup_dev(struct net_device *dev, local_info_t *local,
switch(type) {
case HOSTAP_INTERFACE_AP:
+ dev->tx_queue_len = 0; /* use main radio device queue */
dev->netdev_ops = &hostap_mgmt_netdev_ops;
dev->type = ARPHRD_IEEE80211;
dev->header_ops = &hostap_80211_ops;
break;
case HOSTAP_INTERFACE_MASTER:
- dev->tx_queue_len = 0; /* use main radio device queue */
dev->netdev_ops = &hostap_master_ops;
break;
default:
+ dev->tx_queue_len = 0; /* use main radio device queue */
dev->netdev_ops = &hostap_netdev_ops;
}
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c
index 742432388ca3..d04350b14790 100644
--- a/drivers/net/wireless/ipw2x00/ipw2100.c
+++ b/drivers/net/wireless/ipw2x00/ipw2100.c
@@ -6487,6 +6487,16 @@ static int ipw2100_resume(struct pci_dev *pci_dev)
}
#endif
+static void ipw2100_shutdown(struct pci_dev *pci_dev)
+{
+ struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
+
+ /* Take down the device; powers it off, etc. */
+ ipw2100_down(priv);
+
+ pci_disable_device(pci_dev);
+}
+
#define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
static struct pci_device_id ipw2100_pci_id_table[] __devinitdata = {
@@ -6550,6 +6560,7 @@ static struct pci_driver ipw2100_pci_driver = {
.suspend = ipw2100_suspend,
.resume = ipw2100_resume,
#endif
+ .shutdown = ipw2100_shutdown,
};
/**
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index 7da52f1cc1d6..44baa60c9fd3 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -46,7 +46,7 @@
#include "iwl-5000-hw.h"
/* Highest firmware API version supported */
-#define IWL1000_UCODE_API_MAX 2
+#define IWL1000_UCODE_API_MAX 3
/* Lowest firmware API version supported */
#define IWL1000_UCODE_API_MIN 1
@@ -62,12 +62,15 @@ struct iwl_cfg iwl1000_bgn_cfg = {
.ucode_api_min = IWL1000_UCODE_API_MIN,
.sku = IWL_SKU_G|IWL_SKU_N,
.ops = &iwl5000_ops,
- .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
+ .eeprom_size = OTP_LOW_IMAGE_SIZE,
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
.mod_params = &iwl50_mod_params,
.valid_tx_ant = ANT_A,
.valid_rx_ant = ANT_AB,
.need_pll_cfg = true,
+ .max_ll_items = OTP_MAX_LL_ITEMS_1000,
+ .shadow_ram_support = false,
+ .use_rts_for_ht = true, /* use rts/cts protection */
};
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index 46288e724889..b73ab6c278f3 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -2784,11 +2784,50 @@ static int iwl3945_load_bsm(struct iwl_priv *priv)
return 0;
}
+#define IWL3945_UCODE_GET(item) \
+static u32 iwl3945_ucode_get_##item(const struct iwl_ucode_header *ucode,\
+ u32 api_ver) \
+{ \
+ return le32_to_cpu(ucode->u.v1.item); \
+}
+
+static u32 iwl3945_ucode_get_header_size(u32 api_ver)
+{
+ return UCODE_HEADER_SIZE(1);
+}
+static u32 iwl3945_ucode_get_build(const struct iwl_ucode_header *ucode,
+ u32 api_ver)
+{
+ return 0;
+}
+static u8 *iwl3945_ucode_get_data(const struct iwl_ucode_header *ucode,
+ u32 api_ver)
+{
+ return (u8 *) ucode->u.v1.data;
+}
+
+IWL3945_UCODE_GET(inst_size);
+IWL3945_UCODE_GET(data_size);
+IWL3945_UCODE_GET(init_size);
+IWL3945_UCODE_GET(init_data_size);
+IWL3945_UCODE_GET(boot_size);
+
static struct iwl_hcmd_ops iwl3945_hcmd = {
.rxon_assoc = iwl3945_send_rxon_assoc,
.commit_rxon = iwl3945_commit_rxon,
};
+static struct iwl_ucode_ops iwl3945_ucode = {
+ .get_header_size = iwl3945_ucode_get_header_size,
+ .get_build = iwl3945_ucode_get_build,
+ .get_inst_size = iwl3945_ucode_get_inst_size,
+ .get_data_size = iwl3945_ucode_get_data_size,
+ .get_init_size = iwl3945_ucode_get_init_size,
+ .get_init_data_size = iwl3945_ucode_get_init_data_size,
+ .get_boot_size = iwl3945_ucode_get_boot_size,
+ .get_data = iwl3945_ucode_get_data,
+};
+
static struct iwl_lib_ops iwl3945_lib = {
.txq_attach_buf_to_tfd = iwl3945_hw_txq_attach_buf_to_tfd,
.txq_free_tfd = iwl3945_hw_txq_free_tfd,
@@ -2829,6 +2868,7 @@ static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = {
};
static struct iwl_ops iwl3945_ops = {
+ .ucode = &iwl3945_ucode,
.lib = &iwl3945_lib,
.hcmd = &iwl3945_hcmd,
.utils = &iwl3945_hcmd_utils,
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index 8f3d4bc6a03f..157ee1506b3c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -2221,12 +2221,50 @@ static void iwl4965_cancel_deferred_work(struct iwl_priv *priv)
cancel_work_sync(&priv->txpower_work);
}
+#define IWL4965_UCODE_GET(item) \
+static u32 iwl4965_ucode_get_##item(const struct iwl_ucode_header *ucode,\
+ u32 api_ver) \
+{ \
+ return le32_to_cpu(ucode->u.v1.item); \
+}
+
+static u32 iwl4965_ucode_get_header_size(u32 api_ver)
+{
+ return UCODE_HEADER_SIZE(1);
+}
+static u32 iwl4965_ucode_get_build(const struct iwl_ucode_header *ucode,
+ u32 api_ver)
+{
+ return 0;
+}
+static u8 *iwl4965_ucode_get_data(const struct iwl_ucode_header *ucode,
+ u32 api_ver)
+{
+ return (u8 *) ucode->u.v1.data;
+}
+
+IWL4965_UCODE_GET(inst_size);
+IWL4965_UCODE_GET(data_size);
+IWL4965_UCODE_GET(init_size);
+IWL4965_UCODE_GET(init_data_size);
+IWL4965_UCODE_GET(boot_size);
+
static struct iwl_hcmd_ops iwl4965_hcmd = {
.rxon_assoc = iwl4965_send_rxon_assoc,
.commit_rxon = iwl_commit_rxon,
.set_rxon_chain = iwl_set_rxon_chain,
};
+static struct iwl_ucode_ops iwl4965_ucode = {
+ .get_header_size = iwl4965_ucode_get_header_size,
+ .get_build = iwl4965_ucode_get_build,
+ .get_inst_size = iwl4965_ucode_get_inst_size,
+ .get_data_size = iwl4965_ucode_get_data_size,
+ .get_init_size = iwl4965_ucode_get_init_size,
+ .get_init_data_size = iwl4965_ucode_get_init_data_size,
+ .get_boot_size = iwl4965_ucode_get_boot_size,
+ .get_data = iwl4965_ucode_get_data,
+};
static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = {
.get_hcmd_size = iwl4965_get_hcmd_size,
.build_addsta_hcmd = iwl4965_build_addsta_hcmd,
@@ -2287,6 +2325,7 @@ static struct iwl_lib_ops iwl4965_lib = {
};
static struct iwl_ops iwl4965_ops = {
+ .ucode = &iwl4965_ucode,
.lib = &iwl4965_lib,
.hcmd = &iwl4965_hcmd,
.utils = &iwl4965_hcmd_utils,
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index b3c648ce8c7b..a9ea3b5d49d5 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -239,6 +239,13 @@ static void iwl5000_nic_config(struct iwl_priv *priv)
APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
+ if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_1000) {
+ /* Setting digital SVR for 1000 card to 1.32V */
+ iwl_set_bits_mask_prph(priv, APMG_DIGITAL_SVR_REG,
+ APMG_SVR_DIGITAL_VOLTAGE_1_32,
+ ~APMG_SVR_VOLTAGE_CONFIG_BIT_MSK);
+ }
+
spin_unlock_irqrestore(&priv->lock, flags);
}
@@ -1426,6 +1433,44 @@ int iwl5000_calc_rssi(struct iwl_priv *priv,
return max_rssi - agc - IWL49_RSSI_OFFSET;
}
+#define IWL5000_UCODE_GET(item) \
+static u32 iwl5000_ucode_get_##item(const struct iwl_ucode_header *ucode,\
+ u32 api_ver) \
+{ \
+ if (api_ver <= 2) \
+ return le32_to_cpu(ucode->u.v1.item); \
+ return le32_to_cpu(ucode->u.v2.item); \
+}
+
+static u32 iwl5000_ucode_get_header_size(u32 api_ver)
+{
+ if (api_ver <= 2)
+ return UCODE_HEADER_SIZE(1);
+ return UCODE_HEADER_SIZE(2);
+}
+
+static u32 iwl5000_ucode_get_build(const struct iwl_ucode_header *ucode,
+ u32 api_ver)
+{
+ if (api_ver <= 2)
+ return 0;
+ return le32_to_cpu(ucode->u.v2.build);
+}
+
+static u8 *iwl5000_ucode_get_data(const struct iwl_ucode_header *ucode,
+ u32 api_ver)
+{
+ if (api_ver <= 2)
+ return (u8 *) ucode->u.v1.data;
+ return (u8 *) ucode->u.v2.data;
+}
+
+IWL5000_UCODE_GET(inst_size);
+IWL5000_UCODE_GET(data_size);
+IWL5000_UCODE_GET(init_size);
+IWL5000_UCODE_GET(init_data_size);
+IWL5000_UCODE_GET(boot_size);
+
struct iwl_hcmd_ops iwl5000_hcmd = {
.rxon_assoc = iwl5000_send_rxon_assoc,
.commit_rxon = iwl_commit_rxon,
@@ -1441,6 +1486,17 @@ struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = {
.calc_rssi = iwl5000_calc_rssi,
};
+struct iwl_ucode_ops iwl5000_ucode = {
+ .get_header_size = iwl5000_ucode_get_header_size,
+ .get_build = iwl5000_ucode_get_build,
+ .get_inst_size = iwl5000_ucode_get_inst_size,
+ .get_data_size = iwl5000_ucode_get_data_size,
+ .get_init_size = iwl5000_ucode_get_init_size,
+ .get_init_data_size = iwl5000_ucode_get_init_data_size,
+ .get_boot_size = iwl5000_ucode_get_boot_size,
+ .get_data = iwl5000_ucode_get_data,
+};
+
struct iwl_lib_ops iwl5000_lib = {
.set_hw_params = iwl5000_hw_set_hw_params,
.txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl,
@@ -1542,12 +1598,14 @@ static struct iwl_lib_ops iwl5150_lib = {
};
struct iwl_ops iwl5000_ops = {
+ .ucode = &iwl5000_ucode,
.lib = &iwl5000_lib,
.hcmd = &iwl5000_hcmd,
.utils = &iwl5000_hcmd_utils,
};
static struct iwl_ops iwl5150_ops = {
+ .ucode = &iwl5000_ucode,
.lib = &iwl5150_lib,
.hcmd = &iwl5000_hcmd,
.utils = &iwl5000_hcmd_utils,
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index bd438d8acf55..ee7b48ed3e8b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -46,8 +46,8 @@
#include "iwl-5000-hw.h"
/* Highest firmware API version supported */
-#define IWL6000_UCODE_API_MAX 2
-#define IWL6050_UCODE_API_MAX 2
+#define IWL6000_UCODE_API_MAX 3
+#define IWL6050_UCODE_API_MAX 3
/* Lowest firmware API version supported */
#define IWL6000_UCODE_API_MIN 1
@@ -69,6 +69,7 @@ static struct iwl_hcmd_utils_ops iwl6000_hcmd_utils = {
};
static struct iwl_ops iwl6000_ops = {
+ .ucode = &iwl5000_ucode,
.lib = &iwl5000_lib,
.hcmd = &iwl5000_hcmd,
.utils = &iwl6000_hcmd_utils,
@@ -81,13 +82,15 @@ struct iwl_cfg iwl6000_2ag_cfg = {
.ucode_api_min = IWL6000_UCODE_API_MIN,
.sku = IWL_SKU_A|IWL_SKU_G,
.ops = &iwl6000_ops,
- .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
+ .eeprom_size = OTP_LOW_IMAGE_SIZE,
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
.mod_params = &iwl50_mod_params,
.valid_tx_ant = ANT_BC,
.valid_rx_ant = ANT_BC,
.need_pll_cfg = false,
+ .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
+ .shadow_ram_support = true,
};
struct iwl_cfg iwl6000_2agn_cfg = {
@@ -97,13 +100,16 @@ struct iwl_cfg iwl6000_2agn_cfg = {
.ucode_api_min = IWL6000_UCODE_API_MIN,
.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,
.ops = &iwl6000_ops,
- .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
+ .eeprom_size = OTP_LOW_IMAGE_SIZE,
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
.mod_params = &iwl50_mod_params,
.valid_tx_ant = ANT_AB,
.valid_rx_ant = ANT_AB,
.need_pll_cfg = false,
+ .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
+ .shadow_ram_support = true,
+ .use_rts_for_ht = true, /* use rts/cts protection */
};
struct iwl_cfg iwl6050_2agn_cfg = {
@@ -113,13 +119,16 @@ struct iwl_cfg iwl6050_2agn_cfg = {
.ucode_api_min = IWL6050_UCODE_API_MIN,
.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,
.ops = &iwl6000_ops,
- .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
+ .eeprom_size = OTP_LOW_IMAGE_SIZE,
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
.mod_params = &iwl50_mod_params,
.valid_tx_ant = ANT_AB,
.valid_rx_ant = ANT_AB,
.need_pll_cfg = false,
+ .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
+ .shadow_ram_support = true,
+ .use_rts_for_ht = true, /* use rts/cts protection */
};
struct iwl_cfg iwl6000_3agn_cfg = {
@@ -129,13 +138,16 @@ struct iwl_cfg iwl6000_3agn_cfg = {
.ucode_api_min = IWL6000_UCODE_API_MIN,
.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,
.ops = &iwl6000_ops,
- .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
+ .eeprom_size = OTP_LOW_IMAGE_SIZE,
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
.mod_params = &iwl50_mod_params,
.valid_tx_ant = ANT_ABC,
.valid_rx_ant = ANT_ABC,
.need_pll_cfg = false,
+ .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
+ .shadow_ram_support = true,
+ .use_rts_for_ht = true, /* use rts/cts protection */
};
struct iwl_cfg iwl6050_3agn_cfg = {
@@ -145,13 +157,16 @@ struct iwl_cfg iwl6050_3agn_cfg = {
.ucode_api_min = IWL6050_UCODE_API_MIN,
.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,
.ops = &iwl6000_ops,
- .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
+ .eeprom_size = OTP_LOW_IMAGE_SIZE,
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
.mod_params = &iwl50_mod_params,
.valid_tx_ant = ANT_ABC,
.valid_rx_ant = ANT_ABC,
.need_pll_cfg = false,
+ .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
+ .shadow_ram_support = true,
+ .use_rts_for_ht = true, /* use rts/cts protection */
};
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
index ff20e5048a55..f5c108be541c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
@@ -415,6 +415,15 @@ static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid,
else if (tid == IWL_AGG_ALL_TID)
for (tid = 0; tid < TID_MAX_LOAD_COUNT; tid++)
rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta);
+ if (priv->cfg->use_rts_for_ht) {
+ /*
+ * switch to RTS/CTS if it is the prefer protection method
+ * for HT traffic
+ */
+ IWL_DEBUG_HT(priv, "use RTS/CTS protection for HT\n");
+ priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN;
+ iwlcore_commit_rxon(priv);
+ }
}
static inline int get_num_of_ant_from_rate(u32 rate_n_flags)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 355f50ea7fef..fc33b29c58ae 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -115,9 +115,6 @@ int iwl_commit_rxon(struct iwl_priv *priv)
/* always get timestamp with Rx frame */
priv->staging_rxon.flags |= RXON_FLG_TSF2HOST_MSK;
- /* allow CTS-to-self if possible. this is relevant only for
- * 5000, but will not damage 4965 */
- priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN;
ret = iwl_check_rxon_cmd(priv);
if (ret) {
@@ -217,6 +214,13 @@ int iwl_commit_rxon(struct iwl_priv *priv)
"Could not send WEP static key.\n");
}
+ /*
+ * allow CTS-to-self if possible for new association.
+ * this is relevant only for 5000 series and up,
+ * but will not damage 4965
+ */
+ priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN;
+
/* Apply the new configuration
* RXON assoc doesn't clear the station table in uCode,
*/
@@ -1348,7 +1352,7 @@ static void iwl_nic_start(struct iwl_priv *priv)
*/
static int iwl_read_ucode(struct iwl_priv *priv)
{
- struct iwl_ucode *ucode;
+ struct iwl_ucode_header *ucode;
int ret = -EINVAL, index;
const struct firmware *ucode_raw;
const char *name_pre = priv->cfg->fw_name_pre;
@@ -1357,7 +1361,8 @@ static int iwl_read_ucode(struct iwl_priv *priv)
char buf[25];
u8 *src;
size_t len;
- u32 api_ver, inst_size, data_size, init_size, init_data_size, boot_size;
+ u32 api_ver, build;
+ u32 inst_size, data_size, init_size, init_data_size, boot_size;
/* Ask kernel firmware_class module to get the boot firmware off disk.
* request_firmware() is synchronous, file is in memory on return. */
@@ -1387,23 +1392,26 @@ static int iwl_read_ucode(struct iwl_priv *priv)
if (ret < 0)
goto error;
- /* Make sure that we got at least our header! */
- if (ucode_raw->size < sizeof(*ucode)) {
+ /* Make sure that we got at least the v1 header! */
+ if (ucode_raw->size < priv->cfg->ops->ucode->get_header_size(1)) {
IWL_ERR(priv, "File size way too small!\n");
ret = -EINVAL;
goto err_release;
}
/* Data from ucode file: header followed by uCode images */
- ucode = (void *)ucode_raw->data;
+ ucode = (struct iwl_ucode_header *)ucode_raw->data;
priv->ucode_ver = le32_to_cpu(ucode->ver);
api_ver = IWL_UCODE_API(priv->ucode_ver);
- inst_size = le32_to_cpu(ucode->inst_size);
- data_size = le32_to_cpu(ucode->data_size);
- init_size = le32_to_cpu(ucode->init_size);
- init_data_size = le32_to_cpu(ucode->init_data_size);
- boot_size = le32_to_cpu(ucode->boot_size);
+ build = priv->cfg->ops->ucode->get_build(ucode, api_ver);
+ inst_size = priv->cfg->ops->ucode->get_inst_size(ucode, api_ver);
+ data_size = priv->cfg->ops->ucode->get_data_size(ucode, api_ver);
+ init_size = priv->cfg->ops->ucode->get_init_size(ucode, api_ver);
+ init_data_size =
+ priv->cfg->ops->ucode->get_init_data_size(ucode, api_ver);
+ boot_size = priv->cfg->ops->ucode->get_boot_size(ucode, api_ver);
+ src = priv->cfg->ops->ucode->get_data(ucode, api_ver);
/* api_ver should match the api version forming part of the
* firmware filename ... but we don't check for that and only rely
@@ -1429,6 +1437,9 @@ static int iwl_read_ucode(struct iwl_priv *priv)
IWL_UCODE_API(priv->ucode_ver),
IWL_UCODE_SERIAL(priv->ucode_ver));
+ if (build)
+ IWL_DEBUG_INFO(priv, "Build %u\n", build);
+
IWL_DEBUG_INFO(priv, "f/w package hdr ucode version raw = 0x%x\n",
priv->ucode_ver);
IWL_DEBUG_INFO(priv, "f/w package hdr runtime inst size = %u\n",
@@ -1443,12 +1454,14 @@ static int iwl_read_ucode(struct iwl_priv *priv)
boot_size);
/* Verify size of file vs. image size info in file's header */
- if (ucode_raw->size < sizeof(*ucode) +
+ if (ucode_raw->size !=
+ priv->cfg->ops->ucode->get_header_size(api_ver) +
inst_size + data_size + init_size +
init_data_size + boot_size) {
- IWL_DEBUG_INFO(priv, "uCode file size %d too small\n",
- (int)ucode_raw->size);
+ IWL_DEBUG_INFO(priv,
+ "uCode file size %d does not match expected size\n",
+ (int)ucode_raw->size);
ret = -EINVAL;
goto err_release;
}
@@ -1528,42 +1541,42 @@ static int iwl_read_ucode(struct iwl_priv *priv)
/* Copy images into buffers for card's bus-master reads ... */
/* Runtime instructions (first block of data in file) */
- src = &ucode->data[0];
- len = priv->ucode_code.len;
+ len = inst_size;
IWL_DEBUG_INFO(priv, "Copying (but not loading) uCode instr len %Zd\n", len);
memcpy(priv->ucode_code.v_addr, src, len);
+ src += len;
+
IWL_DEBUG_INFO(priv, "uCode instr buf vaddr = 0x%p, paddr = 0x%08x\n",
priv->ucode_code.v_addr, (u32)priv->ucode_code.p_addr);
/* Runtime data (2nd block)
* NOTE: Copy into backup buffer will be done in iwl_up() */
- src = &ucode->data[inst_size];
- len = priv->ucode_data.len;
+ len = data_size;
IWL_DEBUG_INFO(priv, "Copying (but not loading) uCode data len %Zd\n", len);
memcpy(priv->ucode_data.v_addr, src, len);
memcpy(priv->ucode_data_backup.v_addr, src, len);
+ src += len;
/* Initialization instructions (3rd block) */
if (init_size) {
- src = &ucode->data[inst_size + data_size];
- len = priv->ucode_init.len;
+ len = init_size;
IWL_DEBUG_INFO(priv, "Copying (but not loading) init instr len %Zd\n",
len);
memcpy(priv->ucode_init.v_addr, src, len);
+ src += len;
}
/* Initialization data (4th block) */
if (init_data_size) {
- src = &ucode->data[inst_size + data_size + init_size];
- len = priv->ucode_init_data.len;
+ len = init_data_size;
IWL_DEBUG_INFO(priv, "Copying (but not loading) init data len %Zd\n",
len);
memcpy(priv->ucode_init_data.v_addr, src, len);
+ src += len;
}
/* Bootstrap instructions (5th block) */
- src = &ucode->data[inst_size + data_size + init_size + init_data_size];
- len = priv->ucode_boot.len;
+ len = boot_size;
IWL_DEBUG_INFO(priv, "Copying (but not loading) boot instr len %Zd\n", len);
memcpy(priv->ucode_boot.v_addr, src, len);
@@ -2206,7 +2219,7 @@ static void iwl_mac_stop(struct ieee80211_hw *hw)
priv->is_open = 0;
- if (iwl_is_ready_rf(priv)) {
+ if (iwl_is_ready_rf(priv) || test_bit(STATUS_SCAN_HW, &priv->status)) {
/* stop mac, cancel any scan request and clear
* RXON_FILTER_ASSOC_MSK BIT
*/
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index dabf663e36e5..4e616eccebfb 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -116,6 +116,17 @@ struct iwl_temp_ops {
void (*set_ct_kill)(struct iwl_priv *priv);
};
+struct iwl_ucode_ops {
+ u32 (*get_header_size)(u32);
+ u32 (*get_build)(const struct iwl_ucode_header *, u32);
+ u32 (*get_inst_size)(const struct iwl_ucode_header *, u32);
+ u32 (*get_data_size)(const struct iwl_ucode_header *, u32);
+ u32 (*get_init_size)(const struct iwl_ucode_header *, u32);
+ u32 (*get_init_data_size)(const struct iwl_ucode_header *, u32);
+ u32 (*get_boot_size)(const struct iwl_ucode_header *, u32);
+ u8 * (*get_data)(const struct iwl_ucode_header *, u32);
+};
+
struct iwl_lib_ops {
/* set hw dependent parameters */
int (*set_hw_params)(struct iwl_priv *priv);
@@ -171,6 +182,7 @@ struct iwl_lib_ops {
};
struct iwl_ops {
+ const struct iwl_ucode_ops *ucode;
const struct iwl_lib_ops *lib;
const struct iwl_hcmd_ops *hcmd;
const struct iwl_hcmd_utils_ops *utils;
@@ -195,6 +207,9 @@ struct iwl_mod_params {
* filename is constructed as fw_name_pre<api>.ucode.
* @ucode_api_max: Highest version of uCode API supported by driver.
* @ucode_api_min: Lowest version of uCode API supported by driver.
+ * @max_ll_items: max number of OTP blocks
+ * @shadow_ram_support: shadow support for OTP memory
+ * @use_rts_for_ht: use rts/cts protection for HT traffic
*
* We enable the driver to be backward compatible wrt API version. The
* driver specifies which APIs it supports (with @ucode_api_max being the
@@ -231,6 +246,9 @@ struct iwl_cfg {
u8 valid_rx_ant;
bool need_pll_cfg;
bool use_isr_legacy;
+ const u16 max_ll_items;
+ const bool shadow_ram_support;
+ bool use_rts_for_ht;
};
/***************************
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 650e20af20fa..e8c86079334a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -66,6 +66,7 @@ extern struct iwl_cfg iwl1000_bgn_cfg;
/* shared structures from iwl-5000.c */
extern struct iwl_mod_params iwl50_mod_params;
extern struct iwl_ops iwl5000_ops;
+extern struct iwl_ucode_ops iwl5000_ucode;
extern struct iwl_lib_ops iwl5000_lib;
extern struct iwl_hcmd_ops iwl5000_hcmd;
extern struct iwl_hcmd_utils_ops iwl5000_hcmd_utils;
@@ -525,15 +526,29 @@ struct fw_desc {
};
/* uCode file layout */
-struct iwl_ucode {
- __le32 ver; /* major/minor/API/serial */
- __le32 inst_size; /* bytes of runtime instructions */
- __le32 data_size; /* bytes of runtime data */
- __le32 init_size; /* bytes of initialization instructions */
- __le32 init_data_size; /* bytes of initialization data */
- __le32 boot_size; /* bytes of bootstrap instructions */
- u8 data[0]; /* data in same order as "size" elements */
+struct iwl_ucode_header {
+ __le32 ver; /* major/minor/API/serial */
+ union {
+ struct {
+ __le32 inst_size; /* bytes of runtime code */
+ __le32 data_size; /* bytes of runtime data */
+ __le32 init_size; /* bytes of init code */
+ __le32 init_data_size; /* bytes of init data */
+ __le32 boot_size; /* bytes of bootstrap code */
+ u8 data[0]; /* in same order as sizes */
+ } v1;
+ struct {
+ __le32 build; /* build number */
+ __le32 inst_size; /* bytes of runtime code */
+ __le32 data_size; /* bytes of runtime data */
+ __le32 init_size; /* bytes of init code */
+ __le32 init_data_size; /* bytes of init data */
+ __le32 boot_size; /* bytes of bootstrap code */
+ u8 data[0]; /* in same order as sizes */
+ } v2;
+ } u;
};
+#define UCODE_HEADER_SIZE(ver) ((ver) == 1 ? 24 : 28)
struct iwl4965_ibss_seq {
u8 mac[ETH_ALEN];
@@ -820,6 +835,18 @@ enum iwl_nvm_type {
NVM_DEVICE_TYPE_OTP,
};
+/*
+ * Two types of OTP memory access modes
+ * IWL_OTP_ACCESS_ABSOLUTE - absolute address mode,
+ * based on physical memory addressing
+ * IWL_OTP_ACCESS_RELATIVE - relative address mode,
+ * based on logical memory addressing
+ */
+enum iwl_access_mode {
+ IWL_OTP_ACCESS_ABSOLUTE,
+ IWL_OTP_ACCESS_RELATIVE,
+};
+
/* interrupt statistics */
struct isr_statistics {
u32 hw;
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
index 7d7554a2f341..eabe48a7ebfe 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
@@ -152,6 +152,19 @@ int iwlcore_eeprom_verify_signature(struct iwl_priv *priv)
}
EXPORT_SYMBOL(iwlcore_eeprom_verify_signature);
+static void iwl_set_otp_access(struct iwl_priv *priv, enum iwl_access_mode mode)
+{
+ u32 otpgp;
+
+ otpgp = iwl_read32(priv, CSR_OTP_GP_REG);
+ if (mode == IWL_OTP_ACCESS_ABSOLUTE)
+ iwl_clear_bit(priv, CSR_OTP_GP_REG,
+ CSR_OTP_GP_REG_OTP_ACCESS_MODE);
+ else
+ iwl_set_bit(priv, CSR_OTP_GP_REG,
+ CSR_OTP_GP_REG_OTP_ACCESS_MODE);
+}
+
static int iwlcore_get_nvm_type(struct iwl_priv *priv)
{
u32 otpgp;
@@ -249,6 +262,123 @@ static int iwl_init_otp_access(struct iwl_priv *priv)
return ret;
}
+static int iwl_read_otp_word(struct iwl_priv *priv, u16 addr, u16 *eeprom_data)
+{
+ int ret = 0;
+ u32 r;
+ u32 otpgp;
+
+ _iwl_write32(priv, CSR_EEPROM_REG,
+ CSR_EEPROM_REG_MSK_ADDR & (addr << 1));
+ ret = iwl_poll_direct_bit(priv, CSR_EEPROM_REG,
+ CSR_EEPROM_REG_READ_VALID_MSK,
+ IWL_EEPROM_ACCESS_TIMEOUT);
+ if (ret < 0) {
+ IWL_ERR(priv, "Time out reading OTP[%d]\n", addr);
+ return ret;
+ }
+ r = _iwl_read_direct32(priv, CSR_EEPROM_REG);
+ /* check for ECC errors: */
+ otpgp = iwl_read32(priv, CSR_OTP_GP_REG);
+ if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) {
+ /* stop in this case */
+ /* set the uncorrectable OTP ECC bit for acknowledgement */
+ iwl_set_bit(priv, CSR_OTP_GP_REG,
+ CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK);
+ IWL_ERR(priv, "Uncorrectable OTP ECC error, abort OTP read\n");
+ return -EINVAL;
+ }
+ if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) {
+ /* continue in this case */
+ /* set the correctable OTP ECC bit for acknowledgement */
+ iwl_set_bit(priv, CSR_OTP_GP_REG,
+ CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK);
+ IWL_ERR(priv, "Correctable OTP ECC error, continue read\n");
+ }
+ *eeprom_data = le16_to_cpu((__force __le16)(r >> 16));
+ return 0;
+}
+
+/*
+ * iwl_is_otp_empty: check for empty OTP
+ */
+static bool iwl_is_otp_empty(struct iwl_priv *priv)
+{
+ u16 next_link_addr = 0, link_value;
+ bool is_empty = false;
+
+ /* locate the beginning of OTP link list */
+ if (!iwl_read_otp_word(priv, next_link_addr, &link_value)) {
+ if (!link_value) {
+ IWL_ERR(priv, "OTP is empty\n");
+ is_empty = true;
+ }
+ } else {
+ IWL_ERR(priv, "Unable to read first block of OTP list.\n");
+ is_empty = true;
+ }
+
+ return is_empty;
+}
+
+
+/*
+ * iwl_find_otp_image: find EEPROM image in OTP
+ * finding the OTP block that contains the EEPROM image.
+ * the last valid block on the link list (the block _before_ the last block)
+ * is the block we should read and used to configure the device.
+ * If all the available OTP blocks are full, the last block will be the block
+ * we should read and used to configure the device.
+ * only perform this operation if shadow RAM is disabled
+ */
+static int iwl_find_otp_image(struct iwl_priv *priv,
+ u16 *validblockaddr)
+{
+ u16 next_link_addr = 0, link_value = 0, valid_addr;
+ int usedblocks = 0;
+
+ /* set addressing mode to absolute to traverse the link list */
+ iwl_set_otp_access(priv, IWL_OTP_ACCESS_ABSOLUTE);
+
+ /* checking for empty OTP or error */
+ if (iwl_is_otp_empty(priv))
+ return -EINVAL;
+
+ /*
+ * start traverse link list
+ * until reach the max number of OTP blocks
+ * different devices have different number of OTP blocks
+ */
+ do {
+ /* save current valid block address
+ * check for more block on the link list
+ */
+ valid_addr = next_link_addr;
+ next_link_addr = link_value * sizeof(u16);
+ IWL_DEBUG_INFO(priv, "OTP blocks %d addr 0x%x\n",
+ usedblocks, next_link_addr);
+ if (iwl_read_otp_word(priv, next_link_addr, &link_value))
+ return -EINVAL;
+ if (!link_value) {
+ /*
+ * reach the end of link list, return success and
+ * set address point to the starting address
+ * of the image
+ */
+ *validblockaddr = valid_addr;
+ /* skip first 2 bytes (link list pointer) */
+ *validblockaddr += 2;
+ return 0;
+ }
+ /* more in the link list, continue */
+ usedblocks++;
+ } while (usedblocks <= priv->cfg->max_ll_items);
+
+ /* OTP has no valid blocks */
+ IWL_DEBUG_INFO(priv, "OTP has no valid blocks\n");
+ return -EINVAL;
+}
+
/**
* iwl_eeprom_init - read EEPROM contents
*
@@ -263,14 +393,13 @@ int iwl_eeprom_init(struct iwl_priv *priv)
int sz;
int ret;
u16 addr;
- u32 otpgp;
+ u16 validblockaddr = 0;
+ u16 cache_addr = 0;
priv->nvm_device_type = iwlcore_get_nvm_type(priv);
/* allocate eeprom */
- if (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP)
- priv->cfg->eeprom_size =
- OTP_BLOCK_SIZE * OTP_LOWER_BLOCKS_TOTAL;
+ IWL_DEBUG_INFO(priv, "NVM size = %d\n", priv->cfg->eeprom_size);
sz = priv->cfg->eeprom_size;
priv->eeprom = kzalloc(sz, GFP_KERNEL);
if (!priv->eeprom) {
@@ -298,46 +427,31 @@ int iwl_eeprom_init(struct iwl_priv *priv)
if (ret) {
IWL_ERR(priv, "Failed to initialize OTP access.\n");
ret = -ENOENT;
- goto err;
+ goto done;
}
_iwl_write32(priv, CSR_EEPROM_GP,
iwl_read32(priv, CSR_EEPROM_GP) &
~CSR_EEPROM_GP_IF_OWNER_MSK);
- /* clear */
- _iwl_write32(priv, CSR_OTP_GP_REG,
- iwl_read32(priv, CSR_OTP_GP_REG) |
+
+ iwl_set_bit(priv, CSR_OTP_GP_REG,
CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK |
CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK);
-
- for (addr = 0; addr < sz; addr += sizeof(u16)) {
- u32 r;
-
- _iwl_write32(priv, CSR_EEPROM_REG,
- CSR_EEPROM_REG_MSK_ADDR & (addr << 1));
-
- ret = iwl_poll_direct_bit(priv, CSR_EEPROM_REG,
- CSR_EEPROM_REG_READ_VALID_MSK,
- IWL_EEPROM_ACCESS_TIMEOUT);
- if (ret < 0) {
- IWL_ERR(priv, "Time out reading OTP[%d]\n", addr);
+ /* traversing the linked list if no shadow ram supported */
+ if (!priv->cfg->shadow_ram_support) {
+ if (iwl_find_otp_image(priv, &validblockaddr)) {
+ ret = -ENOENT;
goto done;
}
- r = _iwl_read_direct32(priv, CSR_EEPROM_REG);
- /* check for ECC errors: */
- otpgp = iwl_read32(priv, CSR_OTP_GP_REG);
- if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) {
- /* stop in this case */
- IWL_ERR(priv, "Uncorrectable OTP ECC error, Abort OTP read\n");
+ }
+ for (addr = validblockaddr; addr < validblockaddr + sz;
+ addr += sizeof(u16)) {
+ u16 eeprom_data;
+
+ ret = iwl_read_otp_word(priv, addr, &eeprom_data);
+ if (ret)
goto done;
- }
- if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) {
- /* continue in this case */
- _iwl_write32(priv, CSR_OTP_GP_REG,
- iwl_read32(priv, CSR_OTP_GP_REG) |
- CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK);
- IWL_ERR(priv, "Correctable OTP ECC error, continue read\n");
- }
- e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16));
+ e[cache_addr / 2] = eeprom_data;
+ cache_addr += sizeof(u16);
}
} else {
/* eeprom is an array of 16bit values */
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
index 195b4ef12c27..78998854dd99 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
@@ -180,8 +180,14 @@ struct iwl_eeprom_channel {
#define EEPROM_5050_EEPROM_VERSION (0x21E)
/* OTP */
-#define OTP_LOWER_BLOCKS_TOTAL (3)
-#define OTP_BLOCK_SIZE (0x400)
+/* lower blocks contain EEPROM image and calibration data */
+#define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16)) /* 2 KB */
+/* high blocks contain PAPD data */
+#define OTP_HIGH_IMAGE_SIZE_6x00 (6 * 512 * sizeof(u16)) /* 6 KB */
+#define OTP_HIGH_IMAGE_SIZE_1000 (0x200 * sizeof(u16)) /* 1024 bytes */
+#define OTP_MAX_LL_ITEMS_1000 (3) /* OTP blocks for 1000 */
+#define OTP_MAX_LL_ITEMS_6x00 (4) /* OTP blocks for 6x00 */
+#define OTP_MAX_LL_ITEMS_6x50 (7) /* OTP blocks for 6x50 */
/* 2.4 GHz */
extern const u8 iwl_eeprom_band_1[14];
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h
index 3b9cac3fd216..d393e8f02102 100644
--- a/drivers/net/wireless/iwlwifi/iwl-prph.h
+++ b/drivers/net/wireless/iwlwifi/iwl-prph.h
@@ -80,6 +80,8 @@
#define APMG_RFKILL_REG (APMG_BASE + 0x0014)
#define APMG_RTC_INT_STT_REG (APMG_BASE + 0x001c)
#define APMG_RTC_INT_MSK_REG (APMG_BASE + 0x0020)
+#define APMG_DIGITAL_SVR_REG (APMG_BASE + 0x0058)
+#define APMG_ANALOG_SVR_REG (APMG_BASE + 0x006C)
#define APMG_CLK_VAL_DMA_CLK_RQT (0x00000200)
#define APMG_CLK_VAL_BSM_CLK_RQT (0x00000800)
@@ -91,7 +93,8 @@
#define APMG_PS_CTRL_VAL_PWR_SRC_VMAIN (0x00000000)
#define APMG_PS_CTRL_VAL_PWR_SRC_MAX (0x01000000) /* 3945 only */
#define APMG_PS_CTRL_VAL_PWR_SRC_VAUX (0x02000000)
-
+#define APMG_SVR_VOLTAGE_CONFIG_BIT_MSK (0x000001E0) /* bit 8:5 */
+#define APMG_SVR_DIGITAL_VOLTAGE_1_32 (0x00000060)
#define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800)
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
index 2b8d40b37a1c..a13f678fe44c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
@@ -239,33 +239,51 @@ void iwl_rx_allocate(struct iwl_priv *priv, gfp_t priority)
struct iwl_rx_queue *rxq = &priv->rxq;
struct list_head *element;
struct iwl_rx_mem_buffer *rxb;
+ struct sk_buff *skb;
unsigned long flags;
while (1) {
spin_lock_irqsave(&rxq->lock, flags);
-
if (list_empty(&rxq->rx_used)) {
spin_unlock_irqrestore(&rxq->lock, flags);
return;
}
- element = rxq->rx_used.next;
- rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
- list_del(element);
-
spin_unlock_irqrestore(&rxq->lock, flags);
+ if (rxq->free_count > RX_LOW_WATERMARK)
+ priority |= __GFP_NOWARN;
/* Alloc a new receive buffer */
- rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
+ skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
priority);
- if (!rxb->skb) {
- IWL_CRIT(priv, "Can not allocate SKB buffers\n");
+ if (!skb) {
+ if (net_ratelimit())
+ IWL_DEBUG_INFO(priv, "Failed to allocate SKB buffer.\n");
+ if ((rxq->free_count <= RX_LOW_WATERMARK) &&
+ net_ratelimit())
+ IWL_CRIT(priv, "Failed to allocate SKB buffer with %s. Only %u free buffers remaining.\n",
+ priority == GFP_ATOMIC ? "GFP_ATOMIC" : "GFP_KERNEL",
+ rxq->free_count);
/* We don't reschedule replenish work here -- we will
* call the restock method and if it still needs
* more buffers it will schedule replenish */
break;
}
+ spin_lock_irqsave(&rxq->lock, flags);
+
+ if (list_empty(&rxq->rx_used)) {
+ spin_unlock_irqrestore(&rxq->lock, flags);
+ dev_kfree_skb_any(skb);
+ return;
+ }
+ element = rxq->rx_used.next;
+ rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
+ list_del(element);
+
+ spin_unlock_irqrestore(&rxq->lock, flags);
+
+ rxb->skb = skb;
/* Get physical address of RB/SKB */
rxb->real_dma_addr = pci_map_single(
priv->pci_dev,
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
index e26875dbe859..474fd4982471 100644
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
@@ -799,7 +799,8 @@ void iwl_bg_abort_scan(struct work_struct *work)
{
struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan);
- if (!iwl_is_ready(priv))
+ if (!test_bit(STATUS_READY, &priv->status) ||
+ !test_bit(STATUS_GEO_CONFIGURED, &priv->status))
return;
mutex_lock(&priv->mutex);
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
index 2e89040e63be..c17b8f93ad15 100644
--- a/drivers/net/wireless/iwlwifi/iwl-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
@@ -1233,8 +1233,16 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid)
return -ENXIO;
}
+ if (priv->stations[sta_id].tid[tid].agg.state ==
+ IWL_EMPTYING_HW_QUEUE_ADDBA) {
+ IWL_DEBUG_HT(priv, "AGG stop before setup done\n");
+ ieee80211_stop_tx_ba_cb_irqsafe(priv->hw, ra, tid);
+ priv->stations[sta_id].tid[tid].agg.state = IWL_AGG_OFF;
+ return 0;
+ }
+
if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_ON)
- IWL_WARN(priv, "Stopping AGG while state not IWL_AGG_ON\n");
+ IWL_WARN(priv, "Stopping AGG while state not ON or starting\n");
tid_data = &priv->stations[sta_id].tid[tid];
ssn = (tid_data->seq_number & IEEE80211_SCTL_SEQ) >> 4;
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 523843369ca2..4fac58260001 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -1196,6 +1196,7 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv, gfp_t priority)
struct iwl_rx_queue *rxq = &priv->rxq;
struct list_head *element;
struct iwl_rx_mem_buffer *rxb;
+ struct sk_buff *skb;
unsigned long flags;
while (1) {
@@ -1205,25 +1206,39 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv, gfp_t priority)
spin_unlock_irqrestore(&rxq->lock, flags);
return;
}
-
- element = rxq->rx_used.next;
- rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
- list_del(element);
spin_unlock_irqrestore(&rxq->lock, flags);
+ if (rxq->free_count > RX_LOW_WATERMARK)
+ priority |= __GFP_NOWARN;
/* Alloc a new receive buffer */
- rxb->skb =
- alloc_skb(priv->hw_params.rx_buf_size,
- priority);
- if (!rxb->skb) {
+ skb = alloc_skb(priv->hw_params.rx_buf_size, priority);
+ if (!skb) {
if (net_ratelimit())
- IWL_CRIT(priv, ": Can not allocate SKB buffers\n");
+ IWL_DEBUG_INFO(priv, "Failed to allocate SKB buffer.\n");
+ if ((rxq->free_count <= RX_LOW_WATERMARK) &&
+ net_ratelimit())
+ IWL_CRIT(priv, "Failed to allocate SKB buffer with %s. Only %u free buffers remaining.\n",
+ priority == GFP_ATOMIC ? "GFP_ATOMIC" : "GFP_KERNEL",
+ rxq->free_count);
/* We don't reschedule replenish work here -- we will
* call the restock method and if it still needs
* more buffers it will schedule replenish */
break;
}
+ spin_lock_irqsave(&rxq->lock, flags);
+ if (list_empty(&rxq->rx_used)) {
+ spin_unlock_irqrestore(&rxq->lock, flags);
+ dev_kfree_skb_any(skb);
+ return;
+ }
+ element = rxq->rx_used.next;
+ rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
+ list_del(element);
+ spin_unlock_irqrestore(&rxq->lock, flags);
+
+ rxb->skb = skb;
+
/* If radiotap head is required, reserve some headroom here.
* The physical head count is a variable rx_stats->phy_count.
* We reserve 4 bytes here. Plus these extra bytes, the
@@ -2111,7 +2126,7 @@ static void iwl3945_nic_start(struct iwl_priv *priv)
*/
static int iwl3945_read_ucode(struct iwl_priv *priv)
{
- struct iwl_ucode *ucode;
+ const struct iwl_ucode_header *ucode;
int ret = -EINVAL, index;
const struct firmware *ucode_raw;
/* firmware file name contains uCode/driver compatibility version */
@@ -2152,22 +2167,24 @@ static int iwl3945_read_ucode(struct iwl_priv *priv)
goto error;
/* Make sure that we got at least our header! */
- if (ucode_raw->size < sizeof(*ucode)) {
+ if (ucode_raw->size < priv->cfg->ops->ucode->get_header_size(1)) {
IWL_ERR(priv, "File size way too small!\n");
ret = -EINVAL;
goto err_release;
}
/* Data from ucode file: header followed by uCode images */
- ucode = (void *)ucode_raw->data;
+ ucode = (struct iwl_ucode_header *)ucode_raw->data;
priv->ucode_ver = le32_to_cpu(ucode->ver);
api_ver = IWL_UCODE_API(priv->ucode_ver);
- inst_size = le32_to_cpu(ucode->inst_size);
- data_size = le32_to_cpu(ucode->data_size);
- init_size = le32_to_cpu(ucode->init_size);
- init_data_size = le32_to_cpu(ucode->init_data_size);
- boot_size = le32_to_cpu(ucode->boot_size);
+ inst_size = priv->cfg->ops->ucode->get_inst_size(ucode, api_ver);
+ data_size = priv->cfg->ops->ucode->get_data_size(ucode, api_ver);
+ init_size = priv->cfg->ops->ucode->get_init_size(ucode, api_ver);
+ init_data_size =
+ priv->cfg->ops->ucode->get_init_data_size(ucode, api_ver);
+ boot_size = priv->cfg->ops->ucode->get_boot_size(ucode, api_ver);
+ src = priv->cfg->ops->ucode->get_data(ucode, api_ver);
/* api_ver should match the api version forming part of the
* firmware filename ... but we don't check for that and only rely
@@ -2208,12 +2225,13 @@ static int iwl3945_read_ucode(struct iwl_priv *priv)
/* Verify size of file vs. image size info in file's header */
- if (ucode_raw->size < sizeof(*ucode) +
+ if (ucode_raw->size != priv->cfg->ops->ucode->get_header_size(api_ver) +
inst_size + data_size + init_size +
init_data_size + boot_size) {
- IWL_DEBUG_INFO(priv, "uCode file size %zd too small\n",
- ucode_raw->size);
+ IWL_DEBUG_INFO(priv,
+ "uCode file size %zd does not match expected size\n",
+ ucode_raw->size);
ret = -EINVAL;
goto err_release;
}
@@ -2296,44 +2314,44 @@ static int iwl3945_read_ucode(struct iwl_priv *priv)
/* Copy images into buffers for card's bus-master reads ... */
/* Runtime instructions (first block of data in file) */
- src = &ucode->data[0];
- len = priv->ucode_code.len;
+ len = inst_size;
IWL_DEBUG_INFO(priv,
"Copying (but not loading) uCode instr len %zd\n", len);
memcpy(priv->ucode_code.v_addr, src, len);
+ src += len;
+
IWL_DEBUG_INFO(priv, "uCode instr buf vaddr = 0x%p, paddr = 0x%08x\n",
priv->ucode_code.v_addr, (u32)priv->ucode_code.p_addr);
/* Runtime data (2nd block)
* NOTE: Copy into backup buffer will be done in iwl3945_up() */
- src = &ucode->data[inst_size];
- len = priv->ucode_data.len;
+ len = data_size;
IWL_DEBUG_INFO(priv,
"Copying (but not loading) uCode data len %zd\n", len);
memcpy(priv->ucode_data.v_addr, src, len);
memcpy(priv->ucode_data_backup.v_addr, src, len);
+ src += len;
/* Initialization instructions (3rd block) */
if (init_size) {
- src = &ucode->data[inst_size + data_size];
- len = priv->ucode_init.len;
+ len = init_size;
IWL_DEBUG_INFO(priv,
"Copying (but not loading) init instr len %zd\n", len);
memcpy(priv->ucode_init.v_addr, src, len);
+ src += len;
}
/* Initialization data (4th block) */
if (init_data_size) {
- src = &ucode->data[inst_size + data_size + init_size];
- len = priv->ucode_init_data.len;
+ len = init_data_size;
IWL_DEBUG_INFO(priv,
"Copying (but not loading) init data len %zd\n", len);
memcpy(priv->ucode_init_data.v_addr, src, len);
+ src += len;
}
/* Bootstrap instructions (5th block) */
- src = &ucode->data[inst_size + data_size + init_size + init_data_size];
- len = priv->ucode_boot.len;
+ len = boot_size;
IWL_DEBUG_INFO(priv,
"Copying (but not loading) boot instr len %zd\n", len);
memcpy(priv->ucode_boot.v_addr, src, len);
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 1844c5adf6e9..3a9a8c13b8a9 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -507,7 +507,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
/* Fill the receive configuration URB and initialise the Rx call back */
usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
- (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
+ skb->data + IPFIELD_ALIGN_OFFSET,
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
cardp);
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index 8bc1907458b1..f9c366c6ce4c 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -1951,10 +1951,8 @@ static int lbs_get_essid(struct net_device *dev, struct iw_request_info *info,
if (priv->connect_status == LBS_CONNECTED) {
memcpy(extra, priv->curbssparams.ssid,
priv->curbssparams.ssid_len);
- extra[priv->curbssparams.ssid_len] = '\0';
} else {
memset(extra, 0, 32);
- extra[priv->curbssparams.ssid_len] = '\0';
}
/*
* If none, we may want to get the one that was set
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
index 0e877a104a89..b17ec7f24b82 100644
--- a/drivers/net/wireless/p54/p54usb.c
+++ b/drivers/net/wireless/p54/p54usb.c
@@ -66,6 +66,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
{USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
{USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */
{USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
+ {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */
{USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
{USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
{USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
@@ -426,12 +427,16 @@ static const char p54u_romboot_3887[] = "~~~~";
static int p54u_firmware_reset_3887(struct ieee80211_hw *dev)
{
struct p54u_priv *priv = dev->priv;
- u8 buf[4];
+ u8 *buf;
int ret;
- memcpy(&buf, p54u_romboot_3887, sizeof(buf));
+ buf = kmalloc(4, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+ memcpy(buf, p54u_romboot_3887, 4);
ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
- buf, sizeof(buf));
+ buf, 4);
+ kfree(buf);
if (ret)
dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
"boot ROM (%d)!\n", ret);
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c
index 698b11b1cadb..8c67a488f83b 100644
--- a/drivers/net/wireless/ray_cs.c
+++ b/drivers/net/wireless/ray_cs.c
@@ -2878,7 +2878,7 @@ static int write_essid(struct file *file, const char __user *buffer,
unsigned long count, void *data)
{
static char proc_essid[33];
- int len = count;
+ unsigned int len = count;
if (len > 32)
len = 32;
diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c
index cf9f899fe0e6..75648dd17595 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
@@ -210,10 +210,10 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
/* turn the LED off before exiting */
queue_delayed_work(dev->workqueue, &priv->led_off, 0);
- cancel_delayed_work_sync(&priv->led_off);
- cancel_delayed_work_sync(&priv->led_on);
rtl8187_unregister_led(&priv->led_rx);
rtl8187_unregister_led(&priv->led_tx);
+ cancel_delayed_work_sync(&priv->led_off);
+ cancel_delayed_work_sync(&priv->led_on);
}
#endif /* def CONFIG_RTL8187_LED */
diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
index a45b0c0d574e..a6b4a5a53d40 100644
--- a/drivers/parisc/ccio-dma.c
+++ b/drivers/parisc/ccio-dma.c
@@ -1266,7 +1266,7 @@ ccio_ioc_init(struct ioc *ioc)
** Hot-Plug/Removal of PCI cards. (aka PCI OLARD).
*/
- iova_space_size = (u32) (num_physpages / count_parisc_driver(&ccio_driver));
+ iova_space_size = (u32) (totalram_pages / count_parisc_driver(&ccio_driver));
/* limit IOVA space size to 1MB-1GB */
@@ -1305,7 +1305,7 @@ ccio_ioc_init(struct ioc *ioc)
DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits)\n",
__func__, ioc->ioc_regs,
- (unsigned long) num_physpages >> (20 - PAGE_SHIFT),
+ (unsigned long) totalram_pages >> (20 - PAGE_SHIFT),
iova_space_size>>20,
iov_order + PAGE_SHIFT);
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c
index 123d8fe3427d..57a6d19eba4c 100644
--- a/drivers/parisc/sba_iommu.c
+++ b/drivers/parisc/sba_iommu.c
@@ -1390,7 +1390,7 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
** for DMA hints - ergo only 30 bits max.
*/
- iova_space_size = (u32) (num_physpages/global_ioc_cnt);
+ iova_space_size = (u32) (totalram_pages/global_ioc_cnt);
/* limit IOVA space size to 1MB-1GB */
if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {
@@ -1415,7 +1415,7 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
DBG_INIT("%s() hpa 0x%lx mem %ldMB IOV %dMB (%d bits)\n",
__func__,
ioc->ioc_hpa,
- (unsigned long) num_physpages >> (20 - PAGE_SHIFT),
+ (unsigned long) totalram_pages >> (20 - PAGE_SHIFT),
iova_space_size>>20,
iov_order + PAGE_SHIFT);
diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c
index 7b287cb38b7a..380b60e677e0 100644
--- a/drivers/pci/dmar.c
+++ b/drivers/pci/dmar.c
@@ -632,20 +632,31 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)
iommu->cap = dmar_readq(iommu->reg + DMAR_CAP_REG);
iommu->ecap = dmar_readq(iommu->reg + DMAR_ECAP_REG);
+ if (iommu->cap == (uint64_t)-1 && iommu->ecap == (uint64_t)-1) {
+ /* Promote an attitude of violence to a BIOS engineer today */
+ WARN(1, "Your BIOS is broken; DMAR reported at address %llx returns all ones!\n"
+ "BIOS vendor: %s; Ver: %s; Product Version: %s\n",
+ drhd->reg_base_addr,
+ dmi_get_system_info(DMI_BIOS_VENDOR),
+ dmi_get_system_info(DMI_BIOS_VERSION),
+ dmi_get_system_info(DMI_PRODUCT_VERSION));
+ goto err_unmap;
+ }
+
#ifdef CONFIG_DMAR
agaw = iommu_calculate_agaw(iommu);
if (agaw < 0) {
printk(KERN_ERR
"Cannot get a valid agaw for iommu (seq_id = %d)\n",
iommu->seq_id);
- goto error;
+ goto err_unmap;
}
msagaw = iommu_calculate_max_sagaw(iommu);
if (msagaw < 0) {
printk(KERN_ERR
"Cannot get a valid max agaw for iommu (seq_id = %d)\n",
iommu->seq_id);
- goto error;
+ goto err_unmap;
}
#endif
iommu->agaw = agaw;
@@ -665,7 +676,7 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)
}
ver = readl(iommu->reg + DMAR_VER_REG);
- pr_debug("IOMMU %llx: ver %d:%d cap %llx ecap %llx\n",
+ pr_info("IOMMU %llx: ver %d:%d cap %llx ecap %llx\n",
(unsigned long long)drhd->reg_base_addr,
DMAR_VER_MAJOR(ver), DMAR_VER_MINOR(ver),
(unsigned long long)iommu->cap,
@@ -675,7 +686,10 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)
drhd->iommu = iommu;
return 0;
-error:
+
+ err_unmap:
+ iounmap(iommu->reg);
+ error:
kfree(iommu);
return -1;
}
diff --git a/drivers/pci/pcie/aer/aerdrv.c b/drivers/pci/pcie/aer/aerdrv.c
index 4770f13b3ca1..e2504be1fa8d 100644
--- a/drivers/pci/pcie/aer/aerdrv.c
+++ b/drivers/pci/pcie/aer/aerdrv.c
@@ -52,7 +52,7 @@ static struct pci_error_handlers aer_error_handlers = {
static struct pcie_port_service_driver aerdriver = {
.name = "aer",
- .port_type = PCIE_ANY_PORT,
+ .port_type = PCIE_RC_PORT,
.service = PCIE_PORT_SERVICE_AER,
.probe = aer_probe,
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 06b965623962..10731373d00e 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -1201,6 +1201,7 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev)
switch(dev->subsystem_device) {
case 0x00b8: /* Compaq Evo D510 CMT */
case 0x00b9: /* Compaq Evo D510 SFF */
+ case 0x00ba: /* Compaq Evo D510 USDT */
/* Motherboard doesn't have Host bridge
* subvendor/subdevice IDs and on-board VGA
* controller is disabled if an AGP card is
@@ -2382,8 +2383,10 @@ static void __devinit nv_msi_ht_cap_quirk_leaf(struct pci_dev *dev)
}
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk_leaf);
+DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk_leaf);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk_all);
+DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk_all);
static void __devinit quirk_msi_intx_disable_bug(struct pci_dev *dev)
{
@@ -2492,6 +2495,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e6, quirk_i82576_sriov);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e7, quirk_i82576_sriov);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e8, quirk_i82576_sriov);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150a, quirk_i82576_sriov);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150d, quirk_i82576_sriov);
#endif /* CONFIG_PCI_IOV */
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c
index 9e1140f085fd..e1dccedc5960 100644
--- a/drivers/pcmcia/at91_cf.c
+++ b/drivers/pcmcia/at91_cf.c
@@ -363,7 +363,7 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
struct at91_cf_socket *cf = platform_get_drvdata(pdev);
struct at91_cf_data *board = cf->board;
- pcmcia_socket_dev_suspend(&pdev->dev, mesg);
+ pcmcia_socket_dev_suspend(&pdev->dev);
if (device_may_wakeup(&pdev->dev)) {
enable_irq_wake(board->det_pin);
if (board->irq_pin)
diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c
index 90013341cd5f..02088704ac2c 100644
--- a/drivers/pcmcia/au1000_generic.c
+++ b/drivers/pcmcia/au1000_generic.c
@@ -515,7 +515,7 @@ static int au1x00_drv_pcmcia_probe(struct platform_device *dev)
static int au1x00_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int au1x00_drv_pcmcia_resume(struct platform_device *dev)
diff --git a/drivers/pcmcia/bfin_cf_pcmcia.c b/drivers/pcmcia/bfin_cf_pcmcia.c
index b59d4115d20f..300b368605c9 100644
--- a/drivers/pcmcia/bfin_cf_pcmcia.c
+++ b/drivers/pcmcia/bfin_cf_pcmcia.c
@@ -302,7 +302,7 @@ static int __devexit bfin_cf_remove(struct platform_device *pdev)
static int bfin_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
{
- return pcmcia_socket_dev_suspend(&pdev->dev, mesg);
+ return pcmcia_socket_dev_suspend(&pdev->dev);
}
static int bfin_cf_resume(struct platform_device *pdev)
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c
index 0660ad182589..698d75cda084 100644
--- a/drivers/pcmcia/cs.c
+++ b/drivers/pcmcia/cs.c
@@ -98,10 +98,13 @@ EXPORT_SYMBOL(pcmcia_socket_list_rwsem);
* These functions check for the appropriate struct pcmcia_soket arrays,
* and pass them to the low-level functions pcmcia_{suspend,resume}_socket
*/
+static int socket_early_resume(struct pcmcia_socket *skt);
+static int socket_late_resume(struct pcmcia_socket *skt);
static int socket_resume(struct pcmcia_socket *skt);
static int socket_suspend(struct pcmcia_socket *skt);
-int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state)
+static void pcmcia_socket_dev_run(struct device *dev,
+ int (*cb)(struct pcmcia_socket *))
{
struct pcmcia_socket *socket;
@@ -110,29 +113,34 @@ int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state)
if (socket->dev.parent != dev)
continue;
mutex_lock(&socket->skt_mutex);
- socket_suspend(socket);
+ cb(socket);
mutex_unlock(&socket->skt_mutex);
}
up_read(&pcmcia_socket_list_rwsem);
+}
+int pcmcia_socket_dev_suspend(struct device *dev)
+{
+ pcmcia_socket_dev_run(dev, socket_suspend);
return 0;
}
EXPORT_SYMBOL(pcmcia_socket_dev_suspend);
-int pcmcia_socket_dev_resume(struct device *dev)
+void pcmcia_socket_dev_early_resume(struct device *dev)
{
- struct pcmcia_socket *socket;
+ pcmcia_socket_dev_run(dev, socket_early_resume);
+}
+EXPORT_SYMBOL(pcmcia_socket_dev_early_resume);
- down_read(&pcmcia_socket_list_rwsem);
- list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
- if (socket->dev.parent != dev)
- continue;
- mutex_lock(&socket->skt_mutex);
- socket_resume(socket);
- mutex_unlock(&socket->skt_mutex);
- }
- up_read(&pcmcia_socket_list_rwsem);
+void pcmcia_socket_dev_late_resume(struct device *dev)
+{
+ pcmcia_socket_dev_run(dev, socket_late_resume);
+}
+EXPORT_SYMBOL(pcmcia_socket_dev_late_resume);
+int pcmcia_socket_dev_resume(struct device *dev)
+{
+ pcmcia_socket_dev_run(dev, socket_resume);
return 0;
}
EXPORT_SYMBOL(pcmcia_socket_dev_resume);
@@ -546,29 +554,24 @@ static int socket_suspend(struct pcmcia_socket *skt)
return 0;
}
-/*
- * Resume a socket. If a card is present, verify its CIS against
- * our cached copy. If they are different, the card has been
- * replaced, and we need to tell the drivers.
- */
-static int socket_resume(struct pcmcia_socket *skt)
+static int socket_early_resume(struct pcmcia_socket *skt)
{
- int ret;
-
- if (!(skt->state & SOCKET_SUSPEND))
- return -EBUSY;
-
skt->socket = dead_socket;
skt->ops->init(skt);
skt->ops->set_socket(skt, &skt->socket);
+ if (skt->state & SOCKET_PRESENT)
+ skt->resume_status = socket_setup(skt, resume_delay);
+ return 0;
+}
+static int socket_late_resume(struct pcmcia_socket *skt)
+{
if (!(skt->state & SOCKET_PRESENT)) {
skt->state &= ~SOCKET_SUSPEND;
return socket_insert(skt);
}
- ret = socket_setup(skt, resume_delay);
- if (ret == 0) {
+ if (skt->resume_status == 0) {
/*
* FIXME: need a better check here for cardbus cards.
*/
@@ -596,6 +599,20 @@ static int socket_resume(struct pcmcia_socket *skt)
return 0;
}
+/*
+ * Resume a socket. If a card is present, verify its CIS against
+ * our cached copy. If they are different, the card has been
+ * replaced, and we need to tell the drivers.
+ */
+static int socket_resume(struct pcmcia_socket *skt)
+{
+ if (!(skt->state & SOCKET_SUSPEND))
+ return -EBUSY;
+
+ socket_early_resume(skt);
+ return socket_late_resume(skt);
+}
+
static void socket_remove(struct pcmcia_socket *skt)
{
dev_printk(KERN_NOTICE, &skt->dev,
diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c
index 46561face128..a04f21c8170f 100644
--- a/drivers/pcmcia/i82092.c
+++ b/drivers/pcmcia/i82092.c
@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids);
#ifdef CONFIG_PM
static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int i82092aa_socket_resume (struct pci_dev *dev)
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c
index 40d4953e4b12..b906abe26ad0 100644
--- a/drivers/pcmcia/i82365.c
+++ b/drivers/pcmcia/i82365.c
@@ -1241,7 +1241,7 @@ static int pcic_init(struct pcmcia_socket *s)
static int i82365_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int i82365_drv_pcmcia_resume(struct platform_device *dev)
diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c
index 62b4ecc97c46..d1d89c4491ad 100644
--- a/drivers/pcmcia/m32r_cfc.c
+++ b/drivers/pcmcia/m32r_cfc.c
@@ -699,7 +699,7 @@ static struct pccard_operations pcc_operations = {
static int cfc_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int cfc_drv_pcmcia_resume(struct platform_device *dev)
diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c
index 12034b41d196..a0655839c8d3 100644
--- a/drivers/pcmcia/m32r_pcc.c
+++ b/drivers/pcmcia/m32r_pcc.c
@@ -675,7 +675,7 @@ static struct pccard_operations pcc_operations = {
static int pcc_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int pcc_drv_pcmcia_resume(struct platform_device *dev)
diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c
index d1ad0966392d..c69f2c4fe520 100644
--- a/drivers/pcmcia/m8xx_pcmcia.c
+++ b/drivers/pcmcia/m8xx_pcmcia.c
@@ -1296,7 +1296,7 @@ static int m8xx_remove(struct of_device *ofdev)
#ifdef CONFIG_PM
static int m8xx_suspend(struct platform_device *pdev, pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&pdev->dev, state);
+ return pcmcia_socket_dev_suspend(&pdev->dev);
}
static int m8xx_resume(struct platform_device *pdev)
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c
index f3736398900e..68570bc3ac86 100644
--- a/drivers/pcmcia/omap_cf.c
+++ b/drivers/pcmcia/omap_cf.c
@@ -334,7 +334,7 @@ static int __exit omap_cf_remove(struct platform_device *pdev)
static int omap_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
{
- return pcmcia_socket_dev_suspend(&pdev->dev, mesg);
+ return pcmcia_socket_dev_suspend(&pdev->dev);
}
static int omap_cf_resume(struct platform_device *pdev)
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c
index 8bed1dab9039..1c39d3438f20 100644
--- a/drivers/pcmcia/pd6729.c
+++ b/drivers/pcmcia/pd6729.c
@@ -758,7 +758,7 @@ static void __devexit pd6729_pci_remove(struct pci_dev *dev)
#ifdef CONFIG_PM
static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int pd6729_socket_resume(struct pci_dev *dev)
diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
index c49a7269f6d1..86ad87604241 100644
--- a/drivers/pcmcia/pxa2xx_base.c
+++ b/drivers/pcmcia/pxa2xx_base.c
@@ -302,7 +302,7 @@ static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev)
static int pxa2xx_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int pxa2xx_drv_pcmcia_resume(struct platform_device *dev)
diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c
index d8da5ac844e9..2d0e99751530 100644
--- a/drivers/pcmcia/sa1100_generic.c
+++ b/drivers/pcmcia/sa1100_generic.c
@@ -89,7 +89,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev)
static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int sa11x0_drv_pcmcia_resume(struct platform_device *dev)
diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c
index 401052a21ce8..4be4e172ffa1 100644
--- a/drivers/pcmcia/sa1111_generic.c
+++ b/drivers/pcmcia/sa1111_generic.c
@@ -159,7 +159,7 @@ static int __devexit pcmcia_remove(struct sa1111_dev *dev)
static int pcmcia_suspend(struct sa1111_dev *dev, pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int pcmcia_resume(struct sa1111_dev *dev)
diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c
index 8eb04230fec7..582413fcb62f 100644
--- a/drivers/pcmcia/tcic.c
+++ b/drivers/pcmcia/tcic.c
@@ -366,7 +366,7 @@ static int __init get_tcic_id(void)
static int tcic_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int tcic_drv_pcmcia_resume(struct platform_device *dev)
diff --git a/drivers/pcmcia/vrc4171_card.c b/drivers/pcmcia/vrc4171_card.c
index d4ad50d737b0..c9fcbdc164ea 100644
--- a/drivers/pcmcia/vrc4171_card.c
+++ b/drivers/pcmcia/vrc4171_card.c
@@ -707,7 +707,7 @@ __setup("vrc4171_card=", vrc4171_card_setup);
static int vrc4171_card_suspend(struct platform_device *dev,
pm_message_t state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state);
+ return pcmcia_socket_dev_suspend(&dev->dev);
}
static int vrc4171_card_resume(struct platform_device *dev)
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
index 3ecd7c99d8eb..bcebffb54b25 100644
--- a/drivers/pcmcia/yenta_socket.c
+++ b/drivers/pcmcia/yenta_socket.c
@@ -1225,60 +1225,81 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
}
#ifdef CONFIG_PM
-static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state)
+static int yenta_dev_suspend_noirq(struct device *dev)
{
- struct yenta_socket *socket = pci_get_drvdata(dev);
+ struct pci_dev *pdev = to_pci_dev(dev);
+ struct yenta_socket *socket = pci_get_drvdata(pdev);
int ret;
- ret = pcmcia_socket_dev_suspend(&dev->dev, state);
+ ret = pcmcia_socket_dev_suspend(dev);
- if (socket) {
- if (socket->type && socket->type->save_state)
- socket->type->save_state(socket);
+ if (!socket)
+ return ret;
- /* FIXME: pci_save_state needs to have a better interface */
- pci_save_state(dev);
- pci_read_config_dword(dev, 16*4, &socket->saved_state[0]);
- pci_read_config_dword(dev, 17*4, &socket->saved_state[1]);
- pci_disable_device(dev);
+ if (socket->type && socket->type->save_state)
+ socket->type->save_state(socket);
- /*
- * Some laptops (IBM T22) do not like us putting the Cardbus
- * bridge into D3. At a guess, some other laptop will
- * probably require this, so leave it commented out for now.
- */
- /* pci_set_power_state(dev, 3); */
- }
+ pci_save_state(pdev);
+ pci_read_config_dword(pdev, 16*4, &socket->saved_state[0]);
+ pci_read_config_dword(pdev, 17*4, &socket->saved_state[1]);
+ pci_disable_device(pdev);
+
+ /*
+ * Some laptops (IBM T22) do not like us putting the Cardbus
+ * bridge into D3. At a guess, some other laptop will
+ * probably require this, so leave it commented out for now.
+ */
+ /* pci_set_power_state(dev, 3); */
return ret;
}
-
-static int yenta_dev_resume (struct pci_dev *dev)
+static int yenta_dev_resume_noirq(struct device *dev)
{
- struct yenta_socket *socket = pci_get_drvdata(dev);
+ struct pci_dev *pdev = to_pci_dev(dev);
+ struct yenta_socket *socket = pci_get_drvdata(pdev);
+ int ret;
- if (socket) {
- int rc;
+ if (!socket)
+ return 0;
- pci_set_power_state(dev, 0);
- /* FIXME: pci_restore_state needs to have a better interface */
- pci_restore_state(dev);
- pci_write_config_dword(dev, 16*4, socket->saved_state[0]);
- pci_write_config_dword(dev, 17*4, socket->saved_state[1]);
+ pci_write_config_dword(pdev, 16*4, socket->saved_state[0]);
+ pci_write_config_dword(pdev, 17*4, socket->saved_state[1]);
- rc = pci_enable_device(dev);
- if (rc)
- return rc;
+ ret = pci_enable_device(pdev);
+ if (ret)
+ return ret;
- pci_set_master(dev);
+ pci_set_master(pdev);
- if (socket->type && socket->type->restore_state)
- socket->type->restore_state(socket);
- }
+ if (socket->type && socket->type->restore_state)
+ socket->type->restore_state(socket);
+
+ pcmcia_socket_dev_early_resume(dev);
+ return 0;
+}
- return pcmcia_socket_dev_resume(&dev->dev);
+static int yenta_dev_resume(struct device *dev)
+{
+ pcmcia_socket_dev_late_resume(dev);
+ return 0;
}
+
+static struct dev_pm_ops yenta_pm_ops = {
+ .suspend_noirq = yenta_dev_suspend_noirq,
+ .resume_noirq = yenta_dev_resume_noirq,
+ .resume = yenta_dev_resume,
+ .freeze_noirq = yenta_dev_suspend_noirq,
+ .thaw_noirq = yenta_dev_resume_noirq,
+ .thaw = yenta_dev_resume,
+ .poweroff_noirq = yenta_dev_suspend_noirq,
+ .restore_noirq = yenta_dev_resume_noirq,
+ .restore = yenta_dev_resume,
+};
+
+#define YENTA_PM_OPS (&yenta_pm_ops)
+#else
+#define YENTA_PM_OPS NULL
#endif
#define CB_ID(vend,dev,type) \
@@ -1376,10 +1397,7 @@ static struct pci_driver yenta_cardbus_driver = {
.id_table = yenta_table,
.probe = yenta_probe,
.remove = __devexit_p(yenta_close),
-#ifdef CONFIG_PM
- .suspend = yenta_dev_suspend,
- .resume = yenta_dev_resume,
-#endif
+ .driver.pm = YENTA_PM_OPS,
};
diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c
index bdfee177eefb..034ca6d9081d 100644
--- a/drivers/platform/x86/acerhdf.c
+++ b/drivers/platform/x86/acerhdf.c
@@ -52,7 +52,7 @@
*/
#undef START_IN_KERNEL_MODE
-#define DRV_VER "0.5.13"
+#define DRV_VER "0.5.16"
/*
* According to the Atom N270 datasheet,
@@ -61,7 +61,7 @@
* measured by the on-die thermal monitor are within 0 <= Tj <= 90. So,
* assume 89°C is critical temperature.
*/
-#define ACERHDF_TEMP_CRIT 89
+#define ACERHDF_TEMP_CRIT 89000
#define ACERHDF_FAN_OFF 0
#define ACERHDF_FAN_AUTO 1
@@ -69,7 +69,7 @@
* No matter what value the user puts into the fanon variable, turn on the fan
* at 80 degree Celsius to prevent hardware damage
*/
-#define ACERHDF_MAX_FANON 80
+#define ACERHDF_MAX_FANON 80000
/*
* Maximum interval between two temperature checks is 15 seconds, as the die
@@ -85,11 +85,12 @@ static int kernelmode;
#endif
static unsigned int interval = 10;
-static unsigned int fanon = 63;
-static unsigned int fanoff = 58;
+static unsigned int fanon = 63000;
+static unsigned int fanoff = 58000;
static unsigned int verbose;
static unsigned int fanstate = ACERHDF_FAN_AUTO;
static char force_bios[16];
+static char force_product[16];
static unsigned int prev_interval;
struct thermal_zone_device *thz_dev;
struct thermal_cooling_device *cl_dev;
@@ -107,34 +108,62 @@ module_param(verbose, uint, 0600);
MODULE_PARM_DESC(verbose, "Enable verbose dmesg output");
module_param_string(force_bios, force_bios, 16, 0);
MODULE_PARM_DESC(force_bios, "Force BIOS version and omit BIOS check");
+module_param_string(force_product, force_product, 16, 0);
+MODULE_PARM_DESC(force_product, "Force BIOS product and omit BIOS check");
+
+/*
+ * cmd_off: to switch the fan completely off / to check if the fan is off
+ * cmd_auto: to set the BIOS in control of the fan. The BIOS regulates then
+ * the fan speed depending on the temperature
+ */
+struct fancmd {
+ u8 cmd_off;
+ u8 cmd_auto;
+};
/* BIOS settings */
struct bios_settings_t {
const char *vendor;
+ const char *product;
const char *version;
unsigned char fanreg;
unsigned char tempreg;
- unsigned char fancmd[2]; /* fan off and auto commands */
+ struct fancmd cmd;
};
/* Register addresses and values for different BIOS versions */
static const struct bios_settings_t bios_tbl[] = {
- {"Acer", "v0.3109", 0x55, 0x58, {0x1f, 0x00} },
- {"Acer", "v0.3114", 0x55, 0x58, {0x1f, 0x00} },
- {"Acer", "v0.3301", 0x55, 0x58, {0xaf, 0x00} },
- {"Acer", "v0.3304", 0x55, 0x58, {0xaf, 0x00} },
- {"Acer", "v0.3305", 0x55, 0x58, {0xaf, 0x00} },
- {"Acer", "v0.3308", 0x55, 0x58, {0x21, 0x00} },
- {"Acer", "v0.3309", 0x55, 0x58, {0x21, 0x00} },
- {"Acer", "v0.3310", 0x55, 0x58, {0x21, 0x00} },
- {"Gateway", "v0.3103", 0x55, 0x58, {0x21, 0x00} },
- {"Packard Bell", "v0.3105", 0x55, 0x58, {0x21, 0x00} },
- {"", "", 0, 0, {0, 0} }
+ /* AOA110 */
+ {"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00} },
+ {"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00} },
+ {"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0x00} },
+ {"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0x00} },
+ {"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0x00} },
+ {"Acer", "AOA110", "v0.3307", 0x55, 0x58, {0xaf, 0x00} },
+ {"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x00} },
+ {"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x00} },
+ {"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x00} },
+ /* AOA150 */
+ {"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x20, 0x00} },
+ {"Acer", "AOA150", "v0.3301", 0x55, 0x58, {0x20, 0x00} },
+ {"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x00} },
+ {"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x00} },
+ {"Acer", "AOA150", "v0.3307", 0x55, 0x58, {0x20, 0x00} },
+ {"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x00} },
+ {"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x00} },
+ {"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x00} },
+ /* special BIOS / other */
+ {"Gateway", "AOA110", "v0.3103", 0x55, 0x58, {0x21, 0x00} },
+ {"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x00} },
+ {"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00} },
+ {"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x00} },
+ {"Packard Bell", "AOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00} },
+ /* pewpew-terminator */
+ {"", "", "", 0, 0, {0, 0} }
};
static const struct bios_settings_t *bios_cfg __read_mostly;
-
static int acerhdf_get_temp(int *temp)
{
u8 read_temp;
@@ -142,7 +171,7 @@ static int acerhdf_get_temp(int *temp)
if (ec_read(bios_cfg->tempreg, &read_temp))
return -EINVAL;
- *temp = read_temp;
+ *temp = read_temp * 1000;
return 0;
}
@@ -150,13 +179,14 @@ static int acerhdf_get_temp(int *temp)
static int acerhdf_get_fanstate(int *state)
{
u8 fan;
- bool tmp;
if (ec_read(bios_cfg->fanreg, &fan))
return -EINVAL;
- tmp = (fan == bios_cfg->fancmd[ACERHDF_FAN_OFF]);
- *state = tmp ? ACERHDF_FAN_OFF : ACERHDF_FAN_AUTO;
+ if (fan != bios_cfg->cmd.cmd_off)
+ *state = ACERHDF_FAN_AUTO;
+ else
+ *state = ACERHDF_FAN_OFF;
return 0;
}
@@ -175,7 +205,8 @@ static void acerhdf_change_fanstate(int state)
state = ACERHDF_FAN_AUTO;
}
- cmd = bios_cfg->fancmd[state];
+ cmd = (state == ACERHDF_FAN_OFF) ? bios_cfg->cmd.cmd_off
+ : bios_cfg->cmd.cmd_auto;
fanstate = state;
ec_write(bios_cfg->fanreg, cmd);
@@ -437,7 +468,7 @@ static int acerhdf_remove(struct platform_device *device)
return 0;
}
-struct platform_driver acerhdf_drv = {
+static struct platform_driver acerhdf_driver = {
.driver = {
.name = "acerhdf",
.owner = THIS_MODULE,
@@ -454,32 +485,40 @@ static int acerhdf_check_hardware(void)
{
char const *vendor, *version, *product;
int i;
+ unsigned long prod_len = 0;
/* get BIOS data */
vendor = dmi_get_system_info(DMI_SYS_VENDOR);
version = dmi_get_system_info(DMI_BIOS_VERSION);
product = dmi_get_system_info(DMI_PRODUCT_NAME);
+
pr_info("Acer Aspire One Fan driver, v.%s\n", DRV_VER);
- if (!force_bios[0]) {
- if (strncmp(product, "AO", 2)) {
- pr_err("no Aspire One hardware found\n");
- return -EINVAL;
- }
- } else {
- pr_info("forcing BIOS version: %s\n", version);
+ if (force_bios[0]) {
version = force_bios;
+ pr_info("forcing BIOS version: %s\n", version);
kernelmode = 0;
}
+ if (force_product[0]) {
+ product = force_product;
+ pr_info("forcing BIOS product: %s\n", product);
+ kernelmode = 0;
+ }
+
+ prod_len = strlen(product);
+
if (verbose)
pr_info("BIOS info: %s %s, product: %s\n",
vendor, version, product);
/* search BIOS version and vendor in BIOS settings table */
for (i = 0; bios_tbl[i].version[0]; i++) {
- if (!strcmp(bios_tbl[i].vendor, vendor) &&
+ if (strlen(bios_tbl[i].product) >= prod_len &&
+ !strncmp(bios_tbl[i].product, product,
+ strlen(bios_tbl[i].product)) &&
+ !strcmp(bios_tbl[i].vendor, vendor) &&
!strcmp(bios_tbl[i].version, version)) {
bios_cfg = &bios_tbl[i];
break;
@@ -487,8 +526,8 @@ static int acerhdf_check_hardware(void)
}
if (!bios_cfg) {
- pr_err("unknown (unsupported) BIOS version %s/%s, "
- "please report, aborting!\n", vendor, version);
+ pr_err("unknown (unsupported) BIOS version %s/%s/%s, "
+ "please report, aborting!\n", vendor, product, version);
return -EINVAL;
}
@@ -509,7 +548,7 @@ static int acerhdf_register_platform(void)
{
int err = 0;
- err = platform_driver_register(&acerhdf_drv);
+ err = platform_driver_register(&acerhdf_driver);
if (err)
return err;
@@ -525,7 +564,7 @@ static void acerhdf_unregister_platform(void)
return;
platform_device_del(acerhdf_dev);
- platform_driver_unregister(&acerhdf_drv);
+ platform_driver_unregister(&acerhdf_driver);
}
static int acerhdf_register_thermal(void)
@@ -594,9 +633,10 @@ static void __exit acerhdf_exit(void)
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Peter Feuerer");
MODULE_DESCRIPTION("Aspire One temperature and fan driver");
-MODULE_ALIAS("dmi:*:*Acer*:*:");
-MODULE_ALIAS("dmi:*:*Gateway*:*:");
-MODULE_ALIAS("dmi:*:*Packard Bell*:*:");
+MODULE_ALIAS("dmi:*:*Acer*:pnAOA*:");
+MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:");
+MODULE_ALIAS("dmi:*:*Packard Bell*:pnAOA*:");
+MODULE_ALIAS("dmi:*:*Packard Bell*:pnDOA*:");
module_init(acerhdf_init);
module_exit(acerhdf_exit);
diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c
index db657bbeec90..fae1951cb753 100644
--- a/drivers/platform/x86/asus-laptop.c
+++ b/drivers/platform/x86/asus-laptop.c
@@ -1172,8 +1172,8 @@ static int asus_hotk_add(struct acpi_device *device)
hotk->ledd_status = 0xFFF;
/* Set initial values of light sensor and level */
- hotk->light_switch = 1; /* Default to light sensor disabled */
- hotk->light_level = 0; /* level 5 for sensor sensitivity */
+ hotk->light_switch = 0; /* Default to light sensor disabled */
+ hotk->light_level = 5; /* level 5 for sensor sensitivity */
if (ls_switch_handle)
set_light_sens_switch(hotk->light_switch);
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index dafaa4a92df5..a234a9db15d9 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -1081,6 +1081,8 @@ static int sony_nc_setup_rfkill(struct acpi_device *device,
struct rfkill *rfk;
enum rfkill_type type;
const char *name;
+ int result;
+ bool hwblock;
switch (nc_type) {
case SONY_WIFI:
@@ -1108,6 +1110,10 @@ static int sony_nc_setup_rfkill(struct acpi_device *device,
if (!rfk)
return -ENOMEM;
+ sony_call_snc_handle(0x124, 0x200, &result);
+ hwblock = !(result & 0x1);
+ rfkill_set_hw_state(rfk, hwblock);
+
err = rfkill_register(rfk);
if (err) {
rfkill_destroy(rfk);
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index e85600852502..05e5d56f9c82 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -3406,15 +3406,6 @@ enum {
#define TPACPI_RFK_BLUETOOTH_SW_NAME "tpacpi_bluetooth_sw"
-static void bluetooth_suspend(pm_message_t state)
-{
- /* Try to make sure radio will resume powered off */
- if (!acpi_evalf(NULL, NULL, "\\BLTH", "vd",
- TP_ACPI_BLTH_PWR_OFF_ON_RESUME))
- vdbg_printk(TPACPI_DBG_RFKILL,
- "bluetooth power down on resume request failed\n");
-}
-
static int bluetooth_get_status(void)
{
int status;
@@ -3448,10 +3439,9 @@ static int bluetooth_set_status(enum tpacpi_rfkill_state state)
#endif
/* We make sure to keep TP_ACPI_BLUETOOTH_RESUMECTRL off */
+ status = TP_ACPI_BLUETOOTH_RESUMECTRL;
if (state == TPACPI_RFK_RADIO_ON)
- status = TP_ACPI_BLUETOOTH_RADIOSSW;
- else
- status = 0;
+ status |= TP_ACPI_BLUETOOTH_RADIOSSW;
if (!acpi_evalf(hkey_handle, NULL, "SBDC", "vd", status))
return -EIO;
@@ -3590,7 +3580,6 @@ static struct ibm_struct bluetooth_driver_data = {
.read = bluetooth_read,
.write = bluetooth_write,
.exit = bluetooth_exit,
- .suspend = bluetooth_suspend,
.shutdown = bluetooth_shutdown,
};
@@ -3608,15 +3597,6 @@ enum {
#define TPACPI_RFK_WWAN_SW_NAME "tpacpi_wwan_sw"
-static void wan_suspend(pm_message_t state)
-{
- /* Try to make sure radio will resume powered off */
- if (!acpi_evalf(NULL, NULL, "\\WGSV", "qvd",
- TP_ACPI_WGSV_PWR_OFF_ON_RESUME))
- vdbg_printk(TPACPI_DBG_RFKILL,
- "WWAN power down on resume request failed\n");
-}
-
static int wan_get_status(void)
{
int status;
@@ -3649,11 +3629,10 @@ static int wan_set_status(enum tpacpi_rfkill_state state)
}
#endif
- /* We make sure to keep TP_ACPI_WANCARD_RESUMECTRL off */
+ /* We make sure to set TP_ACPI_WANCARD_RESUMECTRL */
+ status = TP_ACPI_WANCARD_RESUMECTRL;
if (state == TPACPI_RFK_RADIO_ON)
- status = TP_ACPI_WANCARD_RADIOSSW;
- else
- status = 0;
+ status |= TP_ACPI_WANCARD_RADIOSSW;
if (!acpi_evalf(hkey_handle, NULL, "SWAN", "vd", status))
return -EIO;
@@ -3791,7 +3770,6 @@ static struct ibm_struct wan_driver_data = {
.read = wan_read,
.write = wan_write,
.exit = wan_exit,
- .suspend = wan_suspend,
.shutdown = wan_shutdown,
};
@@ -5655,16 +5633,16 @@ static const struct tpacpi_quirk brightness_quirk_table[] __initconst = {
/* Models with ATI GPUs known to require ECNVRAM mode */
TPACPI_Q_IBM('1', 'Y', TPACPI_BRGHT_Q_EC), /* T43/p ATI */
- /* Models with ATI GPUs (waiting confirmation) */
- TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
+ /* Models with ATI GPUs that can use ECNVRAM */
+ TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_EC),
TPACPI_Q_IBM('1', 'Q', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
TPACPI_Q_IBM('7', '6', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
TPACPI_Q_IBM('7', '8', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
- /* Models with Intel Extreme Graphics 2 (waiting confirmation) */
- TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC),
- TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC),
- TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC),
+ /* Models with Intel Extreme Graphics 2 */
+ TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_NOEC),
+ TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
+ TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
/* Models with Intel GMA900 */
TPACPI_Q_IBM('7', '0', TPACPI_BRGHT_Q_NOEC), /* T43, R52 */
@@ -5863,7 +5841,7 @@ static int brightness_write(char *buf)
* Doing it this way makes the syscall restartable in case of EINTR
*/
rc = brightness_set(level);
- return (rc == -EINTR)? ERESTARTSYS : rc;
+ return (rc == -EINTR)? -ERESTARTSYS : rc;
}
static struct ibm_struct brightness_driver_data = {
diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c
index 35a0b192d768..2d414e23d390 100644
--- a/drivers/pps/kapi.c
+++ b/drivers/pps/kapi.c
@@ -271,6 +271,7 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data)
{
struct pps_device *pps;
unsigned long flags;
+ int captured = 0;
if ((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0) {
printk(KERN_ERR "pps: unknown event (%x) for source %d\n",
@@ -293,7 +294,8 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data)
/* Check the event */
pps->current_mode = pps->params.mode;
- if (event & PPS_CAPTUREASSERT) {
+ if ((event & PPS_CAPTUREASSERT) &
+ (pps->params.mode & PPS_CAPTUREASSERT)) {
/* We have to add an offset? */
if (pps->params.mode & PPS_OFFSETASSERT)
pps_add_offset(ts, &pps->params.assert_off_tu);
@@ -303,8 +305,11 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data)
pps->assert_sequence++;
pr_debug("capture assert seq #%u for source %d\n",
pps->assert_sequence, source);
+
+ captured = ~0;
}
- if (event & PPS_CAPTURECLEAR) {
+ if ((event & PPS_CAPTURECLEAR) &
+ (pps->params.mode & PPS_CAPTURECLEAR)) {
/* We have to add an offset? */
if (pps->params.mode & PPS_OFFSETCLEAR)
pps_add_offset(ts, &pps->params.clear_off_tu);
@@ -314,12 +319,17 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data)
pps->clear_sequence++;
pr_debug("capture clear seq #%u for source %d\n",
pps->clear_sequence, source);
+
+ captured = ~0;
}
- pps->go = ~0;
- wake_up_interruptible(&pps->queue);
+ /* Wake up iif captured somthing */
+ if (captured) {
+ pps->go = ~0;
+ wake_up_interruptible(&pps->queue);
- kill_fasync(&pps->async_queue, SIGIO, POLL_IN);
+ kill_fasync(&pps->async_queue, SIGIO, POLL_IN);
+ }
spin_unlock_irqrestore(&pps->lock, flags);
diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c
index fea17e7805e9..ca5183bdad85 100644
--- a/drivers/pps/pps.c
+++ b/drivers/pps/pps.c
@@ -71,9 +71,14 @@ static long pps_cdev_ioctl(struct file *file,
case PPS_GETPARAMS:
pr_debug("PPS_GETPARAMS: source %d\n", pps->id);
- /* Return current parameters */
- err = copy_to_user(uarg, &pps->params,
- sizeof(struct pps_kparams));
+ spin_lock_irq(&pps->lock);
+
+ /* Get the current parameters */
+ params = pps->params;
+
+ spin_unlock_irq(&pps->lock);
+
+ err = copy_to_user(uarg, &params, sizeof(struct pps_kparams));
if (err)
return -EFAULT;
diff --git a/drivers/ps3/ps3stor_lib.c b/drivers/ps3/ps3stor_lib.c
index 18066d555397..af0afa1db4a8 100644
--- a/drivers/ps3/ps3stor_lib.c
+++ b/drivers/ps3/ps3stor_lib.c
@@ -23,6 +23,65 @@
#include <asm/lv1call.h>
#include <asm/ps3stor.h>
+/*
+ * A workaround for flash memory I/O errors when the internal hard disk
+ * has not been formatted for OtherOS use. Delay disk close until flash
+ * memory is closed.
+ */
+
+static struct ps3_flash_workaround {
+ int flash_open;
+ int disk_open;
+ struct ps3_system_bus_device *disk_sbd;
+} ps3_flash_workaround;
+
+static int ps3stor_open_hv_device(struct ps3_system_bus_device *sbd)
+{
+ int error = ps3_open_hv_device(sbd);
+
+ if (error)
+ return error;
+
+ if (sbd->match_id == PS3_MATCH_ID_STOR_FLASH)
+ ps3_flash_workaround.flash_open = 1;
+
+ if (sbd->match_id == PS3_MATCH_ID_STOR_DISK)
+ ps3_flash_workaround.disk_open = 1;
+
+ return 0;
+}
+
+static int ps3stor_close_hv_device(struct ps3_system_bus_device *sbd)
+{
+ int error;
+
+ if (sbd->match_id == PS3_MATCH_ID_STOR_DISK
+ && ps3_flash_workaround.disk_open
+ && ps3_flash_workaround.flash_open) {
+ ps3_flash_workaround.disk_sbd = sbd;
+ return 0;
+ }
+
+ error = ps3_close_hv_device(sbd);
+
+ if (error)
+ return error;
+
+ if (sbd->match_id == PS3_MATCH_ID_STOR_DISK)
+ ps3_flash_workaround.disk_open = 0;
+
+ if (sbd->match_id == PS3_MATCH_ID_STOR_FLASH) {
+ ps3_flash_workaround.flash_open = 0;
+
+ if (ps3_flash_workaround.disk_sbd) {
+ ps3_close_hv_device(ps3_flash_workaround.disk_sbd);
+ ps3_flash_workaround.disk_open = 0;
+ ps3_flash_workaround.disk_sbd = NULL;
+ }
+ }
+
+ return 0;
+}
static int ps3stor_probe_access(struct ps3_storage_device *dev)
{
@@ -90,7 +149,7 @@ int ps3stor_setup(struct ps3_storage_device *dev, irq_handler_t handler)
int error, res, alignment;
enum ps3_dma_page_size page_size;
- error = ps3_open_hv_device(&dev->sbd);
+ error = ps3stor_open_hv_device(&dev->sbd);
if (error) {
dev_err(&dev->sbd.core,
"%s:%u: ps3_open_hv_device failed %d\n", __func__,
@@ -166,7 +225,7 @@ fail_free_irq:
fail_sb_event_receive_port_destroy:
ps3_sb_event_receive_port_destroy(&dev->sbd, dev->irq);
fail_close_device:
- ps3_close_hv_device(&dev->sbd);
+ ps3stor_close_hv_device(&dev->sbd);
fail:
return error;
}
@@ -193,7 +252,7 @@ void ps3stor_teardown(struct ps3_storage_device *dev)
"%s:%u: destroy event receive port failed %d\n",
__func__, __LINE__, error);
- error = ps3_close_hv_device(&dev->sbd);
+ error = ps3stor_close_hv_device(&dev->sbd);
if (error)
dev_err(&dev->sbd.core,
"%s:%u: ps3_close_hv_device failed %d\n", __func__,
diff --git a/drivers/regulator/max17135-regulator.c b/drivers/regulator/max17135-regulator.c
index a667c2f7cf59..3fdec795fbeb 100644
--- a/drivers/regulator/max17135-regulator.c
+++ b/drivers/regulator/max17135-regulator.c
@@ -30,6 +30,12 @@
#include <linux/gpio.h>
/*
+ * Define this as 1 when using a Rev 1 MAX17135 part. These parts have
+ * some limitations, including an inability to turn on the PMIC via I2C.
+ */
+#define MAX17135_REV 1
+
+/*
* PMIC Register Addresses
*/
enum {
@@ -170,8 +176,27 @@ enum {
#define MAX17135_GVEE_MIN_VAL 0
#define MAX17135_GVEE_MAX_VAL 1
+#if (MAX17135_REV == 1)
+#define MAX17135_VCOM_MIN_uV -4325000
+#define MAX17135_VCOM_MAX_uV -500000
+#define MAX17135_VCOM_STEP_uV 15000
#define MAX17135_VCOM_MIN_VAL 0
#define MAX17135_VCOM_MAX_VAL 255
+/* Required due to discrepancy between
+ * observed VCOM programming and
+ * what is suggested in the spec.
+ */
+#define MAX17135_VCOM_FUDGE_FACTOR 330000
+#else
+#define MAX17135_VCOM_MIN_uV -3050000
+#define MAX17135_VCOM_MAX_uV -500000
+#define MAX17135_VCOM_STEP_uV 10000
+#define MAX17135_VCOM_MIN_VAL 0
+#define MAX17135_VCOM_MAX_VAL 255
+#define MAX17135_VCOM_FUDGE_FACTOR 330000
+#endif
+
+#define MAX17135_VCOM_VOLTAGE_DEFAULT -1250000
#define MAX17135_VNEG_MIN_uV 5000000
#define MAX17135_VNEG_MAX_uV 20000000
@@ -185,25 +210,6 @@ enum {
#define MAX17135_VPOS_MIN_VAL 0
#define MAX17135_VPOS_MAX_VAL 1
-struct max17135_vcom_programming_data {
- int vcom_min_uV;
- int vcom_max_uV;
- int vcom_step_uV;
-};
-
-struct max17135_vcom_programming_data vcom_data[2] = {
- {
- -4325000,
- -500000,
- 15000,
- },
- {
- -3050000,
- -500000,
- 10000,
- },
-};
-
struct max17135 {
/* chip revision */
int rev;
@@ -222,9 +228,6 @@ struct max17135 {
int gpio_pmic_wakeup;
int gpio_pmic_intr;
- int pass_num;
- int vcom_uV;
-
bool vcom_setup;
int max_wait;
@@ -290,17 +293,15 @@ static int max17135_hvinp_disable(struct regulator_dev *reg)
}
/* Convert uV to the VCOM register bitfield setting */
-static inline int vcom_uV_to_rs(int uV, int pass_num)
+static inline int vcom_uV_to_rs(int uV)
{
- return (vcom_data[pass_num].vcom_max_uV - uV)
- / vcom_data[pass_num].vcom_step_uV;
+ return (MAX17135_VCOM_MAX_uV - uV) / MAX17135_VCOM_STEP_uV;
}
/* Convert the VCOM register bitfield setting to uV */
-static inline int vcom_rs_to_uV(int rs, int pass_num)
+static inline int vcom_rs_to_uV(int rs)
{
- return vcom_data[pass_num].vcom_max_uV
- - (vcom_data[pass_num].vcom_step_uV * rs);
+ return MAX17135_VCOM_MAX_uV - (MAX17135_VCOM_STEP_uV * rs);
}
static int max17135_vcom_set_voltage(struct regulator_dev *reg,
@@ -311,8 +312,7 @@ static int max17135_vcom_set_voltage(struct regulator_dev *reg,
unsigned int reg_val;
int vcom_read;
- if ((uV < vcom_data[max17135->pass_num-1].vcom_min_uV)
- || (uV > vcom_data[max17135->pass_num-1].vcom_max_uV))
+ if ((uV < MAX17135_VCOM_MIN_uV) || (uV > MAX17135_VCOM_MAX_uV))
return -EINVAL;
reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_DVR);
@@ -322,11 +322,11 @@ static int max17135_vcom_set_voltage(struct regulator_dev *reg,
* Programming VCOM excessively degrades ability to keep
* DVR register value persistent.
*/
- vcom_read = vcom_rs_to_uV(reg_val, max17135->pass_num-1);
- if (vcom_read != max17135->vcom_uV) {
+ vcom_read = vcom_rs_to_uV(reg_val) - MAX17135_VCOM_FUDGE_FACTOR;
+ if (vcom_read != MAX17135_VCOM_VOLTAGE_DEFAULT) {
reg_val &= ~BITFMASK(DVR);
- reg_val |= BITFVAL(DVR, vcom_uV_to_rs(uV,
- max17135->pass_num-1));
+ reg_val |= BITFVAL(DVR,
+ vcom_uV_to_rs(uV + MAX17135_VCOM_FUDGE_FACTOR));
i2c_smbus_write_byte_data(client, REG_MAX17135_DVR, reg_val);
reg_val = BITFVAL(CTRL_DVR, true); /* shift to correct bit */
@@ -342,7 +342,7 @@ static int max17135_vcom_get_voltage(struct regulator_dev *reg)
unsigned int reg_val;
reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_DVR);
- return vcom_rs_to_uV(BITFEXT(reg_val, DVR), max17135->pass_num-1);
+ return vcom_rs_to_uV(BITFEXT(reg_val, DVR));
}
static int max17135_vcom_enable(struct regulator_dev *reg)
@@ -357,41 +357,38 @@ static int max17135_vcom_enable(struct regulator_dev *reg)
if (!max17135->vcom_setup
&& gpio_get_value(max17135->gpio_pmic_pwrgood)) {
max17135_vcom_set_voltage(reg,
- max17135->vcom_uV,
- max17135->vcom_uV);
+ MAX17135_VCOM_VOLTAGE_DEFAULT,
+ MAX17135_VCOM_VOLTAGE_DEFAULT);
max17135->vcom_setup = true;
}
/* enable VCOM regulator output */
- if (max17135->pass_num == 1)
- gpio_set_value(max17135->gpio_pmic_vcom_ctrl, 1);
- else {
- struct i2c_client *client = max17135->i2c_client;
- unsigned int reg_val;
-
- reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE);
- reg_val &= ~BITFMASK(VCOM_ENABLE);
- reg_val |= BITFVAL(VCOM_ENABLE, 1); /* shift to correct bit */
- i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val);
- }
+#if (MAX17135_REV == 1)
+ gpio_set_value(max17135->gpio_pmic_vcom_ctrl, 1);
+#else
+ struct i2c_client *client = max17135->i2c_client;
+ reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE);
+ reg_val &= ~BITFMASK(VCOM_ENABLE);
+ reg_val |= BITFVAL(VCOM_ENABLE, 1); /* shift to correct bit */
+ i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val);
+#endif
return 0;
}
static int max17135_vcom_disable(struct regulator_dev *reg)
{
struct max17135 *max17135 = rdev_get_drvdata(reg);
- if (max17135->pass_num == 1)
- gpio_set_value(max17135->gpio_pmic_vcom_ctrl, 0);
- else {
- struct i2c_client *client = max17135->i2c_client;
- unsigned int reg_val;
-
- reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE);
- reg_val &= ~BITFMASK(VCOM_ENABLE);
- i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val);
- }
+#if (MAX17135_REV == 1)
+ gpio_set_value(max17135->gpio_pmic_vcom_ctrl, 0);
+#else
+ struct i2c_client *client = max17135->i2c_client;
+ unsigned int reg_val;
+ reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE);
+ reg_val &= ~BITFMASK(VCOM_ENABLE);
+ i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val);
+#endif
return 0;
}
@@ -411,21 +408,17 @@ static int max17135_wait_power_good(struct max17135 *max17135)
static int max17135_display_enable(struct regulator_dev *reg)
{
struct max17135 *max17135 = rdev_get_drvdata(reg);
+#if (MAX17135_REV == 1)
+ gpio_set_value(max17135->gpio_pmic_wakeup, 1);
+#else
+ struct i2c_client *client = max17135->i2c_client;
+ unsigned int reg_val;
- /* The Pass 1 parts cannot turn on the PMIC via I2C. */
- if (max17135->pass_num == 1)
- gpio_set_value(max17135->gpio_pmic_wakeup, 1);
- else {
- struct i2c_client *client = max17135->i2c_client;
- unsigned int reg_val;
-
- reg_val = i2c_smbus_read_byte_data(client,
- REG_MAX17135_ENABLE);
- reg_val &= ~BITFMASK(ENABLE);
- reg_val |= BITFVAL(ENABLE, 1);
- i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE,
- reg_val);
- }
+ reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE);
+ reg_val &= ~BITFMASK(ENABLE);
+ reg_val |= BITFVAL(ENABLE, 1);
+ i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val);
+#endif
return max17135_wait_power_good(max17135);
}
@@ -433,20 +426,17 @@ static int max17135_display_enable(struct regulator_dev *reg)
static int max17135_display_disable(struct regulator_dev *reg)
{
struct max17135 *max17135 = rdev_get_drvdata(reg);
+#if (MAX17135_REV == 1)
+ gpio_set_value(max17135->gpio_pmic_wakeup, 0);
+#else
+ struct i2c_client *client = max17135->i2c_client;
+ unsigned int reg_val;
- if (max17135->pass_num == 1)
- gpio_set_value(max17135->gpio_pmic_wakeup, 0);
- else {
- struct i2c_client *client = max17135->i2c_client;
- unsigned int reg_val;
-
- reg_val = i2c_smbus_read_byte_data(client,
- REG_MAX17135_ENABLE);
- reg_val &= ~BITFMASK(ENABLE);
- i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE,
- reg_val);
- }
-
+ reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE);
+ reg_val &= ~BITFMASK(ENABLE);
+ i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val);
+ msleep(PMIC_DISABLE__V3P3_DESERT/1000);
+#endif
return 0;
}
@@ -668,9 +658,6 @@ static int max17135_i2c_probe(struct i2c_client *client,
max17135->gpio_pmic_wakeup = pdata->gpio_pmic_wakeup;
max17135->gpio_pmic_intr = pdata->gpio_pmic_intr;
- max17135->pass_num = pdata->pass_num;
- max17135->vcom_uV = pdata->vcom_uV;
-
max17135->vcom_setup = false;
ret = platform_driver_register(&max17135_regulator_driver);
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index bd320c1ab70c..09492700cddf 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -109,16 +109,6 @@ config RTC_INTF_DEV_UIE_EMUL
clock several times per second, please enable this option
only if you know that you really need it.
-config RTC_INTF_ALARM
- bool "Android alarm driver"
- depends on RTC_CLASS
- default y
- help
- Provides non-wakeup and rtc backed wakeup alarms based on rtc or
- elapsed realtime, and a non-wakeup alarm on the monotonic clock.
- Also provides an ioctl to set the wall time which must be used
- for elapsed realtime to work.
-
config RTC_DRV_TEST
tristate "Test driver/device"
help
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index c8df86258348..91da97eca589 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -11,7 +11,6 @@ obj-$(CONFIG_RTC_HCTOSYS) += hctosys.o
obj-$(CONFIG_RTC_CLASS) += rtc-core.o
rtc-core-y := class.o interface.o
-rtc-core-$(CONFIG_RTC_INTF_ALARM) += alarm.o
rtc-core-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o
rtc-core-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o
rtc-core-$(CONFIG_RTC_INTF_SYSFS) += rtc-sysfs.o
diff --git a/drivers/rtc/rtc-fm3130.c b/drivers/rtc/rtc-fm3130.c
index 3a7be11cc6b9..812c66755083 100644
--- a/drivers/rtc/rtc-fm3130.c
+++ b/drivers/rtc/rtc-fm3130.c
@@ -376,20 +376,22 @@ static int __devinit fm3130_probe(struct i2c_client *client,
}
/* Disabling calibration mode */
- if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL)
+ if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) {
i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
fm3130->regs[FM3130_RTC_CONTROL] &
~(FM3130_RTC_CONTROL_BIT_CAL));
dev_warn(&client->dev, "Disabling calibration mode!\n");
+ }
/* Disabling read and write modes */
if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE ||
- fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ)
+ fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) {
i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
fm3130->regs[FM3130_RTC_CONTROL] &
~(FM3130_RTC_CONTROL_BIT_READ |
FM3130_RTC_CONTROL_BIT_WRITE));
dev_warn(&client->dev, "Disabling READ or WRITE mode!\n");
+ }
/* oscillator off? turn it on, so clock can tick. */
if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN)
diff --git a/drivers/rtc/rtc-mxs.c b/drivers/rtc/rtc-mxs.c
index bb4c33b1a0ba..0e2b0e1e14f6 100644
--- a/drivers/rtc/rtc-mxs.c
+++ b/drivers/rtc/rtc-mxs.c
@@ -254,8 +254,6 @@ static int mxs_rtc_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, rtc_data);
- device_init_wakeup(&pdev->dev, 1);
-
return 0;
}
diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c
index ad164056feb6..423cd5a30b10 100644
--- a/drivers/rtc/rtc-v3020.c
+++ b/drivers/rtc/rtc-v3020.c
@@ -96,7 +96,7 @@ static void v3020_mmio_write_bit(struct v3020 *chip, unsigned char bit)
static unsigned char v3020_mmio_read_bit(struct v3020 *chip)
{
- return readl(chip->ioaddress) & (1 << chip->leftshift);
+ return !!(readl(chip->ioaddress) & (1 << chip->leftshift));
}
static struct v3020_chip_ops v3020_mmio_ops = {
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c
index 644086ba2ede..b76dee9f2861 100644
--- a/drivers/s390/block/dasd_diag.c
+++ b/drivers/s390/block/dasd_diag.c
@@ -145,6 +145,15 @@ dasd_diag_erp(struct dasd_device *device)
mdsk_term_io(device);
rc = mdsk_init_io(device, device->block->bp_block, 0, NULL);
+ if (rc == 4) {
+ if (!(device->features & DASD_FEATURE_READONLY)) {
+ dev_warn(&device->cdev->dev,
+ "The access mode of a DIAG device changed"
+ " to read-only");
+ device->features |= DASD_FEATURE_READONLY;
+ }
+ rc = 0;
+ }
if (rc)
dev_warn(&device->cdev->dev, "DIAG ERP failed with "
"rc=%d\n", rc);
@@ -433,16 +442,20 @@ dasd_diag_check_device(struct dasd_device *device)
for (sb = 512; sb < bsize; sb = sb << 1)
block->s2b_shift++;
rc = mdsk_init_io(device, block->bp_block, 0, NULL);
- if (rc) {
+ if (rc && (rc != 4)) {
dev_warn(&device->cdev->dev, "DIAG initialization "
"failed with rc=%d\n", rc);
rc = -EIO;
} else {
+ if (rc == 4)
+ device->features |= DASD_FEATURE_READONLY;
dev_info(&device->cdev->dev,
- "New DASD with %ld byte/block, total size %ld KB\n",
+ "New DASD with %ld byte/block, total size %ld KB%s\n",
(unsigned long) block->bp_block,
(unsigned long) (block->blocks <<
- block->s2b_shift) >> 1);
+ block->s2b_shift) >> 1,
+ (rc == 4) ? ", read-only device" : "");
+ rc = 0;
}
out_label:
free_page((long) label);
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
index b6af63ca980b..496764349c41 100644
--- a/drivers/scsi/dpt_i2o.c
+++ b/drivers/scsi/dpt_i2o.c
@@ -1918,6 +1918,10 @@ static int adpt_i2o_passthru(adpt_hba* pHba, u32 __user *arg)
}
size = size>>16;
size *= 4;
+ if (size > MAX_MESSAGE_SIZE) {
+ rcode = -EINVAL;
+ goto cleanup;
+ }
/* Copy in the user's I2O command */
if (copy_from_user (msg, user_msg, size)) {
rcode = -EFAULT;
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
index 185e6bc4dd40..9e8fce0f0c1b 100644
--- a/drivers/scsi/gdth.c
+++ b/drivers/scsi/gdth.c
@@ -2900,7 +2900,7 @@ static int gdth_read_event(gdth_ha_str *ha, int handle, gdth_evt_str *estr)
eindex = handle;
estr->event_source = 0;
- if (eindex >= MAX_EVENTS) {
+ if (eindex < 0 || eindex >= MAX_EVENTS) {
spin_unlock_irqrestore(&ha->smp_lock, flags);
return eindex;
}
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 5fd2da494d08..28a753d796f3 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -180,14 +180,20 @@ void scsi_remove_host(struct Scsi_Host *shost)
EXPORT_SYMBOL(scsi_remove_host);
/**
- * scsi_add_host - add a scsi host
+ * scsi_add_host_with_dma - add a scsi host with dma device
* @shost: scsi host pointer to add
* @dev: a struct device of type scsi class
+ * @dma_dev: dma device for the host
+ *
+ * Note: You rarely need to worry about this unless you're in a
+ * virtualised host environments, so use the simpler scsi_add_host()
+ * function instead.
*
* Return value:
* 0 on success / != 0 for error
**/
-int scsi_add_host(struct Scsi_Host *shost, struct device *dev)
+int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
+ struct device *dma_dev)
{
struct scsi_host_template *sht = shost->hostt;
int error = -EINVAL;
@@ -207,6 +213,7 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev)
if (!shost->shost_gendev.parent)
shost->shost_gendev.parent = dev ? dev : &platform_bus;
+ shost->dma_dev = dma_dev;
error = device_add(&shost->shost_gendev);
if (error)
@@ -262,7 +269,7 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev)
fail:
return error;
}
-EXPORT_SYMBOL(scsi_add_host);
+EXPORT_SYMBOL(scsi_add_host_with_dma);
static void scsi_host_dev_release(struct device *dev)
{
diff --git a/drivers/scsi/libsrp.c b/drivers/scsi/libsrp.c
index 2742ae8a3d09..9ad38e81e343 100644
--- a/drivers/scsi/libsrp.c
+++ b/drivers/scsi/libsrp.c
@@ -124,6 +124,7 @@ static void srp_ring_free(struct device *dev, struct srp_buf **ring, size_t max,
dma_free_coherent(dev, size, ring[i]->buf, ring[i]->dma);
kfree(ring[i]);
}
+ kfree(ring);
}
int srp_target_alloc(struct srp_target *target, struct device *dev,
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index fc67cc65c63b..cf13ff2e9f01 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -2384,7 +2384,7 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
vport->els_tmofunc.function = lpfc_els_timeout;
vport->els_tmofunc.data = (unsigned long)vport;
- error = scsi_add_host(shost, dev);
+ error = scsi_add_host_with_dma(shost, dev, &phba->pcidev->dev);
if (error)
goto out_put_shost;
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c
index 7dc3d1894b1a..4352e30cd1f6 100644
--- a/drivers/scsi/megaraid/megaraid_sas.c
+++ b/drivers/scsi/megaraid/megaraid_sas.c
@@ -3032,7 +3032,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
int error = 0, i;
void *sense = NULL;
dma_addr_t sense_handle;
- u32 *sense_ptr;
+ unsigned long *sense_ptr;
memset(kbuff_arr, 0, sizeof(kbuff_arr));
@@ -3109,7 +3109,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
}
sense_ptr =
- (u32 *) ((unsigned long)cmd->frame + ioc->sense_off);
+ (unsigned long *) ((unsigned long)cmd->frame + ioc->sense_off);
*sense_ptr = sense_handle;
}
@@ -3140,8 +3140,8 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
* sense_ptr points to the location that has the user
* sense buffer address
*/
- sense_ptr = (u32 *) ((unsigned long)ioc->frame.raw +
- ioc->sense_off);
+ sense_ptr = (unsigned long *) ((unsigned long)ioc->frame.raw +
+ ioc->sense_off);
if (copy_to_user((void __user *)((unsigned long)(*sense_ptr)),
sense, ioc->sense_len)) {
@@ -3451,7 +3451,7 @@ out:
return retval;
}
-static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUGO,
+static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUSR,
megasas_sysfs_show_poll_mode_io,
megasas_sysfs_set_poll_mode_io);
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c
index 35a13867495e..2e4bc3d2b435 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_base.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_base.c
@@ -94,7 +94,7 @@ _base_fault_reset_work(struct work_struct *work)
int rc;
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->ioc_reset_in_progress)
+ if (ioc->shost_recovery)
goto rearm_timer;
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
@@ -1542,6 +1542,8 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc)
(ioc->bios_pg3.BiosVersion & 0x0000FF00) >> 8,
ioc->bios_pg3.BiosVersion & 0x000000FF);
+ _base_display_dell_branding(ioc);
+
printk(MPT2SAS_INFO_FMT "Protocol=(", ioc->name);
if (ioc->facts.ProtocolFlags & MPI2_IOCFACTS_PROTOCOL_SCSI_INITIATOR) {
@@ -1554,8 +1556,6 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc)
i++;
}
- _base_display_dell_branding(ioc);
-
i = 0;
printk("), ");
printk("Capabilities=(");
@@ -1627,6 +1627,9 @@ _base_static_config_pages(struct MPT2SAS_ADAPTER *ioc)
u32 iounit_pg1_flags;
mpt2sas_config_get_manufacturing_pg0(ioc, &mpi_reply, &ioc->manu_pg0);
+ if (ioc->ir_firmware)
+ mpt2sas_config_get_manufacturing_pg10(ioc, &mpi_reply,
+ &ioc->manu_pg10);
mpt2sas_config_get_bios_pg2(ioc, &mpi_reply, &ioc->bios_pg2);
mpt2sas_config_get_bios_pg3(ioc, &mpi_reply, &ioc->bios_pg3);
mpt2sas_config_get_ioc_pg8(ioc, &mpi_reply, &ioc->ioc_pg8);
@@ -3501,20 +3504,13 @@ mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,
__func__));
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->ioc_reset_in_progress) {
+ if (ioc->shost_recovery) {
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
printk(MPT2SAS_ERR_FMT "%s: busy\n",
ioc->name, __func__);
return -EBUSY;
}
- ioc->ioc_reset_in_progress = 1;
ioc->shost_recovery = 1;
- if (ioc->shost->shost_state == SHOST_RUNNING) {
- /* set back to SHOST_RUNNING in mpt2sas_scsih.c */
- scsi_host_set_state(ioc->shost, SHOST_RECOVERY);
- printk(MPT2SAS_INFO_FMT "putting controller into "
- "SHOST_RECOVERY\n", ioc->name);
- }
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
_base_reset_handler(ioc, MPT2_IOC_PRE_RESET);
@@ -3534,7 +3530,10 @@ mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,
ioc->name, __func__, ((r == 0) ? "SUCCESS" : "FAILED")));
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- ioc->ioc_reset_in_progress = 0;
+ ioc->shost_recovery = 0;
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+
+ if (!r)
+ _base_reset_handler(ioc, MPT2_IOC_RUNNING);
return r;
}
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h
index acdcff150a35..22f84d3a3f2e 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_base.h
+++ b/drivers/scsi/mpt2sas/mpt2sas_base.h
@@ -119,6 +119,7 @@
#define MPT2_IOC_PRE_RESET 1 /* prior to host reset */
#define MPT2_IOC_AFTER_RESET 2 /* just after host reset */
#define MPT2_IOC_DONE_RESET 3 /* links re-initialized */
+#define MPT2_IOC_RUNNING 4 /* shost running */
/*
* logging format
@@ -196,6 +197,38 @@ struct MPT2SAS_TARGET {
* @block: device is in SDEV_BLOCK state
* @tlr_snoop_check: flag used in determining whether to disable TLR
*/
+
+/* OEM Identifiers */
+#define MFG10_OEM_ID_INVALID (0x00000000)
+#define MFG10_OEM_ID_DELL (0x00000001)
+#define MFG10_OEM_ID_FSC (0x00000002)
+#define MFG10_OEM_ID_SUN (0x00000003)
+#define MFG10_OEM_ID_IBM (0x00000004)
+
+/* GENERIC Flags 0*/
+#define MFG10_GF0_OCE_DISABLED (0x00000001)
+#define MFG10_GF0_R1E_DRIVE_COUNT (0x00000002)
+#define MFG10_GF0_R10_DISPLAY (0x00000004)
+#define MFG10_GF0_SSD_DATA_SCRUB_DISABLE (0x00000008)
+#define MFG10_GF0_SINGLE_DRIVE_R0 (0x00000010)
+
+/* OEM Specific Flags will come from OEM specific header files */
+typedef struct _MPI2_CONFIG_PAGE_MAN_10 {
+ MPI2_CONFIG_PAGE_HEADER Header; /* 00h */
+ U8 OEMIdentifier; /* 04h */
+ U8 Reserved1; /* 05h */
+ U16 Reserved2; /* 08h */
+ U32 Reserved3; /* 0Ch */
+ U32 GenericFlags0; /* 10h */
+ U32 GenericFlags1; /* 14h */
+ U32 Reserved4; /* 18h */
+ U32 OEMSpecificFlags0; /* 1Ch */
+ U32 OEMSpecificFlags1; /* 20h */
+ U32 Reserved5[18]; /* 24h-60h*/
+} MPI2_CONFIG_PAGE_MAN_10,
+ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_10,
+ Mpi2ManufacturingPage10_t, MPI2_POINTER pMpi2ManufacturingPage10_t;
+
struct MPT2SAS_DEVICE {
struct MPT2SAS_TARGET *sas_target;
unsigned int lun;
@@ -431,7 +464,7 @@ typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr);
* @fw_event_list: list of fw events
* @aen_event_read_flag: event log was read
* @broadcast_aen_busy: broadcast aen waiting to be serviced
- * @ioc_reset_in_progress: host reset in progress
+ * @shost_recovery: host reset in progress
* @ioc_reset_in_progress_lock:
* @ioc_link_reset_in_progress: phy/hard reset in progress
* @ignore_loginfos: ignore loginfos during task managment
@@ -460,6 +493,7 @@ typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr);
* @facts: static facts data
* @pfacts: static port facts data
* @manu_pg0: static manufacturing page 0
+ * @manu_pg10: static manufacturing page 10
* @bios_pg2: static bios page 2
* @bios_pg3: static bios page 3
* @ioc_pg8: static ioc page 8
@@ -544,7 +578,6 @@ struct MPT2SAS_ADAPTER {
/* misc flags */
int aen_event_read_flag;
u8 broadcast_aen_busy;
- u8 ioc_reset_in_progress;
u8 shost_recovery;
spinlock_t ioc_reset_in_progress_lock;
u8 ioc_link_reset_in_progress;
@@ -663,6 +696,7 @@ struct MPT2SAS_ADAPTER {
dma_addr_t diag_buffer_dma[MPI2_DIAG_BUF_TYPE_COUNT];
u8 diag_buffer_status[MPI2_DIAG_BUF_TYPE_COUNT];
u32 unique_id[MPI2_DIAG_BUF_TYPE_COUNT];
+ Mpi2ManufacturingPage10_t manu_pg10;
u32 product_specific[MPI2_DIAG_BUF_TYPE_COUNT][23];
u32 diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT];
};
@@ -734,6 +768,8 @@ void mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 re
int mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys);
int mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage0_t *config_page);
+int mpt2sas_config_get_manufacturing_pg10(struct MPT2SAS_ADAPTER *ioc,
+ Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage10_t *config_page);
int mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
*mpi_reply, Mpi2BiosPage2_t *config_page);
int mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
@@ -776,7 +812,6 @@ int mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
u16 *volume_handle);
int mpt2sas_config_get_volume_wwid(struct MPT2SAS_ADAPTER *ioc, u16 volume_handle,
u64 *wwid);
-
/* ctl shared API */
extern struct device_attribute *mpt2sas_host_attrs[];
extern struct device_attribute *mpt2sas_dev_attrs[];
@@ -802,5 +837,7 @@ void mpt2sas_transport_update_phy_link_change(struct MPT2SAS_ADAPTER *ioc, u16 h
u16 attached_handle, u8 phy_number, u8 link_rate);
extern struct sas_function_template mpt2sas_transport_functions;
extern struct scsi_transport_template *mpt2sas_transport_template;
+extern int scsi_internal_device_block(struct scsi_device *sdev);
+extern int scsi_internal_device_unblock(struct scsi_device *sdev);
#endif /* MPT2SAS_BASE_H_INCLUDED */
diff --git a/drivers/scsi/mpt2sas/mpt2sas_config.c b/drivers/scsi/mpt2sas/mpt2sas_config.c
index 6ddee161beb3..b9f4d0f97e50 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_config.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_config.c
@@ -426,6 +426,67 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
}
/**
+ * mpt2sas_config_get_manufacturing_pg10 - obtain manufacturing page 10
+ * @ioc: per adapter object
+ * @mpi_reply: reply mf payload returned from firmware
+ * @config_page: contents of the config page
+ * Context: sleep.
+ *
+ * Returns 0 for success, non-zero for failure.
+ */
+int
+mpt2sas_config_get_manufacturing_pg10(struct MPT2SAS_ADAPTER *ioc,
+ Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage10_t *config_page)
+{
+ Mpi2ConfigRequest_t mpi_request;
+ int r;
+ struct config_request mem;
+
+ memset(config_page, 0, sizeof(Mpi2ManufacturingPage10_t));
+ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
+ mpi_request.Function = MPI2_FUNCTION_CONFIG;
+ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
+ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING;
+ mpi_request.Header.PageNumber = 10;
+ mpi_request.Header.PageVersion = MPI2_MANUFACTURING0_PAGEVERSION;
+ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE);
+ r = _config_request(ioc, &mpi_request, mpi_reply,
+ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT);
+ if (r)
+ goto out;
+
+ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
+ mpi_request.Header.PageVersion = mpi_reply->Header.PageVersion;
+ mpi_request.Header.PageNumber = mpi_reply->Header.PageNumber;
+ mpi_request.Header.PageType = mpi_reply->Header.PageType;
+ mpi_request.Header.PageLength = mpi_reply->Header.PageLength;
+ mem.config_page_sz = le16_to_cpu(mpi_reply->Header.PageLength) * 4;
+ if (mem.config_page_sz > ioc->config_page_sz) {
+ r = _config_alloc_config_dma_memory(ioc, &mem);
+ if (r)
+ goto out;
+ } else {
+ mem.config_page_dma = ioc->config_page_dma;
+ mem.config_page = ioc->config_page;
+ }
+ ioc->base_add_sg_single(&mpi_request.PageBufferSGE,
+ MPT2_CONFIG_COMMON_SGLFLAGS | mem.config_page_sz,
+ mem.config_page_dma);
+ r = _config_request(ioc, &mpi_request, mpi_reply,
+ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT);
+ if (!r)
+ memcpy(config_page, mem.config_page,
+ min_t(u16, mem.config_page_sz,
+ sizeof(Mpi2ManufacturingPage10_t)));
+
+ if (mem.config_page_sz > ioc->config_page_sz)
+ _config_free_config_dma_memory(ioc, &mem);
+
+ out:
+ return r;
+}
+
+/**
* mpt2sas_config_get_bios_pg2 - obtain bios page 2
* @ioc: per adapter object
* @mpi_reply: reply mf payload returned from firmware
diff --git a/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/drivers/scsi/mpt2sas/mpt2sas_ctl.c
index 14e473d1fa7b..c2a51018910f 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c
@@ -1963,7 +1963,6 @@ _ctl_ioctl_main(struct file *file, unsigned int cmd, void __user *arg)
{
enum block_state state;
long ret = -EINVAL;
- unsigned long flags;
state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING :
BLOCKING;
@@ -1989,13 +1988,8 @@ _ctl_ioctl_main(struct file *file, unsigned int cmd, void __user *arg)
!ioc)
return -ENODEV;
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->shost_recovery) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock,
- flags);
+ if (ioc->shost_recovery)
return -EAGAIN;
- }
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_command)) {
uarg = arg;
@@ -2098,7 +2092,6 @@ _ctl_compat_mpt_command(struct file *file, unsigned cmd, unsigned long arg)
struct mpt2_ioctl_command karg;
struct MPT2SAS_ADAPTER *ioc;
enum block_state state;
- unsigned long flags;
if (_IOC_SIZE(cmd) != sizeof(struct mpt2_ioctl_command32))
return -EINVAL;
@@ -2113,13 +2106,8 @@ _ctl_compat_mpt_command(struct file *file, unsigned cmd, unsigned long arg)
if (_ctl_verify_adapter(karg32.hdr.ioc_number, &ioc) == -1 || !ioc)
return -ENODEV;
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->shost_recovery) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock,
- flags);
+ if (ioc->shost_recovery)
return -EAGAIN;
- }
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
memset(&karg, 0, sizeof(struct mpt2_ioctl_command));
karg.hdr.ioc_number = karg32.hdr.ioc_number;
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
index 2e9a4445596f..bb65cce0491d 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -103,7 +103,6 @@ struct sense_info {
};
-#define MPT2SAS_RESCAN_AFTER_HOST_RESET (0xFFFF)
/**
* struct fw_event_work - firmware event struct
* @list: link list framework
@@ -1502,7 +1501,13 @@ _scsih_slave_configure(struct scsi_device *sdev)
break;
case MPI2_RAID_VOL_TYPE_RAID1E:
qdepth = MPT2SAS_RAID_QUEUE_DEPTH;
- r_level = "RAID1E";
+ if (ioc->manu_pg10.OEMIdentifier &&
+ (ioc->manu_pg10.GenericFlags0 &
+ MFG10_GF0_R10_DISPLAY) &&
+ !(raid_device->num_pds % 2))
+ r_level = "RAID10";
+ else
+ r_level = "RAID1E";
break;
case MPI2_RAID_VOL_TYPE_RAID1:
qdepth = MPT2SAS_RAID_QUEUE_DEPTH;
@@ -1786,17 +1791,18 @@ mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle, uint lun,
u32 ioc_state;
unsigned long timeleft;
u8 VF_ID = 0;
- unsigned long flags;
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->tm_cmds.status != MPT2_CMD_NOT_USED ||
- ioc->shost_recovery) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+ if (ioc->tm_cmds.status != MPT2_CMD_NOT_USED) {
+ printk(MPT2SAS_INFO_FMT "%s: tm_cmd busy!!!\n",
+ __func__, ioc->name);
+ return;
+ }
+
+ if (ioc->shost_recovery) {
printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
__func__, ioc->name);
return;
}
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
ioc_state = mpt2sas_base_get_iocstate(ioc, 0);
if (ioc_state & MPI2_DOORBELL_USED) {
@@ -2222,7 +2228,7 @@ _scsih_ublock_io_device(struct MPT2SAS_ADAPTER *ioc, u16 handle)
MPT2SAS_INFO_FMT "SDEV_RUNNING: "
"handle(0x%04x)\n", ioc->name, handle));
sas_device_priv_data->block = 0;
- scsi_device_set_state(sdev, SDEV_RUNNING);
+ scsi_internal_device_unblock(sdev);
}
}
}
@@ -2251,7 +2257,7 @@ _scsih_block_io_device(struct MPT2SAS_ADAPTER *ioc, u16 handle)
MPT2SAS_INFO_FMT "SDEV_BLOCK: "
"handle(0x%04x)\n", ioc->name, handle));
sas_device_priv_data->block = 1;
- scsi_device_set_state(sdev, SDEV_BLOCK);
+ scsi_internal_device_block(sdev);
}
}
}
@@ -2327,6 +2333,7 @@ _scsih_block_io_to_children_attached_directly(struct MPT2SAS_ADAPTER *ioc,
u16 handle;
u16 reason_code;
u8 phy_number;
+ u8 link_rate;
for (i = 0; i < event_data->NumEntries; i++) {
handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
@@ -2337,6 +2344,11 @@ _scsih_block_io_to_children_attached_directly(struct MPT2SAS_ADAPTER *ioc,
MPI2_EVENT_SAS_TOPO_RC_MASK;
if (reason_code == MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING)
_scsih_block_io_device(ioc, handle);
+ if (reason_code == MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED) {
+ link_rate = event_data->PHY[i].LinkRate >> 4;
+ if (link_rate >= MPI2_SAS_NEG_LINK_RATE_1_5)
+ _scsih_ublock_io_device(ioc, handle);
+ }
}
}
@@ -2405,27 +2417,6 @@ _scsih_check_topo_delete_events(struct MPT2SAS_ADAPTER *ioc,
}
/**
- * _scsih_queue_rescan - queue a topology rescan from user context
- * @ioc: per adapter object
- *
- * Return nothing.
- */
-static void
-_scsih_queue_rescan(struct MPT2SAS_ADAPTER *ioc)
-{
- struct fw_event_work *fw_event;
-
- if (ioc->wait_for_port_enable_to_complete)
- return;
- fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC);
- if (!fw_event)
- return;
- fw_event->event = MPT2SAS_RESCAN_AFTER_HOST_RESET;
- fw_event->ioc = ioc;
- _scsih_fw_event_add(ioc, fw_event);
-}
-
-/**
* _scsih_flush_running_cmds - completing outstanding commands.
* @ioc: per adapter object
*
@@ -2456,46 +2447,6 @@ _scsih_flush_running_cmds(struct MPT2SAS_ADAPTER *ioc)
}
/**
- * mpt2sas_scsih_reset_handler - reset callback handler (for scsih)
- * @ioc: per adapter object
- * @reset_phase: phase
- *
- * The handler for doing any required cleanup or initialization.
- *
- * The reset phase can be MPT2_IOC_PRE_RESET, MPT2_IOC_AFTER_RESET,
- * MPT2_IOC_DONE_RESET
- *
- * Return nothing.
- */
-void
-mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)
-{
- switch (reset_phase) {
- case MPT2_IOC_PRE_RESET:
- dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
- "MPT2_IOC_PRE_RESET\n", ioc->name, __func__));
- _scsih_fw_event_off(ioc);
- break;
- case MPT2_IOC_AFTER_RESET:
- dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
- "MPT2_IOC_AFTER_RESET\n", ioc->name, __func__));
- if (ioc->tm_cmds.status & MPT2_CMD_PENDING) {
- ioc->tm_cmds.status |= MPT2_CMD_RESET;
- mpt2sas_base_free_smid(ioc, ioc->tm_cmds.smid);
- complete(&ioc->tm_cmds.done);
- }
- _scsih_fw_event_on(ioc);
- _scsih_flush_running_cmds(ioc);
- break;
- case MPT2_IOC_DONE_RESET:
- dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
- "MPT2_IOC_DONE_RESET\n", ioc->name, __func__));
- _scsih_queue_rescan(ioc);
- break;
- }
-}
-
-/**
* _scsih_setup_eedp - setup MPI request for EEDP transfer
* @scmd: pointer to scsi command object
* @mpi_request: pointer to the SCSI_IO reqest message frame
@@ -2615,7 +2566,6 @@ _scsih_qcmd(struct scsi_cmnd *scmd, void (*done)(struct scsi_cmnd *))
Mpi2SCSIIORequest_t *mpi_request;
u32 mpi_control;
u16 smid;
- unsigned long flags;
scmd->scsi_done = done;
sas_device_priv_data = scmd->device->hostdata;
@@ -2634,13 +2584,10 @@ _scsih_qcmd(struct scsi_cmnd *scmd, void (*done)(struct scsi_cmnd *))
}
/* see if we are busy with task managment stuff */
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (sas_target_priv_data->tm_busy ||
- ioc->shost_recovery || ioc->ioc_link_reset_in_progress) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+ if (sas_target_priv_data->tm_busy)
+ return SCSI_MLQUEUE_DEVICE_BUSY;
+ else if (ioc->shost_recovery || ioc->ioc_link_reset_in_progress)
return SCSI_MLQUEUE_HOST_BUSY;
- }
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
if (scmd->sc_data_direction == DMA_FROM_DEVICE)
mpi_control = MPI2_SCSIIO_CONTROL_READ;
@@ -3436,6 +3383,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
if (!handle)
return -1;
+ if (ioc->shost_recovery)
+ return -1;
+
if ((mpt2sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0,
MPI2_SAS_EXPAND_PGAD_FORM_HNDL, handle))) {
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
@@ -3572,6 +3522,9 @@ _scsih_expander_remove(struct MPT2SAS_ADAPTER *ioc, u16 handle)
struct _sas_node *sas_expander;
unsigned long flags;
+ if (ioc->shost_recovery)
+ return;
+
spin_lock_irqsave(&ioc->sas_node_lock, flags);
sas_expander = mpt2sas_scsih_expander_find_by_handle(ioc, handle);
spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
@@ -3743,6 +3696,8 @@ _scsih_remove_device(struct MPT2SAS_ADAPTER *ioc, u16 handle)
mutex_unlock(&ioc->tm_cmds.mutex);
dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "issue target reset "
"done: handle(0x%04x)\n", ioc->name, device_handle));
+ if (ioc->shost_recovery)
+ goto out;
}
/* SAS_IO_UNIT_CNTR - send REMOVE_DEVICE */
@@ -3765,6 +3720,9 @@ _scsih_remove_device(struct MPT2SAS_ADAPTER *ioc, u16 handle)
le32_to_cpu(mpi_reply.IOCLogInfo)));
out:
+
+ _scsih_ublock_io_device(ioc, handle);
+
mpt2sas_transport_port_remove(ioc, sas_device->sas_address,
sas_device->parent_handle);
@@ -3908,6 +3866,8 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
"expander event\n", ioc->name));
return;
}
+ if (ioc->shost_recovery)
+ return;
if (event_data->PHY[i].PhyStatus &
MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT)
continue;
@@ -3942,10 +3902,6 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
link_rate_);
}
}
- if (reason_code == MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED) {
- if (link_rate_ >= MPI2_SAS_NEG_LINK_RATE_1_5)
- _scsih_ublock_io_device(ioc, handle);
- }
if (reason_code == MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED) {
if (link_rate_ < MPI2_SAS_NEG_LINK_RATE_1_5)
break;
@@ -5156,22 +5112,9 @@ static void
_scsih_remove_unresponding_devices(struct MPT2SAS_ADAPTER *ioc)
{
struct _sas_device *sas_device, *sas_device_next;
- struct _sas_node *sas_expander, *sas_expander_next;
+ struct _sas_node *sas_expander;
struct _raid_device *raid_device, *raid_device_next;
- unsigned long flags;
-
- _scsih_search_responding_sas_devices(ioc);
- _scsih_search_responding_raid_devices(ioc);
- _scsih_search_responding_expanders(ioc);
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- ioc->shost_recovery = 0;
- if (ioc->shost->shost_state == SHOST_RECOVERY) {
- printk(MPT2SAS_INFO_FMT "putting controller into "
- "SHOST_RUNNING\n", ioc->name);
- scsi_host_set_state(ioc->shost, SHOST_RUNNING);
- }
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
list_for_each_entry_safe(sas_device, sas_device_next,
&ioc->sas_device_list, list) {
@@ -5207,16 +5150,63 @@ _scsih_remove_unresponding_devices(struct MPT2SAS_ADAPTER *ioc)
_scsih_raid_device_remove(ioc, raid_device);
}
- list_for_each_entry_safe(sas_expander, sas_expander_next,
- &ioc->sas_expander_list, list) {
+ retry_expander_search:
+ sas_expander = NULL;
+ list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) {
if (sas_expander->responding) {
sas_expander->responding = 0;
continue;
}
- printk("\tremoving expander: handle(0x%04x), "
- " sas_addr(0x%016llx)\n", sas_expander->handle,
- (unsigned long long)sas_expander->sas_address);
_scsih_expander_remove(ioc, sas_expander->handle);
+ goto retry_expander_search;
+ }
+}
+
+/**
+ * mpt2sas_scsih_reset_handler - reset callback handler (for scsih)
+ * @ioc: per adapter object
+ * @reset_phase: phase
+ *
+ * The handler for doing any required cleanup or initialization.
+ *
+ * The reset phase can be MPT2_IOC_PRE_RESET, MPT2_IOC_AFTER_RESET,
+ * MPT2_IOC_DONE_RESET
+ *
+ * Return nothing.
+ */
+void
+mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)
+{
+ switch (reset_phase) {
+ case MPT2_IOC_PRE_RESET:
+ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
+ "MPT2_IOC_PRE_RESET\n", ioc->name, __func__));
+ _scsih_fw_event_off(ioc);
+ break;
+ case MPT2_IOC_AFTER_RESET:
+ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
+ "MPT2_IOC_AFTER_RESET\n", ioc->name, __func__));
+ if (ioc->tm_cmds.status & MPT2_CMD_PENDING) {
+ ioc->tm_cmds.status |= MPT2_CMD_RESET;
+ mpt2sas_base_free_smid(ioc, ioc->tm_cmds.smid);
+ complete(&ioc->tm_cmds.done);
+ }
+ _scsih_fw_event_on(ioc);
+ _scsih_flush_running_cmds(ioc);
+ break;
+ case MPT2_IOC_DONE_RESET:
+ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
+ "MPT2_IOC_DONE_RESET\n", ioc->name, __func__));
+ _scsih_sas_host_refresh(ioc, 0);
+ _scsih_search_responding_sas_devices(ioc);
+ _scsih_search_responding_raid_devices(ioc);
+ _scsih_search_responding_expanders(ioc);
+ break;
+ case MPT2_IOC_RUNNING:
+ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
+ "MPT2_IOC_RUNNING\n", ioc->name, __func__));
+ _scsih_remove_unresponding_devices(ioc);
+ break;
}
}
@@ -5236,14 +5226,6 @@ _firmware_event_work(struct work_struct *work)
unsigned long flags;
struct MPT2SAS_ADAPTER *ioc = fw_event->ioc;
- /* This is invoked by calling _scsih_queue_rescan(). */
- if (fw_event->event == MPT2SAS_RESCAN_AFTER_HOST_RESET) {
- _scsih_fw_event_free(ioc, fw_event);
- _scsih_sas_host_refresh(ioc, 1);
- _scsih_remove_unresponding_devices(ioc);
- return;
- }
-
/* the queue is being flushed so ignore this event */
spin_lock_irqsave(&ioc->fw_event_lock, flags);
if (ioc->fw_events_off || ioc->remove_host) {
@@ -5253,13 +5235,10 @@ _firmware_event_work(struct work_struct *work)
}
spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
if (ioc->shost_recovery) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
_scsih_fw_event_requeue(ioc, fw_event, 1000);
return;
}
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
switch (fw_event->event) {
case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
@@ -5461,6 +5440,8 @@ _scsih_expander_node_remove(struct MPT2SAS_ADAPTER *ioc,
if (!sas_device)
continue;
_scsih_remove_device(ioc, sas_device->handle);
+ if (ioc->shost_recovery)
+ return;
goto retry_device_search;
}
}
@@ -5482,6 +5463,8 @@ _scsih_expander_node_remove(struct MPT2SAS_ADAPTER *ioc,
if (!expander_sibling)
continue;
_scsih_expander_remove(ioc, expander_sibling->handle);
+ if (ioc->shost_recovery)
+ return;
goto retry_expander_search;
}
}
@@ -5513,6 +5496,8 @@ _scsih_remove(struct pci_dev *pdev)
struct _sas_port *mpt2sas_port;
struct _sas_device *sas_device;
struct _sas_node *expander_sibling;
+ struct _raid_device *raid_device, *next;
+ struct MPT2SAS_TARGET *sas_target_priv_data;
struct workqueue_struct *wq;
unsigned long flags;
@@ -5526,6 +5511,21 @@ _scsih_remove(struct pci_dev *pdev)
if (wq)
destroy_workqueue(wq);
+ /* release all the volumes */
+ list_for_each_entry_safe(raid_device, next, &ioc->raid_device_list,
+ list) {
+ if (raid_device->starget) {
+ sas_target_priv_data =
+ raid_device->starget->hostdata;
+ sas_target_priv_data->deleted = 1;
+ scsi_remove_target(&raid_device->starget->dev);
+ }
+ printk(MPT2SAS_INFO_FMT "removing handle(0x%04x), wwid"
+ "(0x%016llx)\n", ioc->name, raid_device->handle,
+ (unsigned long long) raid_device->wwid);
+ _scsih_raid_device_remove(ioc, raid_device);
+ }
+
/* free ports attached to the sas_host */
retry_again:
list_for_each_entry(mpt2sas_port,
diff --git a/drivers/scsi/mpt2sas/mpt2sas_transport.c b/drivers/scsi/mpt2sas/mpt2sas_transport.c
index 686695b155c7..a53086d0381a 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_transport.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c
@@ -140,11 +140,18 @@ _transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle,
u32 device_info;
u32 ioc_status;
+ if (ioc->shost_recovery) {
+ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
+ __func__, ioc->name);
+ return -EFAULT;
+ }
+
if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
+
ioc->name, __FILE__, __LINE__, __func__);
- return -1;
+ return -ENXIO;
}
ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
@@ -153,7 +160,7 @@ _transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle,
printk(MPT2SAS_ERR_FMT "handle(0x%04x), ioc_status(0x%04x)"
"\nfailure at %s:%d/%s()!\n", ioc->name, handle, ioc_status,
__FILE__, __LINE__, __func__);
- return -1;
+ return -EIO;
}
memset(identify, 0, sizeof(identify));
@@ -288,21 +295,17 @@ _transport_expander_report_manufacture(struct MPT2SAS_ADAPTER *ioc,
void *psge;
u32 sgl_flags;
u8 issue_reset = 0;
- unsigned long flags;
void *data_out = NULL;
dma_addr_t data_out_dma;
u32 sz;
u64 *sas_address_le;
u16 wait_state_count;
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->ioc_reset_in_progress) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+ if (ioc->shost_recovery) {
printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
__func__, ioc->name);
return -EFAULT;
}
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
mutex_lock(&ioc->transport_cmds.mutex);
@@ -806,6 +809,12 @@ mpt2sas_transport_update_phy_link_change(struct MPT2SAS_ADAPTER *ioc,
struct _sas_node *sas_node;
struct _sas_phy *mpt2sas_phy;
+ if (ioc->shost_recovery) {
+ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
+ __func__, ioc->name);
+ return;
+ }
+
spin_lock_irqsave(&ioc->sas_node_lock, flags);
sas_node = _transport_sas_node_find_by_handle(ioc, handle);
spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
@@ -1025,7 +1034,6 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
void *psge;
u32 sgl_flags;
u8 issue_reset = 0;
- unsigned long flags;
dma_addr_t dma_addr_in = 0;
dma_addr_t dma_addr_out = 0;
u16 wait_state_count;
@@ -1045,14 +1053,11 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
return -EINVAL;
}
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->ioc_reset_in_progress) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+ if (ioc->shost_recovery) {
printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
__func__, ioc->name);
return -EFAULT;
}
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
rc = mutex_lock_interruptible(&ioc->transport_cmds.mutex);
if (rc)
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 0f8796201504..67e016d29f96 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1654,7 +1654,8 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN);
}
- if (scsi_add_host(vha->host, &fc_vport->dev)) {
+ if (scsi_add_host_with_dma(vha->host, &fc_vport->dev,
+ &ha->pdev->dev)) {
DEBUG15(printk("scsi(%ld): scsi_add_host failure for VP[%d].\n",
vha->host_no, vha->vp_idx));
goto vport_create_failed_2;
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 2de5f3ad640b..69397bb964a4 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -241,10 +241,7 @@ scsi_host_alloc_command(struct Scsi_Host *shost, gfp_t gfp_mask)
*/
struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
{
- struct scsi_cmnd *cmd;
- unsigned char *buf;
-
- cmd = scsi_host_alloc_command(shost, gfp_mask);
+ struct scsi_cmnd *cmd = scsi_host_alloc_command(shost, gfp_mask);
if (unlikely(!cmd)) {
unsigned long flags;
@@ -258,9 +255,15 @@ struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
spin_unlock_irqrestore(&shost->free_list_lock, flags);
if (cmd) {
+ void *buf, *prot;
+
buf = cmd->sense_buffer;
+ prot = cmd->prot_sdb;
+
memset(cmd, 0, sizeof(*cmd));
+
cmd->sense_buffer = buf;
+ cmd->prot_sdb = prot;
}
}
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index a1689353d7fd..c253e9c051b2 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -721,6 +721,9 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
case NEEDS_RETRY:
case FAILED:
break;
+ case ADD_TO_MLQUEUE:
+ rtn = NEEDS_RETRY;
+ break;
default:
rtn = FAILED;
break;
diff --git a/drivers/scsi/scsi_lib_dma.c b/drivers/scsi/scsi_lib_dma.c
index ac6855cd2657..dcd128583b89 100644
--- a/drivers/scsi/scsi_lib_dma.c
+++ b/drivers/scsi/scsi_lib_dma.c
@@ -23,7 +23,7 @@ int scsi_dma_map(struct scsi_cmnd *cmd)
int nseg = 0;
if (scsi_sg_count(cmd)) {
- struct device *dev = cmd->device->host->shost_gendev.parent;
+ struct device *dev = cmd->device->host->dma_dev;
nseg = dma_map_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd),
cmd->sc_data_direction);
@@ -41,7 +41,7 @@ EXPORT_SYMBOL(scsi_dma_map);
void scsi_dma_unmap(struct scsi_cmnd *cmd)
{
if (scsi_sg_count(cmd)) {
- struct device *dev = cmd->device->host->shost_gendev.parent;
+ struct device *dev = cmd->device->host->dma_dev;
dma_unmap_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd),
cmd->sc_data_direction);
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 292c02f810d0..7c3264ed146d 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -648,11 +648,22 @@ static __init int fc_transport_init(void)
return error;
error = transport_class_register(&fc_vport_class);
if (error)
- return error;
+ goto unreg_host_class;
error = transport_class_register(&fc_rport_class);
if (error)
- return error;
- return transport_class_register(&fc_transport_class);
+ goto unreg_vport_class;
+ error = transport_class_register(&fc_transport_class);
+ if (error)
+ goto unreg_rport_class;
+ return 0;
+
+unreg_rport_class:
+ transport_class_unregister(&fc_rport_class);
+unreg_vport_class:
+ transport_class_unregister(&fc_vport_class);
+unreg_host_class:
+ transport_class_unregister(&fc_host_class);
+ return error;
}
static void __exit fc_transport_exit(void)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index b7b9fec67a98..a89c421dab51 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -2021,6 +2021,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie)
sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n",
sdp->removable ? "removable " : "");
+ put_device(&sdkp->dev);
}
/**
@@ -2106,6 +2107,7 @@ static int sd_probe(struct device *dev)
get_device(&sdp->sdev_gendev);
+ get_device(&sdkp->dev); /* prevent release before async_schedule */
async_schedule(sd_probe_async, sdkp);
return 0;
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 9230402c45af..dc0e3d4eacc2 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1708,11 +1708,6 @@ static int sg_finish_rem_req(Sg_request * srp)
Sg_scatter_hold *req_schp = &srp->data;
SCSI_LOG_TIMEOUT(4, printk("sg_finish_rem_req: res_used=%d\n", (int) srp->res_used));
- if (srp->res_used)
- sg_unlink_reserve(sfp, srp);
- else
- sg_remove_scat(req_schp);
-
if (srp->rq) {
if (srp->bio)
ret = blk_rq_unmap_user(srp->bio);
@@ -1720,6 +1715,11 @@ static int sg_finish_rem_req(Sg_request * srp)
blk_put_request(srp->rq);
}
+ if (srp->res_used)
+ sg_unlink_reserve(sfp, srp);
+ else
+ sg_remove_scat(req_schp);
+
sg_remove_request(sfp, srp);
return ret;
@@ -1811,7 +1811,7 @@ retry:
return 0;
out:
for (i = 0; i < k; i++)
- __free_pages(schp->pages[k], order);
+ __free_pages(schp->pages[i], order);
if (--order >= 0)
goto retry;
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index d5da26f34cee..ecbf0dac375a 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -81,6 +81,9 @@ static int serial_index(struct uart_port *port)
#define PASS_LIMIT 256
+#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
+
+
/*
* We default to IRQ0 for the "no irq" hack. Some
* machine types want others as well - they're free
@@ -1342,14 +1345,12 @@ static void serial8250_start_tx(struct uart_port *port)
serial_out(up, UART_IER, up->ier);
if (up->bugs & UART_BUG_TXEN) {
- unsigned char lsr, iir;
+ unsigned char lsr;
lsr = serial_in(up, UART_LSR);
up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
- iir = serial_in(up, UART_IIR) & 0x0f;
if ((up->port.type == PORT_RM9000) ?
- (lsr & UART_LSR_THRE &&
- (iir == UART_IIR_NO_INT || iir == UART_IIR_THRI)) :
- (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT))
+ (lsr & UART_LSR_THRE) :
+ (lsr & UART_LSR_TEMT))
transmit_chars(up);
}
}
@@ -1802,7 +1803,7 @@ static unsigned int serial8250_tx_empty(struct uart_port *port)
up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
spin_unlock_irqrestore(&up->port.lock, flags);
- return lsr & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
+ return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
}
static unsigned int serial8250_get_mctrl(struct uart_port *port)
@@ -1860,8 +1861,6 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state)
spin_unlock_irqrestore(&up->port.lock, flags);
}
-#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
-
/*
* Wait for transmitter & holding register to empty
*/
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
index e7108e75653d..7b5ff096c2db 100644
--- a/drivers/serial/8250_pci.c
+++ b/drivers/serial/8250_pci.c
@@ -1561,6 +1561,7 @@ enum pci_board_num_t {
pbn_exar_XR17C152,
pbn_exar_XR17C154,
pbn_exar_XR17C158,
+ pbn_exar_ibm_saturn,
pbn_pasemi_1682M,
pbn_ni8430_2,
pbn_ni8430_4,
@@ -2146,6 +2147,13 @@ static struct pciserial_board pci_boards[] __devinitdata = {
.base_baud = 921600,
.uart_offset = 0x200,
},
+ [pbn_exar_ibm_saturn] = {
+ .flags = FL_BASE0,
+ .num_ports = 1,
+ .base_baud = 921600,
+ .uart_offset = 0x200,
+ },
+
/*
* PA Semi PWRficient PA6T-1682M on-chip UART
*/
@@ -2649,6 +2657,9 @@ static struct pci_device_id serial_pci_tbl[] = {
PCI_SUBVENDOR_ID_CONNECT_TECH,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485, 0, 0,
pbn_b0_8_1843200_200 },
+ { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C152,
+ PCI_VENDOR_ID_IBM, PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT,
+ 0, 0, pbn_exar_ibm_saturn },
{ PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530,
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c
index d71dfe398940..9fb71903c107 100644
--- a/drivers/serial/8250_pnp.c
+++ b/drivers/serial/8250_pnp.c
@@ -328,15 +328,7 @@ static const struct pnp_device_id pnp_dev_table[] = {
/* U.S. Robotics 56K Voice INT PnP*/
{ "USR9190", 0 },
/* Wacom tablets */
- { "WACF004", 0 },
- { "WACF005", 0 },
- { "WACF006", 0 },
- { "WACF007", 0 },
- { "WACF008", 0 },
- { "WACF009", 0 },
- { "WACF00A", 0 },
- { "WACF00B", 0 },
- { "WACF00C", 0 },
+ { "WACFXXX", 0 },
/* Compaq touchscreen */
{ "FPI2002", 0 },
/* Fujitsu Stylistic touchscreens */
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index b41db4d22436..869337a7fd68 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -373,24 +373,6 @@ config SERIAL_MXS_AUART
help
Driver for Freescale i.MXS internal application serial port
-config SERIAL_MXS_AUART_CONSOLE
- bool "Support for console on i.MXS application serial port"
- depends on SERIAL_MXS_AUART=y
- select SERIAL_CORE_CONSOLE
- ---help---
- Say Y here if you wish to use the i.MXS app serial port as the
- system console (the system console is the device which receives all
- kernel messages and warnings and which allows logins in single user
- mode).
-
- Even if you say Y here, the currently visible framebuffer console
- (/dev/tty0) will still be used as the system console by default, but
- you can alter that using a kernel command line option such as
- "console=ttySP1". (Try "man bootparam" or see the documentation of
- your boot loader (lilo or loadlin) about how to pass options to the
- kernel at boot time.)
-
-
config SERIAL_MXS_DUART_CONSOLE
bool "Support for console on i.MXS debug serial port"
depends on SERIAL_MXS_DUART=y
diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c
index b4a7650af696..4fff4e524034 100644
--- a/drivers/serial/bfin_5xx.c
+++ b/drivers/serial/bfin_5xx.c
@@ -42,6 +42,10 @@
# undef CONFIG_EARLY_PRINTK
#endif
+#ifdef CONFIG_SERIAL_BFIN_MODULE
+# undef CONFIG_EARLY_PRINTK
+#endif
+
/* UART name and device definitions */
#define BFIN_SERIAL_NAME "ttyBF"
#define BFIN_SERIAL_MAJOR 204
diff --git a/drivers/serial/mxs-auart.c b/drivers/serial/mxs-auart.c
index 63d7d9128efc..0791af105f72 100644
--- a/drivers/serial/mxs-auart.c
+++ b/drivers/serial/mxs-auart.c
@@ -19,7 +19,6 @@
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/init.h>
-#include <linux/console.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/slab.h>
@@ -48,8 +47,6 @@
#define MXS_AUART_MAJOR 242
#define MXS_AUART_RX_THRESHOLD 16
-static struct uart_driver auart_driver;
-
struct mxs_auart_port {
struct uart_port port;
@@ -788,160 +785,7 @@ static struct uart_ops mxs_auart_ops = {
.config_port = mxs_auart_config_port,
.verify_port = mxs_auart_verify_port,
};
-#ifdef CONFIG_SERIAL_MXS_AUART_CONSOLE
-static struct mxs_auart_port auart_port[CONFIG_MXS_AUART_PORTS] = {};
-
-static void
-auart_console_write(struct console *co, const char *s, unsigned int count)
-{
- struct uart_port *port;
- unsigned int status, old_cr;
- int i;
-
- if (co->index > CONFIG_MXS_AUART_PORTS || co->index < 0)
- return;
- port = &auart_port[co->index].port;
-
- /* First save the CR then disable the interrupts */
- old_cr = __raw_readl(port->membase + HW_UARTAPP_CTRL2);
- __raw_writel(BM_UARTAPP_CTRL2_UARTEN | BM_UARTAPP_CTRL2_TXE,
- port->membase + HW_UARTAPP_CTRL2_SET);
-
- /* Now, do each character */
- for (i = 0; i < count; i++) {
- do {
- status = __raw_readl(port->membase + HW_UARTAPP_STAT);
- } while (status & BM_UARTAPP_STAT_TXFF);
-
- __raw_writel(s[i], port->membase + HW_UARTAPP_DATA);
- if (s[i] == '\n') {
- do {
- status = __raw_readl(port->membase +
- HW_UARTAPP_STAT);
- } while (status & BM_UARTAPP_STAT_TXFF);
- __raw_writel('\r', port->membase + HW_UARTAPP_DATA);
- }
- }
-
- /*
- * Finally, wait for transmitter to become empty
- * and restore the TCR
- */
- do {
- status = __raw_readl(port->membase + HW_UARTAPP_STAT);
- } while (status & BM_UARTAPP_STAT_BUSY);
- __raw_writel(old_cr, port->membase + HW_UARTAPP_CTRL2);
-}
-
-static void __init
-auart_console_get_options(struct uart_port *port, int *baud,
- int *parity, int *bits)
-{
- if (__raw_readl(port->membase + HW_UARTAPP_CTRL2)
- & BM_UARTAPP_CTRL2_UARTEN) {
- unsigned int lcr_h, quot;
- lcr_h = __raw_readl(port->membase + HW_UARTAPP_LINECTRL);
-
- *parity = 'n';
- if (lcr_h & BM_UARTAPP_LINECTRL_PEN) {
- if (lcr_h & BM_UARTAPP_LINECTRL_EPS)
- *parity = 'e';
- else
- *parity = 'o';
- }
-
- if ((lcr_h & BM_UARTAPP_LINECTRL_WLEN)
- == BF_UARTAPP_LINECTRL_WLEN(2))
- *bits = 7;
- else
- *bits = 8;
-
- quot = (((__raw_readl(port->membase + HW_UARTAPP_LINECTRL)
- & BM_UARTAPP_LINECTRL_BAUD_DIVINT))
- >> (BP_UARTAPP_LINECTRL_BAUD_DIVINT - 6))
- | (((__raw_readl(port->membase + HW_UARTAPP_LINECTRL)
- & BM_UARTAPP_LINECTRL_BAUD_DIVFRAC))
- >> BP_UARTAPP_LINECTRL_BAUD_DIVFRAC);
- if (quot == 0)
- quot = 1;
- *baud = (port->uartclk << 2) / quot;
- }
-}
-
-static int __init auart_console_setup(struct console *co, char *options)
-{
- struct mxs_auart_port *port;
- int baud = 115200;
- int bits = 8;
- int parity = 'n';
- int flow = 'n';
- /*
- * Check whether an invalid uart number has been specified, and
- * if so, search for the first available port that does have
- * console support.
- */
- if (co->index > CONFIG_MXS_AUART_PORTS || co->index < 0)
- return -EINVAL;
-
- port = &auart_port[co->index].port;
-
- if (port->port.membase == 0) {
- if (cpu_is_mx23()) {
- if (co->index == 1) {
- port->port.membase = IO_ADDRESS(0x8006C000);
- port->port.mapbase = 0x8006C000;
- } else {
- port->port.membase = IO_ADDRESS(0x8006E000);
- port->port.mapbase = 0x8006E000;
- }
- }
-
- port->port.fifosize = 16;
- port->port.ops = &mxs_auart_ops;
- port->port.flags = ASYNC_BOOT_AUTOCONF;
- port->port.line = 0;
- }
- mxs_auart_reset(port);
-
- __raw_writel(BM_UARTAPP_CTRL2_UARTEN,
- port->port.membase + HW_UARTAPP_CTRL2_SET);
-
- if (port->clk == NULL || IS_ERR(port->clk)) {
- port->clk = clk_get(NULL, "uart");
- if (port->clk == NULL || IS_ERR(port->clk))
- return -ENODEV;
- port->port.uartclk = clk_get_rate(port->clk);
- }
-
- if (options)
- uart_parse_options(options, &baud, &parity, &bits, &flow);
- else
- auart_console_get_options(port, &baud, &parity, &bits);
- return uart_set_options(port, co, baud, parity, bits, flow);
-}
-
-static struct console auart_console = {
- .name = "ttySP",
- .write = auart_console_write,
- .device = uart_console_device,
- .setup = auart_console_setup,
- .flags = CON_PRINTBUFFER,
- .index = -1,
- .data = &auart_driver,
-};
-
-#ifdef CONFIG_MXS_EARLY_CONSOLE
-static int __init auart_console_init(void)
-{
- register_console(&auart_console);
- return 0;
-}
-
-console_initcall(auart_console_init);
-#endif
-
-#endif
static struct uart_driver auart_driver = {
.owner = THIS_MODULE,
.driver_name = "auart",
@@ -949,9 +793,6 @@ static struct uart_driver auart_driver = {
.major = MXS_AUART_MAJOR,
.minor = 0,
.nr = CONFIG_MXS_AUART_PORTS,
-#ifdef CONFIG_SERIAL_MXS_AUART_CONSOLE
- .cons = &auart_console,
-#endif
};
static int __devinit mxs_auart_probe(struct platform_device *pdev)
@@ -1032,10 +873,6 @@ static int __devinit mxs_auart_probe(struct platform_device *pdev)
device_init_wakeup(&pdev->dev, 1);
-#ifdef CONFIG_SERIAL_MXS_AUART_CONSOLE
- memcpy(&auart_port[pdev->id], s, sizeof(struct mxs_auart_port));
-#endif
-
ret = uart_add_one_port(&auart_driver, &s->port);
if (ret)
goto out_free_clk;
diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c
index 02406ba6da1c..cdf172eda2e3 100644
--- a/drivers/serial/of_serial.c
+++ b/drivers/serial/of_serial.c
@@ -161,6 +161,7 @@ static int of_platform_serial_remove(struct of_device *ofdev)
static struct of_device_id __devinitdata of_platform_serial_table[] = {
{ .type = "serial", .compatible = "ns8250", .data = (void *)PORT_8250, },
{ .type = "serial", .compatible = "ns16450", .data = (void *)PORT_16450, },
+ { .type = "serial", .compatible = "ns16550a", .data = (void *)PORT_16550A, },
{ .type = "serial", .compatible = "ns16550", .data = (void *)PORT_16550, },
{ .type = "serial", .compatible = "ns16750", .data = (void *)PORT_16750, },
{ .type = "serial", .compatible = "ns16850", .data = (void *)PORT_16850, },
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c
index 79c9c5f5cdba..6ecb51baf56e 100644
--- a/drivers/serial/serial_cs.c
+++ b/drivers/serial/serial_cs.c
@@ -884,6 +884,7 @@ static struct pcmcia_device_id serial_ids[] = {
PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "MT5634ZLX.cis"),
+ PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "COMpad2.cis"),
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"),
PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"),
PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "RS-COM-2P.cis"),
diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c
index a2d4a19550ab..ed7d958b0a01 100644
--- a/drivers/serial/suncore.c
+++ b/drivers/serial/suncore.c
@@ -53,20 +53,21 @@ void sunserial_unregister_minors(struct uart_driver *drv, int count)
EXPORT_SYMBOL(sunserial_unregister_minors);
int sunserial_console_match(struct console *con, struct device_node *dp,
- struct uart_driver *drv, int line)
+ struct uart_driver *drv, int line, bool ignore_line)
{
- int off;
-
if (!con || of_console_device != dp)
return 0;
- off = 0;
- if (of_console_options &&
- *of_console_options == 'b')
- off = 1;
+ if (!ignore_line) {
+ int off = 0;
- if ((line & 1) != off)
- return 0;
+ if (of_console_options &&
+ *of_console_options == 'b')
+ off = 1;
+
+ if ((line & 1) != off)
+ return 0;
+ }
con->index = line;
drv->cons = con;
@@ -76,23 +77,24 @@ int sunserial_console_match(struct console *con, struct device_node *dp,
}
EXPORT_SYMBOL(sunserial_console_match);
-void
-sunserial_console_termios(struct console *con)
+void sunserial_console_termios(struct console *con, struct device_node *uart_dp)
{
- struct device_node *dp;
- const char *od, *mode, *s;
+ const char *mode, *s;
char mode_prop[] = "ttyX-mode";
int baud, bits, stop, cflag;
char parity;
- dp = of_find_node_by_path("/options");
- od = of_get_property(dp, "output-device", NULL);
- if (!strcmp(od, "rsc")) {
- mode = of_get_property(of_console_device,
+ if (!strcmp(uart_dp->name, "rsc") ||
+ !strcmp(uart_dp->name, "rsc-console") ||
+ !strcmp(uart_dp->name, "rsc-control")) {
+ mode = of_get_property(uart_dp,
"ssp-console-modes", NULL);
if (!mode)
mode = "115200,8,n,1,-";
+ } else if (!strcmp(uart_dp->name, "lom-console")) {
+ mode = "9600,8,n,1,-";
} else {
+ struct device_node *dp;
char c;
c = 'a';
@@ -101,6 +103,7 @@ sunserial_console_termios(struct console *con)
mode_prop[3] = c;
+ dp = of_find_node_by_path("/options");
mode = of_get_property(dp, mode_prop, NULL);
if (!mode)
mode = "9600,8,n,1,-";
diff --git a/drivers/serial/suncore.h b/drivers/serial/suncore.h
index 042668aa602e..db2057936c31 100644
--- a/drivers/serial/suncore.h
+++ b/drivers/serial/suncore.h
@@ -26,7 +26,8 @@ extern int sunserial_register_minors(struct uart_driver *, int);
extern void sunserial_unregister_minors(struct uart_driver *, int);
extern int sunserial_console_match(struct console *, struct device_node *,
- struct uart_driver *, int);
-extern void sunserial_console_termios(struct console *);
+ struct uart_driver *, int, bool);
+extern void sunserial_console_termios(struct console *,
+ struct device_node *);
#endif /* !(_SERIAL_SUN_H) */
diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c
index 1df5325faab2..3b6953aa5d03 100644
--- a/drivers/serial/sunhv.c
+++ b/drivers/serial/sunhv.c
@@ -566,7 +566,7 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m
goto out_free_con_read_page;
sunserial_console_match(&sunhv_console, op->node,
- &sunhv_reg, port->line);
+ &sunhv_reg, port->line, false);
err = uart_add_one_port(&sunhv_reg, port);
if (err)
diff --git a/drivers/serial/sunsab.c b/drivers/serial/sunsab.c
index 0355efe115d9..9cbf597e0ab8 100644
--- a/drivers/serial/sunsab.c
+++ b/drivers/serial/sunsab.c
@@ -883,7 +883,7 @@ static int sunsab_console_setup(struct console *con, char *options)
printk("Console: ttyS%d (SAB82532)\n",
(sunsab_reg.minor - 64) + con->index);
- sunserial_console_termios(con);
+ sunserial_console_termios(con, to_of_device(up->port.dev)->node);
switch (con->cflag & CBAUD) {
case B150: baud = 150; break;
@@ -1027,10 +1027,12 @@ static int __devinit sab_probe(struct of_device *op, const struct of_device_id *
goto out1;
sunserial_console_match(SUNSAB_CONSOLE(), op->node,
- &sunsab_reg, up[0].port.line);
+ &sunsab_reg, up[0].port.line,
+ false);
sunserial_console_match(SUNSAB_CONSOLE(), op->node,
- &sunsab_reg, up[1].port.line);
+ &sunsab_reg, up[1].port.line,
+ false);
err = uart_add_one_port(&sunsab_reg, &up[0].port);
if (err)
@@ -1116,7 +1118,6 @@ static int __init sunsab_init(void)
if (!sunsab_ports)
return -ENOMEM;
- sunsab_reg.cons = SUNSAB_CONSOLE();
err = sunserial_register_minors(&sunsab_reg, num_channels);
if (err) {
kfree(sunsab_ports);
diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c
index 47c6837850b1..ab91166b1b16 100644
--- a/drivers/serial/sunsu.c
+++ b/drivers/serial/sunsu.c
@@ -1329,11 +1329,9 @@ static void sunsu_console_write(struct console *co, const char *s,
*/
static int __init sunsu_console_setup(struct console *co, char *options)
{
+ static struct ktermios dummy;
+ struct ktermios termios;
struct uart_port *port;
- int baud = 9600;
- int bits = 8;
- int parity = 'n';
- int flow = 'n';
printk("Console: ttyS%d (SU)\n",
(sunsu_reg.minor - 64) + co->index);
@@ -1352,10 +1350,15 @@ static int __init sunsu_console_setup(struct console *co, char *options)
*/
spin_lock_init(&port->lock);
- if (options)
- uart_parse_options(options, &baud, &parity, &bits, &flow);
+ /* Get firmware console settings. */
+ sunserial_console_termios(co, to_of_device(port->dev)->node);
- return uart_set_options(port, co, baud, parity, bits, flow);
+ memset(&termios, 0, sizeof(struct ktermios));
+ termios.c_cflag = co->cflag;
+ port->mctrl |= TIOCM_DTR;
+ port->ops->set_termios(port, &termios, &dummy);
+
+ return 0;
}
static struct console sunsu_console = {
@@ -1409,6 +1412,7 @@ static int __devinit su_probe(struct of_device *op, const struct of_device_id *m
struct uart_sunsu_port *up;
struct resource *rp;
enum su_type type;
+ bool ignore_line;
int err;
type = su_get_type(dp);
@@ -1467,8 +1471,14 @@ static int __devinit su_probe(struct of_device *op, const struct of_device_id *m
up->port.ops = &sunsu_pops;
+ ignore_line = false;
+ if (!strcmp(dp->name, "rsc-console") ||
+ !strcmp(dp->name, "lom-console"))
+ ignore_line = true;
+
sunserial_console_match(SUNSU_CONSOLE(), dp,
- &sunsu_reg, up->port.line);
+ &sunsu_reg, up->port.line,
+ ignore_line);
err = uart_add_one_port(&sunsu_reg, &up->port);
if (err)
goto out_unmap;
@@ -1517,6 +1527,10 @@ static const struct of_device_id su_match[] = {
.name = "serial",
.compatible = "su",
},
+ {
+ .type = "serial",
+ .compatible = "su",
+ },
{},
};
MODULE_DEVICE_TABLE(of, su_match);
@@ -1548,6 +1562,12 @@ static int __init sunsu_init(void)
num_uart++;
}
}
+ for_each_node_by_type(dp, "serial") {
+ if (of_device_is_compatible(dp, "su")) {
+ if (su_get_type(dp) == SU_PORT_PORT)
+ num_uart++;
+ }
+ }
if (num_uart) {
err = sunserial_register_minors(&sunsu_reg, num_uart);
diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c
index e09d3cebb4fb..0a2a3335f30f 100644
--- a/drivers/serial/sunzilog.c
+++ b/drivers/serial/sunzilog.c
@@ -1180,7 +1180,7 @@ static int __init sunzilog_console_setup(struct console *con, char *options)
(sunzilog_reg.minor - 64) + con->index, con->index);
/* Get firmware console settings. */
- sunserial_console_termios(con);
+ sunserial_console_termios(con, to_of_device(up->port.dev)->node);
/* Firmware console speed is limited to 150-->38400 baud so
* this hackish cflag thing is OK.
@@ -1416,7 +1416,8 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
if (!keyboard_mouse) {
if (sunserial_console_match(SUNZILOG_CONSOLE(), op->node,
- &sunzilog_reg, up[0].port.line))
+ &sunzilog_reg, up[0].port.line,
+ false))
up->flags |= SUNZILOG_FLAG_IS_CONS;
err = uart_add_one_port(&sunzilog_reg, &up[0].port);
if (err) {
@@ -1425,7 +1426,8 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
return err;
}
if (sunserial_console_match(SUNZILOG_CONSOLE(), op->node,
- &sunzilog_reg, up[1].port.line))
+ &sunzilog_reg, up[1].port.line,
+ false))
up->flags |= SUNZILOG_FLAG_IS_CONS;
err = uart_add_one_port(&sunzilog_reg, &up[1].port);
if (err) {
diff --git a/drivers/ssb/sprom.c b/drivers/ssb/sprom.c
index 8943015a3eef..eb708431cb96 100644
--- a/drivers/ssb/sprom.c
+++ b/drivers/ssb/sprom.c
@@ -13,6 +13,8 @@
#include "ssb_private.h"
+#include <linux/ctype.h>
+
static const struct ssb_sprom *fallback_sprom;
@@ -33,17 +35,27 @@ static int sprom2hex(const u16 *sprom, char *buf, size_t buf_len,
static int hex2sprom(u16 *sprom, const char *dump, size_t len,
size_t sprom_size_words)
{
- char tmp[5] = { 0 };
- int cnt = 0;
+ char c, tmp[5] = { 0 };
+ int err, cnt = 0;
unsigned long parsed;
- if (len < sprom_size_words * 2)
+ /* Strip whitespace at the end. */
+ while (len) {
+ c = dump[len - 1];
+ if (!isspace(c) && c != '\0')
+ break;
+ len--;
+ }
+ /* Length must match exactly. */
+ if (len != sprom_size_words * 4)
return -EINVAL;
while (cnt < sprom_size_words) {
memcpy(tmp, dump, 4);
dump += 4;
- parsed = simple_strtoul(tmp, NULL, 16);
+ err = strict_strtoul(tmp, 16, &parsed);
+ if (err)
+ return err;
sprom[cnt++] = swab16((u16)parsed);
}
diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c
index da7c984b5641..17d89a8124ad 100644
--- a/drivers/staging/android/binder.c
+++ b/drivers/staging/android/binder.c
@@ -43,7 +43,6 @@ static struct proc_dir_entry *binder_proc_dir_entry_proc;
static struct hlist_head binder_dead_nodes;
static HLIST_HEAD(binder_deferred_list);
static DEFINE_MUTEX(binder_deferred_lock);
-static struct workqueue_struct *binder_deferred_workqueue;
static int binder_read_proc_proc(char *page, char **start, off_t off,
int count, int *eof, void *data);
@@ -2987,7 +2986,6 @@ static void binder_deferred_release(struct binder_proc *proc)
int i;
for (i = 0; i < proc->buffer_size / PAGE_SIZE; i++) {
if (proc->pages[i]) {
- void *page_addr = proc->buffer + i * PAGE_SIZE;
if (binder_debug_mask &
BINDER_DEBUG_BUFFER_ALLOC)
printk(KERN_INFO
@@ -2995,8 +2993,6 @@ static void binder_deferred_release(struct binder_proc *proc)
"page %d at %p not freed\n",
proc->pid, i,
proc->buffer + i * PAGE_SIZE);
- unmap_kernel_range((unsigned long)page_addr,
- PAGE_SIZE);
__free_page(proc->pages[i]);
page_count++;
}
@@ -3066,7 +3062,7 @@ static void binder_defer_work(struct binder_proc *proc, int defer)
if (hlist_unhashed(&proc->deferred_work_node)) {
hlist_add_head(&proc->deferred_work_node,
&binder_deferred_list);
- queue_work(binder_deferred_workqueue, &binder_deferred_work);
+ schedule_work(&binder_deferred_work);
}
mutex_unlock(&binder_deferred_lock);
}
@@ -3694,10 +3690,6 @@ static int __init binder_init(void)
{
int ret;
- binder_deferred_workqueue = create_singlethread_workqueue("binder");
- if (!binder_deferred_workqueue)
- return -ENOMEM;
-
binder_proc_dir_entry_root = proc_mkdir("binder", NULL);
if (binder_proc_dir_entry_root)
binder_proc_dir_entry_proc = proc_mkdir("proc",
diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c
index 7f64f8fb26b0..6c10b456c6cc 100644
--- a/drivers/staging/android/logger.c
+++ b/drivers/staging/android/logger.c
@@ -556,7 +556,6 @@ static struct logger_log VAR = { \
DEFINE_LOGGER_DEVICE(log_main, LOGGER_LOG_MAIN, 64*1024)
DEFINE_LOGGER_DEVICE(log_events, LOGGER_LOG_EVENTS, 256*1024)
DEFINE_LOGGER_DEVICE(log_radio, LOGGER_LOG_RADIO, 64*1024)
-DEFINE_LOGGER_DEVICE(log_system, LOGGER_LOG_SYSTEM, 64*1024)
static struct logger_log *get_log_from_minor(int minor)
{
@@ -566,8 +565,6 @@ static struct logger_log *get_log_from_minor(int minor)
return &log_events;
if (log_radio.misc.minor == minor)
return &log_radio;
- if (log_system.misc.minor == minor)
- return &log_system;
return NULL;
}
@@ -604,10 +601,6 @@ static int __init logger_init(void)
if (unlikely(ret))
goto out;
- ret = init_log(&log_system);
- if (unlikely(ret))
- goto out;
-
out:
return ret;
}
diff --git a/drivers/staging/android/logger.h b/drivers/staging/android/logger.h
index 2cb06e9d8f98..a562434d7419 100644
--- a/drivers/staging/android/logger.h
+++ b/drivers/staging/android/logger.h
@@ -32,7 +32,6 @@ struct logger_entry {
#define LOGGER_LOG_RADIO "log_radio" /* radio-related messages */
#define LOGGER_LOG_EVENTS "log_events" /* system/hardware events */
-#define LOGGER_LOG_SYSTEM "log_system" /* system/framework messages */
#define LOGGER_LOG_MAIN "log_main" /* everything else */
#define LOGGER_ENTRY_MAX_LEN (4*1024)
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c
index 572dc062759a..ae41f79d995d 100644
--- a/drivers/staging/android/lowmemorykiller.c
+++ b/drivers/staging/android/lowmemorykiller.c
@@ -20,7 +20,6 @@
#include <linux/sched.h>
#include <linux/nodemask.h>
#include <linux/vmstat.h>
-#include <linux/notifier.h>
static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask);
@@ -44,8 +43,6 @@ static size_t lowmem_minfree[6] = {
};
static int lowmem_minfree_size = 4;
-static struct task_struct *lowmem_deathpending;
-
#define lowmem_print(level, x...) \
do { \
if (lowmem_debug_level >= (level)) \
@@ -59,24 +56,6 @@ module_param_array_named(minfree, lowmem_minfree, uint, &lowmem_minfree_size,
S_IRUGO | S_IWUSR);
module_param_named(debug_level, lowmem_debug_level, uint, S_IRUGO | S_IWUSR);
-static int
-task_notify_func(struct notifier_block *self, unsigned long val, void *data);
-
-static struct notifier_block task_nb = {
- .notifier_call = task_notify_func,
-};
-
-static int
-task_notify_func(struct notifier_block *self, unsigned long val, void *data)
-{
- struct task_struct *task = data;
- if (task == lowmem_deathpending) {
- lowmem_deathpending = NULL;
- task_free_unregister(&task_nb);
- }
- return NOTIFY_OK;
-}
-
static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask)
{
struct task_struct *p;
@@ -92,15 +71,6 @@ static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask)
int other_file = global_page_state(NR_FILE_PAGES);
int node;
- /*
- * If we already have a death outstanding, then
- * bail out right away; indicating to vmscan
- * that we have nothing further to offer on
- * this pass.
- */
- if (lowmem_deathpending)
- return 0;
-
for_each_node_state(node, N_HIGH_MEMORY) {
struct zone *z =
&NODE_DATA(node)->node_zones[ZONE_DMA];
@@ -169,19 +139,9 @@ static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask)
p->pid, p->comm, oom_adj, tasksize);
}
if (selected) {
- if (fatal_signal_pending(selected)) {
- pr_warning("process %d is suffering a slow death\n",
- selected->pid);
- read_unlock(&tasklist_lock);
- return rem;
- }
lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d\n",
selected->pid, selected->comm,
selected_oom_adj, selected_tasksize);
-
- lowmem_deathpending = selected;
- task_free_register(&task_nb);
-
force_sig(SIGKILL, selected);
rem -= selected_tasksize;
}
diff --git a/drivers/staging/dst/dcore.c b/drivers/staging/dst/dcore.c
index fad25b753042..5546898dbdb4 100644
--- a/drivers/staging/dst/dcore.c
+++ b/drivers/staging/dst/dcore.c
@@ -846,15 +846,19 @@ static dst_command_func dst_commands[] = {
/*
* Configuration parser.
*/
-static void cn_dst_callback(void *data)
+static void cn_dst_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
{
struct dst_ctl *ctl;
- struct cn_msg *msg = data;
int err;
struct dst_ctl_ack ack;
struct dst_node *n = NULL, *tmp;
unsigned int hash;
+ if (!cap_raised(nsp->eff_cap, CAP_SYS_ADMIN)) {
+ err = -EPERM;
+ goto out;
+ }
+
if (msg->len < sizeof(struct dst_ctl)) {
err = -EBADMSG;
goto out;
diff --git a/drivers/staging/pohmelfs/config.c b/drivers/staging/pohmelfs/config.c
index a6eaa42fb669..d8ec47a6ee06 100644
--- a/drivers/staging/pohmelfs/config.c
+++ b/drivers/staging/pohmelfs/config.c
@@ -446,11 +446,13 @@ out_unlock:
return err;
}
-static void pohmelfs_cn_callback(void *data)
+static void pohmelfs_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
{
- struct cn_msg *msg = data;
int err;
+ if (!cap_raised(nsp->eff_cap, CAP_SYS_ADMIN))
+ return;
+
switch (msg->flags) {
case POHMELFS_FLAGS_ADD:
case POHMELFS_FLAGS_DEL:
diff --git a/drivers/staging/rt2860/common/cmm_data_2860.c b/drivers/staging/rt2860/common/cmm_data_2860.c
index fb1735533b74..857ff450b6c9 100644
--- a/drivers/staging/rt2860/common/cmm_data_2860.c
+++ b/drivers/staging/rt2860/common/cmm_data_2860.c
@@ -363,6 +363,8 @@ int RtmpPCIMgmtKickOut(
ULONG SwIdx = pAd->MgmtRing.TxCpuIdx;
pTxD = (PTXD_STRUC) pAd->MgmtRing.Cell[SwIdx].AllocVa;
+ if (!pTxD)
+ return 0;
pAd->MgmtRing.Cell[SwIdx].pNdisPacket = pPacket;
pAd->MgmtRing.Cell[SwIdx].pNextNdisPacket = NULL;
diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c
index 31fcd3270b26..3f06818cf9fa 100644
--- a/drivers/uio/uio_pdrv_genirq.c
+++ b/drivers/uio/uio_pdrv_genirq.c
@@ -157,12 +157,6 @@ static int uio_pdrv_genirq_remove(struct platform_device *pdev)
struct uio_pdrv_genirq_platdata *priv = platform_get_drvdata(pdev);
uio_unregister_device(priv->uioinfo);
-
- priv->uioinfo->irq_flags = 0;
- priv->uioinfo->handler = NULL;
- priv->uioinfo->irqcontrol = NULL;
- priv->uioinfo->priv = NULL;
-
kfree(priv);
return 0;
}
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index b8134ad5f05f..b72fa49eb257 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -609,9 +609,9 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
acm->throttle = 0;
- tasklet_schedule(&acm->urb_task);
set_bit(ASYNCB_INITIALIZED, &acm->port.flags);
rv = tty_port_block_til_ready(&acm->port, tty, filp);
+ tasklet_schedule(&acm->urb_task);
done:
mutex_unlock(&acm->mutex);
err_out:
@@ -860,10 +860,7 @@ static void acm_tty_set_termios(struct tty_struct *tty,
if (!ACM_READY(acm))
return;
- /* FIXME: Needs to support the tty_baud interface */
- /* FIXME: Broken on sparc */
- newline.dwDTERate = cpu_to_le32p(acm_tty_speed +
- (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));
+ newline.dwDTERate = cpu_to_le32(tty_get_baud_rate(tty));
newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0;
newline.bParityType = termios->c_cflag & PARENB ?
(termios->c_cflag & PARODD ? 1 : 2) +
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index ba589d4ca8bc..a9c33994459b 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -313,8 +313,13 @@ static ssize_t wdm_write
r = usb_autopm_get_interface(desc->intf);
if (r < 0)
goto outnp;
- r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
- &desc->flags));
+
+ if (!file->f_flags && O_NONBLOCK)
+ r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
+ &desc->flags));
+ else
+ if (test_bit(WDM_IN_USE, &desc->flags))
+ r = -EAGAIN;
if (r < 0)
goto out;
@@ -377,7 +382,7 @@ outnl:
static ssize_t wdm_read
(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
{
- int rv, cntr;
+ int rv, cntr = 0;
int i = 0;
struct wdm_device *desc = file->private_data;
@@ -389,10 +394,23 @@ static ssize_t wdm_read
if (desc->length == 0) {
desc->read = 0;
retry:
+ if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
+ rv = -ENODEV;
+ goto err;
+ }
i++;
- rv = wait_event_interruptible(desc->wait,
- test_bit(WDM_READ, &desc->flags));
+ if (file->f_flags & O_NONBLOCK) {
+ if (!test_bit(WDM_READ, &desc->flags)) {
+ rv = cntr ? cntr : -EAGAIN;
+ goto err;
+ }
+ rv = 0;
+ } else {
+ rv = wait_event_interruptible(desc->wait,
+ test_bit(WDM_READ, &desc->flags));
+ }
+ /* may have happened while we slept */
if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
rv = -ENODEV;
goto err;
@@ -448,7 +466,7 @@ retry:
err:
mutex_unlock(&desc->rlock);
- if (rv < 0)
+ if (rv < 0 && rv != -EAGAIN)
dev_err(&desc->intf->dev, "wdm_read: exit error\n");
return rv;
}
diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index b09a527f7341..aa145f7b4e25 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -367,13 +367,13 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf,
{
struct usbtmc_device_data *data;
struct device *dev;
- unsigned long int n_characters;
+ u32 n_characters;
u8 *buffer;
int actual;
- int done;
- int remaining;
+ size_t done;
+ size_t remaining;
int retval;
- int this_part;
+ size_t this_part;
/* Get pointer to private data structure */
data = filp->private_data;
@@ -455,6 +455,18 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf,
(buffer[6] << 16) +
(buffer[7] << 24);
+ /* Ensure the instrument doesn't lie about it */
+ if(n_characters > actual - 12) {
+ dev_err(dev, "Device lies about message size: %zu > %zu\n", n_characters, actual - 12);
+ n_characters = actual - 12;
+ }
+
+ /* Ensure the instrument doesn't send more back than requested */
+ if(n_characters > this_part) {
+ dev_err(dev, "Device returns more than requested: %zu > %zu\n", done + n_characters, done + this_part);
+ n_characters = this_part;
+ }
+
/* Copy buffer to user space */
if (copy_to_user(buf + done, &buffer[12], n_characters)) {
/* There must have been an addressing problem */
@@ -465,6 +477,8 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf,
done += n_characters;
if (n_characters < USBTMC_SIZE_IOBUFFER)
remaining = 0;
+ else
+ remaining -= n_characters;
}
/* Update file position value */
@@ -531,10 +545,16 @@ static ssize_t usbtmc_write(struct file *filp, const char __user *buf,
n_bytes = roundup(12 + this_part, 4);
memset(buffer + 12 + this_part, 0, n_bytes - (12 + this_part));
- retval = usb_bulk_msg(data->usb_dev,
- usb_sndbulkpipe(data->usb_dev,
- data->bulk_out),
- buffer, n_bytes, &actual, USBTMC_TIMEOUT);
+ do {
+ retval = usb_bulk_msg(data->usb_dev,
+ usb_sndbulkpipe(data->usb_dev,
+ data->bulk_out),
+ buffer, n_bytes,
+ &actual, USBTMC_TIMEOUT);
+ if (retval != 0)
+ break;
+ n_bytes -= actual;
+ } while (n_bytes);
data->bTag_last_write = data->bTag;
data->bTag++;
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index a16c538d0132..0d3af6a6ee49 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -105,7 +105,7 @@ static int usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno,
ep->ss_ep_comp->extralen = i;
buffer += i;
size -= i;
- retval = buffer - buffer_start + i;
+ retval = buffer - buffer_start;
if (num_skipped > 0)
dev_dbg(ddev, "skipped %d descriptor%s after %s\n",
num_skipped, plural(num_skipped),
diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c
index 96f11715cd26..355dffcc23b0 100644
--- a/drivers/usb/core/devices.c
+++ b/drivers/usb/core/devices.c
@@ -494,7 +494,7 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes,
return 0;
/* allocate 2^1 pages = 8K (on i386);
* should be more than enough for one device */
- pages_start = (char *)__get_free_pages(GFP_KERNEL, 1);
+ pages_start = (char *)__get_free_pages(GFP_NOIO, 1);
if (!pages_start)
return -ENOMEM;
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index 4247eccf858c..5ae4099fb4c1 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -1139,6 +1139,13 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
free_async(as);
return -ENOMEM;
}
+ /* Isochronous input data may end up being discontiguous
+ * if some of the packets are short. Clear the buffer so
+ * that the gaps don't leak kernel data to userspace.
+ */
+ if (is_in && uurb->type == USBDEVFS_URB_TYPE_ISO)
+ memset(as->urb->transfer_buffer, 0,
+ uurb->buffer_length);
}
as->urb->dev = ps->dev;
as->urb->pipe = (uurb->type << 30) |
@@ -1240,10 +1247,14 @@ static int processcompl(struct async *as, void __user * __user *arg)
void __user *addr = as->userurb;
unsigned int i;
- if (as->userbuffer)
- if (copy_to_user(as->userbuffer, urb->transfer_buffer,
- urb->transfer_buffer_length))
+ if (as->userbuffer && urb->actual_length) {
+ if (urb->number_of_packets > 0) /* Isochronous */
+ i = urb->transfer_buffer_length;
+ else /* Non-Isoc */
+ i = urb->actual_length;
+ if (copy_to_user(as->userbuffer, urb->transfer_buffer, i))
goto err_out;
+ }
if (put_user(as->status, &userurb->status))
goto err_out;
if (put_user(urb->actual_length, &userurb->actual_length))
@@ -1262,14 +1273,11 @@ static int processcompl(struct async *as, void __user * __user *arg)
}
}
- free_async(as);
-
if (put_user(addr, (void __user * __user *)arg))
return -EFAULT;
return 0;
err_out:
- free_async(as);
return -EFAULT;
}
@@ -1299,8 +1307,11 @@ static struct async *reap_as(struct dev_state *ps)
static int proc_reapurb(struct dev_state *ps, void __user *arg)
{
struct async *as = reap_as(ps);
- if (as)
- return processcompl(as, (void __user * __user *)arg);
+ if (as) {
+ int retval = processcompl(as, (void __user * __user *)arg);
+ free_async(as);
+ return retval;
+ }
if (signal_pending(current))
return -EINTR;
return -EIO;
@@ -1308,11 +1319,16 @@ static int proc_reapurb(struct dev_state *ps, void __user *arg)
static int proc_reapurbnonblock(struct dev_state *ps, void __user *arg)
{
+ int retval;
struct async *as;
- if (!(as = async_getcompleted(ps)))
- return -EAGAIN;
- return processcompl(as, (void __user * __user *)arg);
+ as = async_getcompleted(ps);
+ retval = -EAGAIN;
+ if (as) {
+ retval = processcompl(as, (void __user * __user *)arg);
+ free_async(as);
+ }
+ return retval;
}
#ifdef CONFIG_COMPAT
@@ -1363,9 +1379,9 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
void __user *addr = as->userurb;
unsigned int i;
- if (as->userbuffer)
+ if (as->userbuffer && urb->actual_length)
if (copy_to_user(as->userbuffer, urb->transfer_buffer,
- urb->transfer_buffer_length))
+ urb->actual_length))
return -EFAULT;
if (put_user(as->status, &userurb->status))
return -EFAULT;
@@ -1385,7 +1401,6 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
}
}
- free_async(as);
if (put_user(ptr_to_compat(addr), (u32 __user *)arg))
return -EFAULT;
return 0;
@@ -1394,8 +1409,11 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
static int proc_reapurb_compat(struct dev_state *ps, void __user *arg)
{
struct async *as = reap_as(ps);
- if (as)
- return processcompl_compat(as, (void __user * __user *)arg);
+ if (as) {
+ int retval = processcompl_compat(as, (void __user * __user *)arg);
+ free_async(as);
+ return retval;
+ }
if (signal_pending(current))
return -EINTR;
return -EIO;
@@ -1403,11 +1421,16 @@ static int proc_reapurb_compat(struct dev_state *ps, void __user *arg)
static int proc_reapurbnonblock_compat(struct dev_state *ps, void __user *arg)
{
+ int retval;
struct async *as;
- if (!(as = async_getcompleted(ps)))
- return -EAGAIN;
- return processcompl_compat(as, (void __user * __user *)arg);
+ retval = -EAGAIN;
+ as = async_getcompleted(ps);
+ if (as) {
+ retval = processcompl_compat(as, (void __user * __user *)arg);
+ free_async(as);
+ }
+ return retval;
}
#endif
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index 07f503aa9078..c209dbe4f6c6 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -1754,9 +1754,6 @@ int usb_resume(struct device *dev, pm_message_t msg)
udev = to_usb_device(dev);
-/* At otg mode, if it is a device wakeup interrupt, the host should do nothing */
- if (udev->bus->is_b_host)
- return 0;
/* If udev->skip_sys_resume is set then udev was already suspended
* when the system sleep started, so we don't want to resume it
* during this system wakeup.
diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c
index 539a2c0dde00..66e8a424c9f4 100644
--- a/drivers/usb/core/generic.c
+++ b/drivers/usb/core/generic.c
@@ -196,6 +196,7 @@ extern void usb_host_set_wakeup(struct device *wkup_dev, bool para);
static int generic_suspend(struct usb_device *udev, pm_message_t msg)
{
int rc;
+ u32 temp;
/* Normal USB devices suspend through their upstream port.
* Root hubs don't have upstream ports to suspend,
@@ -203,7 +204,25 @@ static int generic_suspend(struct usb_device *udev, pm_message_t msg)
* interfaces manually by doing a bus (or "global") suspend.
*/
if (!udev->parent) {
+ struct usb_hcd *hcd =
+ container_of(udev->bus, struct usb_hcd, self);
+ struct fsl_usb2_platform_data *pdata;
+ pdata = hcd->self.controller->platform_data;
+
rc = hcd_bus_suspend(udev, msg);
+
+ if (device_may_wakeup(hcd->self.controller)) {
+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+ /* enable remote wake up irq */
+ usb_host_set_wakeup(hcd->self.controller, true);
+
+ /* Put PHY into low power mode */
+ temp = readl(hcd->regs + 0x184);
+ writel(temp | (1 << 23), (hcd->regs + 0x184));
+
+ if (pdata->usb_clock_for_pm)
+ pdata->usb_clock_for_pm(false);
+ }
/* Non-root devices don't need to do anything for FREEZE or PRETHAW */
} else if (msg.event == PM_EVENT_FREEZE ||
msg.event == PM_EVENT_PRETHAW)
@@ -217,6 +236,7 @@ static int generic_suspend(struct usb_device *udev, pm_message_t msg)
static int generic_resume(struct usb_device *udev, pm_message_t msg)
{
int rc;
+ u32 temp;
/* Normal USB devices resume/reset through their upstream port.
* Root hubs don't have upstream ports to resume or reset,
@@ -224,6 +244,13 @@ static int generic_resume(struct usb_device *udev, pm_message_t msg)
* interfaces manually by doing a bus (or "global") resume.
*/
if (!udev->parent) {
+ struct usb_hcd *hcd =
+ container_of(udev->bus, struct usb_hcd, self);
+
+ if (device_may_wakeup(hcd->self.controller)) {
+ temp = readl(hcd->regs + 0x184);
+ writel(temp & (~(1 << 23)), (hcd->regs + 0x184));
+ }
rc = hcd_bus_resume(udev, msg);
} else
rc = usb_port_resume(udev, msg);
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 2f47bdc7c93a..d27ad104731c 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1739,7 +1739,6 @@ int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg)
int status;
int old_state = hcd->state;
- printk("%s\n", __func__);
dev_dbg(&rhdev->dev, "bus %s%s\n",
(msg.event & PM_EVENT_AUTO ? "auto-" : ""), "suspend");
if (!hcd->driver->bus_suspend) {
@@ -1877,6 +1876,7 @@ EXPORT_SYMBOL_GPL(usb_bus_start_enum);
irqreturn_t usb_hcd_irq (int irq, void *__hcd)
{
struct usb_hcd *hcd = __hcd;
+ struct fsl_usb2_platform_data *pdata;
unsigned long flags;
irqreturn_t rc;
@@ -1885,14 +1885,25 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd)
* assume it's never used.
*/
local_irq_save(flags);
- /* At otg mode, the host does need to handle device interrupt */
- if (hcd->self.is_b_host){
- local_irq_restore(flags);
- return IRQ_NONE;
- }
- else if (unlikely(hcd->state == HC_STATE_HALT ||
- !test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) {
+
+ if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
+ /* Need open clock for register access */
+ pdata = hcd->self.controller->platform_data;
+ if (pdata->usb_clock_for_pm)
+ pdata->usb_clock_for_pm(true);
+
+ /* if receive a remote wakeup interrrupt after suspend */
+ if (usb_host_wakeup_irq(hcd->self.controller)) {
+ /* disable remote wake up irq */
+ usb_host_set_wakeup(hcd->self.controller, false);
+
+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+ hcd->driver->irq(hcd);
+ rc = IRQ_HANDLED;
+ } else
rc = IRQ_NONE;
+ } else if (unlikely(hcd->state == HC_STATE_HALT)) {
+ rc = IRQ_NONE;
} else if (hcd->driver->irq(hcd) == IRQ_NONE) {
rc = IRQ_NONE;
} else {
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index cc8f911afbc4..3bcd08fbfb71 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -457,7 +457,7 @@ resubmit:
static inline int
hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt)
{
- return usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0),
+ return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo,
tt, NULL, 0, 1000);
}
@@ -1177,6 +1177,12 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
"Unsupported bus topology: hub nested too deep\n");
return -E2BIG;
}
+#ifdef CONFIG_PM
+ /* Defaultly disable autosuspend for hub and reley on sys
+ * to enable it.
+ */
+ hdev->autosuspend_disabled = 1;
+#endif
#ifdef CONFIG_USB_OTG_BLACKLIST_HUB
if (hdev->parent) {
@@ -2298,6 +2304,7 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
struct usb_hub *hub = usb_get_intfdata (intf);
struct usb_device *hdev = hub->hdev;
unsigned port1;
+
/* fail if children aren't already suspended */
for (port1 = 1; port1 <= hdev->maxchild; port1++) {
struct usb_device *udev;
@@ -2321,15 +2328,8 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
static int hub_resume(struct usb_interface *intf)
{
struct usb_hub *hub = usb_get_intfdata(intf);
- struct usb_hcd *hcd = bus_to_hcd(hub->hdev->bus);
dev_dbg(&intf->dev, "%s\n", __func__);
- /* At otg mode, if the hcd which the hub is attached to is not accessible,
- * It should do nothing.
- */
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
- return 0;
-
hub_activate(hub, HUB_RESUME);
return 0;
}
@@ -3286,6 +3286,9 @@ static void hub_events(void)
USB_PORT_FEAT_C_SUSPEND);
udev = hdev->children[i-1];
if (udev) {
+ /* TRSMRCY = 10 msec */
+ msleep(10);
+
usb_lock_device(udev);
ret = remote_wakeup(hdev->
children[i-1]);
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index 9720e699f472..8c929daa71f2 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -923,11 +923,11 @@ char *usb_cache_string(struct usb_device *udev, int index)
if (index <= 0)
return NULL;
- buf = kmalloc(MAX_USB_STRING_SIZE, GFP_KERNEL);
+ buf = kmalloc(MAX_USB_STRING_SIZE, GFP_NOIO);
if (buf) {
len = usb_string(udev, index, buf, MAX_USB_STRING_SIZE);
if (len > 0) {
- smallbuf = kmalloc(++len, GFP_KERNEL);
+ smallbuf = kmalloc(++len, GFP_NOIO);
if (!smallbuf)
return buf;
memcpy(smallbuf, buf, len);
@@ -1694,7 +1694,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
if (cp) {
nintf = cp->desc.bNumInterfaces;
new_interfaces = kmalloc(nintf * sizeof(*new_interfaces),
- GFP_KERNEL);
+ GFP_NOIO);
if (!new_interfaces) {
dev_err(&dev->dev, "Out of memory\n");
return -ENOMEM;
@@ -1703,7 +1703,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
for (; n < nintf; ++n) {
new_interfaces[n] = kzalloc(
sizeof(struct usb_interface),
- GFP_KERNEL);
+ GFP_NOIO);
if (!new_interfaces[n]) {
dev_err(&dev->dev, "Out of memory\n");
ret = -ENOMEM;
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c
index b5c72e458943..7bc1469c8f0e 100644
--- a/drivers/usb/core/sysfs.c
+++ b/drivers/usb/core/sysfs.c
@@ -111,6 +111,12 @@ show_speed(struct device *dev, struct device_attribute *attr, char *buf)
case USB_SPEED_HIGH:
speed = "480";
break;
+ case USB_SPEED_VARIABLE:
+ speed = "480";
+ break;
+ case USB_SPEED_SUPER:
+ speed = "5000";
+ break;
default:
speed = "unknown";
}
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index a26f73880c32..b661dbd93208 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -132,7 +132,7 @@ EXPORT_SYMBOL_GPL(usb_altnum_to_altsetting);
struct find_interface_arg {
int minor;
- struct usb_interface *interface;
+ struct device_driver *drv;
};
static int __find_interface(struct device *dev, void *data)
@@ -143,12 +143,10 @@ static int __find_interface(struct device *dev, void *data)
if (!is_usb_interface(dev))
return 0;
+ if (dev->driver != arg->drv)
+ return 0;
intf = to_usb_interface(dev);
- if (intf->minor != -1 && intf->minor == arg->minor) {
- arg->interface = intf;
- return 1;
- }
- return 0;
+ return intf->minor == arg->minor;
}
/**
@@ -156,21 +154,24 @@ static int __find_interface(struct device *dev, void *data)
* @drv: the driver whose current configuration is considered
* @minor: the minor number of the desired device
*
- * This walks the driver device list and returns a pointer to the interface
- * with the matching minor. Note, this only works for devices that share the
- * USB major number.
+ * This walks the bus device list and returns a pointer to the interface
+ * with the matching minor and driver. Note, this only works for devices
+ * that share the USB major number.
*/
struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
{
struct find_interface_arg argb;
- int retval;
+ struct device *dev;
argb.minor = minor;
- argb.interface = NULL;
- /* eat the error, it will be in argb.interface */
- retval = driver_for_each_device(&drv->drvwrap.driver, NULL, &argb,
- __find_interface);
- return argb.interface;
+ argb.drv = &drv->drvwrap.driver;
+
+ dev = bus_find_device(&usb_bus_type, NULL, &argb, __find_interface);
+
+ /* Drop reference count from bus_find_device */
+ put_device(dev);
+
+ return dev ? to_usb_interface(dev) : NULL;
}
EXPORT_SYMBOL_GPL(usb_find_interface);
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index c29ebda61b2f..a19d73730470 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -791,15 +791,6 @@ config USB_G_PRINTER
For more information, see Documentation/usb/gadget_printer.txt
which includes sample code for accessing the device file.
-config USB_ANDROID
- tristate "Android Gadget"
- depends on SWITCH
- help
- The Android gadget provides mass storage and adb transport.
-
- Say "y" to link the driver statically, or "m" to build a
- dynamically linked module called "g_android".
-
config USB_CDC_COMPOSITE
tristate "CDC Composite Device (Ethernet and ACM)"
depends on NET
diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile
index 545c0e256e28..477114e43372 100644
--- a/drivers/usb/gadget/Makefile
+++ b/drivers/usb/gadget/Makefile
@@ -41,7 +41,6 @@ gadgetfs-objs := inode.o
g_file_storage-objs := file_storage.o
g_printer-objs := printer.o
g_cdc-objs := cdc2.o
-g_android-objs := android.o f_adb.o f_mass_storage.o
obj-$(CONFIG_USB_ZERO) += g_zero.o
obj-$(CONFIG_USB_AUDIO) += g_audio.o
@@ -52,5 +51,4 @@ obj-$(CONFIG_USB_G_SERIAL) += g_serial.o
obj-$(CONFIG_USB_G_PRINTER) += g_printer.o
obj-$(CONFIG_USB_MIDI_GADGET) += g_midi.o
obj-$(CONFIG_USB_CDC_COMPOSITE) += g_cdc.o
-obj-$(CONFIG_USB_ANDROID) += g_android.o
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c
index 77352ccc245e..fb0976643a2f 100644
--- a/drivers/usb/gadget/amd5536udc.c
+++ b/drivers/usb/gadget/amd5536udc.c
@@ -1213,7 +1213,12 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp)
tmp &= AMD_UNMASK_BIT(ep->num);
writel(tmp, &dev->regs->ep_irqmsk);
}
- }
+ } else if (ep->in) {
+ /* enable ep irq */
+ tmp = readl(&dev->regs->ep_irqmsk);
+ tmp &= AMD_UNMASK_BIT(ep->num);
+ writel(tmp, &dev->regs->ep_irqmsk);
+ }
} else if (ep->dma) {
@@ -2005,18 +2010,17 @@ __acquires(dev->lock)
{
int tmp;
- /* empty queues and init hardware */
- udc_basic_init(dev);
- for (tmp = 0; tmp < UDC_EP_NUM; tmp++) {
- empty_req_queue(&dev->ep[tmp]);
- }
-
if (dev->gadget.speed != USB_SPEED_UNKNOWN) {
spin_unlock(&dev->lock);
driver->disconnect(&dev->gadget);
spin_lock(&dev->lock);
}
- /* init */
+
+ /* empty queues and init hardware */
+ udc_basic_init(dev);
+ for (tmp = 0; tmp < UDC_EP_NUM; tmp++)
+ empty_req_queue(&dev->ep[tmp]);
+
udc_setup_endpoints(dev);
}
@@ -2478,6 +2482,13 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)
}
}
+ } else if (!use_dma && ep->in) {
+ /* disable interrupt */
+ tmp = readl(
+ &dev->regs->ep_irqmsk);
+ tmp |= AMD_BIT(ep->num);
+ writel(tmp,
+ &dev->regs->ep_irqmsk);
}
}
/* clear status bits */
@@ -3285,6 +3296,17 @@ static int udc_pci_probe(
goto finished;
}
+ spin_lock_init(&dev->lock);
+ /* udc csr registers base */
+ dev->csr = dev->virt_addr + UDC_CSR_ADDR;
+ /* dev registers base */
+ dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR;
+ /* ep registers base */
+ dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR;
+ /* fifo's base */
+ dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR);
+ dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR);
+
if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) {
dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq);
kfree(dev);
@@ -3337,7 +3359,6 @@ static int udc_probe(struct udc *dev)
udc_pollstall_timer.data = 0;
/* device struct setup */
- spin_lock_init(&dev->lock);
dev->gadget.ops = &udc_ops;
dev_set_name(&dev->gadget.dev, "gadget");
@@ -3346,16 +3367,6 @@ static int udc_probe(struct udc *dev)
dev->gadget.name = name;
dev->gadget.is_dualspeed = 1;
- /* udc csr registers base */
- dev->csr = dev->virt_addr + UDC_CSR_ADDR;
- /* dev registers base */
- dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR;
- /* ep registers base */
- dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR;
- /* fifo's base */
- dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR);
- dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR);
-
/* init registers, interrupts, ... */
startup_registers(dev);
diff --git a/drivers/usb/gadget/arcotg_udc.c b/drivers/usb/gadget/arcotg_udc.c
index 8e94549f891e..abba4d2ae8d4 100644
--- a/drivers/usb/gadget/arcotg_udc.c
+++ b/drivers/usb/gadget/arcotg_udc.c
@@ -106,6 +106,19 @@ extern struct resource *otg_get_resources(void);
extern void fsl_platform_set_test_mode(struct fsl_usb2_platform_data *pdata, enum usb_test_mode mode);
+static inline void
+dr_wake_up_enable(struct fsl_udc *udc, bool enable)
+{
+ struct fsl_usb2_platform_data *pdata;
+ pdata = udc->pdata;
+
+ if (enable && (!device_may_wakeup(udc_controller->gadget.dev.parent)))
+ return;
+
+ if (pdata->wake_up_enable)
+ pdata->wake_up_enable(pdata, enable);
+}
+
#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
static void safe_writel(u32 val32, void *addr)
{
@@ -270,12 +283,9 @@ static void done(struct fsl_ep *ep, struct fsl_req *req, int status)
static void nuke(struct fsl_ep *ep, int status)
{
ep->stopped = 1;
- /*
- * At udc stop mode, the clock is already off
- * So flush fifo, should be done at clock on mode.
- */
- if (!ep->udc->stopped)
- fsl_ep_fifo_flush(&ep->ep);
+
+ /* Flush fifo */
+ fsl_ep_fifo_flush(&ep->ep);
/* Whether this eq has request linked */
while (!list_empty(&ep->queue)) {
@@ -290,83 +300,31 @@ static void nuke(struct fsl_ep *ep, int status)
/*------------------------------------------------------------------
Internal Hardware related function
------------------------------------------------------------------*/
-static inline void
-dr_wake_up_enable(struct fsl_udc *udc, bool enable)
-{
- struct fsl_usb2_platform_data *pdata;
- pdata = udc->pdata;
- if (pdata && pdata->wake_up_enable)
- pdata->wake_up_enable(pdata, enable);
-}
-static bool clk_stoped = false;
-static inline void dr_clk_gate(bool on)
+static void dr_phy_low_power_mode(struct fsl_udc *udc, bool enable)
{
- struct fsl_usb2_platform_data *pdata = udc_controller->pdata;
+ u32 temp;
- if (!pdata || !pdata->usb_clock_for_pm)
+ if (!device_may_wakeup(udc_controller->gadget.dev.parent))
return;
- if (on && clk_stoped) {
- pdata->usb_clock_for_pm(true);
- clk_stoped = false;
- }
- if (!on && !clk_stoped) {
- pdata->usb_clock_for_pm(false);
- clk_stoped = true;
- }
- if (on)
- reset_phy();
-}
-static void dr_phy_low_power_mode(struct fsl_udc *udc, bool enable)
-{
- struct fsl_usb2_platform_data *pdata = udc->pdata;
- u32 portsc;
+ if (enable) {
+ temp = fsl_readl(&dr_regs->portsc1);
+ temp |= PORTSCX_PHY_LOW_POWER_SPD;
+ fsl_writel(temp, &dr_regs->portsc1);
- if (pdata && pdata->phy_lowpower_suspend) {
- pdata->phy_lowpower_suspend(enable);
+ if (udc_controller->pdata->usb_clock_for_pm)
+ udc_controller->pdata->usb_clock_for_pm(false);
} else {
- if (enable){
- portsc = fsl_readl(&dr_regs->portsc1);
- portsc |= PORTSCX_PHY_LOW_POWER_SPD;
- fsl_writel(portsc, &dr_regs->portsc1);
- } else {
- portsc = fsl_readl(&dr_regs->portsc1);
- portsc &= ~PORTSCX_PHY_LOW_POWER_SPD;
- fsl_writel(portsc, &dr_regs->portsc1);
- }
- }
-}
-
-
-/* workaroud for some boards, maybe there is a large capacitor between the ground and the Vbus
- * that will cause the vbus dropping very slowly when device is detached,
- * may cost 2-3 seconds to below 0.8V */
-static void udc_wait_b_session_low(void)
-{
- u32 temp;
- u32 wait = 5000; /* max wait time is 5000 ms */
- /* if we are in host mode, don't need to care the B session */
- if ((fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID) == 0)
- return;
- /* if the udc is dettached , there will be a suspend irq */
- if (udc_controller->usb_state != USB_STATE_SUSPENDED)
- return;
- temp = fsl_readl(&dr_regs->otgsc);
- temp &= ~(OTGSC_B_SESSION_VALID_IRQ_EN );
- fsl_writel(temp, &dr_regs->otgsc);
+ if (udc_controller->pdata->usb_clock_for_pm)
+ udc_controller->pdata->usb_clock_for_pm(true);
- do {
- if (!(fsl_readl(&dr_regs->otgsc) & OTGSC_B_SESSION_VALID))
- break;
- mdelay(1);
- wait -= 1;
- } while(wait);
- if (!wait)
- printk("ERROR!!!!!: the vbus can not be lower then 0.8V for 5 seconds, Pls Check your HW design\n");
- temp = fsl_readl(&dr_regs->otgsc);
- temp |= (OTGSC_B_SESSION_VALID_IRQ_EN );
- fsl_writel(temp, &dr_regs->otgsc);
+ /* Due to mx35/mx25's phy's bug */
+ reset_phy();
+ temp = fsl_readl(&dr_regs->portsc1);
+ temp &= ~PORTSCX_PHY_LOW_POWER_SPD;
+ fsl_writel(temp, &dr_regs->portsc1);
+ }
}
static int dr_controller_setup(struct fsl_udc *udc)
@@ -490,20 +448,23 @@ static void dr_controller_run(struct fsl_udc *udc)
fsl_writel(temp, &dr_regs->usbintr);
- /* enable BSV irq */
- temp = fsl_readl(&dr_regs->otgsc);
- temp |= OTGSC_B_SESSION_VALID_IRQ_EN;
- fsl_writel(temp, &dr_regs->otgsc);
+ if (device_may_wakeup(udc_controller->gadget.dev.parent)) {
+ /* enable BSV irq */
+ temp = fsl_readl(&dr_regs->otgsc);
+ temp |= OTGSC_B_SESSION_VALID_IRQ_EN;
+ fsl_writel(temp, &dr_regs->otgsc);
+ }
/* If vbus not on and used low power mode */
- if (!(temp & OTGSC_B_SESSION_VALID)) {
- /* Set stopped before low power mode */
- udc->stopped = 1;
+ if (!(fsl_readl(&dr_regs->otgsc) & OTGSC_B_SESSION_VALID)
+ && device_may_wakeup(udc_controller->gadget.dev.parent)) {
/* enable wake up */
dr_wake_up_enable(udc, true);
- /* enter lower power mode */
+ /* Set stopped before low power mode */
+ udc->stopped = 1;
+ /* close PHY clock */
dr_phy_low_power_mode(udc, true);
- printk(KERN_INFO "%s: udc enter low power mode \n", __func__);
+ printk(KERN_INFO "udc enter low power mode \n");
} else {
#ifdef CONFIG_ARCH_MX37
/*
@@ -515,11 +476,11 @@ static void dr_controller_run(struct fsl_udc *udc)
#endif
/* Clear stopped bit */
udc->stopped = 0;
-
- /* The usb line has already been connected to pc */
+ /* Set controller to Run */
temp = fsl_readl(&dr_regs->usbcmd);
temp |= USB_CMD_RUN_STOP;
fsl_writel(temp, &dr_regs->usbcmd);
+ printk(KERN_INFO "udc run \n");
}
return;
@@ -2015,36 +1976,15 @@ static void suspend_irq(struct fsl_udc *udc)
udc->driver->suspend(&udc->gadget);
}
-/* Process Wake up interrupt
- * Be careful that some boards will use ID pin to control the VBUS on/off
- * in these case, after the device enter the lowpower mode(clk off,
- * phy lowpower mode, wakeup enable), then an udisk is attaced to the otg port,
- * there will be an Vbus wakeup event and then an ID change wakeup, But the Vbus
- * event is not expected, so there is an workaround that will detect the ID, if ID=0
- * we just need the ID event so we can not disable the wakeup
- *
- * false: host wakeup event
- * true: device wakeup event
-*/
-static bool wake_up_irq(struct fsl_udc *udc)
-{
- /* Because the IC design needs to remove the glitch on ID so the otgsc bit 8 will
- * be delayed max 2 ms to show the real ID pin value
- */
- mdelay(3);
-
- /* if the ID=0, let arc host process the wakeup */
- if (fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID) {
- dr_wake_up_enable(udc_controller, false);
- dr_phy_low_power_mode(udc, false);
- printk("device wake up event\n");
- return true;
- }else {/* wakeup is vbus wake event, but not for device so we need to clear b session */
- int irq_src = fsl_readl(&dr_regs->otgsc) & (~OTGSC_ID_CHANGE_IRQ_STS);
- fsl_writel(irq_src, &dr_regs->otgsc);
- printk("The host wakeup event, should be handled by host\n");
- return false;
- }
+/* Process Wake up interrupt */
+static void wake_up_irq(struct fsl_udc *udc)
+{
+ pr_debug("%s\n", __func__);
+
+ /* disable wake up irq */
+ dr_wake_up_enable(udc_controller, false);
+
+ udc->stopped = 0;
}
static void bus_resume(struct fsl_udc *udc)
@@ -2113,48 +2053,43 @@ static void reset_irq(struct fsl_udc *udc)
bool try_wake_up_udc(struct fsl_udc *udc)
{
u32 irq_src;
- bool b_device;
/* when udc is stopped, only handle wake up irq */
if (udc->stopped) {
+ if (!device_may_wakeup(&(udc->pdata->pdev->dev)))
+ return false;
+
+ dr_phy_low_power_mode(udc_controller, false);
+
/* check to see if wake up irq */
irq_src = fsl_readl(&dr_regs->usbctrl);
if (irq_src & USB_CTRL_OTG_WUIR) {
- if (wake_up_irq(udc) == false){
- return false; /* host wakeup event */
- }
+ wake_up_irq(udc);
+ } else {
+ dr_phy_low_power_mode(udc_controller, true);
}
}
+ if (!device_may_wakeup(udc_controller->gadget.dev.parent))
+ return true;
+
/* check if Vbus change irq */
irq_src = fsl_readl(&dr_regs->otgsc);
if (irq_src & OTGSC_B_SESSION_VALID_IRQ_STS) {
u32 tmp;
- /* Because the IC design needs to remove the glitch on ID so the otgsc bit 8 will
- * be delayed max 2 ms to show the real ID pin value, as it needs to use ID to judge
- * host or device
- */
- mdelay(3);
- b_device = (irq_src & OTGSC_STS_USB_ID)? true:false;
fsl_writel(irq_src, &dr_regs->otgsc);
- if (!b_device)
- return false;
tmp = fsl_readl(&dr_regs->usbcmd);
/* check BSV bit to see if fall or rise */
if (irq_src & OTGSC_B_SESSION_VALID) {
- if (udc->suspended) /*let the system pm resume the udc */
- return true;
udc->stopped = 0;
fsl_writel(tmp | USB_CMD_RUN_STOP, &dr_regs->usbcmd);
- printk(KERN_INFO "%s: udc out low power mode\n", __func__);
+ printk(KERN_INFO "udc out low power mode\n");
} else {
- printk(KERN_INFO "%s: udc enter low power mode \n", __func__);
- if (udc->driver)
- udc->driver->disconnect(&udc->gadget);
+ printk(KERN_INFO "udc enter low power mode \n");
fsl_writel(tmp & ~USB_CMD_RUN_STOP, &dr_regs->usbcmd);
- udc->stopped = 1;
/* enable wake up */
dr_wake_up_enable(udc, true);
+ udc->stopped = 1;
/* close USB PHY clock */
dr_phy_low_power_mode(udc, true);
return false;
@@ -2163,6 +2098,7 @@ bool try_wake_up_udc(struct fsl_udc *udc)
return true;
}
+
/*
* USB device controller interrupt handler
*/
@@ -2173,29 +2109,15 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)
irqreturn_t status = IRQ_NONE;
unsigned long flags;
- spin_lock_irqsave(&udc->lock, flags);
- if (udc->stopped)
- dr_clk_gate(true);
-
- if (try_wake_up_udc(udc) == false) {
- goto irq_end;
- }
-#ifdef CONFIG_USB_OTG
- /* if no gadget register in this driver, we need do noting */
- if (udc->transceiver->gadget == NULL)
- goto irq_end;
-
- /* only handle device interrupt event */
- if (!(fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID)) {
- goto irq_end;
- }
-#endif
+ if (try_wake_up_udc(udc) == false)
+ return IRQ_NONE;
+ spin_lock_irqsave(&udc->lock, flags);
irq_src = fsl_readl(&dr_regs->usbsts) & fsl_readl(&dr_regs->usbintr);
/* Clear notification bits */
fsl_writel(irq_src, &dr_regs->usbsts);
- VDBG("0x%x\n", irq_src);
+ /* VDBG("irq_src [0x%8x]", irq_src); */
/* Need to resume? */
if (udc->usb_state == USB_STATE_SUSPENDED)
@@ -2240,24 +2162,12 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)
/* Sleep Enable (Suspend) */
if (irq_src & USB_STS_SUSPEND) {
- VDBG("suspend int");
suspend_irq(udc);
status = IRQ_HANDLED;
}
if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) {
- printk(KERN_ERR "Error IRQ %x ", irq_src);
- if (irq_src & USB_STS_SYS_ERR) {
- printk(KERN_ERR "This error can't be recoveried, \
- please reboot your board\n");
- printk(KERN_ERR "If this error happens frequently, \
- please check your dma buffer\n");
- }
- }
-
-irq_end:
- if (udc->stopped){
- dr_clk_gate(false);
+ VDBG("Error IRQ %x ", irq_src);
}
spin_unlock_irqrestore(&udc->lock, flags);
@@ -2272,6 +2182,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
{
int retval = -ENODEV;
unsigned long flags = 0;
+ u32 portsc;
if (!udc_controller)
return -ENODEV;
@@ -2289,18 +2200,17 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
spin_lock_irqsave(&udc_controller->lock, flags);
driver->driver.bus = 0;
- udc_controller->pdata->port_enables = 1;
/* hook up the driver */
udc_controller->driver = driver;
udc_controller->gadget.dev.driver = &driver->driver;
spin_unlock_irqrestore(&udc_controller->lock, flags);
- dr_clk_gate(true);
- /* It doesn't need to switch usb from low power mode to normal mode
- * at otg mode
- */
- if (!udc_controller->transceiver){
- dr_phy_low_power_mode(udc_controller, false);
- }
+
+ if (udc_controller->pdata->usb_clock_for_pm)
+ udc_controller->pdata->usb_clock_for_pm(true);
+
+ portsc = fsl_readl(&dr_regs->portsc1);
+ portsc &= ~PORTSCX_PHY_LOW_POWER_SPD;
+ fsl_writel(portsc, &dr_regs->portsc1);
/* bind udc driver to gadget driver */
retval = driver->bind(&udc_controller->gadget);
@@ -2313,30 +2223,30 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
if (udc_controller->transceiver) {
/* Suspend the controller until OTG enable it */
- udc_controller->suspended = 1;/* let the otg resume it */
+ udc_controller->stopped = 1;
printk(KERN_INFO "Suspend udc for OTG auto detect\n");
dr_wake_up_enable(udc_controller, true);
+ dr_phy_low_power_mode(udc_controller, true);
/* export udc suspend/resume call to OTG */
udc_controller->gadget.dev.driver->suspend = (dev_sus)fsl_udc_suspend;
udc_controller->gadget.dev.driver->resume = (dev_res)fsl_udc_resume;
/* connect to bus through transceiver */
- retval = otg_set_peripheral(udc_controller->transceiver,
- &udc_controller->gadget);
- if (retval < 0) {
- ERR("can't bind to transceiver\n");
- driver->unbind(&udc_controller->gadget);
- udc_controller->gadget.dev.driver = 0;
- udc_controller->driver = 0;
- return retval;
+ if (udc_controller->transceiver) {
+ retval = otg_set_peripheral(udc_controller->transceiver,
+ &udc_controller->gadget);
+ if (retval < 0) {
+ ERR("can't bind to transceiver\n");
+ driver->unbind(&udc_controller->gadget);
+ udc_controller->gadget.dev.driver = 0;
+ udc_controller->driver = 0;
+ return retval;
+ }
}
- //dr_clk_gate(false);
} else {
/* Enable DR IRQ reg and Set usbcmd reg Run bit */
dr_controller_run(udc_controller);
- if (udc_controller->stopped)
- dr_clk_gate(false);
udc_controller->usb_state = USB_STATE_ATTACHED;
udc_controller->ep0_dir = 0;
}
@@ -2344,10 +2254,8 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
udc_controller->gadget.name, driver->driver.name);
out:
- if (retval){
+ if (retval)
printk(KERN_DEBUG "retval %d \n", retval);
- udc_controller->pdata->port_enables = 0;
- }
return retval;
}
EXPORT_SYMBOL(usb_gadget_register_driver);
@@ -2357,6 +2265,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
{
struct fsl_ep *loop_ep;
unsigned long flags;
+ u32 portsc;
if (!udc_controller)
return -ENODEV;
@@ -2364,16 +2273,15 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
if (!driver || driver != udc_controller->driver || !driver->unbind)
return -EINVAL;
- if(udc_controller->stopped)
- dr_clk_gate(true);
-
if (udc_controller->transceiver)
(void)otg_set_peripheral(udc_controller->transceiver, 0);
+ /* open phy clock for following operation */
+ dr_phy_low_power_mode(udc_controller, false);
+
/* stop DR, disable intr */
dr_controller_stop(udc_controller);
- udc_controller->pdata->port_enables = 0;
/* in fact, no needed */
udc_controller->usb_state = USB_STATE_ATTACHED;
udc_controller->ep0_dir = 0;
@@ -2395,11 +2303,14 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
udc_controller->gadget.dev.driver = 0;
udc_controller->driver = 0;
- if (udc_controller->gadget.is_otg) {
- dr_wake_up_enable(udc_controller, true);
- }
+ dr_wake_up_enable(udc_controller, false);
- dr_phy_low_power_mode(udc_controller, true);
+ portsc = fsl_readl(&dr_regs->portsc1);
+ portsc |= PORTSCX_PHY_LOW_POWER_SPD;
+ fsl_writel(portsc, &dr_regs->portsc1);
+
+ if (udc_controller->pdata->usb_clock_for_pm)
+ udc_controller->pdata->usb_clock_for_pm(false);
printk(KERN_INFO "unregistered gadget driver '%s'\r\n",
driver->driver.name);
@@ -2814,7 +2725,6 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
ret = -ENODEV;
goto err1a;
}
- udc_controller->gadget.is_otg = 1;
#endif
if ((pdev->dev.parent) &&
@@ -2915,6 +2825,12 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
if (ret < 0)
goto err3;
+ if (udc_controller->transceiver) {
+ udc_controller->gadget.is_otg = 1;
+ /* now didn't support lpm in OTG mode*/
+ device_set_wakeup_capable(&pdev->dev, 0);
+ }
+
/* setup QH and epctrl for ep0 */
ep0_setup(udc_controller);
@@ -2957,29 +2873,24 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
#ifdef POSTPONE_FREE_LAST_DTD
last_free_td = NULL;
#endif
-
#ifndef CONFIG_USB_OTG
/* disable all INTR */
fsl_writel(0, &dr_regs->usbintr);
+
dr_wake_up_enable(udc_controller, false);
-#else
- dr_wake_up_enable(udc_controller, true);
-#endif
+ udc_controller->stopped = 1;
-/*
- * As mx25/mx35 does not implement clk_gate, should not let phy to low
- * power mode due to IC bug
- */
#if !(defined CONFIG_ARCH_MX35 || defined CONFIG_ARCH_MX25)
{
- dr_phy_low_power_mode(udc_controller, true);
+ u32 portsc;
+ portsc = fsl_readl(&dr_regs->portsc1);
+ portsc |= PORTSCX_PHY_LOW_POWER_SPD;
+ fsl_writel(portsc, &dr_regs->portsc1);
}
#endif
- udc_controller->stopped = 1;
-
- /* let the gadget register function open the clk */
- dr_clk_gate(false);
-
+ if (udc_controller->pdata->usb_clock_for_pm)
+ udc_controller->pdata->usb_clock_for_pm(false);
+#endif
create_proc_file();
return 0;
@@ -3006,6 +2917,9 @@ err1a:
*/
static int __exit fsl_udc_remove(struct platform_device *pdev)
{
+#ifndef CONFIG_USB_OTG
+ struct resource *res;
+#endif
struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
DECLARE_COMPLETION(done);
@@ -3014,8 +2928,7 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
return -ENODEV;
udc_controller->done = &done;
/* open USB PHY clock */
- if (udc_controller->stopped)
- dr_clk_gate(true);
+ dr_phy_low_power_mode(udc_controller, false);
/* DR has been stopped in usb_gadget_unregister_driver() */
remove_proc_file();
@@ -3038,11 +2951,8 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
iounmap((u8 __iomem *)dr_regs);
#ifndef CONFIG_USB_OTG
-{
- struct resource *res;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
release_mem_region(res->start, resource_size(res));
-}
#endif
device_unregister(&udc_controller->gadget.dev);
@@ -3056,8 +2966,6 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
if (pdata->platform_uninit)
pdata->platform_uninit(pdata);
- if (udc_controller->stopped)
- dr_clk_gate(false);
return 0;
}
@@ -3065,19 +2973,10 @@ static int udc_suspend(struct fsl_udc *udc)
{
u32 mode, usbcmd;
- /*
- * When it is the PM suspend routine and the device has no
- * abilities to wakeup system, it should not set wakeup enable.
- * Otherwise, the system will wakeup even the user only wants to
- * charge using usb
- */
- if (udc_controller->gadget.dev.parent->power.status
- == DPM_SUSPENDING) {
- if (!device_may_wakeup(udc_controller->gadget.dev.parent))
- dr_wake_up_enable(udc, false);
- else
- dr_wake_up_enable(udc, true);
- }
+ /* open clock for register access */
+ if (udc_controller->pdata->usb_clock_for_pm)
+ udc_controller->pdata->usb_clock_for_pm(true);
+
mode = fsl_readl(&dr_regs->usbmode) & USB_MODE_CTRL_MODE_MASK;
usbcmd = fsl_readl(&dr_regs->usbcmd);
@@ -3088,8 +2987,9 @@ static int udc_suspend(struct fsl_udc *udc)
* PM suspend. Remember this fact, so that we will leave the
* controller stopped at PM resume time.
*/
- if (udc->suspended) {
+ if (udc->stopped) {
pr_debug("gadget already stopped, leaving early\n");
+ udc->already_stopped = 1;
goto out;
}
@@ -3098,30 +2998,22 @@ static int udc_suspend(struct fsl_udc *udc)
goto out;
}
- /* For some buggy hardware designs, see comment of this function for detail */
- udc_wait_b_session_low();
-
udc->stopped = 1;
-
- /* stop the controller */
- usbcmd = fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP;
- fsl_writel(usbcmd, &dr_regs->usbcmd);
-
/* if the suspend is not for switch to host in otg mode */
if ((!(udc->gadget.is_otg)) ||
(fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID)) {
- if (device_may_wakeup(udc_controller->gadget.dev.parent)) {
- dr_wake_up_enable(udc, true);
- }
+ dr_wake_up_enable(udc, true);
+ dr_phy_low_power_mode(udc, true);
}
- dr_phy_low_power_mode(udc, true);
+ /* stop the controller */
+ usbcmd = fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP;
+ fsl_writel(usbcmd, &dr_regs->usbcmd);
+
printk(KERN_INFO "USB Gadget suspended\n");
out:
- udc->suspended++;
- if (udc->suspended > 2)
- printk("ERROR: suspended times > 2\n");
-
+ if (udc_controller->pdata->usb_clock_for_pm)
+ udc_controller->pdata->usb_clock_for_pm(false);
return 0;
}
@@ -3131,24 +3023,13 @@ out:
-----------------------------------------------------------------*/
static int fsl_udc_suspend(struct platform_device *pdev, pm_message_t state)
{
- int ret;
-#ifdef CONFIG_USB_OTG
- if (udc_controller->transceiver->gadget == NULL)
- return 0;
-#endif
- if (udc_controller->stopped)
- dr_clk_gate(true);
if (((!(udc_controller->gadget.is_otg)) ||
(fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID)) &&
(udc_controller->usb_state > USB_STATE_POWERED) &&
- (udc_controller->usb_state < USB_STATE_SUSPENDED)) {
- return -EBUSY;/* keep the clk on */
- }
- else
- ret = udc_suspend(udc_controller);
- dr_clk_gate(false);
+ (udc_controller->usb_state < USB_STATE_SUSPENDED))
+ return -EBUSY;
- return ret;
+ return udc_suspend(udc_controller);
}
/*-----------------------------------------------------------------
@@ -3157,54 +3038,30 @@ static int fsl_udc_suspend(struct platform_device *pdev, pm_message_t state)
*-----------------------------------------------------------------*/
static int fsl_udc_resume(struct platform_device *pdev)
{
- pr_debug("%s(): stopped %d suspended %d\n", __func__,
- udc_controller->stopped, udc_controller->suspended);
- printk("udc resume\n");
-#ifdef CONFIG_USB_OTG
- if (udc_controller->transceiver->gadget == NULL)
- return 0;
-#endif
- if (udc_controller->stopped)
- dr_clk_gate(true);
+ pr_debug("%s(): stopped %d already_stopped %d\n", __func__,
+ udc_controller->stopped, udc_controller->already_stopped);
+
/*
* If the controller was stopped at suspend time, then
* don't resume it now.
*/
- /*
- * If it is PM resume routine, the udc is at low power mode,
- * and the udc has no abilities to wakeup system, it should
- * set the abilities to wakeup itself. Otherwise, the usb
- * subsystem will not leave from low power mode.
- */
- if (!device_may_wakeup(udc_controller->gadget.dev.parent) &&
- udc_controller->gadget.dev.parent->power.status
- == DPM_RESUMING){
- dr_wake_up_enable(udc_controller, true);
- }
-
- if (--udc_controller->suspended) {
- printk("gadget was already stopped, leaving early\n");
- goto out;
+ if (udc_controller->already_stopped) {
+ udc_controller->already_stopped = 0;
+ pr_debug("gadget was already stopped, leaving early\n");
+ return 0;
}
+
/* Enable DR irq reg and set controller Run */
if (udc_controller->stopped) {
- /* if in host mode, we need to do nothing */
- if ((fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID) == 0) {
- goto out;
- }
dr_wake_up_enable(udc_controller, false);
dr_phy_low_power_mode(udc_controller, false);
- mdelay(10);
+ mdelay(1);
+
dr_controller_setup(udc_controller);
dr_controller_run(udc_controller);
}
udc_controller->usb_state = USB_STATE_ATTACHED;
udc_controller->ep0_dir = 0;
-out:
- /* if udc is resume by otg id change and no device
- * connecting to the otg, otg will enter low power mode*/
- if (udc_controller->stopped)
- dr_clk_gate(false);
printk(KERN_INFO "USB Gadget resumed\n");
return 0;
diff --git a/drivers/usb/gadget/arcotg_udc.h b/drivers/usb/gadget/arcotg_udc.h
index 8d344acb8fef..4574954bf4f4 100644
--- a/drivers/usb/gadget/arcotg_udc.h
+++ b/drivers/usb/gadget/arcotg_udc.h
@@ -266,7 +266,6 @@ struct usb_sys_interface {
#define PORTSCX_SPEED_BIT_POS (26)
/* OTGSC Register Bit Masks */
-#define OTGSC_ID_CHANGE_IRQ_STS (1 << 16)
#define OTGSC_B_SESSION_VALID_IRQ_EN (1 << 27)
#define OTGSC_B_SESSION_VALID_IRQ_STS (1 << 19)
#define OTGSC_B_SESSION_VALID (1 << 11)
@@ -594,15 +593,9 @@ struct fsl_udc {
struct otg_transceiver *transceiver;
unsigned softconnect:1;
unsigned vbus_active:1;
- unsigned remote_wakeup:1;
- /* we must distinguish the stopped and suspended state,
- * stopped means the udc enter lowpower mode, suspended
- * means the udc is suspended by system pm or by otg
- * switching to host mode.if the udc in suspended state
- * it also in the stopped state, while if the udc in
- * stopped state,it may not be in the suspended state*/
unsigned stopped:1;
- int suspended;
+ unsigned remote_wakeup:1;
+ unsigned already_stopped:1;
struct ep_queue_head *ep_qh; /* Endpoints Queue-Head */
struct fsl_req *status_req; /* ep0 status request */
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index 2e79b8c389a4..59e85234fa0a 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -236,7 +236,6 @@ static int config_buf(struct usb_configuration *config,
int len = USB_BUFSIZ - USB_DT_CONFIG_SIZE;
struct usb_function *f;
int status;
- int interfaceCount = 0;
/* write the config descriptor */
c = buf;
@@ -267,16 +266,8 @@ static int config_buf(struct usb_configuration *config,
descriptors = f->hs_descriptors;
else
descriptors = f->descriptors;
- if (f->hidden || !descriptors || descriptors[0] == NULL) {
- for (; f != config->interface[interfaceCount];) {
- interfaceCount++;
- c->bNumInterfaces--;
- }
+ if (!descriptors)
continue;
- }
- for (; f != config->interface[interfaceCount];)
- interfaceCount++;
-
status = usb_descriptor_fillbuf(next, len,
(const struct usb_descriptor_header **) descriptors);
if (status < 0)
@@ -765,11 +756,11 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
case USB_REQ_GET_CONFIGURATION:
if (ctrl->bRequestType != USB_DIR_IN)
goto unknown;
- if (cdev->config) {
+ if (cdev->config)
*(u8 *)req->buf = cdev->config->bConfigurationValue;
- value = min(w_length, (u16) 1);
- } else
+ else
*(u8 *)req->buf = 0;
+ value = min(w_length, (u16) 1);
break;
/* function drivers must handle get/set altsetting; if there's
@@ -819,9 +810,6 @@ unknown:
*/
if ((ctrl->bRequestType & USB_RECIP_MASK)
== USB_RECIP_INTERFACE) {
- if (cdev->config == NULL)
- return value;
-
f = cdev->config->interface[intf];
if (f && f->setup)
value = f->setup(f, ctrl);
@@ -836,25 +824,6 @@ unknown:
value = c->setup(c, ctrl);
}
- /* If the vendor request is not processed (value < 0),
- * call all device registered configure setup callbacks
- * to process it.
- * This is used to handle the following cases:
- * - vendor request is for the device and arrives before
- * setconfiguration.
- * - Some devices are required to handle vendor request before
- * setconfiguration such as MTP, USBNET.
- */
-
- if (value < 0) {
- struct usb_configuration *cfg;
-
- list_for_each_entry(cfg, &cdev->configs, list) {
- if (cfg && cfg->setup)
- value = cfg->setup(cfg, ctrl);
- }
- }
-
goto done;
}
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c
index 7dd1a8bbe382..7953948bfe4a 100644
--- a/drivers/usb/gadget/f_acm.c
+++ b/drivers/usb/gadget/f_acm.c
@@ -761,12 +761,3 @@ int __init acm_bind_config(struct usb_configuration *c, u8 port_num)
kfree(acm);
return status;
}
-
-int __init acm_function_add(struct usb_composite_dev *cdev,
- struct usb_configuration *c)
-{
- int ret = acm_bind_config(c, 0);
- if (ret == 0)
- gserial_setup(c->cdev->gadget, 1);
- return ret;
-}
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c
index 8b0a13202573..66105ce49672 100644
--- a/drivers/usb/gadget/file_storage.c
+++ b/drivers/usb/gadget/file_storage.c
@@ -728,7 +728,6 @@ struct fsg_dev {
#include "fsl_updater.h"
#endif
-static int do_set_interface(struct fsg_dev *fsg, int altsetting);
typedef void (*fsg_routine_t)(struct fsg_dev *);
static int exception_in_progress(struct fsg_dev *fsg)
@@ -1109,14 +1108,6 @@ static void fsg_disconnect(struct usb_gadget *gadget)
struct fsg_dev *fsg = get_gadget_data(gadget);
DBG(fsg, "disconnect or port reset\n");
- /*
- * The disconnect exception will call do_set_config, and therefore will
- * visit controller registers. However it is a delayed event, and will be
- * handled at another process, so the controller maybe have already close the
- * usb clock.*/
- if (fsg->new_config)
- do_set_interface(fsg, -1);/* disable the interface */
-
raise_exception(fsg, FSG_STATE_DISCONNECT);
}
diff --git a/drivers/usb/host/ehci-arc.c b/drivers/usb/host/ehci-arc.c
index 5cfcf169e7c7..21133fb8e47a 100644
--- a/drivers/usb/host/ehci-arc.c
+++ b/drivers/usb/host/ehci-arc.c
@@ -23,28 +23,9 @@
#include <linux/fsl_devices.h>
#include <linux/usb/otg.h>
-#include "../core/usb.h"
#include "ehci-fsl.h"
#include <mach/fsl_usb.h>
-extern int usb_host_wakeup_irq(struct device *wkup_dev);
-extern void usb_host_set_wakeup(struct device *wkup_dev, bool para);
-static void fsl_usb_lowpower_mode(struct fsl_usb2_platform_data *pdata, bool enable)
-{
- if (enable){
- if (pdata->phy_lowpower_suspend)
- pdata->phy_lowpower_suspend(true);
- } else {
- if (pdata->phy_lowpower_suspend)
- pdata->phy_lowpower_suspend(false);
- }
-}
-
-static void fsl_usb_clk_gate(struct fsl_usb2_platform_data *pdata, bool enable)
-{
- if (pdata->usb_clock_for_pm)
- pdata->usb_clock_for_pm(enable);
-}
#undef EHCI_PROC_PTC
#ifdef EHCI_PROC_PTC /* /proc PORTSC:PTC support */
/*
@@ -109,39 +90,8 @@ static int ehci_testmode_init(struct ehci_hcd *ehci)
#endif /* /proc PORTSC:PTC support */
-/*
- * This irq is used to open the hw access and let usb_hcd_irq process the usb event
- * ehci_fsl_pre_irq will be called before usb_hcd_irq
- */
-static irqreturn_t ehci_fsl_pre_irq(int irq, void *dev)
-{
- struct platform_device *pdev = (struct platform_device *)dev;
- struct usb_hcd *hcd = platform_get_drvdata(pdev);
- struct ehci_hcd *ehci = hcd_to_ehci(hcd);
- struct fsl_usb2_platform_data *pdata;
-
- pdata = hcd->self.controller->platform_data;
-
- /* if it is an otg module and in b device mode, we need to do noting here */
- if (ehci->transceiver && !ehci->transceiver->default_a)
- return IRQ_NONE;
-
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
- /* Need to open clk for accessing the register */
- fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
- /* if receive a remote wakeup interrrupt after suspend */
- if (usb_host_wakeup_irq(hcd->self.controller)) {
- printk("host wakeup event happens\n");
- /* disable remote wake up irq */
- usb_host_set_wakeup(hcd->self.controller, false);
- fsl_usb_lowpower_mode(pdata, false);
- set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
- }else {
- fsl_usb_clk_gate(hcd->self.controller->platform_data, false);
- }
- }
- return IRQ_NONE;
-}
+/* configure so an HC device and id are always provided */
+/* always called with process context; sleeping is OK */
/**
* usb_hcd_fsl_probe - initialize FSL-based HCDs
@@ -232,18 +182,9 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver,
fsl_platform_set_host_mode(hcd);
hcd->power_budget = pdata->power_budget;
- /*
- * The ehci_fsl_pre_irq must be registered before usb_hcd_irq, in that case
- * it can be called before usb_hcd_irq when irq occurs
- */
- retval = request_irq(irq, ehci_fsl_pre_irq, IRQF_SHARED,
- "fsl ehci pre interrupt", (void *)pdev);
- if (retval != 0)
- goto err4;
-
retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
if (retval != 0)
- goto err5;
+ goto err4;
fsl_platform_set_vbus_power(pdata, 1);
@@ -258,7 +199,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver,
if (!ehci->transceiver) {
printk(KERN_ERR "can't find transceiver\n");
retval = -ENODEV;
- goto err5;
+ goto err4;
}
retval = otg_set_host(ehci->transceiver, &ehci_to_hcd(ehci)->self);
@@ -275,8 +216,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver,
fsl_platform_set_ahb_burst(hcd);
ehci_testmode_init(hcd_to_ehci(hcd));
return retval;
-err5:
- free_irq(irq, (void *)pdev);
+
err4:
iounmap(hcd->regs);
err3:
@@ -291,6 +231,9 @@ err1:
return retval;
}
+/* may be called without controller electrically present */
+/* may be called with controller, bus, and devices active */
+
/**
* usb_hcd_fsl_remove - shutdown processing for FSL-based HCDs
* @dev: USB Host Controller being removed
@@ -381,59 +324,6 @@ static int ehci_fsl_reinit(struct ehci_hcd *ehci)
return 0;
}
-static int ehci_fsl_bus_suspend(struct usb_hcd *hcd)
-{
- int ret = 0;
- struct fsl_usb2_platform_data *pdata;
- pdata = hcd->self.controller->platform_data;
- pr_debug("%s, %s\n", __func__, pdata->name);
-
- /* the host is already at low power mode */
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
- return 0;
- }
-
- pr_debug("%s, it is the host mode, %s\n", __func__, pdata->name);
-
- ehci_bus_suspend(hcd);
-
- if (pdata->platform_suspend)
- pdata->platform_suspend(pdata);
-
- usb_host_set_wakeup(hcd->self.controller, true);
- fsl_usb_lowpower_mode(pdata, true);
- fsl_usb_clk_gate(hcd->self.controller->platform_data, false);
- clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-
- return ret;
-}
-
-static int ehci_fsl_bus_resume(struct usb_hcd *hcd)
-{
- int ret = 0;
- struct fsl_usb2_platform_data *pdata;
-
- pdata = hcd->self.controller->platform_data;
- pr_debug("%s, %s\n", __func__, pdata->name);
-
- /* if it is a remote wakeup, it will open clock and clear PHCD automatically */
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
- set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
- fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
- usb_host_set_wakeup(hcd->self.controller, false);
- fsl_usb_lowpower_mode(pdata, false);
- }
-
- if (pdata->platform_resume)
- pdata->platform_resume(pdata);
- ret = ehci_bus_resume(hcd);
- if (ret)
- return ret;
-
- return ret;
-}
-
-
/* called during probe() after chip reset completes */
static int ehci_fsl_setup(struct usb_hcd *hcd)
{
@@ -506,8 +396,8 @@ static const struct hc_driver ehci_fsl_hc_driver = {
*/
.hub_status_data = ehci_hub_status_data,
.hub_control = ehci_hub_control,
- .bus_suspend = ehci_fsl_bus_suspend,
- .bus_resume = ehci_fsl_bus_resume,
+ .bus_suspend = ehci_bus_suspend,
+ .bus_resume = ehci_bus_resume,
.start_port_reset = ehci_start_port_reset,
.relinquish_port = ehci_relinquish_port,
.port_handed_over = ehci_port_handed_over,
@@ -548,36 +438,13 @@ static int ehci_fsl_drv_suspend(struct platform_device *pdev,
{
struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
- struct usb_device *roothub = hcd->self.root_hub;
- u32 port_status;
+ u32 tmp, port_status;
struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
- /* Only handles OTG mode switch event, system suspend event will be done in bus suspend */
- if (pdev->dev.power.status == DPM_SUSPENDING){
- pr_debug("%s, system pm event \n", __func__);
- if (!device_may_wakeup(&(pdev->dev))){
- /* Need open clock for register access */
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
- fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
- usb_host_set_wakeup(hcd->self.controller, false);
- fsl_usb_clk_gate(hcd->self.controller->platform_data, false);
- }
- return 0;
- }
- /* only the otg host can go here */
- /* wait for all usb device on the hcd dettached */
- while(roothub->children[0] != NULL)
- msleep(1);
- if ((pdata->operating_mode != FSL_USB2_MPH_HOST) && (!(hcd->state & HC_STATE_SUSPENDED)))
- {
- usb_lock_device(roothub);
- usb_external_suspend_device(roothub, PMSG_USER_SUSPEND);
- usb_unlock_device(roothub);
- }
-
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
- fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
- set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+ if (device_may_wakeup(&(pdev->dev))) {
+ /* Need open clock for register access */
+ if (pdata->usb_clock_for_pm)
+ pdata->usb_clock_for_pm(true);
}
#ifdef DEBUG
@@ -590,9 +457,27 @@ static int ehci_fsl_drv_suspend(struct platform_device *pdev,
pdata->suspended, pdata->already_suspended, mode, tmp);
#endif
+ /*
+ * If the controller is already suspended, then this must be a
+ * PM suspend. Remember this fact, so that we will leave the
+ * controller suspended at PM resume time.
+ */
+ if (pdata->suspended) {
+ pr_debug("%s: already suspended, leaving early\n", __func__);
+ pdata->already_suspended = 1;
+ goto err1;
+ }
+
+ pr_debug("%s: suspending...\n", __func__);
+
printk(KERN_INFO "USB Host suspended\n");
port_status = ehci_readl(ehci, &ehci->regs->port_status[0]);
+ pdev->dev.power.power_state = PMSG_SUSPEND;
+
+ /* ignore non-host interrupts */
+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+
/* save EHCI registers */
pdata->pm_command = ehci_readl(ehci, &ehci->regs->command);
pdata->pm_command &= ~CMD_RUN;
@@ -611,11 +496,25 @@ static int ehci_fsl_drv_suspend(struct platform_device *pdev,
/* clear PHCD bit */
pdata->pm_portsc &= ~PORT_PHCD;
- if (test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
- //fsl_usb_lowpower_mode(pdata ,true);
- //usb_host_set_wakeup(hcd->self.controller, true);
- fsl_usb_clk_gate(hcd->self.controller->platform_data, false);
- clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+
+ pdata->suspended = 1;
+
+ if (!device_may_wakeup(&(pdev->dev))) {
+ /* clear PP to cut power to the port */
+ tmp = ehci_readl(ehci, &ehci->regs->port_status[0]);
+ tmp &= ~PORT_POWER;
+ ehci_writel(ehci, tmp, &ehci->regs->port_status[0]);
+ goto err1;
+ }
+
+ tmp = ehci_readl(ehci, &ehci->regs->port_status[0]);
+
+ if (pdata->platform_suspend)
+ pdata->platform_suspend(pdata);
+err1:
+ if (device_may_wakeup(&(pdev->dev))) {
+ if (pdata->usb_clock_for_pm)
+ pdata->usb_clock_for_pm(false);
}
return 0;
}
@@ -624,35 +523,47 @@ static int ehci_fsl_drv_resume(struct platform_device *pdev)
{
struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
- struct usb_device *roothub = hcd->self.root_hub;
u32 tmp;
struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
- /* Only handles OTG mode switch event */
- if (pdev->dev.power.status == DPM_RESUMING){
- pr_debug("%s, system pm event \n", __func__);
- if (hcd->self.is_b_host) {
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
- fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
- }
- usb_host_set_wakeup(hcd->self.controller, true);
-
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
- fsl_usb_clk_gate(hcd->self.controller->platform_data, false);
- }
- }
+
+ pr_debug("%s('%s'): suspend=%d already_suspended=%d\n", __func__,
+ pdata->name, pdata->suspended, pdata->already_suspended);
+
+ /*
+ * If the controller was already suspended at suspend time,
+ * then don't resume it now.
+ */
+ if (pdata->already_suspended) {
+ pr_debug("already suspended, leaving early\n");
+ pdata->already_suspended = 0;
return 0;
}
- if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
- set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
- fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
- //usb_host_set_wakeup(hcd->self.controller, false);
- //fsl_usb_lowpower_mode(pdata, false);
+
+ if (!pdata->suspended) {
+ pr_debug("not suspended, leaving early\n");
+ return 0;
}
- printk("USB Host resume ... %s\n", pdata->name);
+ /* If hcd is resumed by non-usb wakeup events,
+ * then usb clocks are still not open when come here */
+ if (device_may_wakeup(&(pdev->dev))) {
+ /* Need open clock for register access */
+ if (pdata->usb_clock_for_pm)
+ pdata->usb_clock_for_pm(true);
+ }
+
+ tmp = ehci_readl(ehci, &ehci->regs->port_status[0]);
+
+ pdata->suspended = 0;
+
+ pr_debug("%s resuming...\n", __func__);
+
/* set host mode */
fsl_platform_set_host_mode(hcd);
+ if (pdata->platform_resume)
+ pdata->platform_resume(pdata);
+
/* restore EHCI registers */
ehci_writel(ehci, pdata->pm_portsc, &ehci->regs->port_status[0]);
ehci_writel(ehci, pdata->pm_command, &ehci->regs->command);
@@ -664,21 +575,32 @@ static int ehci_fsl_drv_resume(struct platform_device *pdev)
ehci_writel(ehci, pdata->pm_configured_flag,
&ehci->regs->configured_flag);
+ /* set bit should be done by wakeup irq routine if may wakeup */
+ if (!device_may_wakeup(&(pdev->dev)))
+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+ else
+ while (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
+ msleep(1);
+
+ pdev->dev.power.power_state = PMSG_ON;
tmp = ehci_readl(ehci, &ehci->regs->command);
tmp |= CMD_RUN;
ehci_writel(ehci, tmp, &ehci->regs->command);
- if ((hcd->state & HC_STATE_SUSPENDED)){
- usb_lock_device(roothub);
- usb_external_resume_device(roothub, PMSG_USER_RESUME);
- usb_unlock_device(roothub);
+ usb_hcd_resume_root_hub(hcd);
+
+ printk(KERN_INFO "USB Host resumed\n");
+
+ if (device_may_wakeup(&(pdev->dev))) {
+ if (pdata->usb_clock_for_pm)
+ pdata->usb_clock_for_pm(false);
}
- printk(KERN_INFO "USB Host resume ok\n");
return 0;
}
-#endif
+#endif /* CONFIG_USB_OTG */
+
MODULE_ALIAS("platform:fsl-ehci");
static struct platform_driver ehci_fsl_driver = {
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 1a9266e7e798..f0d6627fb981 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -28,6 +28,7 @@
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/timer.h>
+#include <linux/ktime.h>
#include <linux/list.h>
#include <linux/interrupt.h>
#include <linux/reboot.h>
@@ -660,6 +661,7 @@ static int ehci_run (struct usb_hcd *hcd)
ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
msleep(5);
up_write(&ehci_cf_port_reset_rwsem);
+ ehci->last_periodic_enable = ktime_get_real();
temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase));
ehci_info (ehci,
@@ -767,9 +769,10 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
/* start 20 msec resume signaling from this port,
* and make khubd collect PORT_STAT_C_SUSPEND to
- * stop that signaling.
+ * stop that signaling. Use 5 ms extra for safety,
+ * like usb_port_resume() does.
*/
- ehci->reset_done [i] = jiffies + msecs_to_jiffies (20);
+ ehci->reset_done[i] = jiffies + msecs_to_jiffies(25);
ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
mod_timer(&hcd->rh_timer, ehci->reset_done[i]);
}
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
index 44ff32306362..2eac68f54ccd 100644
--- a/drivers/usb/host/ehci-hub.c
+++ b/drivers/usb/host/ehci-hub.c
@@ -112,7 +112,6 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
int port;
int mask;
- printk("%s\n", __func__);
ehci_dbg(ehci, "suspend root hub\n");
if (time_before (jiffies, ehci->next_statechange))
@@ -120,9 +119,26 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
del_timer_sync(&ehci->watchdog);
del_timer_sync(&ehci->iaa_watchdog);
- port = HCS_N_PORTS (ehci->hcs_params);
spin_lock_irq (&ehci->lock);
+ /* Once the controller is stopped, port resumes that are already
+ * in progress won't complete. Hence if remote wakeup is enabled
+ * for the root hub and any ports are in the middle of a resume or
+ * remote wakeup, we must fail the suspend.
+ */
+ if (hcd->self.root_hub->do_remote_wakeup) {
+ port = HCS_N_PORTS(ehci->hcs_params);
+ while (port--) {
+ if (ehci->reset_done[port] != 0) {
+ spin_unlock_irq(&ehci->lock);
+ ehci_dbg(ehci, "suspend failed because "
+ "port %d is resuming\n",
+ port + 1);
+ return -EBUSY;
+ }
+ }
+ }
+
/* stop schedules, clean any completed work */
if (HC_IS_RUNNING(hcd->state)) {
ehci_quiesce (ehci);
@@ -138,6 +154,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
*/
ehci->bus_suspended = 0;
ehci->owned_ports = 0;
+ port = HCS_N_PORTS(ehci->hcs_params);
while (port--) {
u32 __iomem *reg = &ehci->regs->port_status [port];
u32 t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
index c2f1b7df918c..c757a706843c 100644
--- a/drivers/usb/host/ehci-pci.c
+++ b/drivers/usb/host/ehci-pci.c
@@ -72,6 +72,12 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
int retval;
switch (pdev->vendor) {
+ case PCI_VENDOR_ID_INTEL:
+ if (pdev->device == 0x27cc) {
+ ehci->broken_periodic = 1;
+ ehci_info(ehci, "using broken periodic workaround\n");
+ }
+ break;
case PCI_VENDOR_ID_TOSHIBA_2:
/* celleb's companion chip */
if (pdev->device == 0x01b5) {
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
index 7673554fa64d..1ae9faf1f8c2 100644
--- a/drivers/usb/host/ehci-q.c
+++ b/drivers/usb/host/ehci-q.c
@@ -475,8 +475,20 @@ halt:
* we must clear the TT buffer (11.17.5).
*/
if (unlikely(last_status != -EINPROGRESS &&
- last_status != -EREMOTEIO))
- ehci_clear_tt_buffer(ehci, qh, urb, token);
+ last_status != -EREMOTEIO)) {
+ /* The TT's in some hubs malfunction when they
+ * receive this request following a STALL (they
+ * stop sending isochronous packets). Since a
+ * STALL can't leave the TT buffer in a busy
+ * state (if you believe Figures 11-48 - 11-51
+ * in the USB 2.0 spec), we won't clear the TT
+ * buffer in this case. Strictly speaking this
+ * is a violation of the spec.
+ */
+ if (last_status != -EPIPE)
+ ehci_clear_tt_buffer(ehci, qh, urb,
+ token);
+ }
}
/* if we're removing something not at the queue head,
@@ -790,9 +802,10 @@ qh_make (
* But interval 1 scheduling is simpler, and
* includes high bandwidth.
*/
- dbg ("intr period %d uframes, NYET!",
- urb->interval);
- goto done;
+ urb->interval = 1;
+ } else if (qh->period > ehci->periodic_size) {
+ qh->period = ehci->periodic_size;
+ urb->interval = qh->period << 3;
}
} else {
int think_time;
@@ -815,6 +828,10 @@ qh_make (
usb_calc_bus_time (urb->dev->speed,
is_input, 0, max_packet (maxp)));
qh->period = urb->interval;
+ if (qh->period > ehci->periodic_size) {
+ qh->period = ehci->periodic_size;
+ urb->interval = qh->period;
+ }
}
}
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
index edd61ee90323..c340f1f4b881 100644
--- a/drivers/usb/host/ehci-sched.c
+++ b/drivers/usb/host/ehci-sched.c
@@ -456,6 +456,8 @@ static int enable_periodic (struct ehci_hcd *ehci)
/* make sure ehci_work scans these */
ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index)
% (ehci->periodic_size << 3);
+ if (unlikely(ehci->broken_periodic))
+ ehci->last_periodic_enable = ktime_get_real();
return 0;
}
@@ -467,6 +469,16 @@ static int disable_periodic (struct ehci_hcd *ehci)
if (--ehci->periodic_sched)
return 0;
+ if (unlikely(ehci->broken_periodic)) {
+ /* delay experimentally determined */
+ ktime_t safe = ktime_add_us(ehci->last_periodic_enable, 1000);
+ ktime_t now = ktime_get_real();
+ s64 delay = ktime_us_delta(safe, now);
+
+ if (unlikely(delay > 0))
+ udelay(delay);
+ }
+
/* did setting PSE not take effect yet?
* takes effect only at frame boundaries...
*/
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 4b81f5e77c8b..7a412652cb5d 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -118,6 +118,7 @@ struct ehci_hcd { /* one per controller */
unsigned stamp;
unsigned random_frame;
unsigned long next_statechange;
+ ktime_t last_periodic_enable;
u32 command;
/* SILICON QUIRKS */
@@ -126,6 +127,7 @@ struct ehci_hcd { /* one per controller */
unsigned big_endian_mmio:1;
unsigned big_endian_desc:1;
unsigned has_amcc_usb23:1;
+ unsigned broken_periodic:1;
/* required for usb32 quirk */
#define OHCI_CTRL_HCFS (3 << 6)
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index 58151687d351..1ed2a16a61de 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -88,6 +88,7 @@ static int ohci_restart (struct ohci_hcd *ohci);
#ifdef CONFIG_PCI
static void quirk_amd_pll(int state);
static void amd_iso_dev_put(void);
+static void sb800_prefetch(struct ohci_hcd *ohci, int on);
#else
static inline void quirk_amd_pll(int state)
{
@@ -97,6 +98,10 @@ static inline void amd_iso_dev_put(void)
{
return;
}
+static inline void sb800_prefetch(struct ohci_hcd *ohci, int on)
+{
+ return;
+}
#endif
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c
index d2ba04dd785e..b8a1148f248e 100644
--- a/drivers/usb/host/ohci-pci.c
+++ b/drivers/usb/host/ohci-pci.c
@@ -177,6 +177,13 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd)
return 0;
pci_read_config_byte(amd_smbus_dev, PCI_REVISION_ID, &rev);
+
+ /* SB800 needs pre-fetch fix */
+ if ((rev >= 0x40) && (rev <= 0x4f)) {
+ ohci->flags |= OHCI_QUIRK_AMD_PREFETCH;
+ ohci_dbg(ohci, "enabled AMD prefetch quirk\n");
+ }
+
if ((rev > 0x3b) || (rev < 0x30)) {
pci_dev_put(amd_smbus_dev);
amd_smbus_dev = NULL;
@@ -262,6 +269,19 @@ static void amd_iso_dev_put(void)
}
+static void sb800_prefetch(struct ohci_hcd *ohci, int on)
+{
+ struct pci_dev *pdev;
+ u16 misc;
+
+ pdev = to_pci_dev(ohci_to_hcd(ohci)->self.controller);
+ pci_read_config_word(pdev, 0x50, &misc);
+ if (on == 0)
+ pci_write_config_word(pdev, 0x50, misc & 0xfcff);
+ else
+ pci_write_config_word(pdev, 0x50, misc | 0x0300);
+}
+
/* List of quirks for OHCI */
static const struct pci_device_id ohci_pci_quirks[] = {
{
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
index c2d80f80448b..2c7409b09e8b 100644
--- a/drivers/usb/host/ohci-q.c
+++ b/drivers/usb/host/ohci-q.c
@@ -49,9 +49,12 @@ __acquires(ohci->lock)
switch (usb_pipetype (urb->pipe)) {
case PIPE_ISOCHRONOUS:
ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs--;
- if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0
- && quirk_amdiso(ohci))
- quirk_amd_pll(1);
+ if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0) {
+ if (quirk_amdiso(ohci))
+ quirk_amd_pll(1);
+ if (quirk_amdprefetch(ohci))
+ sb800_prefetch(ohci, 0);
+ }
break;
case PIPE_INTERRUPT:
ohci_to_hcd(ohci)->self.bandwidth_int_reqs--;
@@ -680,9 +683,12 @@ static void td_submit_urb (
data + urb->iso_frame_desc [cnt].offset,
urb->iso_frame_desc [cnt].length, urb, cnt);
}
- if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0
- && quirk_amdiso(ohci))
- quirk_amd_pll(0);
+ if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0) {
+ if (quirk_amdiso(ohci))
+ quirk_amd_pll(0);
+ if (quirk_amdprefetch(ohci))
+ sb800_prefetch(ohci, 1);
+ }
periodic = ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs++ == 0
&& ohci_to_hcd(ohci)->self.bandwidth_int_reqs == 0;
break;
diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h
index 222011f6172c..5bf15fed0d9f 100644
--- a/drivers/usb/host/ohci.h
+++ b/drivers/usb/host/ohci.h
@@ -402,6 +402,7 @@ struct ohci_hcd {
#define OHCI_QUIRK_FRAME_NO 0x80 /* no big endian frame_no shift */
#define OHCI_QUIRK_HUB_POWER 0x100 /* distrust firmware power/oc setup */
#define OHCI_QUIRK_AMD_ISO 0x200 /* ISO transfers*/
+#define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch for ISO transfer */
// there are also chip quirks/bugs in init logic
struct work_struct nec_work; /* Worker for NEC quirk */
@@ -433,6 +434,10 @@ static inline int quirk_amdiso(struct ohci_hcd *ohci)
{
return ohci->flags & OHCI_QUIRK_AMD_ISO;
}
+static inline int quirk_amdprefetch(struct ohci_hcd *ohci)
+{
+ return ohci->flags & OHCI_QUIRK_AMD_PREFETCH;
+}
#else
static inline int quirk_nec(struct ohci_hcd *ohci)
{
@@ -446,6 +451,10 @@ static inline int quirk_amdiso(struct ohci_hcd *ohci)
{
return 0;
}
+static inline int quirk_amdprefetch(struct ohci_hcd *ohci)
+{
+ return 0;
+}
#endif
/* convert between an hcd pointer and the corresponding ohci_hcd */
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c
index a949259f18b9..5b22a4d1c9e4 100644
--- a/drivers/usb/host/sl811-hcd.c
+++ b/drivers/usb/host/sl811-hcd.c
@@ -719,8 +719,12 @@ retry:
/* port status seems weird until after reset, so
* force the reset and make khubd clean up later.
*/
- sl811->port1 |= (1 << USB_PORT_FEAT_C_CONNECTION)
- | (1 << USB_PORT_FEAT_CONNECTION);
+ if (sl811->stat_insrmv & 1)
+ sl811->port1 |= 1 << USB_PORT_FEAT_CONNECTION;
+ else
+ sl811->port1 &= ~(1 << USB_PORT_FEAT_CONNECTION);
+
+ sl811->port1 |= 1 << USB_PORT_FEAT_C_CONNECTION;
} else if (irqstat & SL11H_INTMASK_RD) {
if (sl811->port1 & (1 << USB_PORT_FEAT_SUSPEND)) {
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
index 274751b4409c..eb37d86bafef 100644
--- a/drivers/usb/host/uhci-hcd.c
+++ b/drivers/usb/host/uhci-hcd.c
@@ -749,7 +749,20 @@ static int uhci_rh_suspend(struct usb_hcd *hcd)
spin_lock_irq(&uhci->lock);
if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
rc = -ESHUTDOWN;
- else if (!uhci->dead)
+ else if (uhci->dead)
+ ; /* Dead controllers tell no tales */
+
+ /* Once the controller is stopped, port resumes that are already
+ * in progress won't complete. Hence if remote wakeup is enabled
+ * for the root hub and any ports are in the middle of a resume or
+ * remote wakeup, we must fail the suspend.
+ */
+ else if (hcd->self.root_hub->do_remote_wakeup &&
+ uhci->resuming_ports) {
+ dev_dbg(uhci_dev(uhci), "suspend failed because a port "
+ "is resuming\n");
+ rc = -EBUSY;
+ } else
suspend_rh(uhci, UHCI_RH_SUSPENDED);
spin_unlock_irq(&uhci->lock);
return rc;
diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c
index 885b585360b9..8270055848ca 100644
--- a/drivers/usb/host/uhci-hub.c
+++ b/drivers/usb/host/uhci-hub.c
@@ -167,7 +167,7 @@ static void uhci_check_ports(struct uhci_hcd *uhci)
/* Port received a wakeup request */
set_bit(port, &uhci->resuming_ports);
uhci->ports_timeout = jiffies +
- msecs_to_jiffies(20);
+ msecs_to_jiffies(25);
/* Make sure we see the port again
* after the resuming period is over. */
diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c
index 705e34324156..33128d52f212 100644
--- a/drivers/usb/host/xhci-dbg.c
+++ b/drivers/usb/host/xhci-dbg.c
@@ -413,7 +413,8 @@ void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx)
int i;
struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx);
- dma_addr_t dma = ctx->dma + ((unsigned long)slot_ctx - (unsigned long)ctx);
+ dma_addr_t dma = ctx->dma +
+ ((unsigned long)slot_ctx - (unsigned long)ctx->bytes);
int csz = HCC_64BYTE_CONTEXT(xhci->hcc_params);
xhci_dbg(xhci, "Slot Context:\n");
@@ -459,7 +460,7 @@ void xhci_dbg_ep_ctx(struct xhci_hcd *xhci,
for (i = 0; i < last_ep_ctx; ++i) {
struct xhci_ep_ctx *ep_ctx = xhci_get_ep_ctx(xhci, ctx, i);
dma_addr_t dma = ctx->dma +
- ((unsigned long)ep_ctx - (unsigned long)ctx);
+ ((unsigned long)ep_ctx - (unsigned long)ctx->bytes);
xhci_dbg(xhci, "Endpoint %02d Context:\n", i);
xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - ep_info\n",
diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c
index 816c39caca1c..e478a63488fb 100644
--- a/drivers/usb/host/xhci-hcd.c
+++ b/drivers/usb/host/xhci-hcd.c
@@ -22,12 +22,18 @@
#include <linux/irq.h>
#include <linux/module.h>
+#include <linux/moduleparam.h>
#include "xhci.h"
#define DRIVER_AUTHOR "Sarah Sharp"
#define DRIVER_DESC "'eXtensible' Host Controller (xHC) Driver"
+/* Some 0.95 hardware can't handle the chain bit on a Link TRB being cleared */
+static int link_quirk;
+module_param(link_quirk, int, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(link_quirk, "Don't clear the chain bit on a link TRB");
+
/* TODO: copied from ehci-hcd.c - can this be refactored? */
/*
* handshake - spin reading hc until handshake completes or fails
@@ -214,6 +220,12 @@ int xhci_init(struct usb_hcd *hcd)
xhci_dbg(xhci, "xhci_init\n");
spin_lock_init(&xhci->lock);
+ if (link_quirk) {
+ xhci_dbg(xhci, "QUIRK: Not clearing Link TRB chain bits.\n");
+ xhci->quirks |= XHCI_LINK_TRB_QUIRK;
+ } else {
+ xhci_dbg(xhci, "xHCI doesn't need link TRB QUIRK\n");
+ }
retval = xhci_mem_init(xhci, GFP_KERNEL);
xhci_dbg(xhci, "Finished xhci_init\n");
@@ -555,13 +567,22 @@ unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc)
return 1 << (xhci_get_endpoint_index(desc) + 1);
}
+/* Find the flag for this endpoint (for use in the control context). Use the
+ * endpoint index to create a bitmask. The slot context is bit 0, endpoint 0 is
+ * bit 1, etc.
+ */
+unsigned int xhci_get_endpoint_flag_from_index(unsigned int ep_index)
+{
+ return 1 << (ep_index + 1);
+}
+
/* Compute the last valid endpoint context index. Basically, this is the
* endpoint index plus one. For slot contexts with more than valid endpoint,
* we find the most significant bit set in the added contexts flags.
* e.g. ep 1 IN (with epnum 0x81) => added_ctxs = 0b1000
* fls(0b1000) = 4, but the endpoint context index is 3, so subtract one.
*/
-static inline unsigned int xhci_last_valid_endpoint(u32 added_ctxs)
+unsigned int xhci_last_valid_endpoint(u32 added_ctxs)
{
return fls(added_ctxs) - 1;
}
@@ -589,6 +610,70 @@ int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev,
return 1;
}
+static int xhci_configure_endpoint(struct xhci_hcd *xhci,
+ struct usb_device *udev, struct xhci_virt_device *virt_dev,
+ bool ctx_change);
+
+/*
+ * Full speed devices may have a max packet size greater than 8 bytes, but the
+ * USB core doesn't know that until it reads the first 8 bytes of the
+ * descriptor. If the usb_device's max packet size changes after that point,
+ * we need to issue an evaluate context command and wait on it.
+ */
+static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
+ unsigned int ep_index, struct urb *urb)
+{
+ struct xhci_container_ctx *in_ctx;
+ struct xhci_container_ctx *out_ctx;
+ struct xhci_input_control_ctx *ctrl_ctx;
+ struct xhci_ep_ctx *ep_ctx;
+ int max_packet_size;
+ int hw_max_packet_size;
+ int ret = 0;
+
+ out_ctx = xhci->devs[slot_id]->out_ctx;
+ ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index);
+ hw_max_packet_size = MAX_PACKET_DECODED(ep_ctx->ep_info2);
+ max_packet_size = urb->dev->ep0.desc.wMaxPacketSize;
+ if (hw_max_packet_size != max_packet_size) {
+ xhci_dbg(xhci, "Max Packet Size for ep 0 changed.\n");
+ xhci_dbg(xhci, "Max packet size in usb_device = %d\n",
+ max_packet_size);
+ xhci_dbg(xhci, "Max packet size in xHCI HW = %d\n",
+ hw_max_packet_size);
+ xhci_dbg(xhci, "Issuing evaluate context command.\n");
+
+ /* Set up the modified control endpoint 0 */
+ xhci_endpoint_copy(xhci, xhci->devs[slot_id], ep_index);
+ in_ctx = xhci->devs[slot_id]->in_ctx;
+ ep_ctx = xhci_get_ep_ctx(xhci, in_ctx, ep_index);
+ ep_ctx->ep_info2 &= ~MAX_PACKET_MASK;
+ ep_ctx->ep_info2 |= MAX_PACKET(max_packet_size);
+
+ /* Set up the input context flags for the command */
+ /* FIXME: This won't work if a non-default control endpoint
+ * changes max packet sizes.
+ */
+ ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx);
+ ctrl_ctx->add_flags = EP0_FLAG;
+ ctrl_ctx->drop_flags = 0;
+
+ xhci_dbg(xhci, "Slot %d input context\n", slot_id);
+ xhci_dbg_ctx(xhci, in_ctx, ep_index);
+ xhci_dbg(xhci, "Slot %d output context\n", slot_id);
+ xhci_dbg_ctx(xhci, out_ctx, ep_index);
+
+ ret = xhci_configure_endpoint(xhci, urb->dev,
+ xhci->devs[slot_id], true);
+
+ /* Clean up the input context for later use by bandwidth
+ * functions.
+ */
+ ctrl_ctx->add_flags = SLOT_FLAG;
+ }
+ return ret;
+}
+
/*
* non-error returns are a promise to giveback() the urb later
* we drop ownership so next owner (or urb unlink) can get it
@@ -600,13 +685,13 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
int ret = 0;
unsigned int slot_id, ep_index;
+
if (!urb || xhci_check_args(hcd, urb->dev, urb->ep, true, __func__) <= 0)
return -EINVAL;
slot_id = urb->dev->slot_id;
ep_index = xhci_get_endpoint_index(&urb->ep->desc);
- spin_lock_irqsave(&xhci->lock, flags);
if (!xhci->devs || !xhci->devs[slot_id]) {
if (!in_interrupt())
dev_warn(&urb->dev->dev, "WARN: urb submitted for dev with no Slot ID\n");
@@ -619,19 +704,38 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
ret = -ESHUTDOWN;
goto exit;
}
- if (usb_endpoint_xfer_control(&urb->ep->desc))
+ if (usb_endpoint_xfer_control(&urb->ep->desc)) {
+ /* Check to see if the max packet size for the default control
+ * endpoint changed during FS device enumeration
+ */
+ if (urb->dev->speed == USB_SPEED_FULL) {
+ ret = xhci_check_maxpacket(xhci, slot_id,
+ ep_index, urb);
+ if (ret < 0)
+ return ret;
+ }
+
/* We have a spinlock and interrupts disabled, so we must pass
* atomic context to this function, which may allocate memory.
*/
+ spin_lock_irqsave(&xhci->lock, flags);
ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb,
slot_id, ep_index);
- else if (usb_endpoint_xfer_bulk(&urb->ep->desc))
+ spin_unlock_irqrestore(&xhci->lock, flags);
+ } else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) {
+ spin_lock_irqsave(&xhci->lock, flags);
ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb,
slot_id, ep_index);
- else
+ spin_unlock_irqrestore(&xhci->lock, flags);
+ } else if (usb_endpoint_xfer_int(&urb->ep->desc)) {
+ spin_lock_irqsave(&xhci->lock, flags);
+ ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb,
+ slot_id, ep_index);
+ spin_unlock_irqrestore(&xhci->lock, flags);
+ } else {
ret = -EINVAL;
+ }
exit:
- spin_unlock_irqrestore(&xhci->lock, flags);
return ret;
}
@@ -930,6 +1034,122 @@ static void xhci_zero_in_ctx(struct xhci_hcd *xhci, struct xhci_virt_device *vir
}
}
+static int xhci_configure_endpoint_result(struct xhci_hcd *xhci,
+ struct usb_device *udev, struct xhci_virt_device *virt_dev)
+{
+ int ret;
+
+ switch (virt_dev->cmd_status) {
+ case COMP_ENOMEM:
+ dev_warn(&udev->dev, "Not enough host controller resources "
+ "for new device state.\n");
+ ret = -ENOMEM;
+ /* FIXME: can we allocate more resources for the HC? */
+ break;
+ case COMP_BW_ERR:
+ dev_warn(&udev->dev, "Not enough bandwidth "
+ "for new device state.\n");
+ ret = -ENOSPC;
+ /* FIXME: can we go back to the old state? */
+ break;
+ case COMP_TRB_ERR:
+ /* the HCD set up something wrong */
+ dev_warn(&udev->dev, "ERROR: Endpoint drop flag = 0, "
+ "add flag = 1, "
+ "and endpoint is not disabled.\n");
+ ret = -EINVAL;
+ break;
+ case COMP_SUCCESS:
+ dev_dbg(&udev->dev, "Successful Endpoint Configure command\n");
+ ret = 0;
+ break;
+ default:
+ xhci_err(xhci, "ERROR: unexpected command completion "
+ "code 0x%x.\n", virt_dev->cmd_status);
+ ret = -EINVAL;
+ break;
+ }
+ return ret;
+}
+
+static int xhci_evaluate_context_result(struct xhci_hcd *xhci,
+ struct usb_device *udev, struct xhci_virt_device *virt_dev)
+{
+ int ret;
+
+ switch (virt_dev->cmd_status) {
+ case COMP_EINVAL:
+ dev_warn(&udev->dev, "WARN: xHCI driver setup invalid evaluate "
+ "context command.\n");
+ ret = -EINVAL;
+ break;
+ case COMP_EBADSLT:
+ dev_warn(&udev->dev, "WARN: slot not enabled for"
+ "evaluate context command.\n");
+ case COMP_CTX_STATE:
+ dev_warn(&udev->dev, "WARN: invalid context state for "
+ "evaluate context command.\n");
+ xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1);
+ ret = -EINVAL;
+ break;
+ case COMP_SUCCESS:
+ dev_dbg(&udev->dev, "Successful evaluate context command\n");
+ ret = 0;
+ break;
+ default:
+ xhci_err(xhci, "ERROR: unexpected command completion "
+ "code 0x%x.\n", virt_dev->cmd_status);
+ ret = -EINVAL;
+ break;
+ }
+ return ret;
+}
+
+/* Issue a configure endpoint command or evaluate context command
+ * and wait for it to finish.
+ */
+static int xhci_configure_endpoint(struct xhci_hcd *xhci,
+ struct usb_device *udev, struct xhci_virt_device *virt_dev,
+ bool ctx_change)
+{
+ int ret;
+ int timeleft;
+ unsigned long flags;
+
+ spin_lock_irqsave(&xhci->lock, flags);
+ if (!ctx_change)
+ ret = xhci_queue_configure_endpoint(xhci, virt_dev->in_ctx->dma,
+ udev->slot_id);
+ else
+ ret = xhci_queue_evaluate_context(xhci, virt_dev->in_ctx->dma,
+ udev->slot_id);
+ if (ret < 0) {
+ spin_unlock_irqrestore(&xhci->lock, flags);
+ xhci_dbg(xhci, "FIXME allocate a new ring segment\n");
+ return -ENOMEM;
+ }
+ xhci_ring_cmd_db(xhci);
+ spin_unlock_irqrestore(&xhci->lock, flags);
+
+ /* Wait for the configure endpoint command to complete */
+ timeleft = wait_for_completion_interruptible_timeout(
+ &virt_dev->cmd_completion,
+ USB_CTRL_SET_TIMEOUT);
+ if (timeleft <= 0) {
+ xhci_warn(xhci, "%s while waiting for %s command\n",
+ timeleft == 0 ? "Timeout" : "Signal",
+ ctx_change == 0 ?
+ "configure endpoint" :
+ "evaluate context");
+ /* FIXME cancel the configure endpoint command */
+ return -ETIME;
+ }
+
+ if (!ctx_change)
+ return xhci_configure_endpoint_result(xhci, udev, virt_dev);
+ return xhci_evaluate_context_result(xhci, udev, virt_dev);
+}
+
/* Called after one or more calls to xhci_add_endpoint() or
* xhci_drop_endpoint(). If this call fails, the USB core is expected
* to call xhci_reset_bandwidth().
@@ -944,8 +1164,6 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)
{
int i;
int ret = 0;
- int timeleft;
- unsigned long flags;
struct xhci_hcd *xhci;
struct xhci_virt_device *virt_dev;
struct xhci_input_control_ctx *ctrl_ctx;
@@ -975,56 +1193,7 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)
xhci_dbg_ctx(xhci, virt_dev->in_ctx,
LAST_CTX_TO_EP_NUM(slot_ctx->dev_info));
- spin_lock_irqsave(&xhci->lock, flags);
- ret = xhci_queue_configure_endpoint(xhci, virt_dev->in_ctx->dma,
- udev->slot_id);
- if (ret < 0) {
- spin_unlock_irqrestore(&xhci->lock, flags);
- xhci_dbg(xhci, "FIXME allocate a new ring segment\n");
- return -ENOMEM;
- }
- xhci_ring_cmd_db(xhci);
- spin_unlock_irqrestore(&xhci->lock, flags);
-
- /* Wait for the configure endpoint command to complete */
- timeleft = wait_for_completion_interruptible_timeout(
- &virt_dev->cmd_completion,
- USB_CTRL_SET_TIMEOUT);
- if (timeleft <= 0) {
- xhci_warn(xhci, "%s while waiting for configure endpoint command\n",
- timeleft == 0 ? "Timeout" : "Signal");
- /* FIXME cancel the configure endpoint command */
- return -ETIME;
- }
-
- switch (virt_dev->cmd_status) {
- case COMP_ENOMEM:
- dev_warn(&udev->dev, "Not enough host controller resources "
- "for new device state.\n");
- ret = -ENOMEM;
- /* FIXME: can we allocate more resources for the HC? */
- break;
- case COMP_BW_ERR:
- dev_warn(&udev->dev, "Not enough bandwidth "
- "for new device state.\n");
- ret = -ENOSPC;
- /* FIXME: can we go back to the old state? */
- break;
- case COMP_TRB_ERR:
- /* the HCD set up something wrong */
- dev_warn(&udev->dev, "ERROR: Endpoint drop flag = 0, add flag = 1, "
- "and endpoint is not disabled.\n");
- ret = -EINVAL;
- break;
- case COMP_SUCCESS:
- dev_dbg(&udev->dev, "Successful Endpoint Configure command\n");
- break;
- default:
- xhci_err(xhci, "ERROR: unexpected command completion "
- "code 0x%x.\n", virt_dev->cmd_status);
- ret = -EINVAL;
- break;
- }
+ ret = xhci_configure_endpoint(xhci, udev, virt_dev, false);
if (ret) {
/* Callee should call reset_bandwidth() */
return ret;
@@ -1075,6 +1244,75 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)
xhci_zero_in_ctx(xhci, virt_dev);
}
+void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci,
+ unsigned int slot_id, unsigned int ep_index,
+ struct xhci_dequeue_state *deq_state)
+{
+ struct xhci_container_ctx *in_ctx;
+ struct xhci_input_control_ctx *ctrl_ctx;
+ struct xhci_ep_ctx *ep_ctx;
+ u32 added_ctxs;
+ dma_addr_t addr;
+
+ xhci_endpoint_copy(xhci, xhci->devs[slot_id], ep_index);
+ in_ctx = xhci->devs[slot_id]->in_ctx;
+ ep_ctx = xhci_get_ep_ctx(xhci, in_ctx, ep_index);
+ addr = xhci_trb_virt_to_dma(deq_state->new_deq_seg,
+ deq_state->new_deq_ptr);
+ if (addr == 0) {
+ xhci_warn(xhci, "WARN Cannot submit config ep after "
+ "reset ep command\n");
+ xhci_warn(xhci, "WARN deq seg = %p, deq ptr = %p\n",
+ deq_state->new_deq_seg,
+ deq_state->new_deq_ptr);
+ return;
+ }
+ ep_ctx->deq = addr | deq_state->new_cycle_state;
+
+ xhci_slot_copy(xhci, xhci->devs[slot_id]);
+
+ ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx);
+ added_ctxs = xhci_get_endpoint_flag_from_index(ep_index);
+ ctrl_ctx->add_flags = added_ctxs | SLOT_FLAG;
+ ctrl_ctx->drop_flags = added_ctxs;
+
+ xhci_dbg(xhci, "Slot ID %d Input Context:\n", slot_id);
+ xhci_dbg_ctx(xhci, in_ctx, ep_index);
+}
+
+void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci,
+ struct usb_device *udev,
+ unsigned int ep_index, struct xhci_ring *ep_ring)
+{
+ struct xhci_dequeue_state deq_state;
+
+ xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n");
+ /* We need to move the HW's dequeue pointer past this TD,
+ * or it will attempt to resend it on the next doorbell ring.
+ */
+ xhci_find_new_dequeue_state(xhci, udev->slot_id,
+ ep_index, ep_ring->stopped_td,
+ &deq_state);
+
+ /* HW with the reset endpoint quirk will use the saved dequeue state to
+ * issue a configure endpoint command later.
+ */
+ if (!(xhci->quirks & XHCI_RESET_EP_QUIRK)) {
+ xhci_dbg(xhci, "Queueing new dequeue state\n");
+ xhci_queue_new_dequeue_state(xhci, ep_ring,
+ udev->slot_id,
+ ep_index, &deq_state);
+ } else {
+ /* Better hope no one uses the input context between now and the
+ * reset endpoint completion!
+ */
+ xhci_dbg(xhci, "Setting up input context for "
+ "configure endpoint command\n");
+ xhci_setup_input_ctx_for_quirk(xhci, udev->slot_id,
+ ep_index, &deq_state);
+ }
+}
+
/* Deal with stalled endpoints. The core should have sent the control message
* to clear the halt condition. However, we need to make the xHCI hardware
* reset its sequence number, since a device will expect a sequence number of
@@ -1089,7 +1327,6 @@ void xhci_endpoint_reset(struct usb_hcd *hcd,
unsigned int ep_index;
unsigned long flags;
int ret;
- struct xhci_dequeue_state deq_state;
struct xhci_ring *ep_ring;
xhci = hcd_to_xhci(hcd);
@@ -1106,6 +1343,10 @@ void xhci_endpoint_reset(struct usb_hcd *hcd,
ep->desc.bEndpointAddress);
return;
}
+ if (usb_endpoint_xfer_control(&ep->desc)) {
+ xhci_dbg(xhci, "Control endpoint stall already handled.\n");
+ return;
+ }
xhci_dbg(xhci, "Queueing reset endpoint command\n");
spin_lock_irqsave(&xhci->lock, flags);
@@ -1116,16 +1357,7 @@ void xhci_endpoint_reset(struct usb_hcd *hcd,
* command. Better hope that last command worked!
*/
if (!ret) {
- xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n");
- /* We need to move the HW's dequeue pointer past this TD,
- * or it will attempt to resend it on the next doorbell ring.
- */
- xhci_find_new_dequeue_state(xhci, udev->slot_id,
- ep_index, ep_ring->stopped_td, &deq_state);
- xhci_dbg(xhci, "Queueing new dequeue state\n");
- xhci_queue_new_dequeue_state(xhci, ep_ring,
- udev->slot_id,
- ep_index, &deq_state);
+ xhci_cleanup_stalled_ring(xhci, udev, ep_index, ep_ring);
kfree(ep_ring->stopped_td);
xhci_ring_cmd_db(xhci);
}
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index e6b9a1c6002d..21146486fdb2 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -94,6 +94,9 @@ static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev,
val = prev->trbs[TRBS_PER_SEGMENT-1].link.control;
val &= ~TRB_TYPE_BITMASK;
val |= TRB_TYPE(TRB_LINK);
+ /* Always set the chain bit with 0.95 hardware */
+ if (xhci_link_trb_quirk(xhci))
+ val |= TRB_CHAIN;
prev->trbs[TRBS_PER_SEGMENT-1].link.control = val;
}
xhci_dbg(xhci, "Linking segment 0x%llx to segment 0x%llx (DMA)\n",
@@ -398,15 +401,28 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud
/* Step 5 */
ep0_ctx->ep_info2 = EP_TYPE(CTRL_EP);
/*
- * See section 4.3 bullet 6:
- * The default Max Packet size for ep0 is "8 bytes for a USB2
- * LS/FS/HS device or 512 bytes for a USB3 SS device"
* XXX: Not sure about wireless USB devices.
*/
- if (udev->speed == USB_SPEED_SUPER)
+ switch (udev->speed) {
+ case USB_SPEED_SUPER:
ep0_ctx->ep_info2 |= MAX_PACKET(512);
- else
+ break;
+ case USB_SPEED_HIGH:
+ /* USB core guesses at a 64-byte max packet first for FS devices */
+ case USB_SPEED_FULL:
+ ep0_ctx->ep_info2 |= MAX_PACKET(64);
+ break;
+ case USB_SPEED_LOW:
ep0_ctx->ep_info2 |= MAX_PACKET(8);
+ break;
+ case USB_SPEED_VARIABLE:
+ xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n");
+ return -EINVAL;
+ break;
+ default:
+ /* New speed? */
+ BUG();
+ }
/* EP 0 can handle "burst" sizes of 1, so Max Burst Size field is 0 */
ep0_ctx->ep_info2 |= MAX_BURST(0);
ep0_ctx->ep_info2 |= ERROR_COUNT(3);
@@ -598,6 +614,44 @@ void xhci_endpoint_zero(struct xhci_hcd *xhci,
*/
}
+/* Copy output xhci_ep_ctx to the input xhci_ep_ctx copy.
+ * Useful when you want to change one particular aspect of the endpoint and then
+ * issue a configure endpoint command.
+ */
+void xhci_endpoint_copy(struct xhci_hcd *xhci,
+ struct xhci_virt_device *vdev, unsigned int ep_index)
+{
+ struct xhci_ep_ctx *out_ep_ctx;
+ struct xhci_ep_ctx *in_ep_ctx;
+
+ out_ep_ctx = xhci_get_ep_ctx(xhci, vdev->out_ctx, ep_index);
+ in_ep_ctx = xhci_get_ep_ctx(xhci, vdev->in_ctx, ep_index);
+
+ in_ep_ctx->ep_info = out_ep_ctx->ep_info;
+ in_ep_ctx->ep_info2 = out_ep_ctx->ep_info2;
+ in_ep_ctx->deq = out_ep_ctx->deq;
+ in_ep_ctx->tx_info = out_ep_ctx->tx_info;
+}
+
+/* Copy output xhci_slot_ctx to the input xhci_slot_ctx.
+ * Useful when you want to change one particular aspect of the endpoint and then
+ * issue a configure endpoint command. Only the context entries field matters,
+ * but we'll copy the whole thing anyway.
+ */
+void xhci_slot_copy(struct xhci_hcd *xhci, struct xhci_virt_device *vdev)
+{
+ struct xhci_slot_ctx *in_slot_ctx;
+ struct xhci_slot_ctx *out_slot_ctx;
+
+ in_slot_ctx = xhci_get_slot_ctx(xhci, vdev->in_ctx);
+ out_slot_ctx = xhci_get_slot_ctx(xhci, vdev->out_ctx);
+
+ in_slot_ctx->dev_info = out_slot_ctx->dev_info;
+ in_slot_ctx->dev_info2 = out_slot_ctx->dev_info2;
+ in_slot_ctx->tt_info = out_slot_ctx->tt_info;
+ in_slot_ctx->dev_state = out_slot_ctx->dev_state;
+}
+
/* Set up the scratchpad buffer array and scratchpad buffers, if needed. */
static int scratchpad_alloc(struct xhci_hcd *xhci, gfp_t flags)
{
@@ -702,9 +756,11 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
int i;
/* Free the Event Ring Segment Table and the actual Event Ring */
- xhci_writel(xhci, 0, &xhci->ir_set->erst_size);
- xhci_write_64(xhci, 0, &xhci->ir_set->erst_base);
- xhci_write_64(xhci, 0, &xhci->ir_set->erst_dequeue);
+ if (xhci->ir_set) {
+ xhci_writel(xhci, 0, &xhci->ir_set->erst_size);
+ xhci_write_64(xhci, 0, &xhci->ir_set->erst_base);
+ xhci_write_64(xhci, 0, &xhci->ir_set->erst_dequeue);
+ }
size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries);
if (xhci->erst.entries)
pci_free_consistent(pdev, size,
@@ -741,9 +797,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
xhci->dcbaa, xhci->dcbaa->dma);
xhci->dcbaa = NULL;
+ scratchpad_free(xhci);
xhci->page_size = 0;
xhci->page_shift = 0;
- scratchpad_free(xhci);
}
int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index 592fe7e623f7..8fb308d43bc1 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -24,6 +24,10 @@
#include "xhci.h"
+/* Device for a quirk */
+#define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73
+#define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000
+
static const char hcd_name[] = "xhci_hcd";
/* called after powerup, by probe or system-pm "wakeup" */
@@ -62,6 +66,15 @@ static int xhci_pci_setup(struct usb_hcd *hcd)
xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hcc_params);
xhci_print_registers(xhci);
+ /* Look for vendor-specific quirks */
+ if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
+ pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK &&
+ pdev->revision == 0x0) {
+ xhci->quirks |= XHCI_RESET_EP_QUIRK;
+ xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure"
+ " endpoint cmd after reset endpoint\n");
+ }
+
/* Make sure the HC is halted. */
retval = xhci_halt(xhci);
if (retval)
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index aa88a067148b..9874d9a60080 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -172,8 +172,9 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer
* have their chain bit cleared (so that each Link TRB is a separate TD).
*
* Section 6.4.4.1 of the 0.95 spec says link TRBs cannot have the chain bit
- * set, but other sections talk about dealing with the chain bit set.
- * Assume section 6.4.4.1 is wrong, and the chain bit can be set in a Link TRB.
+ * set, but other sections talk about dealing with the chain bit set. This was
+ * fixed in the 0.96 specification errata, but we have to assume that all 0.95
+ * xHCI hardware can't handle the chain bit being cleared on a link TRB.
*/
static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer)
{
@@ -191,8 +192,14 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer
while (last_trb(xhci, ring, ring->enq_seg, next)) {
if (!consumer) {
if (ring != xhci->event_ring) {
- next->link.control &= ~TRB_CHAIN;
- next->link.control |= chain;
+ /* If we're not dealing with 0.95 hardware,
+ * carry over the chain bit of the previous TRB
+ * (which may mean the chain bit is cleared).
+ */
+ if (!xhci_link_trb_quirk(xhci)) {
+ next->link.control &= ~TRB_CHAIN;
+ next->link.control |= chain;
+ }
/* Give this link TRB to the hardware */
wmb();
if (next->link.control & TRB_CYCLE)
@@ -462,7 +469,6 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci,
* ring running.
*/
ep_ring->state |= SET_DEQ_PENDING;
- xhci_ring_cmd_db(xhci);
}
/*
@@ -531,6 +537,7 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci,
if (deq_state.new_deq_ptr && deq_state.new_deq_seg) {
xhci_queue_new_dequeue_state(xhci, ep_ring,
slot_id, ep_index, &deq_state);
+ xhci_ring_cmd_db(xhci);
} else {
/* Otherwise just ring the doorbell to restart the ring */
ring_ep_doorbell(xhci, slot_id, ep_index);
@@ -644,18 +651,31 @@ static void handle_reset_ep_completion(struct xhci_hcd *xhci,
{
int slot_id;
unsigned int ep_index;
+ struct xhci_ring *ep_ring;
slot_id = TRB_TO_SLOT_ID(trb->generic.field[3]);
ep_index = TRB_TO_EP_INDEX(trb->generic.field[3]);
+ ep_ring = xhci->devs[slot_id]->ep_rings[ep_index];
/* This command will only fail if the endpoint wasn't halted,
* but we don't care.
*/
xhci_dbg(xhci, "Ignoring reset ep completion code of %u\n",
(unsigned int) GET_COMP_CODE(event->status));
- /* Clear our internal halted state and restart the ring */
- xhci->devs[slot_id]->ep_rings[ep_index]->state &= ~EP_HALTED;
- ring_ep_doorbell(xhci, slot_id, ep_index);
+ /* HW with the reset endpoint quirk needs to have a configure endpoint
+ * command complete before the endpoint can be used. Queue that here
+ * because the HW can't handle two commands being queued in a row.
+ */
+ if (xhci->quirks & XHCI_RESET_EP_QUIRK) {
+ xhci_dbg(xhci, "Queueing configure endpoint command\n");
+ xhci_queue_configure_endpoint(xhci,
+ xhci->devs[slot_id]->in_ctx->dma, slot_id);
+ xhci_ring_cmd_db(xhci);
+ } else {
+ /* Clear our internal halted state and restart the ring */
+ ep_ring->state &= ~EP_HALTED;
+ ring_ep_doorbell(xhci, slot_id, ep_index);
+ }
}
static void handle_cmd_completion(struct xhci_hcd *xhci,
@@ -664,6 +684,10 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
int slot_id = TRB_TO_SLOT_ID(event->flags);
u64 cmd_dma;
dma_addr_t cmd_dequeue_dma;
+ struct xhci_input_control_ctx *ctrl_ctx;
+ unsigned int ep_index;
+ struct xhci_ring *ep_ring;
+ unsigned int ep_state;
cmd_dma = event->cmd_trb;
cmd_dequeue_dma = xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg,
@@ -691,6 +715,41 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
xhci_free_virt_device(xhci, slot_id);
break;
case TRB_TYPE(TRB_CONFIG_EP):
+ /*
+ * Configure endpoint commands can come from the USB core
+ * configuration or alt setting changes, or because the HW
+ * needed an extra configure endpoint command after a reset
+ * endpoint command. In the latter case, the xHCI driver is
+ * not waiting on the configure endpoint command.
+ */
+ ctrl_ctx = xhci_get_input_control_ctx(xhci,
+ xhci->devs[slot_id]->in_ctx);
+ /* Input ctx add_flags are the endpoint index plus one */
+ ep_index = xhci_last_valid_endpoint(ctrl_ctx->add_flags) - 1;
+ ep_ring = xhci->devs[slot_id]->ep_rings[ep_index];
+ if (!ep_ring) {
+ /* This must have been an initial configure endpoint */
+ xhci->devs[slot_id]->cmd_status =
+ GET_COMP_CODE(event->status);
+ complete(&xhci->devs[slot_id]->cmd_completion);
+ break;
+ }
+ ep_state = ep_ring->state;
+ xhci_dbg(xhci, "Completed config ep cmd - last ep index = %d, "
+ "state = %d\n", ep_index, ep_state);
+ if (xhci->quirks & XHCI_RESET_EP_QUIRK &&
+ ep_state & EP_HALTED) {
+ /* Clear our internal halted state and restart ring */
+ xhci->devs[slot_id]->ep_rings[ep_index]->state &=
+ ~EP_HALTED;
+ ring_ep_doorbell(xhci, slot_id, ep_index);
+ } else {
+ xhci->devs[slot_id]->cmd_status =
+ GET_COMP_CODE(event->status);
+ complete(&xhci->devs[slot_id]->cmd_completion);
+ }
+ break;
+ case TRB_TYPE(TRB_EVAL_CONTEXT):
xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(event->status);
complete(&xhci->devs[slot_id]->cmd_completion);
break;
@@ -763,9 +822,11 @@ static struct xhci_segment *trb_in_td(
cur_seg = start_seg;
do {
+ if (start_dma == 0)
+ return 0;
/* We may get an event for a Link TRB in the middle of a TD */
end_seg_dma = xhci_trb_virt_to_dma(cur_seg,
- &start_seg->trbs[TRBS_PER_SEGMENT - 1]);
+ &cur_seg->trbs[TRBS_PER_SEGMENT - 1]);
/* If the end TRB isn't in this segment, this is set to 0 */
end_trb_dma = xhci_trb_virt_to_dma(cur_seg, end_trb);
@@ -792,8 +853,9 @@ static struct xhci_segment *trb_in_td(
}
cur_seg = cur_seg->next;
start_dma = xhci_trb_virt_to_dma(cur_seg, &cur_seg->trbs[0]);
- } while (1);
+ } while (cur_seg != start_seg);
+ return 0;
}
/*
@@ -806,6 +868,7 @@ static int handle_tx_event(struct xhci_hcd *xhci,
{
struct xhci_virt_device *xdev;
struct xhci_ring *ep_ring;
+ unsigned int slot_id;
int ep_index;
struct xhci_td *td = 0;
dma_addr_t event_dma;
@@ -814,9 +877,11 @@ static int handle_tx_event(struct xhci_hcd *xhci,
struct urb *urb = 0;
int status = -EINPROGRESS;
struct xhci_ep_ctx *ep_ctx;
+ u32 trb_comp_code;
xhci_dbg(xhci, "In %s\n", __func__);
- xdev = xhci->devs[TRB_TO_SLOT_ID(event->flags)];
+ slot_id = TRB_TO_SLOT_ID(event->flags);
+ xdev = xhci->devs[slot_id];
if (!xdev) {
xhci_err(xhci, "ERROR Transfer event pointed to bad slot\n");
return -ENODEV;
@@ -870,7 +935,8 @@ static int handle_tx_event(struct xhci_hcd *xhci,
(unsigned int) event->flags);
/* Look for common error cases */
- switch (GET_COMP_CODE(event->transfer_len)) {
+ trb_comp_code = GET_COMP_CODE(event->transfer_len);
+ switch (trb_comp_code) {
/* Skip codes that require special handling depending on
* transfer type
*/
@@ -913,7 +979,7 @@ static int handle_tx_event(struct xhci_hcd *xhci,
/* Was this a control transfer? */
if (usb_endpoint_xfer_control(&td->urb->ep->desc)) {
xhci_debug_trb(xhci, xhci->event_ring->dequeue);
- switch (GET_COMP_CODE(event->transfer_len)) {
+ switch (trb_comp_code) {
case COMP_SUCCESS:
if (event_trb == ep_ring->dequeue) {
xhci_warn(xhci, "WARN: Success on ctrl setup TRB without IOC set??\n");
@@ -928,8 +994,39 @@ static int handle_tx_event(struct xhci_hcd *xhci,
break;
case COMP_SHORT_TX:
xhci_warn(xhci, "WARN: short transfer on control ep\n");
- status = -EREMOTEIO;
+ if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
+ status = -EREMOTEIO;
+ else
+ status = 0;
break;
+ case COMP_BABBLE:
+ /* The 0.96 spec says a babbling control endpoint
+ * is not halted. The 0.96 spec says it is. Some HW
+ * claims to be 0.95 compliant, but it halts the control
+ * endpoint anyway. Check if a babble halted the
+ * endpoint.
+ */
+ if (ep_ctx->ep_info != EP_STATE_HALTED)
+ break;
+ /* else fall through */
+ case COMP_STALL:
+ /* Did we transfer part of the data (middle) phase? */
+ if (event_trb != ep_ring->dequeue &&
+ event_trb != td->last_trb)
+ td->urb->actual_length =
+ td->urb->transfer_buffer_length
+ - TRB_LEN(event->transfer_len);
+ else
+ td->urb->actual_length = 0;
+
+ ep_ring->stopped_td = td;
+ ep_ring->stopped_trb = event_trb;
+ xhci_queue_reset_ep(xhci, slot_id, ep_index);
+ xhci_cleanup_stalled_ring(xhci,
+ td->urb->dev,
+ ep_index, ep_ring);
+ xhci_ring_cmd_db(xhci);
+ goto td_cleanup;
default:
/* Others already handled above */
break;
@@ -943,7 +1040,10 @@ static int handle_tx_event(struct xhci_hcd *xhci,
if (event_trb == td->last_trb) {
if (td->urb->actual_length != 0) {
/* Don't overwrite a previously set error code */
- if (status == -EINPROGRESS || status == 0)
+ if ((status == -EINPROGRESS ||
+ status == 0) &&
+ (td->urb->transfer_flags
+ & URB_SHORT_NOT_OK))
/* Did we already see a short data stage? */
status = -EREMOTEIO;
} else {
@@ -952,7 +1052,7 @@ static int handle_tx_event(struct xhci_hcd *xhci,
}
} else {
/* Maybe the event was for the data stage? */
- if (GET_COMP_CODE(event->transfer_len) != COMP_STOP_INVAL) {
+ if (trb_comp_code != COMP_STOP_INVAL) {
/* We didn't stop on a link TRB in the middle */
td->urb->actual_length =
td->urb->transfer_buffer_length -
@@ -964,7 +1064,7 @@ static int handle_tx_event(struct xhci_hcd *xhci,
}
}
} else {
- switch (GET_COMP_CODE(event->transfer_len)) {
+ switch (trb_comp_code) {
case COMP_SUCCESS:
/* Double check that the HW transferred everything. */
if (event_trb != td->last_trb) {
@@ -975,7 +1075,12 @@ static int handle_tx_event(struct xhci_hcd *xhci,
else
status = 0;
} else {
- xhci_dbg(xhci, "Successful bulk transfer!\n");
+ if (usb_endpoint_xfer_bulk(&td->urb->ep->desc))
+ xhci_dbg(xhci, "Successful bulk "
+ "transfer!\n");
+ else
+ xhci_dbg(xhci, "Successful interrupt "
+ "transfer!\n");
status = 0;
}
break;
@@ -1001,11 +1106,17 @@ static int handle_tx_event(struct xhci_hcd *xhci,
td->urb->actual_length =
td->urb->transfer_buffer_length -
TRB_LEN(event->transfer_len);
- if (td->urb->actual_length < 0) {
+ if (td->urb->transfer_buffer_length <
+ td->urb->actual_length) {
xhci_warn(xhci, "HC gave bad length "
"of %d bytes left\n",
TRB_LEN(event->transfer_len));
td->urb->actual_length = 0;
+ if (td->urb->transfer_flags &
+ URB_SHORT_NOT_OK)
+ status = -EREMOTEIO;
+ else
+ status = 0;
}
/* Don't overwrite a previously set error code */
if (status == -EINPROGRESS) {
@@ -1041,14 +1152,14 @@ static int handle_tx_event(struct xhci_hcd *xhci,
/* If the ring didn't stop on a Link or No-op TRB, add
* in the actual bytes transferred from the Normal TRB
*/
- if (GET_COMP_CODE(event->transfer_len) != COMP_STOP_INVAL)
+ if (trb_comp_code != COMP_STOP_INVAL)
td->urb->actual_length +=
TRB_LEN(cur_trb->generic.field[2]) -
TRB_LEN(event->transfer_len);
}
}
- if (GET_COMP_CODE(event->transfer_len) == COMP_STOP_INVAL ||
- GET_COMP_CODE(event->transfer_len) == COMP_STOP) {
+ if (trb_comp_code == COMP_STOP_INVAL ||
+ trb_comp_code == COMP_STOP) {
/* The Endpoint Stop Command completion will take care of any
* stopped TDs. A stopped TD may be restarted, so don't update
* the ring dequeue pointer or take this TD off any lists yet.
@@ -1056,7 +1167,8 @@ static int handle_tx_event(struct xhci_hcd *xhci,
ep_ring->stopped_td = td;
ep_ring->stopped_trb = event_trb;
} else {
- if (GET_COMP_CODE(event->transfer_len) == COMP_STALL) {
+ if (trb_comp_code == COMP_STALL ||
+ trb_comp_code == COMP_BABBLE) {
/* The transfer is completed from the driver's
* perspective, but we need to issue a set dequeue
* command for this stalled endpoint to move the dequeue
@@ -1072,16 +1184,41 @@ static int handle_tx_event(struct xhci_hcd *xhci,
inc_deq(xhci, ep_ring, false);
}
+td_cleanup:
/* Clean up the endpoint's TD list */
urb = td->urb;
+ /* Do one last check of the actual transfer length.
+ * If the host controller said we transferred more data than
+ * the buffer length, urb->actual_length will be a very big
+ * number (since it's unsigned). Play it safe and say we didn't
+ * transfer anything.
+ */
+ if (urb->actual_length > urb->transfer_buffer_length) {
+ xhci_warn(xhci, "URB transfer length is wrong, "
+ "xHC issue? req. len = %u, "
+ "act. len = %u\n",
+ urb->transfer_buffer_length,
+ urb->actual_length);
+ urb->actual_length = 0;
+ if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
+ status = -EREMOTEIO;
+ else
+ status = 0;
+ }
list_del(&td->td_list);
/* Was this TD slated to be cancelled but completed anyway? */
if (!list_empty(&td->cancelled_td_list)) {
list_del(&td->cancelled_td_list);
ep_ring->cancels_pending--;
}
- /* Leave the TD around for the reset endpoint function to use */
- if (GET_COMP_CODE(event->transfer_len) != COMP_STALL) {
+ /* Leave the TD around for the reset endpoint function to use
+ * (but only if it's not a control endpoint, since we already
+ * queued the Set TR dequeue pointer command for stalled
+ * control endpoints).
+ */
+ if (usb_endpoint_xfer_control(&urb->ep->desc) ||
+ (trb_comp_code != COMP_STALL &&
+ trb_comp_code != COMP_BABBLE)) {
kfree(td);
}
urb->hcpriv = NULL;
@@ -1094,7 +1231,7 @@ cleanup:
if (urb) {
usb_hcd_unlink_urb_from_ep(xhci_to_hcd(xhci), urb);
xhci_dbg(xhci, "Giveback URB %p, len = %d, status = %d\n",
- urb, td->urb->actual_length, status);
+ urb, urb->actual_length, status);
spin_unlock(&xhci->lock);
usb_hcd_giveback_urb(xhci_to_hcd(xhci), urb, status);
spin_lock(&xhci->lock);
@@ -1335,6 +1472,47 @@ static void giveback_first_trb(struct xhci_hcd *xhci, int slot_id,
ring_ep_doorbell(xhci, slot_id, ep_index);
}
+/*
+ * xHCI uses normal TRBs for both bulk and interrupt. When the interrupt
+ * endpoint is to be serviced, the xHC will consume (at most) one TD. A TD
+ * (comprised of sg list entries) can take several service intervals to
+ * transmit.
+ */
+int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
+ struct urb *urb, int slot_id, unsigned int ep_index)
+{
+ struct xhci_ep_ctx *ep_ctx = xhci_get_ep_ctx(xhci,
+ xhci->devs[slot_id]->out_ctx, ep_index);
+ int xhci_interval;
+ int ep_interval;
+
+ xhci_interval = EP_INTERVAL_TO_UFRAMES(ep_ctx->ep_info);
+ ep_interval = urb->interval;
+ /* Convert to microframes */
+ if (urb->dev->speed == USB_SPEED_LOW ||
+ urb->dev->speed == USB_SPEED_FULL)
+ ep_interval *= 8;
+ /* FIXME change this to a warning and a suggestion to use the new API
+ * to set the polling interval (once the API is added).
+ */
+ if (xhci_interval != ep_interval) {
+ if (!printk_ratelimit())
+ dev_dbg(&urb->dev->dev, "Driver uses different interval"
+ " (%d microframe%s) than xHCI "
+ "(%d microframe%s)\n",
+ ep_interval,
+ ep_interval == 1 ? "" : "s",
+ xhci_interval,
+ xhci_interval == 1 ? "" : "s");
+ urb->interval = xhci_interval;
+ /* Convert back to frames for LS/FS devices */
+ if (urb->dev->speed == USB_SPEED_LOW ||
+ urb->dev->speed == USB_SPEED_FULL)
+ urb->interval /= 8;
+ }
+ return xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb, slot_id, ep_index);
+}
+
static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
struct urb *urb, int slot_id, unsigned int ep_index)
{
@@ -1733,6 +1911,15 @@ int xhci_queue_configure_endpoint(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr,
TRB_TYPE(TRB_CONFIG_EP) | SLOT_ID_FOR_TRB(slot_id));
}
+/* Queue an evaluate context command TRB */
+int xhci_queue_evaluate_context(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr,
+ u32 slot_id)
+{
+ return queue_command(xhci, lower_32_bits(in_ctx_ptr),
+ upper_32_bits(in_ctx_ptr), 0,
+ TRB_TYPE(TRB_EVAL_CONTEXT) | SLOT_ID_FOR_TRB(slot_id));
+}
+
int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, int slot_id,
unsigned int ep_index)
{
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index d31d32206ba3..808584153579 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -581,6 +581,7 @@ struct xhci_ep_ctx {
/* bit 15 is Linear Stream Array */
/* Interval - period between requests to an endpoint - 125u increments. */
#define EP_INTERVAL(p) ((p & 0xff) << 16)
+#define EP_INTERVAL_TO_UFRAMES(p) (1 << (((p) >> 16) & 0xff))
/* ep_info2 bitmasks */
/*
@@ -589,6 +590,7 @@ struct xhci_ep_ctx {
*/
#define FORCE_EVENT (0x1)
#define ERROR_COUNT(p) (((p) & 0x3) << 1)
+#define CTX_TO_EP_TYPE(p) (((p) >> 3) & 0x7)
#define EP_TYPE(p) ((p) << 3)
#define ISOC_OUT_EP 1
#define BULK_OUT_EP 2
@@ -601,6 +603,8 @@ struct xhci_ep_ctx {
/* bit 7 is Host Initiate Disable - for disabling stream selection */
#define MAX_BURST(p) (((p)&0xff) << 8)
#define MAX_PACKET(p) (((p)&0xffff) << 16)
+#define MAX_PACKET_MASK (0xffff << 16)
+#define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff)
/**
@@ -926,6 +930,12 @@ struct xhci_td {
union xhci_trb *last_trb;
};
+struct xhci_dequeue_state {
+ struct xhci_segment *new_deq_seg;
+ union xhci_trb *new_deq_ptr;
+ int new_cycle_state;
+};
+
struct xhci_ring {
struct xhci_segment *first_seg;
union xhci_trb *enqueue;
@@ -952,12 +962,6 @@ struct xhci_ring {
u32 cycle_state;
};
-struct xhci_dequeue_state {
- struct xhci_segment *new_deq_seg;
- union xhci_trb *new_deq_ptr;
- int new_cycle_state;
-};
-
struct xhci_erst_entry {
/* 64-bit event ring segment address */
u64 seg_addr;
@@ -1058,6 +1062,9 @@ struct xhci_hcd {
int noops_submitted;
int noops_handled;
int error_bitmask;
+ unsigned int quirks;
+#define XHCI_LINK_TRB_QUIRK (1 << 0)
+#define XHCI_RESET_EP_QUIRK (1 << 1)
};
/* For testing purposes */
@@ -1136,6 +1143,13 @@ static inline void xhci_write_64(struct xhci_hcd *xhci,
writel(val_hi, ptr + 1);
}
+static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci)
+{
+ u32 temp = xhci_readl(xhci, &xhci->cap_regs->hc_capbase);
+ return ((HC_VERSION(temp) == 0x95) &&
+ (xhci->quirks & XHCI_LINK_TRB_QUIRK));
+}
+
/* xHCI debugging */
void xhci_print_ir_set(struct xhci_hcd *xhci, struct xhci_intr_reg *ir_set, int set_num);
void xhci_print_registers(struct xhci_hcd *xhci);
@@ -1158,7 +1172,12 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, struct usb_device
int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *udev);
unsigned int xhci_get_endpoint_index(struct usb_endpoint_descriptor *desc);
unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc);
+unsigned int xhci_get_endpoint_flag_from_index(unsigned int ep_index);
+unsigned int xhci_last_valid_endpoint(u32 added_ctxs);
void xhci_endpoint_zero(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_host_endpoint *ep);
+void xhci_endpoint_copy(struct xhci_hcd *xhci,
+ struct xhci_virt_device *vdev, unsigned int ep_index);
+void xhci_slot_copy(struct xhci_hcd *xhci, struct xhci_virt_device *vdev);
int xhci_endpoint_init(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev,
struct usb_device *udev, struct usb_host_endpoint *ep,
gfp_t mem_flags);
@@ -1205,8 +1224,12 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb,
int slot_id, unsigned int ep_index);
int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb,
int slot_id, unsigned int ep_index);
+int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb,
+ int slot_id, unsigned int ep_index);
int xhci_queue_configure_endpoint(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr,
u32 slot_id);
+int xhci_queue_evaluate_context(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr,
+ u32 slot_id);
int xhci_queue_reset_ep(struct xhci_hcd *xhci, int slot_id,
unsigned int ep_index);
void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,
@@ -1215,6 +1238,12 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,
void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci,
struct xhci_ring *ep_ring, unsigned int slot_id,
unsigned int ep_index, struct xhci_dequeue_state *deq_state);
+void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci,
+ struct usb_device *udev,
+ unsigned int ep_index, struct xhci_ring *ep_ring);
+void xhci_queue_config_ep_quirk(struct xhci_hcd *xhci,
+ unsigned int slot_id, unsigned int ep_index,
+ struct xhci_dequeue_state *deq_state);
/* xHCI roothub code */
int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex,
diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c
index 1d8e39a557d9..62ff5e729110 100644
--- a/drivers/usb/misc/appledisplay.c
+++ b/drivers/usb/misc/appledisplay.c
@@ -72,8 +72,8 @@ struct appledisplay {
struct usb_device *udev; /* usb device */
struct urb *urb; /* usb request block */
struct backlight_device *bd; /* backlight device */
- char *urbdata; /* interrupt URB data buffer */
- char *msgdata; /* control message data buffer */
+ u8 *urbdata; /* interrupt URB data buffer */
+ u8 *msgdata; /* control message data buffer */
struct delayed_work work;
int button_pressed;
diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c
index 602ee05ba9ff..59860b328534 100644
--- a/drivers/usb/misc/emi62.c
+++ b/drivers/usb/misc/emi62.c
@@ -167,7 +167,7 @@ static int emi62_load_firmware (struct usb_device *dev)
err("%s - error loading firmware: error = %d", __func__, err);
goto wraperr;
}
- } while (i > 0);
+ } while (rec);
/* Assert reset (stop the CPU in the EMI) */
err = emi62_set_reset(dev,1);
diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c
index 0f7a30b7d2d1..fb1dd27be76d 100644
--- a/drivers/usb/mon/mon_bin.c
+++ b/drivers/usb/mon/mon_bin.c
@@ -350,12 +350,12 @@ static unsigned int mon_buff_area_alloc_contiguous(struct mon_reader_bin *rp,
/*
* Return a few (kilo-)bytes to the head of the buffer.
- * This is used if a DMA fetch fails.
+ * This is used if a data fetch fails.
*/
static void mon_buff_area_shrink(struct mon_reader_bin *rp, unsigned int size)
{
- size = (size + PKT_ALIGN-1) & ~(PKT_ALIGN-1);
+ /* size &= ~(PKT_ALIGN-1); -- we're called with aligned size */
rp->b_cnt -= size;
if (rp->b_in < size)
rp->b_in += rp->b_size;
@@ -442,6 +442,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
unsigned int urb_length;
unsigned int offset;
unsigned int length;
+ unsigned int delta;
unsigned int ndesc, lendesc;
unsigned char dir;
struct mon_bin_hdr *ep;
@@ -546,8 +547,10 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
if (length != 0) {
ep->flag_data = mon_bin_get_data(rp, offset, urb, length);
if (ep->flag_data != 0) { /* Yes, it's 0x00, not '0' */
- ep->len_cap = 0;
- mon_buff_area_shrink(rp, length);
+ delta = (ep->len_cap + PKT_ALIGN-1) & ~(PKT_ALIGN-1);
+ ep->len_cap -= length;
+ delta -= (ep->len_cap + PKT_ALIGN-1) & ~(PKT_ALIGN-1);
+ mon_buff_area_shrink(rp, delta);
}
} else {
ep->flag_data = data_tag;
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 8b3c4e2ed7b8..74073f9a43f0 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -4,6 +4,7 @@
* Copyright 2005 Mentor Graphics Corporation
* Copyright (C) 2005-2006 by Texas Instruments
* Copyright (C) 2006-2007 Nokia Corporation
+ * Copyright (C) 2009 MontaVista Software, Inc. <source@mvista.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -436,14 +437,6 @@ void musb_g_tx(struct musb *musb, u8 epnum)
csr |= MUSB_TXCSR_P_WZC_BITS;
csr &= ~MUSB_TXCSR_P_SENTSTALL;
musb_writew(epio, MUSB_TXCSR, csr);
- if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) {
- dma->status = MUSB_DMA_STATUS_CORE_ABORT;
- musb->dma_controller->channel_abort(dma);
- }
-
- if (request)
- musb_g_giveback(musb_ep, request, -EPIPE);
-
break;
}
@@ -582,15 +575,25 @@ void musb_g_tx(struct musb *musb, u8 epnum)
*/
static void rxstate(struct musb *musb, struct musb_request *req)
{
- u16 csr = 0;
const u8 epnum = req->epnum;
struct usb_request *request = &req->request;
struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out;
void __iomem *epio = musb->endpoints[epnum].regs;
unsigned fifo_count = 0;
u16 len = musb_ep->packet_sz;
+ u16 csr = musb_readw(epio, MUSB_RXCSR);
- csr = musb_readw(epio, MUSB_RXCSR);
+ /* We shouldn't get here while DMA is active, but we do... */
+ if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) {
+ DBG(4, "DMA pending...\n");
+ return;
+ }
+
+ if (csr & MUSB_RXCSR_P_SENDSTALL) {
+ DBG(5, "%s stalling, RXCSR %04x\n",
+ musb_ep->end_point.name, csr);
+ return;
+ }
if (is_cppi_enabled() && musb_ep->dma) {
struct dma_controller *c = musb->dma_controller;
@@ -761,19 +764,10 @@ void musb_g_rx(struct musb *musb, u8 epnum)
csr, dma ? " (dma)" : "", request);
if (csr & MUSB_RXCSR_P_SENTSTALL) {
- if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) {
- dma->status = MUSB_DMA_STATUS_CORE_ABORT;
- (void) musb->dma_controller->channel_abort(dma);
- request->actual += musb_ep->dma->actual_len;
- }
-
csr |= MUSB_RXCSR_P_WZC_BITS;
csr &= ~MUSB_RXCSR_P_SENTSTALL;
musb_writew(epio, MUSB_RXCSR, csr);
-
- if (request)
- musb_g_giveback(musb_ep, request, -EPIPE);
- goto done;
+ return;
}
if (csr & MUSB_RXCSR_P_OVERRUN) {
@@ -795,7 +789,7 @@ void musb_g_rx(struct musb *musb, u8 epnum)
DBG((csr & MUSB_RXCSR_DMAENAB) ? 4 : 1,
"%s busy, csr %04x\n",
musb_ep->end_point.name, csr);
- goto done;
+ return;
}
if (dma && (csr & MUSB_RXCSR_DMAENAB)) {
@@ -826,22 +820,15 @@ void musb_g_rx(struct musb *musb, u8 epnum)
if ((request->actual < request->length)
&& (musb_ep->dma->actual_len
== musb_ep->packet_sz))
- goto done;
+ return;
#endif
musb_g_giveback(musb_ep, request, 0);
request = next_request(musb_ep);
if (!request)
- goto done;
-
- /* don't start more i/o till the stall clears */
- musb_ep_select(mbase, epnum);
- csr = musb_readw(epio, MUSB_RXCSR);
- if (csr & MUSB_RXCSR_P_SENDSTALL)
- goto done;
+ return;
}
-
/* analyze request if the ep is hot */
if (request)
rxstate(musb, to_musb_request(request));
@@ -849,8 +836,6 @@ void musb_g_rx(struct musb *musb, u8 epnum)
DBG(3, "packet waiting for %s%s request\n",
musb_ep->desc ? "" : "inactive ",
musb_ep->end_point.name);
-
-done:
return;
}
@@ -1244,7 +1229,7 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value)
void __iomem *mbase;
unsigned long flags;
u16 csr;
- struct musb_request *request = NULL;
+ struct musb_request *request;
int status = 0;
if (!ep)
@@ -1260,24 +1245,29 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value)
musb_ep_select(mbase, epnum);
- /* cannot portably stall with non-empty FIFO */
request = to_musb_request(next_request(musb_ep));
- if (value && musb_ep->is_in) {
- csr = musb_readw(epio, MUSB_TXCSR);
- if (csr & MUSB_TXCSR_FIFONOTEMPTY) {
- DBG(3, "%s fifo busy, cannot halt\n", ep->name);
- spin_unlock_irqrestore(&musb->lock, flags);
- return -EAGAIN;
+ if (value) {
+ if (request) {
+ DBG(3, "request in progress, cannot halt %s\n",
+ ep->name);
+ status = -EAGAIN;
+ goto done;
+ }
+ /* Cannot portably stall with non-empty FIFO */
+ if (musb_ep->is_in) {
+ csr = musb_readw(epio, MUSB_TXCSR);
+ if (csr & MUSB_TXCSR_FIFONOTEMPTY) {
+ DBG(3, "FIFO busy, cannot halt %s\n", ep->name);
+ status = -EAGAIN;
+ goto done;
+ }
}
-
}
/* set/clear the stall and toggle bits */
DBG(2, "%s: %s stall\n", ep->name, value ? "set" : "clear");
if (musb_ep->is_in) {
csr = musb_readw(epio, MUSB_TXCSR);
- if (csr & MUSB_TXCSR_FIFONOTEMPTY)
- csr |= MUSB_TXCSR_FLUSHFIFO;
csr |= MUSB_TXCSR_P_WZC_BITS
| MUSB_TXCSR_CLRDATATOG;
if (value)
@@ -1300,14 +1290,13 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value)
musb_writew(epio, MUSB_RXCSR, csr);
}
-done:
-
/* maybe start the first request in the queue */
if (!musb_ep->busy && !value && request) {
DBG(3, "restarting the request\n");
musb_ep_restart(musb, request);
}
+done:
spin_unlock_irqrestore(&musb->lock, flags);
return status;
}
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c
index 7a6778675ad3..677cc2ee9fd3 100644
--- a/drivers/usb/musb/musb_gadget_ep0.c
+++ b/drivers/usb/musb/musb_gadget_ep0.c
@@ -199,7 +199,6 @@ service_in_request(struct musb *musb, const struct usb_ctrlrequest *ctrlrequest)
static void musb_g_ep0_giveback(struct musb *musb, struct usb_request *req)
{
musb_g_giveback(&musb->endpoints[0].ep_in, req, 0);
- musb->ep0_state = MUSB_EP0_STAGE_SETUP;
}
/*
@@ -647,7 +646,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb)
musb->ep0_state = MUSB_EP0_STAGE_STATUSIN;
break;
default:
- ERR("SetupEnd came in a wrong ep0stage %s",
+ ERR("SetupEnd came in a wrong ep0stage %s\n",
decode_ep0stage(musb->ep0_state));
}
csr = musb_readw(regs, MUSB_CSR0);
@@ -770,12 +769,18 @@ setup:
handled = service_zero_data_request(
musb, &setup);
+ /*
+ * We're expecting no data in any case, so
+ * always set the DATAEND bit -- doing this
+ * here helps avoid SetupEnd interrupt coming
+ * in the idle stage when we're stalling...
+ */
+ musb->ackpend |= MUSB_CSR0_P_DATAEND;
+
/* status stage might be immediate */
- if (handled > 0) {
- musb->ackpend |= MUSB_CSR0_P_DATAEND;
+ if (handled > 0)
musb->ep0_state =
MUSB_EP0_STAGE_STATUSIN;
- }
break;
/* sequence #1 (IN to host), includes GET_STATUS
diff --git a/drivers/usb/otg/fsl_otg.c b/drivers/usb/otg/fsl_otg.c
index 81a2985632b6..6941e0565c03 100644
--- a/drivers/usb/otg/fsl_otg.c
+++ b/drivers/usb/otg/fsl_otg.c
@@ -34,7 +34,6 @@
#include <linux/init.h>
#include <linux/reboot.h>
#include <linux/timer.h>
-#include <linux/jiffies.h>
#include <linux/list.h>
#include <linux/usb.h>
#include <linux/device.h>
@@ -62,8 +61,6 @@
#define DRIVER_DESC "Freescale USB OTG Driver"
#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC
-#define TIMER_FREQ 1000 /* 100 ms*/
-#define IDLE_TIME 5000 /* 1000 ms */
MODULE_DESCRIPTION("Freescale USB OTG Transceiver Driver");
@@ -93,13 +90,6 @@ static struct fsl_otg_config fsl_otg_initdata = {
.otg_port = 1,
};
-/* the timer is used to monitor the otg loading, if idle for some times
- * we will close the otg clk
- */
-static unsigned long last_busy;
-static bool clk_stopped;
-static struct timer_list monitor_timer;
-
int write_ulpi(u8 addr, u8 data)
{
u32 temp;
@@ -149,6 +139,15 @@ void fsl_otg_dischrg_vbus(int on)
/* A-device driver vbus, controlled through PP bit in PORTSC */
void fsl_otg_drv_vbus(struct fsl_usb2_platform_data *pdata, int on)
{
+/* if (on)
+ usb_dr_regs->portsc =
+ cpu_to_le32((le32_to_cpu(usb_dr_regs->portsc) &
+ ~PORTSC_W1C_BITS) | PORTSC_PORT_POWER);
+ else
+ usb_dr_regs->portsc =
+ cpu_to_le32(le32_to_cpu(usb_dr_regs->portsc) &
+ ~PORTSC_W1C_BITS & ~PORTSC_PORT_POWER);
+*/
if (pdata->xcvr_ops && pdata->xcvr_ops->set_vbus_power)
pdata->xcvr_ops->set_vbus_power(pdata->xcvr_ops, pdata, on);
}
@@ -399,61 +398,6 @@ int fsl_otg_tick_timer(void)
return expired;
}
-static void fsl_otg_clk_gate(bool on)
-{
- struct device *dev = fsl_otg_dev->otg.dev;
- struct fsl_usb2_platform_data *pdata;
-
- if (dev) {
- pdata = dev->platform_data;
- if (pdata && pdata->usb_clock_for_pm)
- pdata->usb_clock_for_pm(on);
- }
-}
-
-static void fsl_otg_clk_ctl(void)
-{
- if (clk_stopped){
- fsl_otg_clk_gate(true);
- clk_stopped = false;
- }
- last_busy = jiffies;
-}
-
-static void fsl_otg_loading_monitor(unsigned long data)
-{
- unsigned long now = jiffies;
- if (!clk_stopped){
- if (time_after(now, last_busy + msecs_to_jiffies(IDLE_TIME))){
- printk("otg is idle for some times,so we close the clock %x\n", le32_to_cpu(usb_dr_regs->otgsc));
- clk_stopped = true;
- fsl_otg_clk_gate(false);
- printk("close otg clk ok\n");
- }
- }
- mod_timer(&monitor_timer, jiffies + msecs_to_jiffies(TIMER_FREQ));
-}
-
-/**
- * Enable vbus interrupt
- * The otg cares USB_ID interrupt
- * The device cares B Sesstion Valid
- */
-static void b_session_irq_enable(bool enable)
-{
- int osc = le32_to_cpu(usb_dr_regs->otgsc);
- /* The other interrupts' status should not be cleared */
- osc &= ~(OTGSC_INTSTS_USB_ID | OTGSC_INTSTS_A_VBUS_VALID
- | OTGSC_INTSTS_A_SESSION_VALID | OTGSC_INTSTS_B_SESSION_VALID);
- osc |= OTGSC_INTSTS_B_SESSION_VALID;
-
- if (enable)
- osc |= OTGSC_INTR_B_SESSION_VALID_EN;
- else
- osc &= ~OTGSC_INTR_B_SESSION_VALID_EN;
- usb_dr_regs->otgsc = cpu_to_le32(osc);
-}
-
/* Reset controller, not reset the bus */
void otg_reset_controller(void)
{
@@ -540,6 +484,7 @@ int fsl_otg_start_gadget(struct otg_fsm *fsm, int on)
struct device *dev;
struct platform_driver *gadget_pdrv;
struct platform_device *gadget_pdev;
+
if (!xceiv->gadget || !xceiv->gadget->dev.parent)
return -ENODEV;
@@ -575,6 +520,7 @@ static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host)
if (host) {
VDBG("host off......\n");
+
otg_p->host->otg_port = fsl_otg_initdata.otg_port;
otg_p->host->is_b_host = otg_dev->fsm.id;
/* must leave time for khubd to finish its thing
@@ -691,29 +637,11 @@ static void fsl_otg_event(struct work_struct *work)
{
struct fsl_otg *og = container_of(work, struct fsl_otg, otg_event.work);
struct otg_fsm *fsm = &og->fsm;
- struct otg_transceiver *otg = &og->otg;
-
- otg->default_a = (fsm->id == 0);
- /* clear conn information */
- if (fsm->id)
- fsm->b_conn = 0;
- else
- fsm->a_conn = 0;
-
- if (otg->host)
- otg->host->is_b_host = fsm->id;
- if (otg->gadget)
- otg->gadget->is_a_peripheral = !fsm->id;
if (fsm->id) { /* switch to gadget */
- b_session_irq_enable(true);
fsl_otg_start_host(fsm, 0);
otg_drv_vbus(fsm, 0);
fsl_otg_start_gadget(fsm, 1);
- }else { /* switch to host */
- fsl_otg_start_gadget(fsm, 0);
- otg_drv_vbus(fsm, 1);
- fsl_otg_start_host(fsm, 1);
}
}
@@ -753,13 +681,13 @@ irqreturn_t fsl_otg_isr_gpio(int irq, void *dev_id)
struct otg_fsm *fsm;
struct fsl_usb2_platform_data *pdata =
(struct fsl_usb2_platform_data *)dev_id;
- struct fsl_otg *f_otg;
+ struct fsl_otg *p_otg;
struct otg_transceiver *otg_trans = otg_get_transceiver();
int value;
- f_otg = container_of(otg_trans, struct fsl_otg, otg);
- fsm = &f_otg->fsm;
- fsl_otg_clk_ctl();
+ p_otg = container_of(otg_trans, struct fsl_otg, otg);
+ fsm = &p_otg->fsm;
+
if (pdata->id_gpio == 0)
return IRQ_NONE;
@@ -771,25 +699,35 @@ irqreturn_t fsl_otg_isr_gpio(int irq, void *dev_id)
set_irq_type(gpio_to_irq(pdata->id_gpio), IRQ_TYPE_LEVEL_HIGH);
- if (value == f_otg->fsm.id)
+ if (value == p_otg->fsm.id)
return IRQ_HANDLED;
- f_otg->fsm.id = value;
+ p_otg->fsm.id = value;
- cancel_delayed_work(&f_otg->otg_event);
- schedule_delayed_work(&f_otg->otg_event, msecs_to_jiffies(10));
- /* if host mode, we should clear B_SESSION_VLD event and disable
- * B_SESSION_VLD irq
- */
- if (!f_otg->fsm.id) {
- b_session_irq_enable(false);
- }else {
- //b_session_irq_enable(true);
- }
+ otg_trans->default_a = (fsm->id == 0);
+ /* clear conn information */
+ if (fsm->id)
+ fsm->b_conn = 0;
+ else
+ fsm->a_conn = 0;
+ if (otg_trans->host)
+ otg_trans->host->is_b_host = fsm->id;
+ if (otg_trans->gadget)
+ otg_trans->gadget->is_a_peripheral = !fsm->id;
+
+ VDBG("ID int (ID is %d)\n", fsm->id);
+ if (fsm->id) { /* switch to gadget */
+ schedule_delayed_work(&p_otg->otg_event, 100);
+
+ } else { /* switch to host */
+ cancel_delayed_work(&p_otg->otg_event);
+ fsl_otg_start_gadget(fsm, 0);
+ otg_drv_vbus(fsm, 1);
+ fsl_otg_start_host(fsm, 1);
+ }
return IRQ_HANDLED;
}
-
/* Interrupt handler. OTG/host/peripheral share the same int line.
* OTG driver clears OTGSC interrupts and leaves USB interrupts
* intact. It needs to have knowledge of some USB interrupts
@@ -797,65 +735,71 @@ irqreturn_t fsl_otg_isr_gpio(int irq, void *dev_id)
*/
irqreturn_t fsl_otg_isr(int irq, void *dev_id)
{
- struct fsl_otg *fotg = (struct fsl_otg *)dev_id;
- struct otg_transceiver *otg = &fotg->otg;
+ struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm;
+ struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg;
u32 otg_int_src, otg_sc;
- irqreturn_t ret = IRQ_NONE;
- fsl_otg_clk_ctl();
otg_sc = le32_to_cpu(usb_dr_regs->otgsc);
otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8);
- /* Only clear otg interrupts, expect B_SESSION_VALID,
- * Leave it to be handled by arcotg_udc */
- usb_dr_regs->otgsc = ((usb_dr_regs->otgsc | cpu_to_le32(otg_sc & OTGSC_INTSTS_MASK))&
- (~OTGSC_INTSTS_B_SESSION_VALID));
+ /* Only clear otg interrupts */
+ usb_dr_regs->otgsc |= cpu_to_le32(otg_sc & OTGSC_INTSTS_MASK);
/*FIXME: ID change not generate when init to 0 */
- fotg->fsm.id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
- otg->default_a = (fotg->fsm.id == 0);
+ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
+ otg->default_a = (fsm->id == 0);
/* process OTG interrupts */
if (otg_int_src) {
if (otg_int_src & OTGSC_INTSTS_USB_ID) {
- fotg->fsm.id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
-
- printk("ID int (ID is %d)\n", fotg->fsm.id);
-
- cancel_delayed_work(&fotg->otg_event);
- schedule_delayed_work(&fotg->otg_event, msecs_to_jiffies(10));
- /* if host mode, we should clear B_SESSION_VLD event and disable
- * B_SESSION_VLD irq
- */
- if (!fotg->fsm.id) {
- b_session_irq_enable(false);
- }else {
- //b_session_irq_enable(true);
+ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
+ otg->default_a = (fsm->id == 0);
+ /* clear conn information */
+ if (fsm->id)
+ fsm->b_conn = 0;
+ else
+ fsm->a_conn = 0;
+
+ if (otg->host)
+ otg->host->is_b_host = fsm->id;
+ if (otg->gadget)
+ otg->gadget->is_a_peripheral = !fsm->id;
+ VDBG("ID int (ID is %d)\n", fsm->id);
+
+ if (fsm->id) { /* switch to gadget */
+ schedule_delayed_work(&((struct fsl_otg *)
+ dev_id)->otg_event,
+ 100);
+ } else { /* switch to host */
+ cancel_delayed_work(&
+ ((struct fsl_otg *)dev_id)->
+ otg_event);
+ fsl_otg_start_gadget(fsm, 0);
+ otg_drv_vbus(fsm, 1);
+ fsl_otg_start_host(fsm, 1);
}
- ret = IRQ_HANDLED;
+
+ return IRQ_HANDLED;
}
}
- return ret;
+ return IRQ_NONE;
}
static void fsl_otg_fsm_drv_vbus(int on)
{
struct otg_fsm *fsm = &(fsl_otg_dev->fsm);
struct otg_transceiver *xceiv = fsm->transceiver;
+ struct device *dev = NULL;
- struct device *dev;
- /*
- * The host is assigned at otg_set_host
- */
- if (!xceiv->host)
+ if (!xceiv->host) {
return;
- /*
- * The dev is assigned at usb_create_hcd which is called earlier
- * than otg_set_host at host driver's probe
- */
+ }
+
dev = xceiv->host->controller;
+
fsl_otg_drv_vbus(dev->platform_data, on);
+
}
static struct otg_fsm_ops fsl_otg_ops = {
@@ -913,7 +857,6 @@ static int fsl_otg_conf(struct platform_device *pdev)
fsl_otg_tc->otg.set_power = fsl_otg_set_power;
fsl_otg_tc->otg.start_hnp = fsl_otg_start_hnp;
fsl_otg_tc->otg.start_srp = fsl_otg_start_srp;
- fsl_otg_tc->otg.dev = &pdev->dev;
fsl_otg_dev = fsl_otg_tc;
@@ -980,8 +923,6 @@ int usb_otg_start(struct platform_device *pdev)
if (pdata->platform_init && pdata->platform_init(pdev) != 0)
return -EINVAL;
- clk_stopped = false; /* platform_init will open the otg clk */
-
/* stop the controller */
temp = readl(&p_otg->dr_mem_map->usbcmd);
temp &= ~USB_CMD_RUN_STOP;
@@ -1308,10 +1249,6 @@ static int __init fsl_otg_probe(struct platform_device *pdev)
return -EIO;
}
- last_busy = jiffies;
- setup_timer(&monitor_timer, fsl_otg_loading_monitor, (unsigned long)pdev);
- mod_timer(&monitor_timer, jiffies + msecs_to_jiffies(TIMER_FREQ));
-
create_proc_file();
return status;
}
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c
index aec61880f36c..1a50beb32029 100644
--- a/drivers/usb/serial/ark3116.c
+++ b/drivers/usb/serial/ark3116.c
@@ -35,11 +35,6 @@ static struct usb_device_id id_table [] = {
};
MODULE_DEVICE_TABLE(usb, id_table);
-struct ark3116_private {
- spinlock_t lock;
- u8 termios_initialized;
-};
-
static inline void ARK3116_SND(struct usb_serial *serial, int seq,
__u8 request, __u8 requesttype,
__u16 value, __u16 index)
@@ -82,22 +77,11 @@ static inline void ARK3116_RCV_QUIET(struct usb_serial *serial,
static int ark3116_attach(struct usb_serial *serial)
{
char *buf;
- struct ark3116_private *priv;
- int i;
-
- for (i = 0; i < serial->num_ports; ++i) {
- priv = kzalloc(sizeof(struct ark3116_private), GFP_KERNEL);
- if (!priv)
- goto cleanup;
- spin_lock_init(&priv->lock);
-
- usb_set_serial_port_data(serial->port[i], priv);
- }
buf = kmalloc(1, GFP_KERNEL);
if (!buf) {
dbg("error kmalloc -> out of mem?");
- goto cleanup;
+ return -ENOMEM;
}
/* 3 */
@@ -149,13 +133,16 @@ static int ark3116_attach(struct usb_serial *serial)
kfree(buf);
return 0;
+}
-cleanup:
- for (--i; i >= 0; --i) {
- kfree(usb_get_serial_port_data(serial->port[i]));
- usb_set_serial_port_data(serial->port[i], NULL);
- }
- return -ENOMEM;
+static void ark3116_init_termios(struct tty_struct *tty)
+{
+ struct ktermios *termios = tty->termios;
+ *termios = tty_std_termios;
+ termios->c_cflag = B9600 | CS8
+ | CREAD | HUPCL | CLOCAL;
+ termios->c_ispeed = 9600;
+ termios->c_ospeed = 9600;
}
static void ark3116_set_termios(struct tty_struct *tty,
@@ -163,10 +150,8 @@ static void ark3116_set_termios(struct tty_struct *tty,
struct ktermios *old_termios)
{
struct usb_serial *serial = port->serial;
- struct ark3116_private *priv = usb_get_serial_port_data(port);
struct ktermios *termios = tty->termios;
unsigned int cflag = termios->c_cflag;
- unsigned long flags;
int baud;
int ark3116_baud;
char *buf;
@@ -176,16 +161,6 @@ static void ark3116_set_termios(struct tty_struct *tty,
dbg("%s - port %d", __func__, port->number);
- spin_lock_irqsave(&priv->lock, flags);
- if (!priv->termios_initialized) {
- *termios = tty_std_termios;
- termios->c_cflag = B9600 | CS8
- | CREAD | HUPCL | CLOCAL;
- termios->c_ispeed = 9600;
- termios->c_ospeed = 9600;
- priv->termios_initialized = 1;
- }
- spin_unlock_irqrestore(&priv->lock, flags);
cflag = termios->c_cflag;
termios->c_cflag &= ~(CMSPAR|CRTSCTS);
@@ -455,6 +430,7 @@ static struct usb_serial_driver ark3116_device = {
.num_ports = 1,
.attach = ark3116_attach,
.set_termios = ark3116_set_termios,
+ .init_termios = ark3116_init_termios,
.ioctl = ark3116_ioctl,
.tiocmget = ark3116_tiocmget,
.open = ark3116_open,
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
index 0e4f2e41ace5..3e49b2ed0266 100644
--- a/drivers/usb/serial/console.c
+++ b/drivers/usb/serial/console.c
@@ -16,6 +16,7 @@
#include <linux/slab.h>
#include <linux/tty.h>
#include <linux/console.h>
+#include <linux/serial.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>
@@ -63,7 +64,7 @@ static int usb_console_setup(struct console *co, char *options)
char *s;
struct usb_serial *serial;
struct usb_serial_port *port;
- int retval = 0;
+ int retval;
struct tty_struct *tty = NULL;
struct ktermios *termios = NULL, dummy;
@@ -116,13 +117,17 @@ static int usb_console_setup(struct console *co, char *options)
return -ENODEV;
}
- port = serial->port[0];
+ retval = usb_autopm_get_interface(serial->interface);
+ if (retval)
+ goto error_get_interface;
+
+ port = serial->port[co->index - serial->minor];
tty_port_tty_set(&port->port, NULL);
info->port = port;
++port->port.count;
- if (port->port.count == 1) {
+ if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags)) {
if (serial->type->set_termios) {
/*
* allocate a fake tty so the driver can initialize
@@ -168,6 +173,7 @@ static int usb_console_setup(struct console *co, char *options)
kfree(termios);
kfree(tty);
}
+ set_bit(ASYNCB_INITIALIZED, &port->port.flags);
}
/* Now that any required fake tty operations are completed restore
* the tty port count */
@@ -175,18 +181,22 @@ static int usb_console_setup(struct console *co, char *options)
/* The console is special in terms of closing the device so
* indicate this port is now acting as a system console. */
port->console = 1;
- retval = 0;
-out:
+ mutex_unlock(&serial->disc_mutex);
return retval;
-free_termios:
+
+ free_termios:
kfree(termios);
tty_port_tty_set(&port->port, NULL);
-free_tty:
+ free_tty:
kfree(tty);
-reset_open_count:
+ reset_open_count:
port->port.count = 0;
- goto out;
+ usb_autopm_put_interface(serial->interface);
+ error_get_interface:
+ usb_serial_put(serial);
+ mutex_unlock(&serial->disc_mutex);
+ return retval;
}
static void usb_console_write(struct console *co,
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index 985cbcf48bda..2367325e80b0 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -51,6 +51,8 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *,
static void cp210x_break_ctl(struct tty_struct *, int);
static int cp210x_startup(struct usb_serial *);
static void cp210x_disconnect(struct usb_serial *);
+static void cp210x_dtr_rts(struct usb_serial_port *p, int on);
+static int cp210x_carrier_raised(struct usb_serial_port *p);
static int debug;
@@ -114,6 +116,7 @@ static struct usb_device_id id_table [] = {
{ USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */
{ USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
{ USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
+ { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */
{ } /* Terminating Entry */
};
@@ -143,6 +146,8 @@ static struct usb_serial_driver cp210x_device = {
.tiocmset = cp210x_tiocmset,
.attach = cp210x_startup,
.disconnect = cp210x_disconnect,
+ .dtr_rts = cp210x_dtr_rts,
+ .carrier_raised = cp210x_carrier_raised
};
/* Config request types */
@@ -399,12 +404,6 @@ static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port,
/* Configure the termios structure */
cp210x_get_termios(tty, port);
-
- /* Set the DTR and RTS pins low */
- cp210x_tiocmset_port(tty ? (struct usb_serial_port *) tty->driver_data
- : port,
- NULL, TIOCM_DTR | TIOCM_RTS, 0);
-
return 0;
}
@@ -753,6 +752,14 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *file,
return cp210x_set_config(port, CP210X_SET_MHS, &control, 2);
}
+static void cp210x_dtr_rts(struct usb_serial_port *p, int on)
+{
+ if (on)
+ cp210x_tiocmset_port(p, NULL, TIOCM_DTR|TIOCM_RTS, 0);
+ else
+ cp210x_tiocmset_port(p, NULL, 0, TIOCM_DTR|TIOCM_RTS);
+}
+
static int cp210x_tiocmget (struct tty_struct *tty, struct file *file)
{
struct usb_serial_port *port = tty->driver_data;
@@ -775,6 +782,15 @@ static int cp210x_tiocmget (struct tty_struct *tty, struct file *file)
return result;
}
+static int cp210x_carrier_raised(struct usb_serial_port *p)
+{
+ unsigned int control;
+ cp210x_get_config(p, CP210X_GET_MDMSTS, &control, 1);
+ if (control & CONTROL_DCD)
+ return 1;
+ return 0;
+}
+
static void cp210x_break_ctl (struct tty_struct *tty, int break_state)
{
struct usb_serial_port *port = tty->driver_data;
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
index 59adfe123110..27b5a271fe4a 100644
--- a/drivers/usb/serial/cypress_m8.c
+++ b/drivers/usb/serial/cypress_m8.c
@@ -659,15 +659,7 @@ static int cypress_open(struct tty_struct *tty,
spin_unlock_irqrestore(&priv->lock, flags);
/* Set termios */
- result = cypress_write(tty, port, NULL, 0);
-
- if (result) {
- dev_err(&port->dev,
- "%s - failed setting the control lines - error %d\n",
- __func__, result);
- return result;
- } else
- dbg("%s - success setting the control lines", __func__);
+ cypress_send(port);
if (tty)
cypress_set_termios(tty, port, &priv->tmp_termios);
@@ -1005,6 +997,8 @@ static void cypress_set_termios(struct tty_struct *tty,
dbg("%s - port %d", __func__, port->number);
spin_lock_irqsave(&priv->lock, flags);
+ /* We can't clean this one up as we don't know the device type
+ early enough */
if (!priv->termios_initialized) {
if (priv->chiptype == CT_EARTHMATE) {
*(tty->termios) = tty_std_termios;
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
index f4808091c47c..9bd82b487005 100644
--- a/drivers/usb/serial/digi_acceleport.c
+++ b/drivers/usb/serial/digi_acceleport.c
@@ -899,16 +899,16 @@ static void digi_rx_unthrottle(struct tty_struct *tty)
spin_lock_irqsave(&priv->dp_port_lock, flags);
- /* turn throttle off */
- priv->dp_throttled = 0;
- priv->dp_throttle_restart = 0;
-
/* restart read chain */
if (priv->dp_throttle_restart) {
port->read_urb->dev = port->serial->dev;
ret = usb_submit_urb(port->read_urb, GFP_ATOMIC);
}
+ /* turn throttle off */
+ priv->dp_throttled = 0;
+ priv->dp_throttle_restart = 0;
+
spin_unlock_irqrestore(&priv->dp_port_lock, flags);
if (ret)
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c
index 80cb3471adbe..3433f9db4418 100644
--- a/drivers/usb/serial/empeg.c
+++ b/drivers/usb/serial/empeg.c
@@ -90,8 +90,7 @@ static int empeg_chars_in_buffer(struct tty_struct *tty);
static void empeg_throttle(struct tty_struct *tty);
static void empeg_unthrottle(struct tty_struct *tty);
static int empeg_startup(struct usb_serial *serial);
-static void empeg_set_termios(struct tty_struct *tty,
- struct usb_serial_port *port, struct ktermios *old_termios);
+static void empeg_init_termios(struct tty_struct *tty);
static void empeg_write_bulk_callback(struct urb *urb);
static void empeg_read_bulk_callback(struct urb *urb);
@@ -123,7 +122,7 @@ static struct usb_serial_driver empeg_device = {
.throttle = empeg_throttle,
.unthrottle = empeg_unthrottle,
.attach = empeg_startup,
- .set_termios = empeg_set_termios,
+ .init_termios = empeg_init_termios,
.write = empeg_write,
.write_room = empeg_write_room,
.chars_in_buffer = empeg_chars_in_buffer,
@@ -150,9 +149,6 @@ static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port,
dbg("%s - port %d", __func__, port->number);
- /* Force default termio settings */
- empeg_set_termios(tty, port, NULL) ;
-
bytes_in = 0;
bytes_out = 0;
@@ -425,11 +421,9 @@ static int empeg_startup(struct usb_serial *serial)
}
-static void empeg_set_termios(struct tty_struct *tty,
- struct usb_serial_port *port, struct ktermios *old_termios)
+static void empeg_init_termios(struct tty_struct *tty)
{
struct ktermios *termios = tty->termios;
- dbg("%s - port %d", __func__, port->number);
/*
* The empeg-car player wants these particular tty settings.
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 8fec5d4455c9..84102014ed5b 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -76,13 +76,7 @@ struct ftdi_private {
unsigned long last_dtr_rts; /* saved modem control outputs */
wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
char prev_status, diff_status; /* Used for TIOCMIWAIT */
- __u8 rx_flags; /* receive state flags (throttling) */
- spinlock_t rx_lock; /* spinlock for receive state */
- struct delayed_work rx_work;
struct usb_serial_port *port;
- int rx_processed;
- unsigned long rx_bytes;
-
__u16 interface; /* FT2232C, FT2232H or FT4232H port interface
(0 for FT232/245) */
@@ -176,6 +170,9 @@ static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
@@ -694,6 +691,8 @@ static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(DE_VID, WHT_PID) },
{ USB_DEVICE(ADI_VID, ADI_GNICE_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+ { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
+ .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
{ USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
@@ -702,6 +701,8 @@ static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
{ USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+ { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
+ { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
{ }, /* Optional parameter entry */
{ } /* Terminating entry */
};
@@ -730,10 +731,6 @@ static const char *ftdi_chip_name[] = {
/* Constants for read urb and write urb */
#define BUFSZ 512
-/* rx_flags */
-#define THROTTLED 0x01
-#define ACTUALLY_THROTTLED 0x02
-
/* Used for TIOCMIWAIT */
#define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
#define FTDI_STATUS_B1_MASK (FTDI_RS_BI)
@@ -757,7 +754,7 @@ static int ftdi_write_room(struct tty_struct *tty);
static int ftdi_chars_in_buffer(struct tty_struct *tty);
static void ftdi_write_bulk_callback(struct urb *urb);
static void ftdi_read_bulk_callback(struct urb *urb);
-static void ftdi_process_read(struct work_struct *work);
+static void ftdi_process_read(struct usb_serial_port *port);
static void ftdi_set_termios(struct tty_struct *tty,
struct usb_serial_port *port, struct ktermios *old);
static int ftdi_tiocmget(struct tty_struct *tty, struct file *file);
@@ -1228,7 +1225,6 @@ static int set_serial_info(struct tty_struct *tty,
(new_serial.flags & ASYNC_FLAGS));
priv->custom_divisor = new_serial.custom_divisor;
- tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
write_latency_timer(port);
check_and_exit:
@@ -1521,7 +1517,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
}
kref_init(&priv->kref);
- spin_lock_init(&priv->rx_lock);
spin_lock_init(&priv->tx_lock);
init_waitqueue_head(&priv->delta_msr_wait);
/* This will push the characters through immediately rather
@@ -1543,7 +1538,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
port->read_urb->transfer_buffer_length = BUFSZ;
}
- INIT_DELAYED_WORK(&priv->rx_work, ftdi_process_read);
priv->port = port;
/* Free port's existing write urb and transfer buffer. */
@@ -1680,6 +1674,26 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port)
return 0;
}
+static int ftdi_submit_read_urb(struct usb_serial_port *port, gfp_t mem_flags)
+{
+ struct urb *urb = port->read_urb;
+ struct usb_serial *serial = port->serial;
+ int result;
+
+ usb_fill_bulk_urb(urb, serial->dev,
+ usb_rcvbulkpipe(serial->dev,
+ port->bulk_in_endpointAddress),
+ urb->transfer_buffer,
+ urb->transfer_buffer_length,
+ ftdi_read_bulk_callback, port);
+ result = usb_submit_urb(urb, mem_flags);
+ if (result)
+ dev_err(&port->dev,
+ "%s - failed submitting read urb, error %d\n",
+ __func__, result);
+ return result;
+}
+
static int ftdi_open(struct tty_struct *tty,
struct usb_serial_port *port, struct file *filp)
{ /* ftdi_open */
@@ -1695,12 +1709,6 @@ static int ftdi_open(struct tty_struct *tty,
spin_lock_irqsave(&priv->tx_lock, flags);
priv->tx_bytes = 0;
spin_unlock_irqrestore(&priv->tx_lock, flags);
- spin_lock_irqsave(&priv->rx_lock, flags);
- priv->rx_bytes = 0;
- spin_unlock_irqrestore(&priv->rx_lock, flags);
-
- if (tty)
- tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
write_latency_timer(port);
@@ -1720,23 +1728,14 @@ static int ftdi_open(struct tty_struct *tty,
ftdi_set_termios(tty, port, tty->termios);
/* Not throttled */
- spin_lock_irqsave(&priv->rx_lock, flags);
- priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
- spin_unlock_irqrestore(&priv->rx_lock, flags);
+ spin_lock_irqsave(&port->lock, flags);
+ port->throttled = 0;
+ port->throttle_req = 0;
+ spin_unlock_irqrestore(&port->lock, flags);
/* Start reading from the device */
- priv->rx_processed = 0;
- usb_fill_bulk_urb(port->read_urb, dev,
- usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
- port->read_urb->transfer_buffer_length,
- ftdi_read_bulk_callback, port);
- result = usb_submit_urb(port->read_urb, GFP_KERNEL);
- if (result)
- dev_err(&port->dev,
- "%s - failed submitting read urb, error %d\n",
- __func__, result);
- else
+ result = ftdi_submit_read_urb(port, GFP_KERNEL);
+ if (!result)
kref_get(&priv->kref);
return result;
@@ -1782,10 +1781,6 @@ static void ftdi_close(struct usb_serial_port *port)
dbg("%s", __func__);
-
- /* cancel any scheduled reading */
- cancel_delayed_work_sync(&priv->rx_work);
-
/* shutdown our bulk read */
usb_kill_urb(port->read_urb);
kref_put(&priv->kref, ftdi_sio_priv_release);
@@ -1944,7 +1939,7 @@ static void ftdi_write_bulk_callback(struct urb *urb)
return;
}
/* account for transferred data */
- countback = urb->actual_length;
+ countback = urb->transfer_buffer_length;
data_offset = priv->write_offset;
if (data_offset > 0) {
/* Subtract the control bytes */
@@ -1957,7 +1952,6 @@ static void ftdi_write_bulk_callback(struct urb *urb)
if (status) {
dbg("nonzero write bulk status received: %d", status);
- return;
}
usb_serial_port_softint(port);
@@ -2008,271 +2002,121 @@ static int ftdi_chars_in_buffer(struct tty_struct *tty)
return buffered;
}
-static void ftdi_read_bulk_callback(struct urb *urb)
+static int ftdi_process_packet(struct tty_struct *tty,
+ struct usb_serial_port *port, struct ftdi_private *priv,
+ char *packet, int len)
{
- struct usb_serial_port *port = urb->context;
- struct tty_struct *tty;
- struct ftdi_private *priv;
- unsigned long countread;
- unsigned long flags;
- int status = urb->status;
-
- if (urb->number_of_packets > 0) {
- dev_err(&port->dev, "%s transfer_buffer_length %d "
- "actual_length %d number of packets %d\n", __func__,
- urb->transfer_buffer_length,
- urb->actual_length, urb->number_of_packets);
- dev_err(&port->dev, "%s transfer_flags %x\n", __func__,
- urb->transfer_flags);
- }
+ int i;
+ char status;
+ char flag;
+ char *ch;
dbg("%s - port %d", __func__, port->number);
- if (port->port.count <= 0)
- return;
-
- tty = tty_port_tty_get(&port->port);
- if (!tty) {
- dbg("%s - bad tty pointer - exiting", __func__);
- return;
+ if (len < 2) {
+ dbg("malformed packet");
+ return 0;
}
- priv = usb_get_serial_port_data(port);
- if (!priv) {
- dbg("%s - bad port private data pointer - exiting", __func__);
- goto out;
+ /* Compare new line status to the old one, signal if different/
+ N.B. packet may be processed more than once, but differences
+ are only processed once. */
+ status = packet[0] & FTDI_STATUS_B0_MASK;
+ if (status != priv->prev_status) {
+ priv->diff_status |= status ^ priv->prev_status;
+ wake_up_interruptible(&priv->delta_msr_wait);
+ priv->prev_status = status;
}
- if (urb != port->read_urb)
- dev_err(&port->dev, "%s - Not my urb!\n", __func__);
-
- if (status) {
- /* This will happen at close every time so it is a dbg not an
- err */
- dbg("(this is ok on close) nonzero read bulk status received: %d", status);
- goto out;
+ /*
+ * Although the device uses a bitmask and hence can have multiple
+ * errors on a packet - the order here sets the priority the error is
+ * returned to the tty layer.
+ */
+ flag = TTY_NORMAL;
+ if (packet[1] & FTDI_RS_OE) {
+ flag = TTY_OVERRUN;
+ dbg("OVERRRUN error");
+ }
+ if (packet[1] & FTDI_RS_BI) {
+ flag = TTY_BREAK;
+ dbg("BREAK received");
+ usb_serial_handle_break(port);
+ }
+ if (packet[1] & FTDI_RS_PE) {
+ flag = TTY_PARITY;
+ dbg("PARITY error");
+ }
+ if (packet[1] & FTDI_RS_FE) {
+ flag = TTY_FRAME;
+ dbg("FRAMING error");
}
- /* count data bytes, but not status bytes */
- countread = urb->actual_length;
- countread -= 2 * DIV_ROUND_UP(countread, priv->max_packet_size);
- spin_lock_irqsave(&priv->rx_lock, flags);
- priv->rx_bytes += countread;
- spin_unlock_irqrestore(&priv->rx_lock, flags);
-
- ftdi_process_read(&priv->rx_work.work);
-out:
- tty_kref_put(tty);
-} /* ftdi_read_bulk_callback */
-
+ len -= 2;
+ if (!len)
+ return 0; /* status only */
+ ch = packet + 2;
+
+ if (!(port->console && port->sysrq) && flag == TTY_NORMAL)
+ tty_insert_flip_string(tty, ch, len);
+ else {
+ for (i = 0; i < len; i++, ch++) {
+ if (!usb_serial_handle_sysrq_char(tty, port, *ch))
+ tty_insert_flip_char(tty, *ch, flag);
+ }
+ }
+ return len;
+}
-static void ftdi_process_read(struct work_struct *work)
-{ /* ftdi_process_read */
- struct ftdi_private *priv =
- container_of(work, struct ftdi_private, rx_work.work);
- struct usb_serial_port *port = priv->port;
- struct urb *urb;
+static void ftdi_process_read(struct usb_serial_port *port)
+{
+ struct urb *urb = port->read_urb;
struct tty_struct *tty;
- char error_flag;
- unsigned char *data;
-
+ struct ftdi_private *priv = usb_get_serial_port_data(port);
+ char *data = (char *)urb->transfer_buffer;
int i;
- int result;
- int need_flip;
- int packet_offset;
- unsigned long flags;
-
- dbg("%s - port %d", __func__, port->number);
-
- if (port->port.count <= 0)
- return;
+ int len;
+ int count = 0;
tty = tty_port_tty_get(&port->port);
- if (!tty) {
- dbg("%s - bad tty pointer - exiting", __func__);
+ if (!tty)
return;
- }
- priv = usb_get_serial_port_data(port);
- if (!priv) {
- dbg("%s - bad port private data pointer - exiting", __func__);
- goto out;
- }
-
- urb = port->read_urb;
- if (!urb) {
- dbg("%s - bad read_urb pointer - exiting", __func__);
- goto out;
+ for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
+ len = min_t(int, urb->actual_length - i, priv->max_packet_size);
+ count += ftdi_process_packet(tty, port, priv, &data[i], len);
}
- data = urb->transfer_buffer;
-
- if (priv->rx_processed) {
- dbg("%s - already processed: %d bytes, %d remain", __func__,
- priv->rx_processed,
- urb->actual_length - priv->rx_processed);
- } else {
- /* The first two bytes of every read packet are status */
- if (urb->actual_length > 2)
- usb_serial_debug_data(debug, &port->dev, __func__,
- urb->actual_length, data);
- else
- dbg("Status only: %03oo %03oo", data[0], data[1]);
- }
-
-
- /* TO DO -- check for hung up line and handle appropriately: */
- /* send hangup */
- /* See acm.c - you do a tty_hangup - eg tty_hangup(tty) */
- /* if CD is dropped and the line is not CLOCAL then we should hangup */
-
- need_flip = 0;
- for (packet_offset = priv->rx_processed;
- packet_offset < urb->actual_length; packet_offset += priv->max_packet_size) {
- int length;
-
- /* Compare new line status to the old one, signal if different/
- N.B. packet may be processed more than once, but differences
- are only processed once. */
- char new_status = data[packet_offset + 0] &
- FTDI_STATUS_B0_MASK;
- if (new_status != priv->prev_status) {
- priv->diff_status |=
- new_status ^ priv->prev_status;
- wake_up_interruptible(&priv->delta_msr_wait);
- priv->prev_status = new_status;
- }
-
- length = min_t(u32, priv->max_packet_size, urb->actual_length-packet_offset)-2;
- if (length < 0) {
- dev_err(&port->dev, "%s - bad packet length: %d\n",
- __func__, length+2);
- length = 0;
- }
-
- if (priv->rx_flags & THROTTLED) {
- dbg("%s - throttled", __func__);
- break;
- }
- if (tty_buffer_request_room(tty, length) < length) {
- /* break out & wait for throttling/unthrottling to
- happen */
- dbg("%s - receive room low", __func__);
- break;
- }
-
- /* Handle errors and break */
- error_flag = TTY_NORMAL;
- /* Although the device uses a bitmask and hence can have
- multiple errors on a packet - the order here sets the
- priority the error is returned to the tty layer */
-
- if (data[packet_offset+1] & FTDI_RS_OE) {
- error_flag = TTY_OVERRUN;
- dbg("OVERRRUN error");
- }
- if (data[packet_offset+1] & FTDI_RS_BI) {
- error_flag = TTY_BREAK;
- dbg("BREAK received");
- usb_serial_handle_break(port);
- }
- if (data[packet_offset+1] & FTDI_RS_PE) {
- error_flag = TTY_PARITY;
- dbg("PARITY error");
- }
- if (data[packet_offset+1] & FTDI_RS_FE) {
- error_flag = TTY_FRAME;
- dbg("FRAMING error");
- }
- if (length > 0) {
- for (i = 2; i < length+2; i++) {
- /* Note that the error flag is duplicated for
- every character received since we don't know
- which character it applied to */
- if (!usb_serial_handle_sysrq_char(tty, port,
- data[packet_offset + i]))
- tty_insert_flip_char(tty,
- data[packet_offset + i],
- error_flag);
- }
- need_flip = 1;
- }
-
-#ifdef NOT_CORRECT_BUT_KEEPING_IT_FOR_NOW
- /* if a parity error is detected you get status packets forever
- until a character is sent without a parity error.
- This doesn't work well since the application receives a
- never ending stream of bad data - even though new data
- hasn't been sent. Therefore I (bill) have taken this out.
- However - this might make sense for framing errors and so on
- so I am leaving the code in for now.
- */
- else {
- if (error_flag != TTY_NORMAL) {
- dbg("error_flag is not normal");
- /* In this case it is just status - if that is
- an error send a bad character */
- if (tty->flip.count >= TTY_FLIPBUF_SIZE)
- tty_flip_buffer_push(tty);
- tty_insert_flip_char(tty, 0xff, error_flag);
- need_flip = 1;
- }
- }
-#endif
- } /* "for(packet_offset=0..." */
-
- /* Low latency */
- if (need_flip)
+ if (count)
tty_flip_buffer_push(tty);
+ tty_kref_put(tty);
+}
- if (packet_offset < urb->actual_length) {
- /* not completely processed - record progress */
- priv->rx_processed = packet_offset;
- dbg("%s - incomplete, %d bytes processed, %d remain",
- __func__, packet_offset,
- urb->actual_length - packet_offset);
- /* check if we were throttled while processing */
- spin_lock_irqsave(&priv->rx_lock, flags);
- if (priv->rx_flags & THROTTLED) {
- priv->rx_flags |= ACTUALLY_THROTTLED;
- spin_unlock_irqrestore(&priv->rx_lock, flags);
- dbg("%s - deferring remainder until unthrottled",
- __func__);
- goto out;
- }
- spin_unlock_irqrestore(&priv->rx_lock, flags);
- /* if the port is closed stop trying to read */
- if (port->port.count > 0)
- /* delay processing of remainder */
- schedule_delayed_work(&priv->rx_work, 1);
- else
- dbg("%s - port is closed", __func__);
- goto out;
- }
-
- /* urb is completely processed */
- priv->rx_processed = 0;
+static void ftdi_read_bulk_callback(struct urb *urb)
+{
+ struct usb_serial_port *port = urb->context;
+ unsigned long flags;
- /* if the port is closed stop trying to read */
- if (port->port.count > 0) {
- /* Continue trying to always read */
- usb_fill_bulk_urb(port->read_urb, port->serial->dev,
- usb_rcvbulkpipe(port->serial->dev,
- port->bulk_in_endpointAddress),
- port->read_urb->transfer_buffer,
- port->read_urb->transfer_buffer_length,
- ftdi_read_bulk_callback, port);
+ dbg("%s - port %d", __func__, port->number);
- result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
- if (result)
- dev_err(&port->dev,
- "%s - failed resubmitting read urb, error %d\n",
- __func__, result);
+ if (urb->status) {
+ dbg("%s - nonzero read bulk status received: %d",
+ __func__, urb->status);
+ return;
}
-out:
- tty_kref_put(tty);
-} /* ftdi_process_read */
+ usb_serial_debug_data(debug, &port->dev, __func__,
+ urb->actual_length, urb->transfer_buffer);
+ ftdi_process_read(port);
+
+ spin_lock_irqsave(&port->lock, flags);
+ port->throttled = port->throttle_req;
+ if (!port->throttled) {
+ spin_unlock_irqrestore(&port->lock, flags);
+ ftdi_submit_read_urb(port, GFP_ATOMIC);
+ } else
+ spin_unlock_irqrestore(&port->lock, flags);
+}
static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
{
@@ -2604,33 +2448,31 @@ static int ftdi_ioctl(struct tty_struct *tty, struct file *file,
static void ftdi_throttle(struct tty_struct *tty)
{
struct usb_serial_port *port = tty->driver_data;
- struct ftdi_private *priv = usb_get_serial_port_data(port);
unsigned long flags;
dbg("%s - port %d", __func__, port->number);
- spin_lock_irqsave(&priv->rx_lock, flags);
- priv->rx_flags |= THROTTLED;
- spin_unlock_irqrestore(&priv->rx_lock, flags);
+ spin_lock_irqsave(&port->lock, flags);
+ port->throttle_req = 1;
+ spin_unlock_irqrestore(&port->lock, flags);
}
-
-static void ftdi_unthrottle(struct tty_struct *tty)
+void ftdi_unthrottle(struct tty_struct *tty)
{
struct usb_serial_port *port = tty->driver_data;
- struct ftdi_private *priv = usb_get_serial_port_data(port);
- int actually_throttled;
+ int was_throttled;
unsigned long flags;
dbg("%s - port %d", __func__, port->number);
- spin_lock_irqsave(&priv->rx_lock, flags);
- actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED;
- priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
- spin_unlock_irqrestore(&priv->rx_lock, flags);
+ spin_lock_irqsave(&port->lock, flags);
+ was_throttled = port->throttled;
+ port->throttled = port->throttle_req = 0;
+ spin_unlock_irqrestore(&port->lock, flags);
- if (actually_throttled)
- schedule_delayed_work(&priv->rx_work, 0);
+ /* Resubmit urb if throttled and open. */
+ if (was_throttled && test_bit(ASYNCB_INITIALIZED, &port->port.flags))
+ ftdi_submit_read_urb(port, GFP_KERNEL);
}
static int __init ftdi_init(void)
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
index 8c92b88166ae..6f31e0d71898 100644
--- a/drivers/usb/serial/ftdi_sio.h
+++ b/drivers/usb/serial/ftdi_sio.h
@@ -81,6 +81,9 @@
/* OpenDCC (www.opendcc.de) product id */
#define FTDI_OPENDCC_PID 0xBFD8
+#define FTDI_OPENDCC_SNIFFER_PID 0xBFD9
+#define FTDI_OPENDCC_THROTTLE_PID 0xBFDA
+#define FTDI_OPENDCC_GATEWAY_PID 0xBFDB
/* Sprog II (Andrew Crosland's SprogII DCC interface) */
#define FTDI_SPROG_II 0xF0C8
@@ -930,6 +933,7 @@
*/
#define ADI_VID 0x0456
#define ADI_GNICE_PID 0xF000
+#define ADI_GNICEPLUS_PID 0xF001
/*
* JETI SPECTROMETER SPECBOS 1201
@@ -968,6 +972,12 @@
#define MARVELL_OPENRD_PID 0x9e90
/*
+ * Hameg HO820 and HO870 interface (using VID 0x0403)
+ */
+#define HAMEG_HO820_PID 0xed74
+#define HAMEG_HO870_PID 0xed71
+
+/*
* BmRequestType: 1100 0000b
* bRequest: FTDI_E2_READ
* wValue: 0
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
index ce57f6a32bdf..6463fee644b9 100644
--- a/drivers/usb/serial/generic.c
+++ b/drivers/usb/serial/generic.c
@@ -480,6 +480,8 @@ void usb_serial_generic_write_bulk_callback(struct urb *urb)
dbg("%s - port %d", __func__, port->number);
if (port->serial->type->max_in_flight_urbs) {
+ kfree(urb->transfer_buffer);
+
spin_lock_irqsave(&port->lock, flags);
--port->urbs_in_flight;
port->tx_bytes_flight -= urb->transfer_buffer_length;
@@ -530,7 +532,7 @@ void usb_serial_generic_unthrottle(struct tty_struct *tty)
if (was_throttled) {
/* Resume reading from device */
- usb_serial_generic_resubmit_read_urb(port, GFP_KERNEL);
+ flush_and_resubmit_read_urb(port);
}
}
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
index 2545d45ce16f..c4d02064e5f1 100644
--- a/drivers/usb/serial/ipaq.c
+++ b/drivers/usb/serial/ipaq.c
@@ -971,6 +971,15 @@ static int ipaq_calc_num_ports(struct usb_serial *serial)
static int ipaq_startup(struct usb_serial *serial)
{
dbg("%s", __func__);
+
+ /* Some of the devices in ipaq_id_table[] are composite, and we
+ * shouldn't bind to all the interfaces. This test will rule out
+ * some obviously invalid possibilities.
+ */
+ if (serial->num_bulk_in < serial->num_ports ||
+ serial->num_bulk_out < serial->num_ports)
+ return -ENODEV;
+
if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
/*
* FIXME: HP iPaq rx3715, possibly others, have 1 config that
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
index 96873a7a32b0..af6df6c788b9 100644
--- a/drivers/usb/serial/iuu_phoenix.c
+++ b/drivers/usb/serial/iuu_phoenix.c
@@ -71,7 +71,6 @@ struct iuu_private {
spinlock_t lock; /* store irq state */
wait_queue_head_t delta_msr_wait;
u8 line_status;
- u8 termios_initialized;
int tiostatus; /* store IUART SIGNAL for tiocmget call */
u8 reset; /* if 1 reset is needed */
int poll; /* number of poll */
@@ -1018,6 +1017,18 @@ static void iuu_close(struct usb_serial_port *port)
}
}
+static void iuu_init_termios(struct tty_struct *tty)
+{
+ *(tty->termios) = tty_std_termios;
+ tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600
+ | TIOCM_CTS | CSTOPB | PARENB;
+ tty->termios->c_ispeed = 9600;
+ tty->termios->c_ospeed = 9600;
+ tty->termios->c_lflag = 0;
+ tty->termios->c_oflag = 0;
+ tty->termios->c_iflag = 0;
+}
+
static int iuu_open(struct tty_struct *tty,
struct usb_serial_port *port, struct file *filp)
{
@@ -1025,7 +1036,6 @@ static int iuu_open(struct tty_struct *tty,
u8 *buf;
int result;
u32 actual;
- unsigned long flags;
struct iuu_private *priv = usb_get_serial_port_data(port);
dbg("%s - port %d", __func__, port->number);
@@ -1064,21 +1074,7 @@ static int iuu_open(struct tty_struct *tty,
port->bulk_in_buffer, 512,
NULL, NULL);
- /* set the termios structure */
- spin_lock_irqsave(&priv->lock, flags);
- if (tty && !priv->termios_initialized) {
- *(tty->termios) = tty_std_termios;
- tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600
- | TIOCM_CTS | CSTOPB | PARENB;
- tty->termios->c_ispeed = 9600;
- tty->termios->c_ospeed = 9600;
- tty->termios->c_lflag = 0;
- tty->termios->c_oflag = 0;
- tty->termios->c_iflag = 0;
- priv->termios_initialized = 1;
- priv->poll = 0;
- }
- spin_unlock_irqrestore(&priv->lock, flags);
+ priv->poll = 0;
/* initialize writebuf */
#define FISH(a, b, c, d) do { \
@@ -1201,6 +1197,7 @@ static struct usb_serial_driver iuu_device = {
.tiocmget = iuu_tiocmget,
.tiocmset = iuu_tiocmset,
.set_termios = iuu_set_termios,
+ .init_termios = iuu_init_termios,
.attach = iuu_startup,
.release = iuu_release,
};
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
index 6db0e561f680..46d47d1463c9 100644
--- a/drivers/usb/serial/kobil_sct.c
+++ b/drivers/usb/serial/kobil_sct.c
@@ -85,7 +85,7 @@ static void kobil_read_int_callback(struct urb *urb);
static void kobil_write_callback(struct urb *purb);
static void kobil_set_termios(struct tty_struct *tty,
struct usb_serial_port *port, struct ktermios *old);
-
+static void kobil_init_termios(struct tty_struct *tty);
static struct usb_device_id id_table [] = {
{ USB_DEVICE(KOBIL_VENDOR_ID, KOBIL_ADAPTER_B_PRODUCT_ID) },
@@ -120,6 +120,7 @@ static struct usb_serial_driver kobil_device = {
.release = kobil_release,
.ioctl = kobil_ioctl,
.set_termios = kobil_set_termios,
+ .init_termios = kobil_init_termios,
.tiocmget = kobil_tiocmget,
.tiocmset = kobil_tiocmset,
.open = kobil_open,
@@ -210,6 +211,15 @@ static void kobil_release(struct usb_serial *serial)
kfree(usb_get_serial_port_data(serial->port[i]));
}
+static void kobil_init_termios(struct tty_struct *tty)
+{
+ /* Default to echo off and other sane device settings */
+ tty->termios->c_lflag = 0;
+ tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE);
+ tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF;
+ /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */
+ tty->termios->c_oflag &= ~ONLCR;
+}
static int kobil_open(struct tty_struct *tty,
struct usb_serial_port *port, struct file *filp)
@@ -226,16 +236,6 @@ static int kobil_open(struct tty_struct *tty,
/* someone sets the dev to 0 if the close method has been called */
port->interrupt_in_urb->dev = port->serial->dev;
- if (tty) {
-
- /* Default to echo off and other sane device settings */
- tty->termios->c_lflag = 0;
- tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN |
- XCASE);
- tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF;
- /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */
- tty->termios->c_oflag &= ~ONLCR;
- }
/* allocate memory for transfer buffer */
transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL);
if (!transfer_buffer)
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index c784ddbe7b61..c7b42ca00d56 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -166,6 +166,7 @@ static int option_resume(struct usb_serial *serial);
#define HUAWEI_PRODUCT_E143D 0x143D
#define HUAWEI_PRODUCT_E143E 0x143E
#define HUAWEI_PRODUCT_E143F 0x143F
+#define HUAWEI_PRODUCT_E14AC 0x14AC
#define QUANTA_VENDOR_ID 0x0408
#define QUANTA_PRODUCT_Q101 0xEA02
@@ -292,6 +293,7 @@ static int option_resume(struct usb_serial *serial);
#define TELIT_VENDOR_ID 0x1bc7
#define TELIT_PRODUCT_UC864E 0x1003
+#define TELIT_PRODUCT_UC864G 0x1004
/* ZTE PRODUCTS */
#define ZTE_VENDOR_ID 0x19d2
@@ -300,12 +302,14 @@ static int option_resume(struct usb_serial *serial);
#define ZTE_PRODUCT_MF626 0x0031
#define ZTE_PRODUCT_CDMA_TECH 0xfffe
#define ZTE_PRODUCT_AC8710 0xfff1
+#define ZTE_PRODUCT_AC2726 0xfff5
#define BENQ_VENDOR_ID 0x04a5
#define BENQ_PRODUCT_H10 0x4068
#define DLINK_VENDOR_ID 0x1186
#define DLINK_PRODUCT_DWM_652 0x3e04
+#define DLINK_PRODUCT_DWM_652_U5 0xce16
#define QISDA_VENDOR_ID 0x1da5
#define QISDA_PRODUCT_H21_4512 0x4512
@@ -313,10 +317,14 @@ static int option_resume(struct usb_serial *serial);
#define QISDA_PRODUCT_H20_4515 0x4515
#define QISDA_PRODUCT_H20_4519 0x4519
+/* TLAYTECH PRODUCTS */
+#define TLAYTECH_VENDOR_ID 0x20B9
+#define TLAYTECH_PRODUCT_TEU800 0x1682
/* TOSHIBA PRODUCTS */
#define TOSHIBA_VENDOR_ID 0x0930
#define TOSHIBA_PRODUCT_HSDPA_MINICARD 0x1302
+#define TOSHIBA_PRODUCT_G450 0x0d45
#define ALINK_VENDOR_ID 0x1e0e
#define ALINK_PRODUCT_3GU 0x9200
@@ -325,6 +333,13 @@ static int option_resume(struct usb_serial *serial);
#define ALCATEL_VENDOR_ID 0x1bbb
#define ALCATEL_PRODUCT_X060S 0x0000
+/* Airplus products */
+#define AIRPLUS_VENDOR_ID 0x1011
+#define AIRPLUS_PRODUCT_MCD650 0x3198
+
+/* Haier products */
+#define HAIER_VENDOR_ID 0x201e
+#define HAIER_PRODUCT_CE100 0x2009
static struct usb_device_id option_ids[] = {
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
@@ -423,6 +438,7 @@ static struct usb_device_id option_ids[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) },
+ { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC) },
{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
@@ -503,6 +519,7 @@ static struct usb_device_id option_ids[] = {
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
{ USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0003, 0xff, 0xff, 0xff) },
@@ -564,24 +581,67 @@ static struct usb_device_id option_ids[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0086, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0104, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0106, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0108, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0117, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0122, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0145, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0146, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0148, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0149, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0150, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0151, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0153, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0154, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0155, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0160, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, /* ZTE CDMA products */
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0027, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) },
{ USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
{ USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
+ { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */
{ USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4512) },
{ USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4523) },
{ USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4515) },
{ USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4519) },
+ { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_G450) },
{ USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */
{ USB_DEVICE(ALINK_VENDOR_ID, 0x9000) },
+ { USB_DEVICE(ALINK_VENDOR_ID, 0xce16) },
{ USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) },
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) },
+ { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) },
+ { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) },
+ { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) },
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, option_ids);
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c
index 3cece27325e7..ef34cffabdf8 100644
--- a/drivers/usb/serial/oti6858.c
+++ b/drivers/usb/serial/oti6858.c
@@ -146,6 +146,7 @@ static int oti6858_open(struct tty_struct *tty,
static void oti6858_close(struct usb_serial_port *port);
static void oti6858_set_termios(struct tty_struct *tty,
struct usb_serial_port *port, struct ktermios *old);
+static void oti6858_init_termios(struct tty_struct *tty);
static int oti6858_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg);
static void oti6858_read_int_callback(struct urb *urb);
@@ -186,6 +187,7 @@ static struct usb_serial_driver oti6858_device = {
.write = oti6858_write,
.ioctl = oti6858_ioctl,
.set_termios = oti6858_set_termios,
+ .init_termios = oti6858_init_termios,
.tiocmget = oti6858_tiocmget,
.tiocmset = oti6858_tiocmset,
.read_bulk_callback = oti6858_read_bulk_callback,
@@ -206,7 +208,6 @@ struct oti6858_private {
struct {
u8 read_urb_in_use;
u8 write_urb_in_use;
- u8 termios_initialized;
} flags;
struct delayed_work delayed_write_work;
@@ -447,6 +448,14 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty)
return chars;
}
+static void oti6858_init_termios(struct tty_struct *tty)
+{
+ *(tty->termios) = tty_std_termios;
+ tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
+ tty->termios->c_ispeed = 38400;
+ tty->termios->c_ospeed = 38400;
+}
+
static void oti6858_set_termios(struct tty_struct *tty,
struct usb_serial_port *port, struct ktermios *old_termios)
{
@@ -464,16 +473,6 @@ static void oti6858_set_termios(struct tty_struct *tty,
return;
}
- spin_lock_irqsave(&priv->lock, flags);
- if (!priv->flags.termios_initialized) {
- *(tty->termios) = tty_std_termios;
- tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
- tty->termios->c_ispeed = 38400;
- tty->termios->c_ospeed = 38400;
- priv->flags.termios_initialized = 1;
- }
- spin_unlock_irqrestore(&priv->lock, flags);
-
cflag = tty->termios->c_cflag;
spin_lock_irqsave(&priv->lock, flags);
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 3e86815b2705..600097de714f 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -96,6 +96,7 @@ static struct usb_device_id id_table [] = {
{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
{ USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
+ { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
{ } /* Terminating entry */
};
@@ -994,13 +995,15 @@ static void pl2303_push_data(struct tty_struct *tty,
/* overrun is special, not associated with a char */
if (line_status & UART_OVERRUN_ERROR)
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
- if (port->console && port->sysrq) {
+
+ if (tty_flag == TTY_NORMAL && !(port->console && port->sysrq))
+ tty_insert_flip_string(tty, data, urb->actual_length);
+ else {
int i;
for (i = 0; i < urb->actual_length; ++i)
if (!usb_serial_handle_sysrq_char(tty, port, data[i]))
tty_insert_flip_char(tty, data[i], tty_flag);
- } else
- tty_insert_flip_string(tty, data, urb->actual_length);
+ }
tty_flip_buffer_push(tty);
}
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
index ee9505e1dd92..d640dc951568 100644
--- a/drivers/usb/serial/pl2303.h
+++ b/drivers/usb/serial/pl2303.h
@@ -130,3 +130,7 @@
/* Sony, USB data cable for CMD-Jxx mobile phones */
#define SONY_VENDOR_ID 0x054c
#define SONY_QN3USB_PRODUCT_ID 0x0437
+
+/* Sanwa KB-USB2 multimeter cable (ID: 11ad:0001) */
+#define SANWA_VENDOR_ID 0x11ad
+#define SANWA_PRODUCT_ID 0x0001
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index f48d05e0acc1..c5fbaa5dde05 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -287,6 +287,8 @@ static int sierra_send_setup(struct usb_serial_port *port)
struct sierra_port_private *portdata;
__u16 interface = 0;
int val = 0;
+ int do_send = 0;
+ int retval;
dev_dbg(&port->dev, "%s\n", __func__);
@@ -305,10 +307,7 @@ static int sierra_send_setup(struct usb_serial_port *port)
*/
if (port->interrupt_in_urb) {
/* send control message */
- return usb_control_msg(serial->dev,
- usb_rcvctrlpipe(serial->dev, 0),
- 0x22, 0x21, val, interface,
- NULL, 0, USB_CTRL_SET_TIMEOUT);
+ do_send = 1;
}
}
@@ -320,12 +319,18 @@ static int sierra_send_setup(struct usb_serial_port *port)
interface = 1;
else if (port->bulk_out_endpointAddress == 5)
interface = 2;
- return usb_control_msg(serial->dev,
- usb_rcvctrlpipe(serial->dev, 0),
- 0x22, 0x21, val, interface,
- NULL, 0, USB_CTRL_SET_TIMEOUT);
+
+ do_send = 1;
}
- return 0;
+ if (!do_send)
+ return 0;
+
+ usb_autopm_get_interface(serial->interface);
+ retval = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
+ 0x22, 0x21, val, interface, NULL, 0, USB_CTRL_SET_TIMEOUT);
+ usb_autopm_put_interface(serial->interface);
+
+ return retval;
}
static void sierra_set_termios(struct tty_struct *tty,
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c
index 3c249d8e8b8e..993a6d5a1b7a 100644
--- a/drivers/usb/serial/spcp8x5.c
+++ b/drivers/usb/serial/spcp8x5.c
@@ -299,7 +299,6 @@ struct spcp8x5_private {
wait_queue_head_t delta_msr_wait;
u8 line_control;
u8 line_status;
- u8 termios_initialized;
};
/* desc : when device plug in,this function would be called.
@@ -498,6 +497,15 @@ static void spcp8x5_close(struct usb_serial_port *port)
dev_dbg(&port->dev, "usb_unlink_urb(read_urb) = %d\n", result);
}
+static void spcp8x5_init_termios(struct tty_struct *tty)
+{
+ /* for the 1st time call this function */
+ *(tty->termios) = tty_std_termios;
+ tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
+ tty->termios->c_ispeed = 115200;
+ tty->termios->c_ospeed = 115200;
+}
+
/* set the serial param for transfer. we should check if we really need to
* transfer. if we set flow control we should do this too. */
static void spcp8x5_set_termios(struct tty_struct *tty,
@@ -514,16 +522,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
int i;
u8 control;
- /* for the 1st time call this function */
- spin_lock_irqsave(&priv->lock, flags);
- if (!priv->termios_initialized) {
- *(tty->termios) = tty_std_termios;
- tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
- tty->termios->c_ispeed = 115200;
- tty->termios->c_ospeed = 115200;
- priv->termios_initialized = 1;
- }
- spin_unlock_irqrestore(&priv->lock, flags);
/* check that they really want us to change something */
if (!tty_termios_hw_change(tty->termios, old_termios))
@@ -1011,6 +1009,7 @@ static struct usb_serial_driver spcp8x5_device = {
.carrier_raised = spcp8x5_carrier_raised,
.write = spcp8x5_write,
.set_termios = spcp8x5_set_termios,
+ .init_termios = spcp8x5_init_termios,
.ioctl = spcp8x5_ioctl,
.tiocmget = spcp8x5_tiocmget,
.tiocmset = spcp8x5_tiocmset,
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 99188c92068b..3292e0391e28 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -43,8 +43,6 @@
#define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/"
#define DRIVER_DESC "USB Serial Driver core"
-static void port_free(struct usb_serial_port *port);
-
/* Driver structure we register with the USB core */
static struct usb_driver usb_serial_driver = {
.name = "usbserial",
@@ -68,6 +66,11 @@ static struct usb_serial *serial_table[SERIAL_TTY_MINORS];
static DEFINE_MUTEX(table_lock);
static LIST_HEAD(usb_serial_driver_list);
+/*
+ * Look up the serial structure. If it is found and it hasn't been
+ * disconnected, return with its disc_mutex held and its refcount
+ * incremented. Otherwise return NULL.
+ */
struct usb_serial *usb_serial_get_by_index(unsigned index)
{
struct usb_serial *serial;
@@ -75,8 +78,15 @@ struct usb_serial *usb_serial_get_by_index(unsigned index)
mutex_lock(&table_lock);
serial = serial_table[index];
- if (serial)
- kref_get(&serial->kref);
+ if (serial) {
+ mutex_lock(&serial->disc_mutex);
+ if (serial->disconnected) {
+ mutex_unlock(&serial->disc_mutex);
+ serial = NULL;
+ } else {
+ kref_get(&serial->kref);
+ }
+ }
mutex_unlock(&table_lock);
return serial;
}
@@ -125,8 +135,10 @@ static void return_serial(struct usb_serial *serial)
dbg("%s", __func__);
+ mutex_lock(&table_lock);
for (i = 0; i < serial->num_ports; ++i)
serial_table[serial->minor + i] = NULL;
+ mutex_unlock(&table_lock);
}
static void destroy_serial(struct kref *kref)
@@ -143,163 +155,160 @@ static void destroy_serial(struct kref *kref)
if (serial->minor != SERIAL_TTY_NO_MINOR)
return_serial(serial);
- serial->type->release(serial);
+ if (serial->attached)
+ serial->type->release(serial);
- for (i = 0; i < serial->num_ports; ++i) {
+ /* Now that nothing is using the ports, they can be freed */
+ for (i = 0; i < serial->num_port_pointers; ++i) {
port = serial->port[i];
- if (port)
+ if (port) {
+ port->serial = NULL;
put_device(&port->dev);
- }
-
- /* If this is a "fake" port, we have to clean it up here, as it will
- * not get cleaned up in port_release() as it was never registered with
- * the driver core */
- if (serial->num_ports < serial->num_port_pointers) {
- for (i = serial->num_ports;
- i < serial->num_port_pointers; ++i) {
- port = serial->port[i];
- if (port)
- port_free(port);
}
}
usb_put_dev(serial->dev);
-
- /* free up any memory that we allocated */
kfree(serial);
}
void usb_serial_put(struct usb_serial *serial)
{
- mutex_lock(&table_lock);
kref_put(&serial->kref, destroy_serial);
- mutex_unlock(&table_lock);
}
/*****************************************************************************
* Driver tty interface functions
*****************************************************************************/
-static int serial_open (struct tty_struct *tty, struct file *filp)
+
+/**
+ * serial_install - install tty
+ * @driver: the driver (USB in our case)
+ * @tty: the tty being created
+ *
+ * Create the termios objects for this tty. We use the default
+ * USB serial settings but permit them to be overridden by
+ * serial->type->init_termios.
+ *
+ * This is the first place a new tty gets used. Hence this is where we
+ * acquire references to the usb_serial structure and the driver module,
+ * where we store a pointer to the port, and where we do an autoresume.
+ * All these actions are reversed in serial_release().
+ */
+static int serial_install(struct tty_driver *driver, struct tty_struct *tty)
{
+ int idx = tty->index;
struct usb_serial *serial;
struct usb_serial_port *port;
- unsigned int portNumber;
- int retval = 0;
- int first = 0;
+ int retval = -ENODEV;
dbg("%s", __func__);
- /* get the serial object associated with this tty pointer */
- serial = usb_serial_get_by_index(tty->index);
- if (!serial) {
- tty->driver_data = NULL;
- return -ENODEV;
- }
+ serial = usb_serial_get_by_index(idx);
+ if (!serial)
+ return retval;
- mutex_lock(&serial->disc_mutex);
- portNumber = tty->index - serial->minor;
- port = serial->port[portNumber];
- if (!port || serial->disconnected)
- retval = -ENODEV;
- else
- get_device(&port->dev);
- /*
- * Note: Our locking order requirement does not allow port->mutex
- * to be acquired while serial->disc_mutex is held.
- */
- mutex_unlock(&serial->disc_mutex);
+ port = serial->port[idx - serial->minor];
+ if (!port)
+ goto error_no_port;
+ if (!try_module_get(serial->type->driver.owner))
+ goto error_module_get;
+
+ /* perform the standard setup */
+ retval = tty_init_termios(tty);
if (retval)
- goto bailout_serial_put;
+ goto error_init_termios;
- if (mutex_lock_interruptible(&port->mutex)) {
- retval = -ERESTARTSYS;
- goto bailout_port_put;
- }
+ retval = usb_autopm_get_interface(serial->interface);
+ if (retval)
+ goto error_get_interface;
+
+ mutex_unlock(&serial->disc_mutex);
- ++port->port.count;
+ /* allow the driver to update the settings */
+ if (serial->type->init_termios)
+ serial->type->init_termios(tty);
- /* set up our port structure making the tty driver
- * remember our port object, and us it */
tty->driver_data = port;
- tty_port_tty_set(&port->port, tty);
- /* If the console is attached, the device is already open */
- if (port->port.count == 1 && !port->console) {
- first = 1;
- /* lock this module before we call it
- * this may fail, which means we must bail out,
- * safe because we are called with BKL held */
- if (!try_module_get(serial->type->driver.owner)) {
- retval = -ENODEV;
- goto bailout_mutex_unlock;
- }
+ /* Final install (we use the default method) */
+ tty_driver_kref_get(driver);
+ tty->count++;
+ driver->ttys[idx] = tty;
+ return retval;
+ error_get_interface:
+ error_init_termios:
+ module_put(serial->type->driver.owner);
+ error_module_get:
+ error_no_port:
+ usb_serial_put(serial);
+ mutex_unlock(&serial->disc_mutex);
+ return retval;
+}
+
+static int serial_open(struct tty_struct *tty, struct file *filp)
+{
+ struct usb_serial_port *port = tty->driver_data;
+ struct usb_serial *serial = port->serial;
+ int retval;
+
+ dbg("%s - port %d", __func__, port->number);
+
+ spin_lock_irq(&port->port.lock);
+ if (!tty_hung_up_p(filp))
+ ++port->port.count;
+ spin_unlock_irq(&port->port.lock);
+ tty_port_tty_set(&port->port, tty);
+
+ /* Do the device-specific open only if the hardware isn't
+ * already initialized.
+ */
+ if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags)) {
+ if (mutex_lock_interruptible(&port->mutex))
+ return -ERESTARTSYS;
mutex_lock(&serial->disc_mutex);
if (serial->disconnected)
retval = -ENODEV;
else
- retval = usb_autopm_get_interface(serial->interface);
- if (retval)
- goto bailout_module_put;
-
- /* only call the device specific open if this
- * is the first time the port is opened */
- retval = serial->type->open(tty, port, filp);
- if (retval)
- goto bailout_interface_put;
+ retval = port->serial->type->open(tty, port, filp);
mutex_unlock(&serial->disc_mutex);
+ mutex_unlock(&port->mutex);
+ if (retval)
+ return retval;
set_bit(ASYNCB_INITIALIZED, &port->port.flags);
}
- mutex_unlock(&port->mutex);
+
/* Now do the correct tty layer semantics */
retval = tty_port_block_til_ready(&port->port, tty, filp);
- if (retval == 0) {
- if (!first)
- usb_serial_put(serial);
- return 0;
- }
- mutex_lock(&port->mutex);
- if (first == 0)
- goto bailout_mutex_unlock;
- /* Undo the initial port actions */
- mutex_lock(&serial->disc_mutex);
-bailout_interface_put:
- usb_autopm_put_interface(serial->interface);
-bailout_module_put:
- mutex_unlock(&serial->disc_mutex);
- module_put(serial->type->driver.owner);
-bailout_mutex_unlock:
- port->port.count = 0;
- tty->driver_data = NULL;
- tty_port_tty_set(&port->port, NULL);
- mutex_unlock(&port->mutex);
-bailout_port_put:
- put_device(&port->dev);
-bailout_serial_put:
- usb_serial_put(serial);
return retval;
}
/**
- * serial_do_down - shut down hardware
- * @port: port to shut down
- *
- * Shut down a USB port unless it is the console. We never shut down the
- * console hardware as it will always be in use.
+ * serial_down - shut down hardware
+ * @port: port to shut down
*
- * Don't free any resources at this point
+ * Shut down a USB serial port unless it is the console. We never
+ * shut down the console hardware as it will always be in use.
*/
-static void serial_do_down(struct usb_serial_port *port)
+static void serial_down(struct usb_serial_port *port)
{
struct usb_serial_driver *drv = port->serial->type;
struct usb_serial *serial;
struct module *owner;
- /* The console is magical, do not hang up the console hardware
- or there will be tears */
+ /*
+ * The console is magical. Do not hang up the console hardware
+ * or there will be tears.
+ */
if (port->console)
return;
+ /* Don't call the close method if the hardware hasn't been
+ * initialized.
+ */
+ if (!test_and_clear_bit(ASYNCB_INITIALIZED, &port->port.flags))
+ return;
+
mutex_lock(&port->mutex);
serial = port->serial;
owner = serial->type->driver.owner;
@@ -310,79 +319,69 @@ static void serial_do_down(struct usb_serial_port *port)
mutex_unlock(&port->mutex);
}
-/**
- * serial_do_free - free resources post close/hangup
- * @port: port to free up
- *
- * Do the resource freeing and refcount dropping for the port. We must
- * be careful about ordering and we must avoid freeing up the console.
- */
-
-static void serial_do_free(struct usb_serial_port *port)
+static void serial_hangup(struct tty_struct *tty)
{
- struct usb_serial *serial;
- struct module *owner;
+ struct usb_serial_port *port = tty->driver_data;
- /* The console is magical, do not hang up the console hardware
- or there will be tears */
- if (port->console)
- return;
+ dbg("%s - port %d", __func__, port->number);
- serial = port->serial;
- owner = serial->type->driver.owner;
- put_device(&port->dev);
- /* Mustn't dereference port any more */
- mutex_lock(&serial->disc_mutex);
- if (!serial->disconnected)
- usb_autopm_put_interface(serial->interface);
- mutex_unlock(&serial->disc_mutex);
- usb_serial_put(serial);
- /* Mustn't dereference serial any more */
- module_put(owner);
+ serial_down(port);
+ tty_port_hangup(&port->port);
}
static void serial_close(struct tty_struct *tty, struct file *filp)
{
struct usb_serial_port *port = tty->driver_data;
- if (!port)
- return;
-
dbg("%s - port %d", __func__, port->number);
- /* FIXME:
- This leaves a very narrow race. Really we should do the
- serial_do_free() on tty->shutdown(), but tty->shutdown can
- be called from IRQ context and serial_do_free can sleep.
-
- The right fix is probably to make the tty free (which is rare)
- and thus tty->shutdown() occur via a work queue and simplify all
- the drivers that use it.
- */
- if (tty_hung_up_p(filp)) {
- /* serial_hangup already called serial_down at this point.
- Another user may have already reopened the port but
- serial_do_free is refcounted */
- serial_do_free(port);
+ if (tty_hung_up_p(filp))
return;
- }
-
if (tty_port_close_start(&port->port, tty, filp) == 0)
return;
-
- serial_do_down(port);
+ serial_down(port);
tty_port_close_end(&port->port, tty);
tty_port_tty_set(&port->port, NULL);
- serial_do_free(port);
}
-static void serial_hangup(struct tty_struct *tty)
+/**
+ * serial_release - free resources post close/hangup
+ * @port: port to free up
+ *
+ * Do the resource freeing and refcount dropping for the port.
+ * Avoid freeing the console.
+ *
+ * Called when the last tty kref is dropped.
+ */
+static void serial_release(struct tty_struct *tty)
{
struct usb_serial_port *port = tty->driver_data;
- serial_do_down(port);
- tty_port_hangup(&port->port);
- /* We must not free port yet - the USB serial layer depends on it's
- continued existence */
+ struct usb_serial *serial;
+ struct module *owner;
+
+ /* The console is magical. Do not hang up the console hardware
+ * or there will be tears.
+ */
+ if (port->console)
+ return;
+
+ dbg("%s - port %d", __func__, port->number);
+
+ /* Standard shutdown processing */
+ tty_shutdown(tty);
+
+ tty->driver_data = NULL;
+
+ serial = port->serial;
+ owner = serial->type->driver.owner;
+
+ mutex_lock(&serial->disc_mutex);
+ if (!serial->disconnected)
+ usb_autopm_put_interface(serial->interface);
+ mutex_unlock(&serial->disc_mutex);
+
+ usb_serial_put(serial);
+ module_put(owner);
}
static int serial_write(struct tty_struct *tty, const unsigned char *buf,
@@ -527,6 +526,7 @@ static int serial_proc_show(struct seq_file *m, void *v)
seq_putc(m, '\n');
usb_serial_put(serial);
+ mutex_unlock(&serial->disc_mutex);
}
return 0;
}
@@ -596,14 +596,6 @@ static void usb_serial_port_work(struct work_struct *work)
tty_kref_put(tty);
}
-static void port_release(struct device *dev)
-{
- struct usb_serial_port *port = to_usb_serial_port(dev);
-
- dbg ("%s - %s", __func__, dev_name(dev));
- port_free(port);
-}
-
static void kill_traffic(struct usb_serial_port *port)
{
usb_kill_urb(port->read_urb);
@@ -623,8 +615,12 @@ static void kill_traffic(struct usb_serial_port *port)
usb_kill_urb(port->interrupt_out_urb);
}
-static void port_free(struct usb_serial_port *port)
+static void port_release(struct device *dev)
{
+ struct usb_serial_port *port = to_usb_serial_port(dev);
+
+ dbg ("%s - %s", __func__, dev_name(dev));
+
/*
* Stop all the traffic before cancelling the work, so that
* nobody will restart it by calling usb_serial_port_softint.
@@ -935,6 +931,11 @@ int usb_serial_probe(struct usb_interface *interface,
mutex_init(&port->mutex);
INIT_WORK(&port->work, usb_serial_port_work);
serial->port[i] = port;
+ port->dev.parent = &interface->dev;
+ port->dev.driver = NULL;
+ port->dev.bus = &usb_serial_bus_type;
+ port->dev.release = &port_release;
+ device_initialize(&port->dev);
}
/* set up the endpoint information */
@@ -1060,12 +1061,15 @@ int usb_serial_probe(struct usb_interface *interface,
module_put(type->driver.owner);
if (retval < 0)
goto probe_error;
+ serial->attached = 1;
if (retval > 0) {
/* quietly accept this device, but don't bind to a
serial port as it's about to disappear */
serial->num_ports = 0;
goto exit;
}
+ } else {
+ serial->attached = 1;
}
if (get_free_serial(serial, num_ports, &minor) == NULL) {
@@ -1077,15 +1081,10 @@ int usb_serial_probe(struct usb_interface *interface,
/* register all of the individual ports with the driver core */
for (i = 0; i < num_ports; ++i) {
port = serial->port[i];
- port->dev.parent = &interface->dev;
- port->dev.driver = NULL;
- port->dev.bus = &usb_serial_bus_type;
- port->dev.release = &port_release;
-
dev_set_name(&port->dev, "ttyUSB%d", port->number);
dbg ("%s - registering %s", __func__, dev_name(&port->dev));
port->dev_state = PORT_REGISTERING;
- retval = device_register(&port->dev);
+ retval = device_add(&port->dev);
if (retval) {
dev_err(&port->dev, "Error registering port device, "
"continuing\n");
@@ -1103,39 +1102,7 @@ exit:
return 0;
probe_error:
- for (i = 0; i < num_bulk_in; ++i) {
- port = serial->port[i];
- if (!port)
- continue;
- usb_free_urb(port->read_urb);
- kfree(port->bulk_in_buffer);
- }
- for (i = 0; i < num_bulk_out; ++i) {
- port = serial->port[i];
- if (!port)
- continue;
- usb_free_urb(port->write_urb);
- kfree(port->bulk_out_buffer);
- }
- for (i = 0; i < num_interrupt_in; ++i) {
- port = serial->port[i];
- if (!port)
- continue;
- usb_free_urb(port->interrupt_in_urb);
- kfree(port->interrupt_in_buffer);
- }
- for (i = 0; i < num_interrupt_out; ++i) {
- port = serial->port[i];
- if (!port)
- continue;
- usb_free_urb(port->interrupt_out_urb);
- kfree(port->interrupt_out_buffer);
- }
-
- /* free up any memory that we allocated */
- for (i = 0; i < serial->num_port_pointers; ++i)
- kfree(serial->port[i]);
- kfree(serial);
+ usb_serial_put(serial);
return -EIO;
}
EXPORT_SYMBOL_GPL(usb_serial_probe);
@@ -1161,10 +1128,7 @@ void usb_serial_disconnect(struct usb_interface *interface)
if (port) {
struct tty_struct *tty = tty_port_tty_get(&port->port);
if (tty) {
- /* The hangup will occur asynchronously but
- the object refcounts will sort out all the
- cleanup */
- tty_hangup(tty);
+ tty_vhangup(tty);
tty_kref_put(tty);
}
kill_traffic(port);
@@ -1189,8 +1153,7 @@ void usb_serial_disconnect(struct usb_interface *interface)
}
serial->type->disconnect(serial);
- /* let the last holder of this object
- * cause it to be cleaned up */
+ /* let the last holder of this object cause it to be cleaned up */
usb_serial_put(serial);
dev_info(dev, "device disconnected\n");
}
@@ -1246,6 +1209,8 @@ static const struct tty_operations serial_ops = {
.chars_in_buffer = serial_chars_in_buffer,
.tiocmget = serial_tiocmget,
.tiocmset = serial_tiocmset,
+ .shutdown = serial_release,
+ .install = serial_install,
.proc_fops = &serial_proc_fops,
};
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
index 8d126dd7a02e..f7232b1bce51 100644
--- a/drivers/usb/serial/whiteheat.c
+++ b/drivers/usb/serial/whiteheat.c
@@ -259,7 +259,7 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command,
__u8 *data, __u8 datasize);
static int firm_open(struct usb_serial_port *port);
static int firm_close(struct usb_serial_port *port);
-static int firm_setup_port(struct tty_struct *tty);
+static void firm_setup_port(struct tty_struct *tty);
static int firm_set_rts(struct usb_serial_port *port, __u8 onoff);
static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff);
static int firm_set_break(struct usb_serial_port *port, __u8 onoff);
@@ -1211,7 +1211,7 @@ static int firm_close(struct usb_serial_port *port)
}
-static int firm_setup_port(struct tty_struct *tty)
+static void firm_setup_port(struct tty_struct *tty)
{
struct usb_serial_port *port = tty->driver_data;
struct whiteheat_port_settings port_settings;
@@ -1286,7 +1286,7 @@ static int firm_setup_port(struct tty_struct *tty)
port_settings.lloop = 0;
/* now send the message to the device */
- return firm_send_command(port, WHITEHEAT_SETUP_PORT,
+ firm_send_command(port, WHITEHEAT_SETUP_PORT,
(__u8 *)&port_settings, sizeof(port_settings));
}
diff --git a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c
index ec17c96371af..105d900150c1 100644
--- a/drivers/usb/storage/initializers.c
+++ b/drivers/usb/storage/initializers.c
@@ -102,5 +102,5 @@ int usb_stor_huawei_e220_init(struct us_data *us)
USB_TYPE_STANDARD | USB_RECIP_DEVICE,
0x01, 0x0, NULL, 0x0, 1000);
US_DEBUGP("Huawei mode set result is %d\n", result);
- return (result ? 0 : -ENODEV);
+ return 0;
}
diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c
index 380233bd6a39..80e65f29921c 100644
--- a/drivers/usb/storage/onetouch.c
+++ b/drivers/usb/storage/onetouch.c
@@ -163,7 +163,7 @@ static void usb_onetouch_pm_hook(struct us_data *us, int action)
usb_kill_urb(onetouch->irq);
break;
case US_RESUME:
- if (usb_submit_urb(onetouch->irq, GFP_KERNEL) != 0)
+ if (usb_submit_urb(onetouch->irq, GFP_NOIO) != 0)
dev_err(&onetouch->irq->dev->dev,
"usb_submit_urb failed\n");
break;
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index e20dc525d177..cc313d16d727 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -666,10 +666,11 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
* to wait for at least one CHECK_CONDITION to determine
* SANE_SENSE support
*/
- if ((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) &&
+ if (unlikely((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) &&
result == USB_STOR_TRANSPORT_GOOD &&
!(us->fflags & US_FL_SANE_SENSE) &&
- !(srb->cmnd[2] & 0x20)) {
+ !(us->fflags & US_FL_BAD_SENSE) &&
+ !(srb->cmnd[2] & 0x20))) {
US_DEBUGP("-- SAT supported, increasing auto-sense\n");
us->fflags |= US_FL_SANE_SENSE;
}
@@ -696,7 +697,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
/* device supports and needs bigger sense buffer */
if (us->fflags & US_FL_SANE_SENSE)
sense_size = ~0;
-
+Retry_Sense:
US_DEBUGP("Issuing auto-REQUEST_SENSE\n");
scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sense_size);
@@ -718,8 +719,30 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
US_DEBUGP("-- auto-sense aborted\n");
srb->result = DID_ABORT << 16;
+
+ /* If SANE_SENSE caused this problem, disable it */
+ if (sense_size != US_SENSE_SIZE) {
+ us->fflags &= ~US_FL_SANE_SENSE;
+ us->fflags |= US_FL_BAD_SENSE;
+ }
goto Handle_Errors;
}
+
+ /* Some devices claim to support larger sense but fail when
+ * trying to request it. When a transport failure happens
+ * using US_FS_SANE_SENSE, we always retry with a standard
+ * (small) sense request. This fixes some USB GSM modems
+ */
+ if (temp_result == USB_STOR_TRANSPORT_FAILED &&
+ sense_size != US_SENSE_SIZE) {
+ US_DEBUGP("-- auto-sense failure, retry small sense\n");
+ sense_size = US_SENSE_SIZE;
+ us->fflags &= ~US_FL_SANE_SENSE;
+ us->fflags |= US_FL_BAD_SENSE;
+ goto Retry_Sense;
+ }
+
+ /* Other failures */
if (temp_result != USB_STOR_TRANSPORT_GOOD) {
US_DEBUGP("-- auto-sense failure\n");
@@ -739,6 +762,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
*/
if (srb->sense_buffer[7] > (US_SENSE_SIZE - 8) &&
!(us->fflags & US_FL_SANE_SENSE) &&
+ !(us->fflags & US_FL_BAD_SENSE) &&
(srb->sense_buffer[0] & 0x7C) == 0x70) {
US_DEBUGP("-- SANE_SENSE support enabled\n");
us->fflags |= US_FL_SANE_SENSE;
@@ -768,17 +792,32 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
/* set the result so the higher layers expect this data */
srb->result = SAM_STAT_CHECK_CONDITION;
- /* If things are really okay, then let's show that. Zero
- * out the sense buffer so the higher layers won't realize
- * we did an unsolicited auto-sense. */
- if (result == USB_STOR_TRANSPORT_GOOD &&
- /* Filemark 0, ignore EOM, ILI 0, no sense */
+ /* We often get empty sense data. This could indicate that
+ * everything worked or that there was an unspecified
+ * problem. We have to decide which.
+ */
+ if ( /* Filemark 0, ignore EOM, ILI 0, no sense */
(srb->sense_buffer[2] & 0xaf) == 0 &&
/* No ASC or ASCQ */
srb->sense_buffer[12] == 0 &&
srb->sense_buffer[13] == 0) {
- srb->result = SAM_STAT_GOOD;
- srb->sense_buffer[0] = 0x0;
+
+ /* If things are really okay, then let's show that.
+ * Zero out the sense buffer so the higher layers
+ * won't realize we did an unsolicited auto-sense.
+ */
+ if (result == USB_STOR_TRANSPORT_GOOD) {
+ srb->result = SAM_STAT_GOOD;
+ srb->sense_buffer[0] = 0x0;
+
+ /* If there was a problem, report an unspecified
+ * hardware error to prevent the higher layers from
+ * entering an infinite retry loop.
+ */
+ } else {
+ srb->result = DID_ERROR << 16;
+ srb->sense_buffer[2] = HARDWARE_ERROR;
+ }
}
}
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 7477d411959f..5ef11f435330 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -838,6 +838,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001,
US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY ),
+/* Reported by Daniel Kukula <daniel.kuku@gmail.com> */
+UNUSUAL_DEV( 0x067b, 0x1063, 0x0100, 0x0100,
+ "Prolific Technology, Inc.",
+ "Prolific Storage Gadget",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+ US_FL_BAD_SENSE ),
+
/* Reported by Rogerio Brito <rbrito@ime.usp.br> */
UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
"Prolific Technology, Inc.",
@@ -1820,13 +1827,6 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999,
US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_GO_SLOW ),
-/* Reported by Rohan Hart <rohan.hart17@gmail.com> */
-UNUSUAL_DEV( 0x2770, 0x915d, 0x0010, 0x0010,
- "INTOVA",
- "Pixtreme",
- US_SC_DEVICE, US_PR_DEVICE, NULL,
- US_FL_FIX_CAPACITY ),
-
/* Reported by Frederic Marchal <frederic.marchal@wowcompany.com>
* Mio Moov 330
*/
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
index 11dd37de45c7..f3ba49f62408 100644
--- a/drivers/usb/storage/usb.c
+++ b/drivers/usb/storage/usb.c
@@ -228,6 +228,7 @@ void fill_inquiry_response(struct us_data *us, unsigned char *data,
if (data_len<36) // You lose.
return;
+ memset(data+8, ' ', 28);
if(data[0]&0x20) { /* USB device currently not connected. Return
peripheral qualifier 001b ("...however, the
physical device is not currently connected
@@ -237,15 +238,15 @@ void fill_inquiry_response(struct us_data *us, unsigned char *data,
device, it may return zeros or ASCII spaces
(20h) in those fields until the data is
available from the device."). */
- memset(data+8,0,28);
} else {
u16 bcdDevice = le16_to_cpu(us->pusb_dev->descriptor.bcdDevice);
- memcpy(data+8, us->unusual_dev->vendorName,
- strlen(us->unusual_dev->vendorName) > 8 ? 8 :
- strlen(us->unusual_dev->vendorName));
- memcpy(data+16, us->unusual_dev->productName,
- strlen(us->unusual_dev->productName) > 16 ? 16 :
- strlen(us->unusual_dev->productName));
+ int n;
+
+ n = strlen(us->unusual_dev->vendorName);
+ memcpy(data+8, us->unusual_dev->vendorName, min(8, n));
+ n = strlen(us->unusual_dev->productName);
+ memcpy(data+16, us->unusual_dev->productName, min(16, n));
+
data[32] = 0x30 + ((bcdDevice>>12) & 0x0F);
data[33] = 0x30 + ((bcdDevice>>8) & 0x0F);
data[34] = 0x30 + ((bcdDevice>>4) & 0x0F);
@@ -432,7 +433,8 @@ static void adjust_quirks(struct us_data *us)
u16 vid = le16_to_cpu(us->pusb_dev->descriptor.idVendor);
u16 pid = le16_to_cpu(us->pusb_dev->descriptor.idProduct);
unsigned f = 0;
- unsigned int mask = (US_FL_SANE_SENSE | US_FL_FIX_CAPACITY |
+ unsigned int mask = (US_FL_SANE_SENSE | US_FL_BAD_SENSE |
+ US_FL_FIX_CAPACITY |
US_FL_CAPACITY_HEURISTICS | US_FL_IGNORE_DEVICE |
US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 |
US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE |
@@ -462,6 +464,9 @@ static void adjust_quirks(struct us_data *us)
case 'a':
f |= US_FL_SANE_SENSE;
break;
+ case 'b':
+ f |= US_FL_BAD_SENSE;
+ break;
case 'c':
f |= US_FL_FIX_CAPACITY;
break;
diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c
index b6449470106c..a482dd7b0311 100644
--- a/drivers/video/backlight/lcd.c
+++ b/drivers/video/backlight/lcd.c
@@ -56,7 +56,7 @@ static int fb_notifier_callback(struct notifier_block *self,
static int lcd_register_fb(struct lcd_device *ld)
{
- memset(&ld->fb_notif, 0, sizeof(&ld->fb_notif));
+ memset(&ld->fb_notif, 0, sizeof(ld->fb_notif));
ld->fb_notif.notifier_call = fb_notifier_callback;
return fb_register_client(&ld->fb_notif);
}
diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
index 2f50a80b413e..979b5a18588c 100644
--- a/drivers/video/console/Kconfig
+++ b/drivers/video/console/Kconfig
@@ -67,16 +67,9 @@ config SGI_NEWPORT_CONSOLE
# bool 'IODC console' CONFIG_IODC_CONSOLE
-config PROM_CONSOLE
- bool "PROM console"
- depends on SPARC
- help
- Say Y to build a console driver for Sun machines that uses the
- terminal emulation built into their console PROMS.
-
config DUMMY_CONSOLE
bool
- depends on PROM_CONSOLE!=y || VGA_CONSOLE!=y || SGI_NEWPORT_CONSOLE!=y
+ depends on VGA_CONSOLE!=y || SGI_NEWPORT_CONSOLE!=y
default y
config DUMMY_CONSOLE_COLUMNS
diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile
index ac46cc3f6a2a..a862e9173ebe 100644
--- a/drivers/video/console/Makefile
+++ b/drivers/video/console/Makefile
@@ -22,7 +22,6 @@ font-objs += $(font-objs-y)
obj-$(CONFIG_DUMMY_CONSOLE) += dummycon.o
obj-$(CONFIG_SGI_NEWPORT_CONSOLE) += newport_con.o font.o
-obj-$(CONFIG_PROM_CONSOLE) += promcon.o promcon_tbl.o
obj-$(CONFIG_STI_CONSOLE) += sticon.o sticore.o font.o
obj-$(CONFIG_VGA_CONSOLE) += vgacon.o
obj-$(CONFIG_MDA_CONSOLE) += mdacon.o
@@ -40,14 +39,3 @@ obj-$(CONFIG_FB_STI) += sticore.o font.o
ifeq ($(CONFIG_USB_SISUSBVGA_CON),y)
obj-$(CONFIG_USB_SISUSBVGA) += font.o
endif
-
-# Targets that kbuild needs to know about
-targets := promcon_tbl.c
-
-quiet_cmd_conmakehash = CNMKHSH $@
- cmd_conmakehash = scripts/conmakehash $< | \
- sed -e '/\#include <[^>]*>/p' -e 's/types/init/' \
- -e 's/dfont\(_uni.*\]\)/promfont\1 /' > $@
-
-$(obj)/promcon_tbl.c: $(src)/prom.uni
- $(call cmd,conmakehash)
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 3a44695b9c09..29ff5ea3cc3c 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -114,6 +114,7 @@ static int last_fb_vc = MAX_NR_CONSOLES - 1;
static int fbcon_is_default = 1;
static int fbcon_has_exited;
static int primary_device = -1;
+static int fbcon_has_console_bind;
#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
static int map_override;
@@ -544,6 +545,8 @@ static int fbcon_takeover(int show_logo)
con2fb_map[i] = -1;
}
info_idx = -1;
+ } else {
+ fbcon_has_console_bind = 1;
}
return err;
@@ -2923,6 +2926,10 @@ static int fbcon_unbind(void)
ret = unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc,
fbcon_is_default);
+
+ if (!ret)
+ fbcon_has_console_bind = 0;
+
return ret;
}
#else
@@ -2936,6 +2943,9 @@ static int fbcon_fb_unbind(int idx)
{
int i, new_idx = -1, ret = 0;
+ if (!fbcon_has_console_bind)
+ return 0;
+
for (i = first_fb_vc; i <= last_fb_vc; i++) {
if (con2fb_map[i] != idx &&
con2fb_map[i] != -1) {
diff --git a/drivers/video/matrox/g450_pll.c b/drivers/video/matrox/g450_pll.c
index d42346e7fdda..3dcb6d218f7c 100644
--- a/drivers/video/matrox/g450_pll.c
+++ b/drivers/video/matrox/g450_pll.c
@@ -341,7 +341,8 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll,
M1064_XDVICLKCTRL_C1DVICLKEN |
M1064_XDVICLKCTRL_DVILOOPCTL |
M1064_XDVICLKCTRL_P1LOOPBWDTCTL;
- matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL,tmp);
+ /* Setting this breaks PC systems so don't do it */
+ /* matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL,tmp); */
matroxfb_DAC_out(PMINFO M1064_XPWRCTRL,
xpwrctrl);
diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
index 9c4739c8b19c..34e4e7995169 100644
--- a/drivers/video/modedb.c
+++ b/drivers/video/modedb.c
@@ -35,11 +35,6 @@ EXPORT_SYMBOL_GPL(fb_mode_option);
*/
static const struct fb_videomode modedb[] = {
- {
- /* 800x480 @ 60 Hz, 31.5 kHz hsync */
- "LQ070Y3DG3B", 60, 800, 480, 44000, 0, 50, 25, 10, 128, 10,
- FB_SYNC_EXT,FB_VMODE_NONINTERLACED
- },
{
/* 640x400 @ 70 Hz, 31.5 kHz hsync */
NULL, 70, 640, 400, 39721, 40, 24, 39, 9, 96, 2,
diff --git a/drivers/video/mxc/Kconfig b/drivers/video/mxc/Kconfig
index 42f990ac3499..e86e6d86b978 100644
--- a/drivers/video/mxc/Kconfig
+++ b/drivers/video/mxc/Kconfig
@@ -38,10 +38,6 @@ config FB_MXC_CLAA_WVGA_SYNC_PANEL
depends on FB_MXC_SYNC_PANEL
tristate "CLAA WVGA Panel"
-config FB_MXC_SII9022
- depends on FB_MXC_SYNC_PANEL
- tristate "Si Image SII9022 DVI/HDMI Interface Chip"
-
config FB_MXC_CH7026
depends on FB_MXC_SYNC_PANEL
tristate "Chrontel CH7026 VGA Interface Chip"
diff --git a/drivers/video/mxc/Makefile b/drivers/video/mxc/Makefile
index d823ab29f030..b47b3f77cd80 100644
--- a/drivers/video/mxc/Makefile
+++ b/drivers/video/mxc/Makefile
@@ -21,4 +21,3 @@ obj-$(CONFIG_FB_MXC_TVOUT_TVE) += tve.o
obj-$(CONFIG_FB_MXC_CH7026) += mxcfb_ch7026.o
#obj-$(CONFIG_FB_MODE_HELPERS) += mxc_edid.o
obj-$(CONFIG_VIDEO_AD9389) += ad9389.o
-obj-$(CONFIG_FB_MXC_SII9022) += mxcfb_sii9022.o
diff --git a/drivers/video/mxc/mxc_elcdif_fb.c b/drivers/video/mxc/mxc_elcdif_fb.c
index e163edb7bfb9..44587d28c7f9 100644
--- a/drivers/video/mxc/mxc_elcdif_fb.c
+++ b/drivers/video/mxc/mxc_elcdif_fb.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Freescale Semiconductor, Inc.
+ * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -64,8 +64,7 @@
#define ELCDIF_PIX_FMT_ABGR32 fourcc('A', 'B', 'G', 'R')
struct mxc_elcdif_fb_data {
- int cur_blank;
- int next_blank;
+ int is_blank;
int output_pix_fmt;
int elcdif_mode;
ssize_t mem_size;
@@ -518,7 +517,7 @@ static inline void mxc_init_elcdif(void)
return;
}
-int mxc_elcdif_frame_addr_setup(dma_addr_t phys)
+static inline int mxc_elcdif_dma_init(dma_addr_t phys)
{
int ret = 0;
@@ -807,7 +806,7 @@ static int mxc_elcdif_fb_set_par(struct fb_info *fbi)
return -ENOMEM;
}
- if (data->next_blank != FB_BLANK_UNBLANK)
+ if (data->is_blank)
return 0;
/* init next panel */
@@ -846,7 +845,7 @@ static int mxc_elcdif_fb_set_par(struct fb_info *fbi)
data->output_pix_fmt,
sig_cfg,
1);
- mxc_elcdif_frame_addr_setup(fbi->fix.smem_start);
+ mxc_elcdif_dma_init(fbi->fix.smem_start);
mxc_elcdif_run();
mxc_elcdif_blank_panel(FB_BLANK_UNBLANK);
@@ -951,7 +950,7 @@ static int mxc_elcdif_fb_wait_for_vsync(u32 channel, struct fb_info *info)
(struct mxc_elcdif_fb_data *)info->par;
int ret = 0;
- if (data->cur_blank != FB_BLANK_UNBLANK) {
+ if (data->is_blank) {
dev_err(info->device, "can't wait for VSYNC when fb "
"is blank\n");
return -EINVAL;
@@ -991,15 +990,6 @@ static int mxc_elcdif_fb_ioctl(struct fb_info *info, unsigned int cmd,
if (!get_user(channel, (__u32 __user *) arg))
ret = mxc_elcdif_fb_wait_for_vsync(channel, info);
break;
- case MXCFB_GET_FB_BLANK:
- {
- struct mxc_elcdif_fb_data *data =
- (struct mxc_elcdif_fb_data *)info->par;
-
- if (put_user(data->cur_blank, (__u32 __user *)arg))
- return -EFAULT;
- break;
- }
default:
break;
}
@@ -1012,28 +1002,22 @@ static int mxc_elcdif_fb_blank(int blank, struct fb_info *info)
(struct mxc_elcdif_fb_data *)info->par;
int ret = 0;
- if (data->cur_blank == blank)
+ if (data->is_blank == (blank != FB_BLANK_UNBLANK))
return ret;
- data->next_blank = blank;
-
- if (!g_elcdif_pix_clk_enable) {
- clk_enable(g_elcdif_pix_clk);
- g_elcdif_pix_clk_enable = true;
+ if (blank == FB_BLANK_UNBLANK) {
+ if (!g_elcdif_pix_clk_enable) {
+ clk_enable(g_elcdif_pix_clk);
+ g_elcdif_pix_clk_enable = true;
+ }
}
ret = mxc_elcdif_blank_panel(blank);
if (ret == 0)
- data->cur_blank = blank;
+ data->is_blank = (blank != FB_BLANK_UNBLANK);
else
return ret;
- if (blank == FB_BLANK_UNBLANK) {
- ret = mxc_elcdif_fb_set_par(info);
- if (ret)
- return ret;
- }
-
- if (data->cur_blank != FB_BLANK_UNBLANK) {
+ if (data->is_blank) {
if (g_elcdif_axi_clk_enable) {
clk_disable(g_elcdif_axi_clk);
g_elcdif_axi_clk_enable = false;
@@ -1064,7 +1048,7 @@ static int mxc_elcdif_fb_pan_display(struct fb_var_screeninfo *var,
int ret = 0;
unsigned long base;
- if (data->cur_blank != FB_BLANK_UNBLANK) {
+ if (data->is_blank) {
dev_err(info->device, "can't do pan display when fb "
"is blank\n");
return -EINVAL;
@@ -1187,7 +1171,7 @@ static int mxc_elcdif_fb_probe(struct platform_device *pdev)
}
data = (struct mxc_elcdif_fb_data *)fbi->par;
- data->cur_blank = data->next_blank = FB_BLANK_UNBLANK;
+ data->is_blank = false;
fbi->var.activate = FB_ACTIVATE_NOW;
fbi->fbops = &mxc_elcdif_fb_ops;
@@ -1350,9 +1334,9 @@ static int mxc_elcdif_fb_suspend(struct platform_device *pdev,
acquire_console_sem();
fb_set_suspend(fbi, 1);
- saved_blank = data->cur_blank;
+ saved_blank = data->is_blank;
mxc_elcdif_fb_blank(FB_BLANK_POWERDOWN, fbi);
- data->next_blank = saved_blank;
+ data->is_blank = saved_blank;
if (!g_elcdif_pix_clk_enable) {
clk_enable(g_elcdif_pix_clk);
g_elcdif_pix_clk_enable = true;
@@ -1363,11 +1347,7 @@ static int mxc_elcdif_fb_suspend(struct platform_device *pdev,
clk_disable(g_elcdif_pix_clk);
g_elcdif_pix_clk_enable = false;
}
- if (g_elcdif_axi_clk_enable) {
- clk_disable(g_elcdif_axi_clk);
- g_elcdif_axi_clk_enable = false;
- }
- release_console_sem();
+
return 0;
}
@@ -1377,7 +1357,20 @@ static int mxc_elcdif_fb_resume(struct platform_device *pdev)
struct mxc_elcdif_fb_data *data = (struct mxc_elcdif_fb_data *)fbi->par;
acquire_console_sem();
- mxc_elcdif_fb_blank(data->next_blank, fbi);
+ if (!g_elcdif_pix_clk_enable) {
+ clk_enable(g_elcdif_pix_clk);
+ g_elcdif_pix_clk_enable = true;
+ }
+ mxc_init_elcdif();
+ mxc_elcdif_init_panel();
+ mxc_elcdif_dma_init(fbi->fix.smem_start);
+ mxc_elcdif_run();
+ if (g_elcdif_pix_clk_enable) {
+ clk_disable(g_elcdif_pix_clk);
+ g_elcdif_pix_clk_enable = false;
+ }
+ if (!data->is_blank)
+ mxc_elcdif_fb_blank(FB_BLANK_UNBLANK, fbi);
fb_set_suspend(fbi, 0);
release_console_sem();
diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c
index e9aa9fc72f9c..27f9faa64e53 100644
--- a/drivers/video/mxc/mxc_epdc_fb.c
+++ b/drivers/video/mxc/mxc_epdc_fb.c
@@ -21,6 +21,8 @@
* Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved.
*/
+/*#define NO_POWERDOWN*/
+
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/device.h>
@@ -55,7 +57,6 @@
/*#define DEFAULT_PANEL_HW_INIT*/
#define NUM_SCREENS 2
-#define NUM_SCREENS_X 16
#define EPDC_NUM_LUTS 16
#define EPDC_MAX_NUM_UPDATES 20
#define INVALID_LUT -1
@@ -71,7 +72,20 @@
#define POWER_STATE_ON 1
static unsigned long default_bpp = 16;
-static unsigned long g_num_screens = NUM_SCREENS;
+
+struct mxc_epdc_platform_fb_entry {
+ char name[16];
+ u16 x_res;
+ u16 y_res;
+ u16 bpp;
+ u32 cycle_time_ns;
+ struct list_head link;
+};
+
+struct mxc_epdc_platform_fb_data {
+ struct list_head list;
+ struct mxc_epdc_platform_fb_entry *cur;
+};
struct update_marker_data {
u32 update_marker;
@@ -99,15 +113,13 @@ struct update_data_list {
struct mxc_epdc_fb_data {
struct fb_info info;
u32 pseudo_palette[16];
- char *fb_panel_str;
struct list_head list;
- struct mxc_epdc_fb_mode *cur_mode;
- struct mxc_epdc_fb_platform_data *pdata;
+ struct mxc_epdc_platform_fb_entry *cur;
int blank;
+ ssize_t mem_size;
ssize_t map_size;
dma_addr_t phys_start;
u32 fb_offset;
- int default_bpp;
int native_width;
int native_height;
int epdc_irq;
@@ -143,10 +155,9 @@ struct mxc_epdc_fb_data {
struct update_marker_data update_marker_array[EPDC_MAX_NUM_UPDATES];
u32 lut_update_type[EPDC_NUM_LUTS];
struct completion updates_done;
- struct delayed_work epdc_done_work;
+ struct work_struct epdc_done_work;
struct mutex power_mutex;
bool powering_down;
- int pwrdown_delay;
/* FB elements related to PxP DMA */
struct completion pxp_tx_cmpl;
@@ -191,12 +202,35 @@ struct mxcfb_waveform_data_file {
void __iomem *epdc_base;
+#define NUM_PANELS 1
+
+static struct fb_videomode panel_modes[NUM_PANELS] = {
+ {
+ /* 800x600 @ 60 Hz , pixel clk @ 20MHz */
+ "E-INK SVGA", 60, 800, 600, 50000, 8, 142, 4, 10, 20, 4,
+ 0,
+ FB_VMODE_NONINTERLACED,
+ 0,},
+};
+
+/*
+ * This is a temporary placeholder
+ * Ultimately, this declaration will be off in a panel-specific file,
+ * and will include implementations for all of the panel functions
+ */
+static struct mxc_epdc_platform_fb_entry ed060sc4_fb_entry = {
+ .name = "ed060sc4",
+ .x_res = 800,
+ .y_res = 600,
+ .bpp = 16,
+ .cycle_time_ns = 200,
+};
+
/* forward declaration */
static int mxc_epdc_fb_blank(int blank, struct fb_info *info);
static int mxc_epdc_fb_init_hw(struct fb_info *info);
static int pxp_process_update(struct mxc_epdc_fb_data *fb_data,
- struct mxcfb_rect *update_region,
- int x_start_offs);
+ struct mxcfb_rect *update_region);
static int pxp_complete_update(struct mxc_epdc_fb_data *fb_data, u32 *hist_stat);
static void draw_mode0(struct mxc_epdc_fb_data *fb_data);
@@ -392,6 +426,47 @@ static inline void dump_all_updates(struct mxc_epdc_fb_data *fb_data) {}
#endif
+void check_waveform(u32 *wv_buf_orig, u32 *wv_buf_cur, u32 wv_buf_size)
+{
+ int i;
+ bool is_mismatch = false;
+ for (i = 0; i < wv_buf_size; i++) {
+ if (wv_buf_orig[i] != wv_buf_cur[i]) {
+ is_mismatch = true;
+ printk
+ ("Waveform mismatch - wv_buf_orig[%d] = 0x%x, wv_buf_cur[%d] = 0x%x\n",
+ i, wv_buf_orig[i], i, wv_buf_cur[i]);
+ }
+ }
+
+ if (!is_mismatch)
+ printk("No mismatches!\n");
+}
+
+static struct fb_var_screeninfo mxc_epdc_fb_default __devinitdata = {
+ .activate = FB_ACTIVATE_TEST,
+ .height = -1,
+ .width = -1,
+ .pixclock = 20000,
+ .left_margin = 8,
+ .right_margin = 142,
+ .upper_margin = 4,
+ .lower_margin = 10,
+ .hsync_len = 20,
+ .vsync_len = 4,
+ .vmode = FB_VMODE_NONINTERLACED,
+};
+
+static struct fb_fix_screeninfo mxc_epdc_fb_fix __devinitdata = {
+ .id = "mxc_epdc_fb",
+ .type = FB_TYPE_PACKED_PIXELS,
+ .visual = FB_VISUAL_TRUECOLOR,
+ .xpanstep = 0,
+ .ypanstep = 0,
+ .ywrapstep = 0,
+ .accel = FB_ACCEL_NONE,
+ .line_length = 800 * 2,
+};
/********************************************************
* Start Low-Level EPDC Functions
@@ -579,10 +654,9 @@ static void epdc_set_vertical_timing(u32 vert_start, u32 vert_end,
void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
{
- struct mxc_epdc_fb_mode *epdc_mode = fb_data->cur_mode;
+ struct mxc_epdc_platform_fb_entry *pentry = fb_data->cur;
struct fb_var_screeninfo *screeninfo = &fb_data->info.var;
u32 reg_val;
- int num_ce;
/* Reset */
__raw_writel(EPDC_CTRL_SFTRST, EPDC_CTRL_SET);
@@ -624,7 +698,7 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
epdc_set_temp(8);
/* EPDC_RES */
- epdc_set_screen_res(epdc_mode->vmode->xres, epdc_mode->vmode->yres);
+ epdc_set_screen_res(pentry->x_res, pentry->y_res);
/*
* EPDC_TCE_CTRL
@@ -639,7 +713,7 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
* PIXELS_PER_SDCLK = 4
*/
reg_val =
- ((epdc_mode->vscan_holdoff << EPDC_TCE_CTRL_VSCAN_HOLDOFF_OFFSET) &
+ ((4 << EPDC_TCE_CTRL_VSCAN_HOLDOFF_OFFSET) &
EPDC_TCE_CTRL_VSCAN_HOLDOFF_MASK)
| EPDC_TCE_CTRL_PIXELS_PER_SDCLK_4;
__raw_writel(reg_val, EPDC_TCE_CTRL);
@@ -657,13 +731,13 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
/* EPDC_TCE_OE */
reg_val =
- ((epdc_mode->sdoed_width << EPDC_TCE_OE_SDOED_WIDTH_OFFSET) &
+ ((10 << EPDC_TCE_OE_SDOED_WIDTH_OFFSET) &
EPDC_TCE_OE_SDOED_WIDTH_MASK)
- | ((epdc_mode->sdoed_delay << EPDC_TCE_OE_SDOED_DLY_OFFSET) &
+ | ((20 << EPDC_TCE_OE_SDOED_DLY_OFFSET) &
EPDC_TCE_OE_SDOED_DLY_MASK)
- | ((epdc_mode->sdoez_width << EPDC_TCE_OE_SDOEZ_WIDTH_OFFSET) &
+ | ((10 << EPDC_TCE_OE_SDOEZ_WIDTH_OFFSET) &
EPDC_TCE_OE_SDOEZ_WIDTH_MASK)
- | ((epdc_mode->sdoez_delay << EPDC_TCE_OE_SDOEZ_DLY_OFFSET) &
+ | ((20 << EPDC_TCE_OE_SDOEZ_DLY_OFFSET) &
EPDC_TCE_OE_SDOEZ_DLY_MASK);
__raw_writel(reg_val, EPDC_TCE_OE);
@@ -672,17 +746,17 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
/* EPDC_TCE_TIMING2 */
reg_val =
- ((epdc_mode->gdclk_hp_offs << EPDC_TCE_TIMING2_GDCLK_HP_OFFSET) &
+ ((480 << EPDC_TCE_TIMING2_GDCLK_HP_OFFSET) &
EPDC_TCE_TIMING2_GDCLK_HP_MASK)
- | ((epdc_mode->gdsp_offs << EPDC_TCE_TIMING2_GDSP_OFFSET_OFFSET) &
+ | ((20 << EPDC_TCE_TIMING2_GDSP_OFFSET_OFFSET) &
EPDC_TCE_TIMING2_GDSP_OFFSET_MASK);
__raw_writel(reg_val, EPDC_TCE_TIMING2);
/* EPDC_TCE_TIMING3 */
reg_val =
- ((epdc_mode->gdoe_offs << EPDC_TCE_TIMING3_GDOE_OFFSET_OFFSET) &
+ ((0 << EPDC_TCE_TIMING3_GDOE_OFFSET_OFFSET) &
EPDC_TCE_TIMING3_GDOE_OFFSET_MASK)
- | ((epdc_mode->gdclk_offs << EPDC_TCE_TIMING3_GDCLK_OFFSET_OFFSET) &
+ | ((1 << EPDC_TCE_TIMING3_GDCLK_OFFSET_OFFSET) &
EPDC_TCE_TIMING3_GDCLK_OFFSET_MASK);
__raw_writel(reg_val, EPDC_TCE_TIMING3);
@@ -695,14 +769,10 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
* SDDO_INVERT = DISABLED
* PIXELS_PER_CE = display horizontal resolution
*/
- num_ce = epdc_mode->num_ce;
- if (num_ce == 0)
- num_ce = 1;
reg_val = EPDC_TCE_SDCFG_SDCLK_HOLD | EPDC_TCE_SDCFG_SDSHR
- | ((num_ce << EPDC_TCE_SDCFG_NUM_CE_OFFSET) &
- EPDC_TCE_SDCFG_NUM_CE_MASK)
+ | ((1 << EPDC_TCE_SDCFG_NUM_CE_OFFSET) & EPDC_TCE_SDCFG_NUM_CE_MASK)
| EPDC_TCE_SDCFG_SDDO_REFORMAT_FLIP_PIXELS
- | ((epdc_mode->vmode->xres/num_ce << EPDC_TCE_SDCFG_PIXELS_PER_CE_OFFSET) &
+ | ((pentry->x_res << EPDC_TCE_SDCFG_PIXELS_PER_CE_OFFSET) &
EPDC_TCE_SDCFG_PIXELS_PER_CE_MASK);
__raw_writel(reg_val, EPDC_TCE_SDCFG);
@@ -760,10 +830,6 @@ static void epdc_powerup(struct mxc_epdc_fb_data *fb_data)
dev_dbg(fb_data->dev, "EPDC Powerup\n");
- /* Enable pins used by EPDC */
- if (fb_data->pdata->enable_pins)
- fb_data->pdata->enable_pins();
-
/* Enable clocks to EPDC */
clk_enable(fb_data->epdc_clk_axi);
clk_enable(fb_data->epdc_clk_pix);
@@ -803,10 +869,6 @@ static void epdc_powerdown(struct mxc_epdc_fb_data *fb_data)
clk_disable(fb_data->epdc_clk_pix);
clk_disable(fb_data->epdc_clk_axi);
- /* Disable pins used by EPDC (to prevent leakage current) */
- if (fb_data->pdata->disable_pins)
- fb_data->pdata->disable_pins();
-
fb_data->power_state = POWER_STATE_OFF;
fb_data->powering_down = false;
@@ -1013,7 +1075,7 @@ static int mxc_epdc_fb_set_par(struct fb_info *info)
break;
}
}
- pxp_conf->s0_param.width = screeninfo->xres_virtual;
+ pxp_conf->s0_param.width = screeninfo->xres;
pxp_conf->s0_param.height = screeninfo->yres;
pxp_conf->s0_param.color_key = -1;
pxp_conf->s0_param.color_key_enable = false;
@@ -1032,24 +1094,19 @@ static int mxc_epdc_fb_set_par(struct fb_info *info)
* an initialization request.
*/
if (!fb_data->hw_ready) {
- for (i = 0; i < fb_data->pdata->num_modes; i++) {
- struct fb_videomode *vmode =
- fb_data->pdata->epdc_mode[i].vmode;
- /* Check resolution for a match
- with supported panel types */
- if ((screeninfo->xres != vmode->xres) ||
- (screeninfo->yres != vmode->yres))
+ for (i = 0; i < NUM_PANELS; i++) {
+ /* Check resolution for a match with supported panel types */
+ if ((screeninfo->xres != panel_modes[i].xres) ||
+ (screeninfo->yres != panel_modes[i].yres))
continue;
- fb_data->cur_mode = &fb_data->pdata->epdc_mode[i];
-
/* Found a match - Grab timing params */
- screeninfo->left_margin = vmode->left_margin;
- screeninfo->right_margin = vmode->right_margin;
- screeninfo->upper_margin = vmode->upper_margin;
- screeninfo->lower_margin = vmode->lower_margin;
- screeninfo->hsync_len = vmode->hsync_len;
- screeninfo->vsync_len = vmode->vsync_len;
+ screeninfo->left_margin = panel_modes[i].left_margin;
+ screeninfo->right_margin = panel_modes[i].right_margin;
+ screeninfo->upper_margin = panel_modes[i].upper_margin;
+ screeninfo->lower_margin = panel_modes[i].lower_margin;
+ screeninfo->hsync_len = panel_modes[i].hsync_len;
+ screeninfo->vsync_len = panel_modes[i].vsync_len;
/* Initialize EPDC settings and init panel */
ret =
@@ -1183,13 +1240,15 @@ static int mxc_epdc_fb_check_var(struct fb_var_screeninfo *var,
switch (var->rotate) {
case FB_ROTATE_UR:
case FB_ROTATE_UD:
- var->xres = fb_data->native_width;
+ var->xres = var->xres_virtual = fb_data->native_width;
var->yres = fb_data->native_height;
+ var->yres_virtual = var->yres * 2;
break;
case FB_ROTATE_CW:
case FB_ROTATE_CCW:
- var->xres = fb_data->native_height;
+ var->xres = var->xres_virtual = fb_data->native_height;
var->yres = fb_data->native_width;
+ var->yres_virtual = var->yres * 2;
break;
default:
/* Invalid rotation value */
@@ -1198,9 +1257,6 @@ static int mxc_epdc_fb_check_var(struct fb_var_screeninfo *var,
return -EINVAL;
}
- var->xres_virtual = ALIGN(var->xres, 32);
- var->yres_virtual = ALIGN(var->yres, 128) * g_num_screens;
-
var->height = -1;
var->width = -1;
@@ -1282,7 +1338,7 @@ static int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
u32 offset_from_8, bytes_per_pixel;
u32 post_rotation_xcoord, post_rotation_ycoord, width_pxp_blocks;
u32 pxp_input_offs, pxp_output_offs, pxp_output_shift;
- int x_start_offs = 0;
+ int adj_left, adj_top;
u32 hist_stat = 0;
int temp_index;
bool wait_for_power = false;
@@ -1384,7 +1440,7 @@ static int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
src_width = upd_data->alt_buffer_data.width;
src_upd_region = &upd_data->alt_buffer_data.alt_update_region;
} else {
- src_width = fb_data->info.var.xres_virtual;
+ src_width = fb_data->info.var.xres;
src_upd_region = screen_upd_region;
}
@@ -1411,21 +1467,11 @@ static int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
pxp_upd_region.left = 0;
}
- /*
- * We want PxP processing region to start at the first pixel
- * that we have to process in each row, but PxP alignment
- * restricts the input mem address to be 32-bit aligned
- *
- * We work around this by using x_start_offs to offset
- * to offset from our starting pixel location to the
- * first pixel that is in the relevant update region
- * for each row.
- */
- x_start_offs = pxp_upd_region.left & 0x7;
-
/* Update region to meet 8x8 pixel requirement */
- pxp_upd_region.width = ALIGN(src_upd_region->width, 8);
- pxp_upd_region.height = ALIGN(src_upd_region->height, 8);
+ adj_left = pxp_upd_region.left & 0x7;
+ adj_top = pxp_upd_region.top & 0x7;
+ pxp_upd_region.width = ALIGN(src_upd_region->width + adj_left, 8);
+ pxp_upd_region.height = ALIGN(src_upd_region->height + adj_top, 8);
pxp_upd_region.top &= ~0x7;
pxp_upd_region.left &= ~0x7;
@@ -1484,8 +1530,7 @@ static int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
mutex_lock(&fb_data->pxp_mutex);
/* This is a blocking call, so upon return PxP tx should be done */
- ret = pxp_process_update(fb_data, &pxp_upd_region,
- x_start_offs);
+ ret = pxp_process_update(fb_data, &pxp_upd_region);
if (ret) {
dev_err(fb_data->dev, "Unable to submit PxP update task.\n");
mutex_unlock(&fb_data->pxp_mutex);
@@ -1644,97 +1689,52 @@ static int mxc_epdc_fb_wait_update_complete(u32 update_marker,
return 0;
}
-static int mxc_epdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
- struct fb_info *info)
-{
- struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info;
-
- fb_data->pwrdown_delay = pwrdown_delay;
-
- return 0;
-}
-
static int mxc_epdc_fb_ioctl(struct fb_info *info, unsigned int cmd,
unsigned long arg)
{
void __user *argp = (void __user *)arg;
+ struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info;
+ struct mxcfb_waveform_modes modes;
+ int temperature;
+ u32 auto_mode = 0;
+ struct mxcfb_update_data upd_data;
+ u32 update_marker = 0;
int ret = -EINVAL;
switch (cmd) {
case MXCFB_SET_WAVEFORM_MODES:
- {
- struct mxcfb_waveform_modes modes;
- struct mxc_epdc_fb_data *fb_data =
- (struct mxc_epdc_fb_data *)info;
- if (!copy_from_user(&modes, argp, sizeof(modes))) {
- memcpy(&fb_data->wv_modes, &modes,
- sizeof(modes));
- ret = 0;
- }
- break;
+ if (!copy_from_user(&modes, argp, sizeof(modes))) {
+ memcpy(&fb_data->wv_modes, &modes, sizeof(modes));
+ ret = 0;
}
+ break;
case MXCFB_SET_TEMPERATURE:
- {
- int temperature;
- if (!get_user(temperature, (int32_t __user *) arg))
- ret =
- mxc_epdc_fb_set_temperature(temperature,
- info);
- break;
- }
+ if (!get_user(temperature, (int32_t __user *) arg))
+ ret =
+ mxc_epdc_fb_set_temperature(temperature,
+ info);
+ break;
case MXCFB_SET_AUTO_UPDATE_MODE:
- {
- u32 auto_mode = 0;
- if (!get_user(auto_mode, (__u32 __user *) arg))
- ret =
- mxc_epdc_fb_set_auto_update(auto_mode,
- info);
- break;
- }
+ if (!get_user(auto_mode, (__u32 __user *) arg))
+ ret =
+ mxc_epdc_fb_set_auto_update(auto_mode, info);
+ break;
case MXCFB_SEND_UPDATE:
- {
- struct mxcfb_update_data upd_data;
- if (!copy_from_user(&upd_data, argp,
- sizeof(upd_data))) {
- ret = mxc_epdc_fb_send_update(&upd_data, info);
- if (ret == 0 && copy_to_user(argp, &upd_data,
- sizeof(upd_data)))
- ret = -EFAULT;
- } else {
+ if (!copy_from_user(&upd_data, argp, sizeof(upd_data))) {
+ ret = mxc_epdc_fb_send_update(&upd_data, info);
+ if (ret == 0 && copy_to_user(argp, &upd_data, sizeof(upd_data)))
ret = -EFAULT;
- }
-
- break;
- }
- case MXCFB_WAIT_FOR_UPDATE_COMPLETE:
- {
- u32 update_marker = 0;
- if (!get_user(update_marker, (__u32 __user *) arg))
- ret =
- mxc_epdc_fb_wait_update_complete(update_marker,
- info);
- break;
- }
-
- case MXCFB_SET_PWRDOWN_DELAY:
- {
- int delay = 0;
- if (!get_user(delay, (__u32 __user *) arg))
- ret =
- mxc_epdc_fb_set_pwrdown_delay(delay, info);
- break;
+ } else {
+ ret = -EFAULT;
}
- case MXCFB_GET_PWRDOWN_DELAY:
- {
- struct mxc_epdc_fb_data *fb_data =
- (struct mxc_epdc_fb_data *)info;
- if (put_user(fb_data->pwrdown_delay,
- (int __user *)argp))
- ret = -EFAULT;
- ret = 0;
- break;
- }
+ break;
+ case MXCFB_WAIT_FOR_UPDATE_COMPLETE:
+ if (!get_user(update_marker, (__u32 __user *) arg))
+ ret =
+ mxc_epdc_fb_wait_update_complete(update_marker,
+ info);
+ break;
default:
break;
}
@@ -1833,6 +1833,10 @@ static int mxc_epdc_fb_blank(int blank, struct fb_info *info)
case FB_BLANK_NORMAL:
mxc_epdc_fb_disable(fb_data);
break;
+ case FB_BLANK_UNBLANK:
+ epdc_powerup(fb_data);
+ mxc_epdc_fb_set_par(info);
+ break;
}
return 0;
}
@@ -1841,6 +1845,8 @@ static int mxc_epdc_fb_pan_display(struct fb_var_screeninfo *var,
struct fb_info *info)
{
struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info;
+ struct mxcfb_update_data update;
+ int ret = 0;
u_int y_bottom;
dev_dbg(info->device, "%s: var->xoffset %d, info->var.xoffset %d\n",
@@ -1867,6 +1873,25 @@ static int mxc_epdc_fb_pan_display(struct fb_var_screeninfo *var,
fb_data->fb_offset = (var->yoffset * var->xres_virtual + var->xoffset)
* (var->bits_per_pixel) / 8;
+ /* Update to new view of FB */
+ update.update_region.left = 0;
+ update.update_region.width = fb_data->info.var.xres;
+ update.update_region.top = 0;
+ update.update_region.height = fb_data->info.var.yres;
+ update.waveform_mode = WAVEFORM_MODE_AUTO;
+ update.update_mode = UPDATE_MODE_FULL;
+ update.update_marker = PAN_UPDATE_MARKER;
+ update.temp = TEMP_USE_AMBIENT;
+ update.use_alt_buffer = false;
+
+ mxc_epdc_fb_send_update(&update, &fb_data->info);
+
+ /* Block on initial update */
+ ret = mxc_epdc_fb_wait_update_complete(update.update_marker, info);
+ if (ret < 0)
+ dev_err(fb_data->dev,
+ "Wait for update complete failed. Error = 0x%x", ret);
+
info->var.xoffset = var->xoffset;
info->var.yoffset = var->yoffset;
@@ -1875,7 +1900,7 @@ static int mxc_epdc_fb_pan_display(struct fb_var_screeninfo *var,
else
info->var.vmode &= ~FB_VMODE_YWRAP;
- return 0;
+ return ret;
}
static struct fb_ops mxc_epdc_fb_ops = {
@@ -1893,15 +1918,14 @@ static struct fb_ops mxc_epdc_fb_ops = {
};
static struct fb_deferred_io mxc_epdc_fb_defio = {
- .delay = HZ,
+ .delay = HZ / 2,
.deferred_io = mxc_epdc_fb_deferred_io,
};
static void epdc_done_work_func(struct work_struct *work)
{
struct mxc_epdc_fb_data *fb_data =
- container_of(work, struct mxc_epdc_fb_data,
- epdc_done_work.work);
+ container_of(work, struct mxc_epdc_fb_data, epdc_done_work);
epdc_powerdown(fb_data);
}
@@ -2015,17 +2039,16 @@ static irqreturn_t mxc_epdc_irq_handler(int irq, void *dev_id)
(fb_data->cur_update == NULL) &&
!epdc_any_luts_active()) {
- if (fb_data->pwrdown_delay != FB_POWERDOWN_DISABLE) {
- /*
- * Set variable to prevent overlapping
- * enable/disable requests
- */
- fb_data->powering_down = true;
-
- /* Schedule task to disable EPDC HW until next update */
- schedule_delayed_work(&fb_data->epdc_done_work,
- msecs_to_jiffies(fb_data->pwrdown_delay));
- }
+#ifndef NO_POWERDOWN
+ /*
+ * Set variable to prevent overlapping
+ * enable/disable requests
+ */
+ fb_data->powering_down = true;
+
+ /* Schedule task to disable EPDC HW until next update */
+ schedule_work(&fb_data->epdc_done_work);
+#endif
if (fb_data->waiting_for_idle)
complete(&fb_data->updates_done);
@@ -2241,25 +2264,15 @@ static void draw_mode0(struct mxc_epdc_fb_data *fb_data)
static int mxc_epdc_fb_init_hw(struct fb_info *info)
{
struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info;
+ u32 wv_buf_size;
const struct firmware *fw;
- char *fw_str = "imx/epdc";
struct mxcfb_update_data update;
struct mxcfb_waveform_data_file *wv_file;
int wv_data_offs;
int ret;
int i;
- /*
- * Create fw search string based on ID string in selected videomode.
- * Format is "imx/epdc_[panel string].fw"
- */
- if (fb_data->cur_mode) {
- strcat(fw_str, "_");
- strcat(fw_str, fb_data->cur_mode->vmode->name);
- strcat(fw_str, ".fw");
- }
-
- ret = request_firmware(&fw, fw_str, fb_data->dev);
+ ret = request_firmware(&fw, "imx/epdc.fw", fb_data->dev);
if (ret) {
printk(KERN_ERR "Failed to load image imx/epdc.ihex err %d\n",
ret);
@@ -2280,20 +2293,20 @@ static int mxc_epdc_fb_init_hw(struct fb_info *info)
/* Get offset and size for waveform data */
wv_data_offs = sizeof(wv_file->wdh) + fb_data->trt_entries + 1;
- fb_data->waveform_buffer_size = fw->size - wv_data_offs;
+ wv_buf_size = fw->size - wv_data_offs;
/* Allocate memory for waveform data */
- fb_data->waveform_buffer_virt = dma_alloc_coherent(fb_data->dev,
- fb_data->waveform_buffer_size,
- &fb_data->waveform_buffer_phys,
- GFP_DMA);
+ fb_data->waveform_buffer_virt = dma_alloc_coherent(fb_data->dev, wv_buf_size,
+ &fb_data->waveform_buffer_phys,
+ GFP_DMA);
if (fb_data->waveform_buffer_virt == NULL) {
dev_err(fb_data->dev, "Can't allocate mem for waveform!\n");
ret = -ENOMEM;
}
- memcpy(fb_data->waveform_buffer_virt, (u8 *)(fw->data) + wv_data_offs,
- fb_data->waveform_buffer_size);
+ memcpy(fb_data->waveform_buffer_virt, (u8 *)(fw->data) + wv_data_offs, wv_buf_size);
+ check_waveform((u32 *)(fw->data + wv_data_offs),
+ fb_data->waveform_buffer_virt, wv_buf_size / 4);
release_firmware(fw);
@@ -2302,7 +2315,7 @@ static int mxc_epdc_fb_init_hw(struct fb_info *info)
/* Enable pix clk for EPDC */
clk_enable(fb_data->epdc_clk_pix);
- clk_set_rate(fb_data->epdc_clk_pix, fb_data->cur_mode->vmode->pixclock);
+ clk_set_rate(fb_data->epdc_clk_pix, 17700000);
epdc_init_sequence(fb_data);
@@ -2373,23 +2386,14 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
struct mxc_epdc_fb_data *fb_data;
struct resource *res;
struct fb_info *info;
- char *options, *opt;
- char *panel_str = NULL;
- char name[] = "mxcepdcfb";
- struct fb_videomode *vmode;
- int xres_virt, yres_virt, buf_size;
- struct fb_var_screeninfo *var_info;
- struct fb_fix_screeninfo *fix_info;
+ struct mxc_epdc_platform_fb_data *pdata;
+ struct mxc_epdc_platform_fb_entry *pentry;
struct pxp_config_data *pxp_conf;
struct pxp_proc_data *proc_data;
struct scatterlist *sg;
struct update_data_list *upd_list;
struct update_data_list *plist, *temp_list;
int i;
- unsigned long x_mem_size = 0;
-#ifdef CONFIG_FRAMEBUFFER_CONSOLE
- struct mxcfb_update_data update;
-#endif
fb_data = (struct mxc_epdc_fb_data *)framebuffer_alloc(
sizeof(struct mxc_epdc_fb_data), &pdev->dev);
@@ -2398,54 +2402,10 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
goto out;
}
- /* Get platform data and check validity */
- fb_data->pdata = pdev->dev.platform_data;
- if ((fb_data->pdata == NULL) || (fb_data->pdata->num_modes < 1)
- || (fb_data->pdata->epdc_mode == NULL)
- || (fb_data->pdata->epdc_mode->vmode == NULL)) {
- ret = -EINVAL;
- goto out_fbdata;
- }
-
- if (fb_get_options(name, &options)) {
- ret = -ENODEV;
- goto out_fbdata;
- }
-
- if (options)
- while ((opt = strsep(&options, ",")) != NULL) {
- if (!*opt)
- continue;
-
- if (!strncmp(opt, "bpp=", 4))
- fb_data->default_bpp =
- simple_strtoul(opt + 4, NULL, 0);
- else if (!strncmp(opt, "x_mem=", 6))
- x_mem_size =
- simple_strtoul(opt + 6, NULL, 0);
- else
- panel_str = opt;
- }
-
fb_data->dev = &pdev->dev;
-
- if (!fb_data->default_bpp)
- fb_data->default_bpp = 16;
-
- /* Set default (first defined mode) before searching for a match */
- fb_data->cur_mode = &fb_data->pdata->epdc_mode[0];
-
- if (panel_str)
- for (i = 0; i < fb_data->pdata->num_modes; i++)
- if (!strcmp(fb_data->pdata->epdc_mode[i].vmode->name,
- panel_str)) {
- fb_data->cur_mode =
- &fb_data->pdata->epdc_mode[i];
- break;
- }
-
- vmode = fb_data->cur_mode->vmode;
-
+ /* We want to use hard-coded structure defined in this file */
+ pentry = &ed060sc4_fb_entry;
+ fb_data->cur = pentry;
platform_set_drvdata(pdev, fb_data);
info = &fb_data->info;
@@ -2454,24 +2414,12 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
if (ret)
goto out_fbdata;
- dev_dbg(&pdev->dev, "resolution %dx%d, bpp %d\n",
- fb_data->cur_mode->vmode->xres,
- fb_data->cur_mode->vmode->yres, fb_data->default_bpp);
-
- /*
- * GPU alignment restrictions dictate framebuffer parameters:
- * - 32-byte alignment for buffer width
- * - 128-byte alignment for buffer height
- * => 4K buffer alignment for buffer start
- */
- xres_virt = ALIGN(vmode->xres, 32);
- yres_virt = ALIGN(vmode->yres, 128);
- buf_size = xres_virt * yres_virt * fb_data->default_bpp/8;
+ dev_dbg(&pdev->dev, "resolution %dx%d, bpp %d\n", pentry->x_res,
+ pentry->y_res, pentry->bpp);
- if (x_mem_size > 0)
- g_num_screens = NUM_SCREENS_X;
+ fb_data->mem_size = pentry->x_res * pentry->y_res * pentry->bpp/8;
- fb_data->map_size = PAGE_ALIGN(buf_size) * g_num_screens;
+ fb_data->map_size = PAGE_ALIGN(fb_data->mem_size) * NUM_SCREENS;
dev_dbg(&pdev->dev, "memory to allocate: %d\n", fb_data->map_size);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -2499,69 +2447,49 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "allocated at %p:0x%x\n", info->screen_base,
fb_data->phys_start);
- var_info = &info->var;
-
- var_info->activate = FB_ACTIVATE_TEST;
- var_info->bits_per_pixel = fb_data->default_bpp;
- var_info->xres = vmode->xres;
- var_info->yres = vmode->yres;
- var_info->xres_virtual = xres_virt;
- /* Additional screens allow for panning and buffer flipping */
- var_info->yres_virtual = yres_virt * g_num_screens;
-
- var_info->pixclock = vmode->pixclock;
- var_info->left_margin = vmode->left_margin;
- var_info->right_margin = vmode->right_margin;
- var_info->upper_margin = vmode->upper_margin;
- var_info->lower_margin = vmode->lower_margin;
- var_info->hsync_len = vmode->hsync_len;
- var_info->vsync_len = vmode->vsync_len;
- var_info->vmode = FB_VMODE_NONINTERLACED;
-
- switch (fb_data->default_bpp) {
+ mxc_epdc_fb_default.bits_per_pixel = pentry->bpp;
+ mxc_epdc_fb_default.xres = pentry->x_res;
+ mxc_epdc_fb_default.yres = pentry->y_res;
+ mxc_epdc_fb_default.xres_virtual = pentry->x_res;
+ mxc_epdc_fb_default.yres_virtual = pentry->y_res * 2; /* FB doubled in virtual space */
+
+ mxc_epdc_fb_fix.smem_start = fb_data->phys_start;
+ mxc_epdc_fb_fix.smem_len = mxc_epdc_fb_default.yres_virtual
+ * pentry->x_res * 2 * pentry->bpp / 8;
+ mxc_epdc_fb_fix.ypanstep = 0;
+
+ switch (pentry->bpp) {
case 32:
case 24:
- var_info->red.offset = 16;
- var_info->red.length = 8;
- var_info->green.offset = 8;
- var_info->green.length = 8;
- var_info->blue.offset = 0;
- var_info->blue.length = 8;
+ mxc_epdc_fb_default.red.offset = 16;
+ mxc_epdc_fb_default.red.length = 8;
+ mxc_epdc_fb_default.green.offset = 8;
+ mxc_epdc_fb_default.green.length = 8;
+ mxc_epdc_fb_default.blue.offset = 0;
+ mxc_epdc_fb_default.blue.length = 8;
break;
case 16:
- var_info->red.offset = 11;
- var_info->red.length = 5;
- var_info->green.offset = 5;
- var_info->green.length = 6;
- var_info->blue.offset = 0;
- var_info->blue.length = 5;
+ mxc_epdc_fb_default.red.offset = 11;
+ mxc_epdc_fb_default.red.length = 5;
+ mxc_epdc_fb_default.green.offset = 5;
+ mxc_epdc_fb_default.green.length = 6;
+ mxc_epdc_fb_default.blue.offset = 0;
+ mxc_epdc_fb_default.blue.length = 5;
break;
default:
- dev_err(&pdev->dev, "unsupported bitwidth %d\n",
- fb_data->default_bpp);
+ dev_err(&pdev->dev, "unsupported bitwidth %d\n", pentry->bpp);
ret = -EINVAL;
goto out_dma_fb;
}
- fix_info = &info->fix;
-
- strcpy(fix_info->id, "mxc_epdc_fb");
- fix_info->type = FB_TYPE_PACKED_PIXELS;
- fix_info->visual = FB_VISUAL_TRUECOLOR;
- fix_info->xpanstep = 0;
- fix_info->ypanstep = 0;
- fix_info->ywrapstep = 0;
- fix_info->accel = FB_ACCEL_NONE;
- fix_info->smem_start = fb_data->phys_start;
- fix_info->smem_len = fb_data->map_size;
- fix_info->ypanstep = 0;
-
- fb_data->native_width = vmode->xres;
- fb_data->native_height = vmode->yres;
+ fb_data->native_width = pentry->x_res;
+ fb_data->native_height = pentry->y_res;
info->fbops = &mxc_epdc_fb_ops;
+ info->var = mxc_epdc_fb_default;
+ info->fix = mxc_epdc_fb_fix;
info->var.activate = FB_ACTIVATE_NOW;
info->pseudo_palette = fb_data->pseudo_palette;
info->screen_size = info->fix.smem_len;
@@ -2633,7 +2561,7 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
upd_list->size, upd_list->phys_addr);
}
- fb_data->working_buffer_size = vmode->yres * vmode->xres * 2;
+ fb_data->working_buffer_size = pentry->y_res * pentry->x_res * 2;
/* Allocate memory for EPDC working buffer */
fb_data->working_buffer_virt =
dma_alloc_coherent(&pdev->dev, fb_data->working_buffer_size,
@@ -2644,13 +2572,11 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
goto out_upd_buffers;
}
- /* Initialize EPDC pins */
- if (fb_data->pdata->get_pins)
- fb_data->pdata->get_pins();
-
fb_data->epdc_clk_axi = clk_get(fb_data->dev, "epdc_axi");
fb_data->epdc_clk_pix = clk_get(fb_data->dev, "epdc_pix");
+ clk_set_rate(fb_data->epdc_clk_axi, 200000000);
+
fb_data->in_init = false;
fb_data->hw_ready = false;
@@ -2691,11 +2617,10 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
if (ret) {
dev_err(&pdev->dev, "request_irq (%d) failed with error %d\n",
fb_data->epdc_irq, ret);
- ret = -ENODEV;
goto out_dma_work_buf;
}
- INIT_DELAYED_WORK(&fb_data->epdc_done_work, epdc_done_work_func);
+ INIT_WORK(&fb_data->epdc_done_work, epdc_done_work_func);
info->fbdefio = &mxc_epdc_fb_defio;
#ifdef CONFIG_FB_MXC_EINK_AUTO_UPDATE_MODE
@@ -2706,17 +2631,15 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
fb_data->display_regulator = regulator_get(NULL, "DISPLAY");
if (IS_ERR(fb_data->display_regulator)) {
dev_err(&pdev->dev, "Unable to get display PMIC regulator."
- "err = 0x%x\n", (int)fb_data->display_regulator);
- ret = -ENODEV;
- goto out_irq;
+ "err = 0x%x\n", fb_data->display_regulator);
+ goto out_dma_work_buf;
}
fb_data->vcom_regulator = regulator_get(NULL, "VCOM");
if (IS_ERR(fb_data->vcom_regulator)) {
regulator_put(fb_data->display_regulator);
dev_err(&pdev->dev, "Unable to get VCOM regulator."
- "err = 0x%x\n", (int)fb_data->vcom_regulator);
- ret = -ENODEV;
- goto out_irq;
+ "err = 0x%x\n", fb_data->vcom_regulator);
+ goto out_dma_work_buf;
}
if (device_create_file(info->dev, &fb_attrs[0]))
@@ -2763,7 +2686,7 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
* Parameters should match FB format/width/height
*/
pxp_conf->s0_param.pixel_fmt = PXP_PIX_FMT_RGB565;
- pxp_conf->s0_param.width = fb_data->info.var.xres_virtual;
+ pxp_conf->s0_param.width = fb_data->info.var.xres;
pxp_conf->s0_param.height = fb_data->info.var.yres;
pxp_conf->s0_param.color_key = -1;
pxp_conf->s0_param.color_key_enable = false;
@@ -2772,7 +2695,7 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
* Initialize OL0 channel parameters
* No overlay will be used for PxP operation
*/
- for (i = 0; i < 8; i++) {
+ for (i = 0; i < 8; i++) {
pxp_conf->ol_param[i].combine_enable = false;
pxp_conf->ol_param[i].width = 0;
pxp_conf->ol_param[i].height = 0;
@@ -2816,54 +2739,33 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
fb_data->blank = FB_BLANK_UNBLANK;
fb_data->power_state = POWER_STATE_OFF;
fb_data->powering_down = false;
- fb_data->pwrdown_delay = 0;
/* Register FB */
ret = register_framebuffer(info);
if (ret) {
dev_err(&pdev->dev,
"register_framebuffer failed with error %d\n", ret);
- goto out_dmaengine;
+ goto out_irq;
}
#ifdef DEFAULT_PANEL_HW_INIT
ret = mxc_epdc_fb_init_hw((struct fb_info *)fb_data);
if (ret) {
- dev_err(&pdev->dev, "Failed to initialize HW!\n");
+ dev_err(&pdev->dev, "Failed to read firmware!\n");
+ goto out_dmaengine;
}
#endif
-#ifdef CONFIG_FRAMEBUFFER_CONSOLE
- /* If FB console included, update display to show logo */
- update.update_region.left = 0;
- update.update_region.width = info->var.xres;
- update.update_region.top = 0;
- update.update_region.height = info->var.yres;
- update.update_mode = UPDATE_MODE_PARTIAL;
- update.waveform_mode = WAVEFORM_MODE_AUTO;
- update.update_marker = INIT_UPDATE_MARKER;
- update.temp = TEMP_USE_AMBIENT;
- update.use_alt_buffer = false;
-
- mxc_epdc_fb_send_update(&update, info);
-
- ret = mxc_epdc_fb_wait_update_complete(update.update_marker, info);
- if (ret < 0)
- dev_err(fb_data->dev,
- "Wait for update complete failed. Error = 0x%x", ret);
-#endif
-
goto out;
out_dmaengine:
dmaengine_put();
+ unregister_framebuffer(&fb_data->info);
out_irq:
free_irq(fb_data->epdc_irq, fb_data);
out_dma_work_buf:
- dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size,
+ dma_free_writecombine(&pdev->dev, pentry->y_res * pentry->x_res / 2,
fb_data->working_buffer_virt, fb_data->working_buffer_phys);
- if (fb_data->pdata->put_pins)
- fb_data->pdata->put_pins();
out_upd_buffers:
list_for_each_entry_safe(plist, temp_list, &fb_data->upd_buf_free_list->list, list) {
list_del(&plist->list);
@@ -2898,29 +2800,19 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev)
unregister_framebuffer(&fb_data->info);
free_irq(fb_data->epdc_irq, fb_data);
- dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size,
- fb_data->working_buffer_virt,
- fb_data->working_buffer_phys);
- if (fb_data->waveform_buffer_virt != NULL)
- dma_free_writecombine(&pdev->dev, fb_data->waveform_buffer_size,
- fb_data->waveform_buffer_virt,
- fb_data->waveform_buffer_phys);
+ dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size, fb_data->working_buffer_virt,
+ fb_data->working_buffer_phys);
+ dma_free_writecombine(&pdev->dev, fb_data->waveform_buffer_size, fb_data->waveform_buffer_virt,
+ fb_data->waveform_buffer_phys);
list_for_each_entry_safe(plist, temp_list, &fb_data->upd_buf_free_list->list, list) {
list_del(&plist->list);
dma_free_writecombine(&pdev->dev, plist->size, plist->virt_addr,
plist->phys_addr);
kfree(plist);
}
-#ifdef CONFIG_FB_MXC_EINK_AUTO_UPDATE_MODE
- fb_deferred_io_cleanup(&fb_data->info);
-#endif
-
dma_free_writecombine(&pdev->dev, fb_data->map_size, fb_data->info.screen_base,
fb_data->phys_start);
- if (fb_data->pdata->put_pins)
- fb_data->pdata->put_pins();
-
/* Release PxP-related resources */
if (fb_data->pxp_chan != NULL)
dma_release_channel(&fb_data->pxp_chan->dma_chan);
@@ -3011,6 +2903,8 @@ static int pxp_chan_init(struct mxc_epdc_fb_data *fb_data)
fb_data->pxp_chan = to_pxp_channel(chan);
+ dev_dbg(fb_data->dev, "dma_chan = 0x%x\n", fb_data->pxp_chan->dma_chan);
+
fb_data->pxp_chan->client = fb_data;
init_completion(&fb_data->pxp_tx_cmpl);
@@ -3024,8 +2918,7 @@ static int pxp_chan_init(struct mxc_epdc_fb_data *fb_data)
* Note: This is a blocking call, so upon return the PxP tx should be complete.
*/
static int pxp_process_update(struct mxc_epdc_fb_data *fb_data,
- struct mxcfb_rect *update_region,
- int x_start_offs)
+ struct mxcfb_rect *update_region)
{
dma_cookie_t cookie;
struct scatterlist *sg = fb_data->sg;
@@ -3035,7 +2928,6 @@ static int pxp_process_update(struct mxc_epdc_fb_data *fb_data,
struct pxp_config_data *pxp_conf = &fb_data->pxp_conf;
struct pxp_proc_data *proc_data = &fb_data->pxp_conf.proc_data;
int i, ret;
- int length;
dev_dbg(fb_data->dev, "Starting PxP Send Buffer\n");
@@ -3086,7 +2978,7 @@ static int pxp_process_update(struct mxc_epdc_fb_data *fb_data,
* probe() and should not need to be changed.
*/
proc_data->srect.top = update_region->top;
- proc_data->srect.left = update_region->left + x_start_offs;
+ proc_data->srect.left = update_region->left;
proc_data->srect.width = update_region->width;
proc_data->srect.height = update_region->height;
@@ -3108,7 +3000,7 @@ static int pxp_process_update(struct mxc_epdc_fb_data *fb_data,
pxp_conf->out_param.height = update_region->height;
desc = to_tx_desc(txd);
- length = desc->len;
+ int length = desc->len;
for (i = 0; i < length; i++) {
if (i == 0) {/* S0 */
memcpy(&desc->proc_data, proc_data, sizeof(struct pxp_proc_data));
diff --git a/drivers/video/mxc/mxc_ipuv3_fb.c b/drivers/video/mxc/mxc_ipuv3_fb.c
index cc48e62637ca..be907a956365 100644
--- a/drivers/video/mxc/mxc_ipuv3_fb.c
+++ b/drivers/video/mxc/mxc_ipuv3_fb.c
@@ -43,7 +43,6 @@
#include <linux/io.h>
#include <linux/ipu.h>
#include <linux/mxcfb.h>
-#include <linux/earlysuspend.h>
#include <asm/mach-types.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
@@ -101,10 +100,9 @@ enum {
BOTH_OFF
};
-#define FB_DEVICE_NUM 3
static bool g_dp_in_use;
LIST_HEAD(fb_alloc_list);
-static struct fb_info *mxcfb_info[FB_DEVICE_NUM];
+static struct fb_info *mxcfb_info[3];
static uint32_t bpp_to_pixfmt(struct fb_info *fbi)
{
@@ -172,11 +170,12 @@ static int _setup_disp_channel1(struct fb_info *fbi)
for (i = 0; i < num_registered_fb; i++) {
mxc_fbi_tmp = (struct mxcfb_info *)
- (registered_fb[i]->par);
+ (registered_fb[i]->par);
if (mxc_fbi_tmp->ipu_ch == MEM_BG_SYNC) {
- fbi->var.vmode = registered_fb[i]->var.vmode;
+ fbi->var.vmode =
+ registered_fb[i]->var.vmode;
mxc_fbi->ipu_di_pix_fmt =
- mxc_fbi_tmp->ipu_di_pix_fmt;
+ mxc_fbi_tmp->ipu_di_pix_fmt;
break;
}
}
@@ -233,7 +232,7 @@ static int _setup_disp_channel2(struct fb_info *fbi)
}
mxc_fbi->cur_ipu_buf = 1;
- sema_init(&mxc_fbi->flip_sem, 0);
+ sema_init(&mxc_fbi->flip_sem, 1);
if (mxc_fbi->alpha_chan_en) {
mxc_fbi->cur_ipu_alpha_buf = 1;
sema_init(&mxc_fbi->alpha_flip_sem, 1);
@@ -247,7 +246,8 @@ static int _setup_disp_channel2(struct fb_info *fbi)
IPU_ROTATE_NONE,
fbi->fix.smem_start +
(fbi->fix.line_length * fbi->var.yres),
- fbi->fix.smem_start, 0, 0);
+ fbi->fix.smem_start,
+ 0, 0);
if (retval) {
dev_err(fbi->device,
"ipu_init_channel_buffer error %d\n", retval);
@@ -317,36 +317,30 @@ static int mxcfb_set_par(struct fb_info *fbi)
mxc_fbi->alpha_phy_addr1);
mxc_fbi->alpha_virt_addr0 =
- dma_alloc_coherent(fbi->device,
- alpha_mem_len,
- &mxc_fbi->alpha_phy_addr0,
- GFP_DMA | GFP_KERNEL);
+ dma_alloc_coherent(fbi->device,
+ alpha_mem_len,
+ &mxc_fbi->alpha_phy_addr0,
+ GFP_DMA | GFP_KERNEL);
mxc_fbi->alpha_virt_addr1 =
- dma_alloc_coherent(fbi->device,
- alpha_mem_len,
- &mxc_fbi->alpha_phy_addr1,
- GFP_DMA | GFP_KERNEL);
+ dma_alloc_coherent(fbi->device,
+ alpha_mem_len,
+ &mxc_fbi->alpha_phy_addr1,
+ GFP_DMA | GFP_KERNEL);
if (mxc_fbi->alpha_virt_addr0 == NULL ||
mxc_fbi->alpha_virt_addr1 == NULL) {
dev_err(fbi->device, "mxcfb: dma alloc for"
" alpha buffer failed.\n");
if (mxc_fbi->alpha_virt_addr0)
dma_free_coherent(fbi->device,
- mxc_fbi->
- alpha_mem_len,
- mxc_fbi->
- alpha_virt_addr0,
- mxc_fbi->
- alpha_phy_addr0);
+ mxc_fbi->alpha_mem_len,
+ mxc_fbi->alpha_virt_addr0,
+ mxc_fbi->alpha_phy_addr0);
if (mxc_fbi->alpha_virt_addr1)
dma_free_coherent(fbi->device,
- mxc_fbi->
- alpha_mem_len,
- mxc_fbi->
- alpha_virt_addr1,
- mxc_fbi->
- alpha_phy_addr1);
+ mxc_fbi->alpha_mem_len,
+ mxc_fbi->alpha_virt_addr1,
+ mxc_fbi->alpha_phy_addr1);
return -ENOMEM;
}
mxc_fbi->alpha_mem_len = alpha_mem_len;
@@ -374,7 +368,7 @@ static int mxcfb_set_par(struct fb_info *fbi)
else
out_pixel_fmt = IPU_PIX_FMT_RGB666;
}
- if (fbi->var.vmode & FB_VMODE_ODD_FLD_FIRST) /* PAL */
+ if (fbi->var.vmode & FB_VMODE_ODD_FLD_FIRST) /* PAL */
sig_cfg.odd_field_first = true;
if ((fbi->var.sync & FB_SYNC_EXT) || mxc_fbi->ipu_ext_clk)
sig_cfg.ext_clk = true;
@@ -482,7 +476,8 @@ static int swap_channels(struct fb_info *fbi)
ch_to = MEM_BG_SYNC;
for (i = 0; i < num_registered_fb; i++) {
- mxc_fbi_to = (struct mxcfb_info *)mxcfb_info[i]->par;
+ mxc_fbi_to =
+ (struct mxcfb_info *)mxcfb_info[i]->par;
if (mxc_fbi_to->ipu_ch == ch_to) {
fbi_to = mxcfb_info[i];
break;
@@ -547,14 +542,14 @@ static int swap_channels(struct fb_info *fbi)
}
if (ipu_request_irq(mxc_fbi_from->ipu_ch_irq, mxcfb_irq_handler, 0,
- MXCFB_NAME, fbi) != 0) {
+ MXCFB_NAME, fbi) != 0) {
dev_err(fbi->device, "Error registering irq %d\n",
mxc_fbi_from->ipu_ch_irq);
return -EBUSY;
}
ipu_disable_irq(mxc_fbi_from->ipu_ch_irq);
if (ipu_request_irq(mxc_fbi_to->ipu_ch_irq, mxcfb_irq_handler, 0,
- MXCFB_NAME, fbi_to) != 0) {
+ MXCFB_NAME, fbi_to) != 0) {
dev_err(fbi_to->device, "Error registering irq %d\n",
mxc_fbi_to->ipu_ch_irq);
return -EBUSY;
@@ -577,35 +572,6 @@ static int mxcfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
u32 vtotal;
u32 htotal;
- /* fg should not bigger than bg */
- if (mxc_fbi->ipu_ch == MEM_FG_SYNC) {
- struct fb_info *fbi_tmp;
- struct mxcfb_info *mxc_fbi_tmp;
- int i, bg_xres, bg_yres;
- int16_t pos_x, pos_y;
-
- bg_xres = var->xres;
- bg_yres = var->yres;
-
- for (i = 0; i < num_registered_fb; i++) {
- fbi_tmp = registered_fb[i];
- mxc_fbi_tmp = (struct mxcfb_info *)
- (fbi_tmp->par);
- if (mxc_fbi_tmp->ipu_ch == MEM_BG_SYNC) {
- bg_xres = fbi_tmp->var.xres;
- bg_yres = fbi_tmp->var.yres;
- break;
- }
- }
-
- ipu_disp_get_window_pos(mxc_fbi->ipu_ch, &pos_x, &pos_y);
-
- if ((var->xres + pos_x) > bg_xres)
- var->xres = bg_xres - pos_x;
- if ((var->yres + pos_y) > bg_yres)
- var->yres = bg_yres - pos_y;
- }
-
if (var->xres_virtual < var->xres)
var->xres_virtual = var->xres;
if (var->yres_virtual < var->yres)
@@ -782,7 +748,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
}
if (ipu_disp_set_global_alpha(mxc_fbi->ipu_ch,
- (bool) ga.enable,
+ (bool)ga.enable,
ga.alpha)) {
retval = -EINVAL;
break;
@@ -809,7 +775,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
}
if (ipu_disp_set_global_alpha(mxc_fbi->ipu_ch,
- !(bool) la.enable, 0)) {
+ !(bool)la.enable, 0)) {
retval = -EINVAL;
break;
}
@@ -824,11 +790,8 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
for (i = 0; i < num_registered_fb; i++) {
char *idstr = registered_fb[i]->fix.id;
- if (strcmp(idstr, video_plane_idstr) ==
- 0) {
- ((struct mxcfb_info
- *)(registered_fb[i]->par))->
- alpha_chan_en = false;
+ if (strcmp(idstr, video_plane_idstr) == 0) {
+ ((struct mxcfb_info *)(registered_fb[i]->par))->alpha_chan_en = false;
break;
}
}
@@ -856,8 +819,8 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
uint32_t ipu_alp_ch_irq;
if (!(((mxc_fbi->ipu_ch == MEM_FG_SYNC) ||
- (mxc_fbi->ipu_ch == MEM_BG_SYNC)) &&
- (mxc_fbi->alpha_chan_en))) {
+ (mxc_fbi->ipu_ch == MEM_BG_SYNC)) &&
+ (mxc_fbi->alpha_chan_en))) {
dev_err(fbi->device,
"Should use background or overlay "
"framebuffer to set the alpha buffer "
@@ -884,10 +847,11 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
down(&mxc_fbi->alpha_flip_sem);
mxc_fbi->cur_ipu_alpha_buf =
- !mxc_fbi->cur_ipu_alpha_buf;
+ !mxc_fbi->cur_ipu_alpha_buf;
if (ipu_update_channel_buffer(mxc_fbi->ipu_ch,
IPU_ALPHA_IN_BUFFER,
- mxc_fbi->cur_ipu_alpha_buf,
+ mxc_fbi->
+ cur_ipu_alpha_buf,
base) == 0) {
ipu_select_buffer(mxc_fbi->ipu_ch,
IPU_ALPHA_IN_BUFFER,
@@ -925,9 +889,9 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
break;
}
retval = ipu_disp_set_gamma_correction(mxc_fbi->ipu_ch,
- gamma.enable,
- gamma.constk,
- gamma.slopek);
+ gamma.enable,
+ gamma.constk,
+ gamma.slopek);
break;
}
case MXCFB_WAIT_FOR_VSYNC:
@@ -937,8 +901,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
int i;
for (i = 0; i < num_registered_fb; i++) {
bg_mxcfbi =
- ((struct mxcfb_info
- *)(registered_fb[i]->par));
+ ((struct mxcfb_info *)(registered_fb[i]->par));
if (bg_mxcfbi->ipu_ch == MEM_BG_SYNC)
break;
@@ -958,10 +921,8 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
ipu_clear_irq(mxc_fbi->ipu_ch_irq);
mxc_fbi->wait4vsync = 1;
ipu_enable_irq(mxc_fbi->ipu_ch_irq);
- retval =
- wait_for_completion_interruptible_timeout(&mxc_fbi->
- vsync_complete,
- 1 * HZ);
+ retval = wait_for_completion_interruptible_timeout(
+ &mxc_fbi->vsync_complete, 1 * HZ);
if (retval == 0) {
dev_err(fbi->device,
"MXCFB_WAIT_FOR_VSYNC: timeout %d\n",
@@ -971,7 +932,6 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
} else if (retval > 0) {
retval = 0;
}
-
break;
}
case FBIO_ALLOC:
@@ -1052,8 +1012,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
for (i = 0; i < num_registered_fb; i++) {
bg_mxcfbi =
- ((struct mxcfb_info *)(registered_fb[i]->
- par));
+ ((struct mxcfb_info *)(registered_fb[i]->par));
if (bg_mxcfbi->ipu_ch == MEM_BG_SYNC) {
bg_fbi = registered_fb[i];
@@ -1072,15 +1031,13 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
if (bg_fbi->var.xres < fbi->var.xres)
pos.x = 0;
else
- pos.x =
- bg_fbi->var.xres - fbi->var.xres;
+ pos.x = bg_fbi->var.xres - fbi->var.xres;
}
if (fbi->var.yres + pos.y > bg_fbi->var.yres) {
if (bg_fbi->var.yres < fbi->var.yres)
pos.y = 0;
else
- pos.y =
- bg_fbi->var.yres - fbi->var.yres;
+ pos.y = bg_fbi->var.yres - fbi->var.yres;
}
retval = ipu_disp_set_window_pos(mxc_fbi->ipu_ch,
@@ -1095,7 +1052,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
case MXCFB_GET_FB_IPU_CHAN:
{
struct mxcfb_info *mxc_fbi =
- (struct mxcfb_info *)fbi->par;
+ (struct mxcfb_info *)fbi->par;
if (put_user(mxc_fbi->ipu_ch, argp))
return -EFAULT;
@@ -1104,7 +1061,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
case MXCFB_GET_DIFMT:
{
struct mxcfb_info *mxc_fbi =
- (struct mxcfb_info *)fbi->par;
+ (struct mxcfb_info *)fbi->par;
if (put_user(mxc_fbi->ipu_di_pix_fmt, argp))
return -EFAULT;
@@ -1113,18 +1070,9 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
case MXCFB_GET_FB_IPU_DI:
{
struct mxcfb_info *mxc_fbi =
- (struct mxcfb_info *)fbi->par;
-
- if (put_user(mxc_fbi->ipu_di, argp))
- return -EFAULT;
- break;
- }
- case MXCFB_GET_FB_BLANK:
- {
- struct mxcfb_info *mxc_fbi =
(struct mxcfb_info *)fbi->par;
- if (put_user(mxc_fbi->cur_blank, argp))
+ if (put_user(mxc_fbi->ipu_di, argp))
return -EFAULT;
break;
}
@@ -1177,7 +1125,7 @@ static int
mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
{
struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)info->par,
- *mxc_graphic_fbi = NULL;
+ *mxc_graphic_fbi = NULL;
u_int y_bottom;
unsigned long base, active_alpha_phy_addr = 0;
bool loc_alpha_en = false;
@@ -1198,7 +1146,7 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
int j;
for (j = 0; j < num_registered_fb; j++) {
bg_mxcfbi =
- ((struct mxcfb_info *)(registered_fb[j]->par));
+ ((struct mxcfb_info *)(registered_fb[j]->par));
if (bg_mxcfbi->ipu_ch == MEM_BG_SYNC)
break;
@@ -1228,13 +1176,13 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
if ((strcmp(idstr, "DISP3 BG") == 0 ||
strcmp(idstr, "DISP3 FG") == 0) &&
((struct mxcfb_info *)
- (registered_fb[i]->par))->alpha_chan_en) {
+ (registered_fb[i]->par))->alpha_chan_en) {
loc_alpha_en = true;
mxc_graphic_fbi = (struct mxcfb_info *)
- (registered_fb[i]->par);
+ (registered_fb[i]->par);
active_alpha_phy_addr = mxc_fbi->cur_ipu_buf ?
- mxc_graphic_fbi->alpha_phy_addr1 :
- mxc_graphic_fbi->alpha_phy_addr0;
+ mxc_graphic_fbi->alpha_phy_addr1 :
+ mxc_graphic_fbi->alpha_phy_addr0;
dev_dbg(info->device, "Updating SDC graphic "
"buf %d address=0x%08lX\n",
mxc_fbi->cur_ipu_buf,
@@ -1244,7 +1192,7 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
}
}
- init_completion(&mxc_fbi->vsync_complete);
+ down(&mxc_fbi->flip_sem);
mxc_fbi->cur_ipu_buf = !mxc_fbi->cur_ipu_buf;
@@ -1278,7 +1226,6 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
return -EBUSY;
}
- down(&mxc_fbi->flip_sem);
dev_dbg(info->device, "Update complete\n");
info->var.xoffset = var->xoffset;
@@ -1312,9 +1259,9 @@ static int mxcfb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
len = fbi->fix.smem_len - offset;
vma->vm_pgoff = (fbi->fix.smem_start + offset) >> PAGE_SHIFT;
} else if ((vma->vm_pgoff ==
- (mxc_fbi->alpha_phy_addr0 >> PAGE_SHIFT)) ||
+ (mxc_fbi->alpha_phy_addr0 >> PAGE_SHIFT)) ||
(vma->vm_pgoff ==
- (mxc_fbi->alpha_phy_addr1 >> PAGE_SHIFT))) {
+ (mxc_fbi->alpha_phy_addr1 >> PAGE_SHIFT))) {
len = mxc_fbi->alpha_mem_len;
} else {
list_for_each_entry(mem, &fb_alloc_list, list) {
@@ -1375,8 +1322,23 @@ static irqreturn_t mxcfb_irq_handler(int irq, void *dev_id)
ipu_disable_irq(irq);
mxc_fbi->wait4vsync = 0;
} else {
- up(&mxc_fbi->flip_sem);
- ipu_disable_irq(irq);
+ if (!ipu_check_buffer_busy(mxc_fbi->ipu_ch,
+ IPU_INPUT_BUFFER, mxc_fbi->cur_ipu_buf)
+ || (mxc_fbi->waitcnt > 2)) {
+ /*
+ * This interrupt come after pan display select
+ * cur_ipu_buf buffer, this buffer should become
+ * idle after show. If it keep busy, clear it manually.
+ */
+ if (mxc_fbi->waitcnt > 2)
+ ipu_clear_buffer_ready(mxc_fbi->ipu_ch,
+ IPU_INPUT_BUFFER,
+ mxc_fbi->cur_ipu_buf);
+ up(&mxc_fbi->flip_sem);
+ ipu_disable_irq(irq);
+ mxc_fbi->waitcnt = 0;
+ } else
+ mxc_fbi->waitcnt++;
}
return IRQ_HANDLED;
}
@@ -1394,10 +1356,14 @@ static irqreturn_t mxcfb_alpha_irq_handler(int irq, void *dev_id)
/*
* Suspends the framebuffer and blanks the screen. Power management support
*/
-static void mxcfb_suspend_one(struct fb_info *fbi)
+static int mxcfb_suspend(struct platform_device *pdev, pm_message_t state)
{
+ struct fb_info *fbi = platform_get_drvdata(pdev);
struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par;
int saved_blank;
+#ifdef CONFIG_FB_MXC_LOW_PWR_DISPLAY
+ void *fbmem;
+#endif
acquire_console_sem();
fb_set_suspend(fbi, 1);
@@ -1405,44 +1371,26 @@ static void mxcfb_suspend_one(struct fb_info *fbi)
mxcfb_blank(FB_BLANK_POWERDOWN, fbi);
mxc_fbi->next_blank = saved_blank;
release_console_sem();
+
+ return 0;
}
/*
* Resumes the framebuffer and unblanks the screen. Power management support
*/
-static void mxcfb_resume_one(struct fb_info *fbi)
+static int mxcfb_resume(struct platform_device *pdev)
{
+ struct fb_info *fbi = platform_get_drvdata(pdev);
struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par;
acquire_console_sem();
mxcfb_blank(mxc_fbi->next_blank, fbi);
fb_set_suspend(fbi, 0);
release_console_sem();
-}
-
-#ifndef CONFIG_HAS_EARLYSUSPEND
-
-static int mxcfb_suspend(struct platform_device *pdev, pm_message_t state)
-{
- struct fb_info *fbi = platform_get_drvdata(pdev);
-
- if (fbi && (strcmp(fbi->fix.id, "DISP3 FG") == 0))
- mxcfb_suspend_one(fbi);
return 0;
}
-static int mxcfb_resume(struct platform_device *pdev)
-{
- struct fb_info *fbi = platform_get_drvdata(pdev);
-
- if (fbi && (strcmp(fbi->fix.id, "DISP3 FG") == 0))
- mxcfb_resume_one(fbi);
-
- return 0;
-}
-#endif
-
/*
* Main framebuffer functions
*/
@@ -1461,12 +1409,12 @@ static int mxcfb_map_video_memory(struct fb_info *fbi)
{
if (fbi->fix.smem_len < fbi->var.yres_virtual * fbi->fix.line_length)
fbi->fix.smem_len = fbi->var.yres_virtual *
- fbi->fix.line_length;
+ fbi->fix.line_length;
fbi->screen_base = dma_alloc_writecombine(fbi->device,
- fbi->fix.smem_len,
- (dma_addr_t *) & fbi->fix.
- smem_start, GFP_DMA);
+ fbi->fix.smem_len,
+ (dma_addr_t *)&fbi->fix.smem_start,
+ GFP_DMA);
if (fbi->screen_base == 0) {
dev_err(fbi->device, "Unable to allocate framebuffer memory\n");
fbi->fix.smem_len = 0;
@@ -1572,13 +1520,15 @@ static ssize_t swap_disp_chan(struct device *dev,
int i;
for (i = 0; i < num_registered_fb; i++) {
- fg_mxcfbi = (struct mxcfb_info *)mxcfb_info[i]->par;
+ fg_mxcfbi =
+ (struct mxcfb_info *)mxcfb_info[i]->par;
if (fg_mxcfbi->ipu_ch == MEM_FG_SYNC)
break;
else
fg_mxcfbi = NULL;
}
- if (!fg_mxcfbi || fg_mxcfbi->cur_blank == FB_BLANK_UNBLANK) {
+ if (!fg_mxcfbi ||
+ fg_mxcfbi->cur_blank == FB_BLANK_UNBLANK) {
dev_err(dev,
"Can not switch while fb2(fb-fg) is on.\n");
release_console_sem();
@@ -1592,7 +1542,6 @@ static ssize_t swap_disp_chan(struct device *dev,
release_console_sem();
return count;
}
-
DEVICE_ATTR(fsl_disp_property, 644, show_disp_chan, swap_disp_chan);
/*!
@@ -1652,7 +1601,7 @@ static int mxcfb_probe(struct platform_device *pdev)
mxcfb_alpha_irq_handler, 0,
MXCFB_NAME, fbi) != 0) {
dev_err(&pdev->dev, "Error registering BG "
- "alpha irq handler.\n");
+ "alpha irq handler.\n");
ret = -EBUSY;
goto err1;
}
@@ -1665,7 +1614,7 @@ static int mxcfb_probe(struct platform_device *pdev)
mxcfb_alpha_irq_handler, 0,
MXCFB_NAME, fbi) != 0) {
dev_err(&pdev->dev, "Error registering BG "
- "alpha irq handler.\n");
+ "alpha irq handler.\n");
ret = -EBUSY;
goto err1;
}
@@ -1683,7 +1632,7 @@ static int mxcfb_probe(struct platform_device *pdev)
mxcfb_alpha_irq_handler, 0,
MXCFB_NAME, fbi) != 0) {
dev_err(&pdev->dev, "Error registering FG alpha irq "
- "handler.\n");
+ "handler.\n");
ret = -EBUSY;
goto err1;
}
@@ -1703,8 +1652,7 @@ static int mxcfb_probe(struct platform_device *pdev)
if (res && res->end) {
fbi->fix.smem_len = res->end - res->start + 1;
fbi->fix.smem_start = res->start;
- fbi->screen_base =
- ioremap(fbi->fix.smem_start, fbi->fix.smem_len);
+ fbi->screen_base = ioremap(fbi->fix.smem_start, fbi->fix.smem_len);
}
/* Need dummy values until real panel is configured */
@@ -1729,21 +1677,15 @@ static int mxcfb_probe(struct platform_device *pdev)
mxcfbi->fb_mode_str = plat_data->mode_str;
if (mxcfbi->fb_mode_str) {
-
#ifdef CONFIG_MODULE_CCXMX51
if ((mstr = strstr(mxcfbi->fb_mode_str, "VGA@")) != NULL)
mxcfbi->fb_mode_str = mstr + 4;
#endif
-
- ret =
- fb_find_mode(&fbi->var, fbi, mxcfbi->fb_mode_str, NULL, 0,
- NULL, mxcfbi->default_bpp);
- if ((!ret || (ret > 2)) && plat_data && plat_data->mode
- && plat_data->num_modes)
- fb_find_mode(&fbi->var, fbi, mxcfbi->fb_mode_str,
- plat_data->mode, plat_data->num_modes,
- NULL, mxcfbi->default_bpp);
-
+ ret = fb_find_mode(&fbi->var, fbi, mxcfbi->fb_mode_str, NULL, 0, NULL,
+ mxcfbi->default_bpp);
+ if ((!ret || (ret > 2)) && plat_data && plat_data->mode && plat_data->num_modes)
+ fb_find_mode(&fbi->var, fbi, mxcfbi->fb_mode_str, plat_data->mode,
+ plat_data->num_modes, NULL, mxcfbi->default_bpp);
#ifdef CONFIG_MODULE_CCXMX51
/* This improves the VGA modes on the CCWi-i.MX51 */
if (mstr != NULL) {
@@ -1758,8 +1700,7 @@ static int mxcfb_probe(struct platform_device *pdev)
pm_set_vt_switch(vt_switch);
/* Default Y virtual size is 2x panel size */
- fbi->var.yres_virtual = ((fbi->var.yres + 127) & ~127) * 2;
- fbi->var.xres_virtual = (fbi->var.xres + 31) & ~31;
+ fbi->var.yres_virtual = fbi->var.yres * 3;
mxcfb_set_fix(fbi);
@@ -1780,12 +1721,12 @@ static int mxcfb_probe(struct platform_device *pdev)
return 0;
- err2:
+err2:
ipu_free_irq(mxcfbi->ipu_ch_irq, fbi);
- err1:
+err1:
fb_dealloc_cmap(&fbi->cmap);
framebuffer_release(fbi);
- err0:
+err0:
return ret;
}
@@ -1818,10 +1759,8 @@ static struct platform_driver mxcfb_driver = {
},
.probe = mxcfb_probe,
.remove = mxcfb_remove,
-#ifndef CONFIG_HAS_EARLYSUSPEND
.suspend = mxcfb_suspend,
.resume = mxcfb_resume,
-#endif
};
/*
@@ -1886,7 +1825,8 @@ static int mxcfb_option_setup(struct fb_info *info, char *options)
continue;
}
if (!strncmp(opt, "bpp=", 4))
- mxcfbi->default_bpp = simple_strtoul(opt + 4, NULL, 0);
+ mxcfbi->default_bpp =
+ simple_strtoul(opt + 4, NULL, 0);
else
mxcfbi->fb_mode_str = opt;
}
@@ -1894,32 +1834,6 @@ static int mxcfb_option_setup(struct fb_info *info, char *options)
return 0;
}
-#ifdef CONFIG_HAS_EARLYSUSPEND
-static void mxcfb_early_suspend(struct early_suspend *h)
-{
- int i;
- for (i = FB_DEVICE_NUM - 1; i >= 0; i--) {
- if (mxcfb_info[i])
- mxcfb_suspend_one(mxcfb_info[i]);
- }
-}
-
-static void mxcfb_later_resume(struct early_suspend *h)
-{
- int i;
- for (i = 0; i < FB_DEVICE_NUM; i++) {
- if (mxcfb_info[i])
- mxcfb_resume_one(mxcfb_info[i]);
- }
-}
-
-struct early_suspend fbdrv_earlysuspend = {
- .level = EARLY_SUSPEND_LEVEL_DISABLE_FB,
- .suspend = mxcfb_early_suspend,
- .resume = mxcfb_later_resume,
-};
-#endif
-
/*!
* Main entry function for the framebuffer. The function registers the power
* management callback functions with the kernel and also registers the MXCFB
@@ -1929,17 +1843,11 @@ struct early_suspend fbdrv_earlysuspend = {
*/
int __init mxcfb_init(void)
{
- int ret;
-
- ret = platform_driver_register(&mxcfb_driver);
- if (!ret)
- register_early_suspend(&fbdrv_earlysuspend);
- return ret;
+ return platform_driver_register(&mxcfb_driver);
}
void mxcfb_exit(void)
{
- unregister_early_suspend(&fbdrv_earlysuspend);
platform_driver_unregister(&mxcfb_driver);
}
diff --git a/drivers/video/mxc/tve.c b/drivers/video/mxc/tve.c
index 793b470cdce4..b1982f868e8c 100644
--- a/drivers/video/mxc/tve.c
+++ b/drivers/video/mxc/tve.c
@@ -513,9 +513,12 @@ static irqreturn_t tve_detect_handler(int irq, void *data)
/* Re-construct clk for tve display */
static inline void tve_recfg_fb(struct fb_info *fbi)
{
+ struct fb_var_screeninfo var;
+
+ memset(&var, 0, sizeof(var));
+ fb_videomode_to_var(&var, fbi->mode);
fbi->flags &= ~FBINFO_MISC_USEREVENT;
- fbi->var.activate |= FB_ACTIVATE_FORCE;
- fb_set_var(fbi, &fbi->var);
+ fb_set_var(fbi, &var);
}
int tve_fb_event(struct notifier_block *nb, unsigned long val, void *v)
diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c
index 5a72083dc67c..adf9632c6b1f 100644
--- a/drivers/video/s3c-fb.c
+++ b/drivers/video/s3c-fb.c
@@ -1036,7 +1036,7 @@ static int s3c_fb_resume(struct platform_device *pdev)
static struct platform_driver s3c_fb_driver = {
.probe = s3c_fb_probe,
- .remove = s3c_fb_remove,
+ .remove = __devexit_p(s3c_fb_remove),
.suspend = s3c_fb_suspend,
.resume = s3c_fb_resume,
.driver = {
diff --git a/drivers/video/sis/vstruct.h b/drivers/video/sis/vstruct.h
index 705c85360526..bef4aae388d0 100644
--- a/drivers/video/sis/vstruct.h
+++ b/drivers/video/sis/vstruct.h
@@ -342,7 +342,7 @@ struct SiS_Private
unsigned short SiS_RY4COE;
unsigned short SiS_LCDHDES;
unsigned short SiS_LCDVDES;
- unsigned short SiS_DDC_Port;
+ SISIOADDRESS SiS_DDC_Port;
unsigned short SiS_DDC_Index;
unsigned short SiS_DDC_Data;
unsigned short SiS_DDC_NData;
diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c
index ca5b4643a401..e35232a18571 100644
--- a/drivers/video/uvesafb.c
+++ b/drivers/video/uvesafb.c
@@ -67,12 +67,14 @@ static DEFINE_MUTEX(uvfb_lock);
* find the kernel part of the task struct, copy the registers and
* the buffer contents and then complete the task.
*/
-static void uvesafb_cn_callback(void *data)
+static void uvesafb_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
{
- struct cn_msg *msg = data;
struct uvesafb_task *utask;
struct uvesafb_ktask *task;
+ if (!cap_raised(nsp->eff_cap, CAP_SYS_ADMIN))
+ return;
+
if (msg->seq >= UVESAFB_TASKS_MAX)
return;
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index a882f2606515..0ffff9ed4eb0 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -281,6 +281,9 @@ static void *vring_get_buf(struct virtqueue *_vq, unsigned int *len)
return NULL;
}
+ /* Only get used array entries after they have been exposed by host. */
+ rmb();
+
i = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].id;
*len = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].len;
diff --git a/drivers/w1/w1_netlink.c b/drivers/w1/w1_netlink.c
index fdf72851c574..45c126fea31d 100644
--- a/drivers/w1/w1_netlink.c
+++ b/drivers/w1/w1_netlink.c
@@ -306,9 +306,8 @@ static int w1_netlink_send_error(struct cn_msg *rcmsg, struct w1_netlink_msg *rm
return error;
}
-static void w1_cn_callback(void *data)
+static void w1_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
{
- struct cn_msg *msg = data;
struct w1_netlink_msg *m = (struct w1_netlink_msg *)(msg + 1);
struct w1_netlink_cmd *cmd;
struct w1_slave *sl;
diff --git a/drivers/watchdog/riowd.c b/drivers/watchdog/riowd.c
index 1e8f02f440e6..d3c824dc2358 100644
--- a/drivers/watchdog/riowd.c
+++ b/drivers/watchdog/riowd.c
@@ -206,7 +206,7 @@ static int __devinit riowd_probe(struct of_device *op,
dev_set_drvdata(&op->dev, p);
riowd_device = p;
- err = 0;
+ return 0;
out_iounmap:
of_iounmap(&op->resource[0], p->regs, 2);
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
index ec2a39b1e26f..7c284342f30f 100644
--- a/drivers/xen/Makefile
+++ b/drivers/xen/Makefile
@@ -1,6 +1,9 @@
obj-y += grant-table.o features.o events.o manage.o
obj-y += xenbus/
+nostackp := $(call cc-option, -fno-stack-protector)
+CFLAGS_features.o := $(nostackp)
+
obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
obj-$(CONFIG_XEN_XENCOMM) += xencomm.o
obj-$(CONFIG_XEN_BALLOON) += balloon.o
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index f5bbd9e83416..1b7123eb5d7b 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -96,11 +96,7 @@ static struct balloon_stats balloon_stats;
/* We increase/decrease in batches which fit in a page */
static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)];
-/* VM /proc information for memory */
-extern unsigned long totalram_pages;
-
#ifdef CONFIG_HIGHMEM
-extern unsigned long totalhigh_pages;
#define inc_totalhigh_pages() (totalhigh_pages++)
#define dec_totalhigh_pages() (totalhigh_pages--)
#else
diff --git a/firmware/Makefile b/firmware/Makefile
index 19d80a6cc763..6cf11103de41 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -110,8 +110,7 @@ fw-shipped-$(CONFIG_USB_SERIAL_XIRCOM) += keyspan_pda/xircom_pgs.fw
fw-shipped-$(CONFIG_USB_VICAM) += vicam/firmware.fw
fw-shipped-$(CONFIG_VIDEO_CPIA2) += cpia2/stv0672_vp4.bin
fw-shipped-$(CONFIG_YAM) += yam/1200.bin yam/9600.bin
-fw-shipped-$(CONFIG_FB_MXC_EINK_PANEL) += imx/epdc_E60.fw \
- imx/epdc_E97.fw
+fw-shipped-$(CONFIG_FB_MXC_EINK_PANEL) += imx/epdc.fw
fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-)
diff --git a/firmware/imx/epdc.fw.ihex b/firmware/imx/epdc.fw.ihex
new file mode 100644
index 000000000000..eca54786f1c4
--- /dev/null
+++ b/firmware/imx/epdc.fw.ihex
@@ -0,0 +1,45914 @@
+:10000000C7FFA986DE9C0000E30100000003250075
+:100010000127020E3C03000000000000400000C366
+:100020004700000100030D00FFFC0000000000532A
+:10003000000306090C0F1215181B1E21262B302059
+:10004000000000000000000017050000000000E0B4
+:1000500011060000000000C03509000000000090FB
+:10006000000000000000009895000000000000A0C3
+:1000700016010000000000A885010000000000B08B
+:10008000F2010000000000B85D020000000000C0A6
+:10009000C0020000000000C81B030000000000D0E8
+:1000A00074030000000000D8C9030000000000E055
+:1000B0001E040000000000E863040000000000F0DF
+:1000C0009E040000000000F8D70400000000009526
+:1000D0000000000000000001010101010101010117
+:1000E0000101010101010101010101010101010100
+:1000F00001010101010101010101010101010101F0
+:1001000001010101010101010101010101010101DF
+:1001100001010101010101010101010101010101CF
+:1001200001010101010101010101010101010101BF
+:1001300001010101010101010101010101010101AF
+:10014000010101010101010101010101010101019F
+:10015000010101010101010101010101010101018F
+:10016000010101010101010101010101010101017F
+:10017000010101010101010101010101010101016F
+:10018000010101010101010101010101010101015F
+:10019000010101010101010101010101010101014F
+:1001A000010101010101010101010101010101013F
+:1001B000010101010101010101010101010101012F
+:1001C000010101010101010101010101010101011F
+:1001D000010101010101010101010101010101010F
+:1001E00001010101010101010101010101010101FF
+:1001F00001010101010101010101010101010101EF
+:1002000001010101010101010101010101010101DE
+:1002100001010101010101010101010101010101CE
+:1002200001010101010101010101010101010101BE
+:1002300001010101010101010101010101010101AE
+:10024000010101010101010101010101010101019E
+:10025000010101010101010101010101010101018E
+:10026000010101010101010101010101010101017E
+:10027000010101010101010101010101010101016E
+:10028000010101010101010101010101010101015E
+:10029000010101010101010101010101010101014E
+:1002A000010101010101010101010101010101013E
+:1002B000010101010101010101010101010101012E
+:1002C000010101010101010101010101010101011E
+:1002D000010101010101010101010101010101010E
+:1002E00001010101010101010101010101010101FE
+:1002F00001010101010101010101010101010101EE
+:1003000001010101010101010101010101010101DD
+:1003100001010101010101010101010101010101CD
+:1003200001010101010101010101010101010101BD
+:1003300001010101010101010101010101010101AD
+:10034000010101010101010101010101010101019D
+:10035000010101010101010101010101010101018D
+:10036000010101010101010101010101010101017D
+:10037000010101010101010101010101010101016D
+:10038000010101010101010101010101010101015D
+:10039000010101010101010101010101010101014D
+:1003A000010101010101010101010101010101013D
+:1003B000010101010101010101010101010101012D
+:1003C000010101010101010101010101010101011D
+:1003D000010101010101010101010101010101010D
+:1003E00001010101010101010101010101010101FD
+:1003F00001010101010101010101010101010101ED
+:1004000001010101010101010101010101010101DC
+:1004100001010101010101010101010101010101CC
+:1004200001010101010101010101010101010101BC
+:1004300001010101010101010101010101010101AC
+:10044000010101010101010101010101010101019C
+:10045000010101010101010101010101010101018C
+:10046000010101010101010101010101010101017C
+:10047000010101010101010101010101010101016C
+:10048000010101010101010101010101010101015C
+:10049000010101010101010101010101010101014C
+:1004A000010101010101010101010101010101013C
+:1004B000010101010101010101010101010101012C
+:1004C000010101010101010101010101010101011C
+:1004D000010101010101010101010101010101010C
+:1004E00001010101010101010101010101010101FC
+:1004F00001010101010101010101010101010101EC
+:1005000001010101010101010101010101010101DB
+:1005100001010101010101010101010101010101CB
+:1005200001010101010101010101010101010101BB
+:1005300001010101010101010101010101010101AB
+:10054000010101010101010101010101010101019B
+:10055000010101010101010101010101010101018B
+:10056000010101010101010101010101010101017B
+:10057000010101010101010101010101010101016B
+:10058000010101010101010101010101010101015B
+:10059000010101010101010101010101010101014B
+:1005A000010101010101010101010101010101013B
+:1005B000010101010101010101010101010101012B
+:1005C000010101010101010101010101010101011B
+:1005D000010101010101010101010101010101010B
+:1005E00001010101010101010101010101010101FB
+:1005F00001010101010101010101010101010101EB
+:1006000001010101010101010101010101010101DA
+:1006100001010101010101010101010101010101CA
+:1006200001010101010101010101010101010101BA
+:1006300001010101010101010101010101010101AA
+:10064000010101010101010101010101010101019A
+:10065000010101010101010101010101010101018A
+:10066000010101010101010101010101010101017A
+:10067000010101010101010101010101010101016A
+:10068000010101010101010101010101010101015A
+:10069000010101010101010101010101010101014A
+:1006A000010101010101010101010101010101013A
+:1006B000010101010101010101010101010101012A
+:1006C000010101010101010101010101010101011A
+:1006D000010101010101010101010101010101010A
+:1006E00001010101010101010101010101010101FA
+:1006F00001010101010101010101010101010101EA
+:1007000001010101010101010101010101010101D9
+:1007100001010101010101010101010101010101C9
+:1007200001010101010101010101010101010101B9
+:1007300001010101010101010101010101010101A9
+:100740000101010101010101010101010101010199
+:100750000101010101010101010101010101010189
+:100760000101010101010101010101010101010179
+:100770000101010101010101010101010101010169
+:100780000101010101010101010101010101010159
+:100790000101010101010101010101010101010149
+:1007A0000101010101010101010101010101010139
+:1007B0000101010101010101010101010101010129
+:1007C0000101010101010101010101010101010119
+:1007D0000101010101010101010101010101010109
+:1007E00001010101010101010101010101010101F9
+:1007F00001010101010101010101010101010101E9
+:1008000001010101010101010101010101010101D8
+:1008100001010101010101010101010101010101C8
+:1008200001010101010101010101010101010101B8
+:1008300001010101010101010101010101010101A8
+:100840000101010101010101010101010101010198
+:100850000101010101010101010101010101010188
+:100860000101010101010101010101010101010178
+:100870000101010101010101010101010101010168
+:100880000101010101010101010101010101010158
+:100890000101010101010101010101010101010148
+:1008A0000101010101010101010101010101010138
+:1008B0000101010101010101010101010101010128
+:1008C0000101010101010101010101010101010118
+:1008D0000101010101010101010101010101010108
+:1008E00001010101010101010101010101010101F8
+:1008F00001010101010101010101010101010101E8
+:1009000001010101010101010101010101010101D7
+:1009100001010101010101010101010101010101C7
+:1009200001010101010101010101010101010101B7
+:1009300001010101010101010101010101010101A7
+:100940000101010101010101010101010101010197
+:100950000101010101010101010101010101010187
+:100960000101010101010101010101010101010177
+:100970000101010101010101010101010101010167
+:100980000101010101010101010101010101010157
+:100990000101010101010101010101010101010147
+:1009A0000101010101010101010101010101010137
+:1009B0000101010101010101010101010101010127
+:1009C0000101010101010101010101010101010117
+:1009D0000101010101010101010101010101010107
+:1009E00001010101010101010101010101010101F7
+:1009F00001010101010101010101010101010101E7
+:100A000001010101010101010101010101010101D6
+:100A100001010101010101010101010101010101C6
+:100A200001010101010101010101010101010101B6
+:100A300001010101010101010101010101010101A6
+:100A40000101010101010101010101010101010196
+:100A50000101010101010101010101010101010186
+:100A60000101010101010101010101010101010176
+:100A70000101010101010101010101010101010166
+:100A80000101010101010101010101010101010156
+:100A90000101010101010101010101010101010146
+:100AA0000101010101010101010101010101010136
+:100AB0000101010101010101010101010101010126
+:100AC0000101010101010101010101010101010116
+:100AD0000101010101010101010101010101010106
+:100AE00001010101010101010101010101010101F6
+:100AF00001010101010101010101010101010101E6
+:100B000001010101010101010101010101010101D5
+:100B100001010101010101010101010101010101C5
+:100B200001010101010101010101010101010101B5
+:100B300001010101010101010101010101010101A5
+:100B40000101010101010101010101010101010195
+:100B50000101010101010101010101010101010185
+:100B60000101010101010101010101010101010175
+:100B70000101010101010101010101010101010165
+:100B80000101010101010101010101010101010155
+:100B90000101010101010101010101010101010145
+:100BA0000101010101010101010101010101010135
+:100BB0000101010101010101010101010101010125
+:100BC0000101010101010101010101010101010115
+:100BD0000101010101010101010101010101010105
+:100BE00001010101010101010101010101010101F5
+:100BF00001010101010101010101010101010101E5
+:100C000001010101010101010101010101010101D4
+:100C100001010101010101010101010101010101C4
+:100C200001010101010101010101010101010101B4
+:100C300001010101010101010101010101010101A4
+:100C40000101010101010101010101010101010194
+:100C50000101010101010101010101010101010184
+:100C60000101010101010101010101010101010174
+:100C70000101010101010101010101010101010164
+:100C80000101010101010101010101010101010154
+:100C90000101010101010101010101010101010144
+:100CA0000101010101010101010101010101010134
+:100CB0000101010101010101010101010101010124
+:100CC0000101010101010101010101010101010114
+:100CD0000101010101010101010101010101010104
+:100CE00001010101010101010101010101010101F4
+:100CF00001010101010101010101010101010101E4
+:100D000001010101010101010101010101010101D3
+:100D100001010101010101010101010101010101C3
+:100D200001010101010101010101010101010101B3
+:100D300001010101010101010101010101010101A3
+:100D40000101010101010101010101010101010193
+:100D50000101010101010101010101010101010183
+:100D60000101010101010101010101010101010173
+:100D70000101010101010101010101010101010163
+:100D80000101010101010101010101010101010153
+:100D90000101010101010101010101010101010143
+:100DA0000101010101010101010101010101010133
+:100DB0000101010101010101010101010101010123
+:100DC0000101010101010101010101010101010113
+:100DD0000101010101010101010101010101010103
+:100DE00001010101010101010101010101010101F3
+:100DF00001010101010101010101010101010101E3
+:100E000001010101010101010101010101010101D2
+:100E100001010101010101010101010101010101C2
+:100E200001010101010101010101010101010101B2
+:100E300001010101010101010101010101010101A2
+:100E40000101010101010101010101010101010192
+:100E50000101010101010101010101010101010182
+:100E60000101010101010101010101010101010172
+:100E70000101010101010101010101010101010162
+:100E80000101010101010101010101010101010152
+:100E90000101010101010101010101010101010142
+:100EA0000101010101010101010101010101010132
+:100EB0000101010101010101010101010101010122
+:100EC0000101010101010101010101010101010112
+:100ED0000101010101010101010101010101010102
+:100EE00001010101010101010101010101010101F2
+:100EF00001010101010101010101010101010101E2
+:100F000001010101010101010101010101010101D1
+:100F100001010101010101010101010101010101C1
+:100F200001010101010101010101010101010101B1
+:100F300001010101010101010101010101010101A1
+:100F40000101010101010101010101010101010191
+:100F50000101010101010101010101010101010181
+:100F60000101010101010101010101010101010171
+:100F70000101010101010101010101010101010161
+:100F80000101010101010101010101010101010151
+:100F90000101010101010101010101010101010141
+:100FA0000101010101010101010101010101010131
+:100FB0000101010101010101010101010101010121
+:100FC0000101010101010101010101010101010111
+:100FD0000101010101010101010101010101010101
+:100FE00001010101010101010101010101010101F1
+:100FF00001010101010101010101010101010101E1
+:1010000001010101010101010101010101010101D0
+:1010100001010101010101010101010101010101C0
+:1010200001010101010101010101010101010101B0
+:1010300001010101010101010101010101010101A0
+:101040000101010101010101010101010101010190
+:101050000101010101010101010101010101010180
+:101060000101010101010101010101010101010170
+:101070000101010101010101010101010101010160
+:101080000101010101010101010101010101010150
+:101090000101010101010101010101010101010140
+:1010A0000101010101010101010101010101010130
+:1010B0000101010101010101010101010101010120
+:1010C0000101010101010101010101010101010110
+:1010D0000101010101010101010101010101010100
+:1010E00001010101010101010101010101010101F0
+:1010F00001010101010101010101010101010101E0
+:1011000001010101010101010101010101010101CF
+:1011100001010101010101010101010101010101BF
+:1011200001010101010101010101010101010101AF
+:10113000010101010101010101010101010101019F
+:10114000010101010101010101010101010101018F
+:10115000010101010101010101010101010101017F
+:10116000010101010101010101010101010101016F
+:10117000010101010101010101010101010101015F
+:10118000010101010101010101010101010101014F
+:10119000010101010101010101010101010101013F
+:1011A000010101010101010101010101010101012F
+:1011B000010101010101010101010101010101011F
+:1011C000010101010101010101010101010101010F
+:1011D00001010101010101010101010101010101FF
+:1011E00001010101010101010101010101010101EF
+:1011F00001010101010101010101010101010101DF
+:1012000001010101010101010101010101010101CE
+:1012100001010101010101010101010101010101BE
+:1012200001010101010101010101010101010101AE
+:10123000010101010101010101010101010101019E
+:10124000010101010101010101010101010101018E
+:10125000010101010101010101010101010101017E
+:10126000010101010101010101010101010101016E
+:10127000010101010101010101010101010101015E
+:10128000010101010101010101010101010101014E
+:10129000010101010101010101010101010101013E
+:1012A000010101010101010101010101010101012E
+:1012B000010101010101010101010101010101011E
+:1012C000010101010101010101010101010101010E
+:1012D00001010101010101010101010101010101FE
+:1012E00001010101010101010101010101010101EE
+:1012F00001010101010101010101010101010101DE
+:1013000001010101010101010101010101010101CD
+:1013100001010101010101010101010101010101BD
+:1013200001010101010101010101010101010101AD
+:10133000010101010101010101010101010101019D
+:10134000010101010101010101010101010101018D
+:10135000010101010101010101010101010101017D
+:10136000010101010101010101010101010101016D
+:10137000010101010101010101010101010101015D
+:10138000010101010101010101010101010101014D
+:10139000010101010101010101010101010101013D
+:1013A000010101010101010101010101010101012D
+:1013B000010101010101010101010101010101011D
+:1013C000010101010101010101010101010101010D
+:1013D00001010101010101010101010101010101FD
+:1013E00001010101010101010101010101010101ED
+:1013F00001010101010101010101010101010101DD
+:1014000001010101010101010101010101010101CC
+:1014100001010101010101010101010101010101BC
+:1014200001010101010101010101010101010101AC
+:10143000010101010101010101010101010101019C
+:10144000010101010101010101010101010101018C
+:10145000010101010101010101010101010101017C
+:10146000010101010101010101010101010101016C
+:10147000010101010101010101010101010101015C
+:10148000010101010101010101010101010101014C
+:10149000010101010101010101010101010101013C
+:1014A000010101010101010101010101010101012C
+:1014B000010101010101010101010101010101011C
+:1014C000010101010101010101010101010101010C
+:1014D00001010101010101010101010101010101FC
+:1014E00001010101010101010101010101010101EC
+:1014F00001010101010101010101010101010101DC
+:1015000001010101010101010101010101010101CB
+:1015100001010101010101010101010101010101BB
+:1015200001010101010101010101010101010101AB
+:10153000010101010101010101010101010101019B
+:10154000010101010101010101010101010101018B
+:10155000010101010101010101010101010101017B
+:10156000010101010101010101010101010101016B
+:10157000010101010101010101010101010101015B
+:10158000010101010101010101010101010101014B
+:10159000010101010101010101010101010101013B
+:1015A000010101010101010101010101010101012B
+:1015B000010101010101010101010101010101011B
+:1015C000010101010101010101010101010101010B
+:1015D00001010101010101010101010101010101FB
+:1015E00001010101010101010101010101010101EB
+:1015F00001010101010101010101010101010101DB
+:1016000001010101010101010101010101010101CA
+:1016100001010101010101010101010101010101BA
+:1016200001010101010101010101010101010101AA
+:10163000010101010101010101010101010101019A
+:10164000010101010101010101010101010101018A
+:10165000010101010101010101010101010101017A
+:10166000010101010101010101010101010101016A
+:10167000010101010101010101010101010101015A
+:10168000010101010101010101010101010101014A
+:10169000010101010101010101010101010101013A
+:1016A000010101010101010101010101010101012A
+:1016B000010101010101010101010101010101011A
+:1016C000010101010101010101010101010101010A
+:1016D00001010101010101010101010101010101FA
+:1016E00001010101010101010101010101010101EA
+:1016F00001010101010101010101010101010101DA
+:1017000001010101010101010101010101010101C9
+:1017100001010101010101010101010101010101B9
+:1017200001010101010101010101010101010101A9
+:101730000101010101010101010101010101010199
+:101740000101010101010101010101010101010189
+:101750000101010101010101010101010101010179
+:101760000101010101010101010101010101010169
+:101770000101010101010101010101010101010159
+:101780000101010101010101010101010101010149
+:101790000101010101010101010101010101010139
+:1017A0000101010101010101010101010101010129
+:1017B0000101010101010101010101010101010119
+:1017C0000101010101010101010101010101010109
+:1017D00001010101010101010101010101010101F9
+:1017E00001010101010101010101010101010101E9
+:1017F00001010101010101010101010101010101D9
+:1018000001010101010101010101010101010101C8
+:1018100001010101010101010101010101010101B8
+:1018200001010101010101010101010101010101A8
+:101830000101010101010101010101010101010198
+:101840000101010101010101010101010101010188
+:101850000101010101010101010101010101010178
+:101860000101010101010101010101010101010168
+:101870000101010101010101010101010101010158
+:101880000101010101010101010101010101010148
+:101890000101010101010101010101010101010138
+:1018A0000101010101010101010101010101010128
+:1018B0000101010101010101010101010101010118
+:1018C0000101010101010101010101010101010108
+:1018D00001010101010101010101010101010101F8
+:1018E00001010101010101010101010101010101E8
+:1018F00001010101010101010101010101010101D8
+:1019000001010101010101010101010101010101C7
+:1019100001010101010101010101010101010101B7
+:1019200001010101010101010101010101010101A7
+:101930000101010101010101010101010101010197
+:101940000101010101010101010101010101010187
+:101950000101010101010101010101010101010177
+:101960000101010101010101010101010101010167
+:101970000101010101010101010101010101010157
+:101980000101010101010101010101010101010147
+:101990000101010101010101010101010101010137
+:1019A0000101010101010101010101010101010127
+:1019B0000101010101010101010101010101010117
+:1019C0000101010101010101010101010101010107
+:1019D00001010101010101010101010101010101F7
+:1019E00001010101010101010101010101010101E7
+:1019F00001010101010101010101010101010101D7
+:101A000001010101010101010101010101010101C6
+:101A100001010101010101010101010101010101B6
+:101A200001010101010101010101010101010101A6
+:101A30000101010101010101010101010101010196
+:101A40000101010101010101010101010101010186
+:101A50000101010101010101010101010101010176
+:101A60000101010101010101010101010101010166
+:101A70000101010101010101010101010101010156
+:101A80000101010101010101010101010101010146
+:101A90000101010101010101010101010101010136
+:101AA0000101010101010101010101010101010126
+:101AB0000101010101010101010101010101010116
+:101AC0000101010101010101010101010101010106
+:101AD00001010101010101010101010101010101F6
+:101AE00001010101010101010101010101010101E6
+:101AF00001010101010101010101010101010101D6
+:101B000001010101010101010101010101010101C5
+:101B100001010101010101010101010101010101B5
+:101B200001010101010101010101010101010101A5
+:101B30000101010101010101010101010101010195
+:101B40000101010101010101010101010101010185
+:101B50000101010101010101010101010101010175
+:101B60000101010101010101010101010101010165
+:101B70000101010101010101010101010101010155
+:101B80000101010101010101010101010101010145
+:101B90000101010101010101010101010101010135
+:101BA0000101010101010101010101010101010125
+:101BB0000101010101010101010101010101010115
+:101BC0000101010101010101010101010101010105
+:101BD00001010101010101010101010101010101F5
+:101BE00001010101010101010101010101010101E5
+:101BF00001010101010101010101010101010101D5
+:101C000001010101010101010101010101010101C4
+:101C100001010101010101010101010101010101B4
+:101C200001010101010101010101010101010101A4
+:101C30000101010101010101010101010101010194
+:101C40000101010101010101010101010101010184
+:101C50000101010101010101010101010101010174
+:101C60000101010101010101010101010101010164
+:101C70000101010101010101010101010101010154
+:101C80000101010101010101010101010101010144
+:101C90000101010101010101010101010101010134
+:101CA0000101010101010101010101010101010124
+:101CB0000101010101010101010101010101010114
+:101CC0000101010101010101010101010101010104
+:101CD00001010101010101010101010101010101F4
+:101CE00001010101010101010101010101010101E4
+:101CF00001010101010101010101010101010101D4
+:101D000001010101010101010101010101010101C3
+:101D100001010101010101010101010101010101B3
+:101D200001010101010101010101010101010101A3
+:101D30000101010101010101010101010101010193
+:101D40000101010101010101010101010101010183
+:101D50000101010101010101010101010101010173
+:101D60000101010101010101010101010101010163
+:101D70000101010101010101010101010101010153
+:101D80000101010101010101010101010101010143
+:101D90000101010101010101010101010101010133
+:101DA0000101010101010101010101010101010123
+:101DB0000101010101010101010101010101010113
+:101DC0000101010101010101010101010101010103
+:101DD00001010101010101000000000000000000FC
+:101DE00000000000000000000000000000000000F3
+:101DF00000000000000000000000000000000000E3
+:101E000000000000000000000000000000000000D2
+:101E100000000000000000000000000000000000C2
+:101E200000000000000000000000000000000000B2
+:101E300000000000000000000000000000000000A2
+:101E40000000000000000000000000000000000092
+:101E50000000000000000000000000000000000082
+:101E60000000000000000000000000000000000072
+:101E70000000000000000000000000000000000062
+:101E80000000000000000000000000000000000052
+:101E90000000000000000000000000000000000042
+:101EA0000000000000000000000000000000000032
+:101EB0000000000000000000000000000000000022
+:101EC0000000000000000000000000000000000012
+:101ED0000000000000000000000000000000000002
+:101EE00000000000000000000000000000000000F2
+:101EF00000000000000000000000000000000000E2
+:101F000000000000000000000000000000000000D1
+:101F100000000000000000000000000000000000C1
+:101F200000000000000000000000000000000000B1
+:101F300000000000000000000000000000000000A1
+:101F40000000000000000000000000000000000091
+:101F50000000000000000000000000000000000081
+:101F60000000000000000000000000000000000071
+:101F70000000000000000000000000000000000061
+:101F80000000000000000000000000000000000051
+:101F90000000000000000000000000000000000041
+:101FA0000000000000000000000000000000000031
+:101FB0000000000000000000000000000000000021
+:101FC0000000000000000000000000000000000011
+:101FD0000000000000000000000000000000000001
+:101FE00000000000000000000000000000000000F1
+:101FF00000000000000000000000000000000000E1
+:1020000000000000000000000000000000000000D0
+:1020100000000000000000000000000000000000C0
+:1020200000000000000000000000000000000000B0
+:1020300000000000000000000000000000000000A0
+:102040000000000000000000000000000000000090
+:102050000000000000000000000000000000000080
+:102060000000000000000000000000000000000070
+:102070000000000000000000000000000000000060
+:102080000000000000000000000000000000000050
+:102090000000000000000000000000000000000040
+:1020A0000000000000000000000000000000000030
+:1020B0000000000000000000000000000000000020
+:1020C0000000000000000000000000000000000010
+:1020D0000000000000000000000000000000000000
+:1020E00000000000000000000000000000000000F0
+:1020F00000000000000000000000000000000000E0
+:1021000000000000000000000000000000000000CF
+:1021100000000000000000000000000000000000BF
+:1021200000000000000000000000000000000000AF
+:10213000000000000000000000000000000000009F
+:10214000000000000000000000000000000000008F
+:10215000000000000000000000000000000000007F
+:10216000000000000000000000000000000000006F
+:10217000000000000000000000000000000000005F
+:10218000000000000000000000000000000000004F
+:10219000000000000000000000000000000000003F
+:1021A000000000000000000000000000000000002F
+:1021B000000000000000000000000000000000001F
+:1021C000000000000000000000000000000000000F
+:1021D00000000000000000000000000000000000FF
+:1021E00000000000000000000000000000000000EF
+:1021F00000000000000000000000000000000000DF
+:1022000000000000000000000000000000000000CE
+:1022100000000000000000000000000000000000BE
+:1022200000000000000000000000000000000000AE
+:10223000000000000000000000000000000000009E
+:10224000000000000000000000000000000000008E
+:10225000000000000000000000000000000000007E
+:10226000000000000000000000000000000000006E
+:10227000000000000000000000000000000000005E
+:10228000000000000000000000000000000000004E
+:10229000000000000000000000000000000000003E
+:1022A000000000000000000000000000000000002E
+:1022B000000000000000000000000000000000001E
+:1022C000000000000000000000000000000000000E
+:1022D00000000000000000000000000000000000FE
+:1022E00000000000000000000000000000000000EE
+:1022F00000000000000000000000000000000000DE
+:1023000000000000000000000000000000000000CD
+:1023100000000000000000000000000000000000BD
+:1023200000000000000000000000000000000000AD
+:10233000000000000000000000000000000000009D
+:10234000000000000000000000000000000000008D
+:10235000000000000000000000000000000000007D
+:10236000000000000000000000000000000000006D
+:10237000000000000000000000000000000000005D
+:10238000000000000000000000000000000000004D
+:10239000000000000000000000000000000000003D
+:1023A000000000000000000000000000000000002D
+:1023B000000000000000000000000000000000001D
+:1023C000000000000000000000000000000000000D
+:1023D00000000000000000020202020202020202EB
+:1023E00002020202020202020202020202020202CD
+:1023F00002020202020202020202020202020202BD
+:1024000002020202020202020202020202020202AC
+:10241000020202020202020202020202020202029C
+:10242000020202020202020202020202020202028C
+:10243000020202020202020202020202020202027C
+:10244000020202020202020202020202020202026C
+:10245000020202020202020202020202020202025C
+:10246000020202020202020202020202020202024C
+:10247000020202020202020202020202020202023C
+:10248000020202020202020202020202020202022C
+:10249000020202020202020202020202020202021C
+:1024A000020202020202020202020202020202020C
+:1024B00002020202020202020202020202020202FC
+:1024C00002020202020202020202020202020202EC
+:1024D00002020202020202020202020202020202DC
+:1024E00002020202020202020202020202020202CC
+:1024F00002020202020202020202020202020202BC
+:1025000002020202020202020202020202020202AB
+:10251000020202020202020202020202020202029B
+:10252000020202020202020202020202020202028B
+:10253000020202020202020202020202020202027B
+:10254000020202020202020202020202020202026B
+:10255000020202020202020202020202020202025B
+:10256000020202020202020202020202020202024B
+:10257000020202020202020202020202020202023B
+:10258000020202020202020202020202020202022B
+:10259000020202020202020202020202020202021B
+:1025A000020202020202020202020202020202020B
+:1025B00002020202020202020202020202020202FB
+:1025C00002020202020202020202020202020202EB
+:1025D00002020202020202020202020202020202DB
+:1025E00002020202020202020202020202020202CB
+:1025F00002020202020202020202020202020202BB
+:1026000002020202020202020202020202020202AA
+:10261000020202020202020202020202020202029A
+:10262000020202020202020202020202020202028A
+:10263000020202020202020202020202020202027A
+:10264000020202020202020202020202020202026A
+:10265000020202020202020202020202020202025A
+:10266000020202020202020202020202020202024A
+:10267000020202020202020202020202020202023A
+:10268000020202020202020202020202020202022A
+:10269000020202020202020202020202020202021A
+:1026A000020202020202020202020202020202020A
+:1026B00002020202020202020202020202020202FA
+:1026C00002020202020202020202020202020202EA
+:1026D00002020202020202020202020202020202DA
+:1026E00002020202020202020202020202020202CA
+:1026F00002020202020202020202020202020202BA
+:1027000002020202020202020202020202020202A9
+:102710000202020202020202020202020202020299
+:102720000202020202020202020202020202020289
+:102730000202020202020202020202020202020279
+:102740000202020202020202020202020202020269
+:102750000202020202020202020202020202020259
+:102760000202020202020202020202020202020249
+:102770000202020202020202020202020202020239
+:102780000202020202020202020202020202020229
+:102790000202020202020202020202020202020219
+:1027A0000202020202020202020202020202020209
+:1027B00002020202020202020202020202020202F9
+:1027C00002020202020202020202020202020202E9
+:1027D00002020202020202020202020202020202D9
+:1027E00002020202020202020202020202020202C9
+:1027F00002020202020202020202020202020202B9
+:1028000002020202020202020202020202020202A8
+:102810000202020202020202020202020202020298
+:102820000202020202020202020202020202020288
+:102830000202020202020202020202020202020278
+:102840000202020202020202020202020202020268
+:102850000202020202020202020202020202020258
+:102860000202020202020202020202020202020248
+:102870000202020202020202020202020202020238
+:102880000202020202020202020202020202020228
+:102890000202020202020202020202020202020218
+:1028A0000202020202020202020202020202020208
+:1028B00002020202020202020202020202020202F8
+:1028C00002020202020202020202020202020202E8
+:1028D00002020202020202020202020202020202D8
+:1028E00002020202020202020202020202020202C8
+:1028F00002020202020202020202020202020202B8
+:1029000002020202020202020202020202020202A7
+:102910000202020202020202020202020202020297
+:102920000202020202020202020202020202020287
+:102930000202020202020202020202020202020277
+:102940000202020202020202020202020202020267
+:102950000202020202020202020202020202020257
+:102960000202020202020202020202020202020247
+:102970000202020202020202020202020202020237
+:102980000202020202020202020202020202020227
+:102990000202020202020202020202020202020217
+:1029A0000202020202020202020202020202020207
+:1029B00002020202020202020202020202020202F7
+:1029C00002020202020202020202020202020202E7
+:1029D00002020202020202020202020202020202D7
+:1029E00002020202020202020202020202020202C7
+:1029F00002020202020202020202020202020202B7
+:102A000002020202020202020202020202020202A6
+:102A10000202020202020202020202020202020296
+:102A20000202020202020202020202020202020286
+:102A30000202020202020202020202020202020276
+:102A40000202020202020202020202020202020266
+:102A50000202020202020202020202020202020256
+:102A60000202020202020202020202020202020246
+:102A70000202020202020202020202020202020236
+:102A80000202020202020202020202020202020226
+:102A90000202020202020202020202020202020216
+:102AA0000202020202020202020202020202020206
+:102AB00002020202020202020202020202020202F6
+:102AC00002020202020202020202020202020202E6
+:102AD00002020202020202020202020202020202D6
+:102AE00002020202020202020202020202020202C6
+:102AF00002020202020202020202020202020202B6
+:102B000002020202020202020202020202020202A5
+:102B10000202020202020202020202020202020295
+:102B20000202020202020202020202020202020285
+:102B30000202020202020202020202020202020275
+:102B40000202020202020202020202020202020265
+:102B50000202020202020202020202020202020255
+:102B60000202020202020202020202020202020245
+:102B70000202020202020202020202020202020235
+:102B80000202020202020202020202020202020225
+:102B90000202020202020202020202020202020215
+:102BA0000202020202020202020202020202020205
+:102BB00002020202020202020202020202020202F5
+:102BC00002020202020202020202020202020202E5
+:102BD00002020202020202020202020202020202D5
+:102BE00002020202020202020202020202020202C5
+:102BF00002020202020202020202020202020202B5
+:102C000002020202020202020202020202020202A4
+:102C10000202020202020202020202020202020294
+:102C20000202020202020202020202020202020284
+:102C30000202020202020202020202020202020274
+:102C40000202020202020202020202020202020264
+:102C50000202020202020202020202020202020254
+:102C60000202020202020202020202020202020244
+:102C70000202020202020202020202020202020234
+:102C80000202020202020202020202020202020224
+:102C90000202020202020202020202020202020214
+:102CA0000202020202020202020202020202020204
+:102CB00002020202020202020202020202020202F4
+:102CC00002020202020202020202020202020202E4
+:102CD00002020202020202020202020202020202D4
+:102CE00002020202020202020202020202020202C4
+:102CF00002020202020202020202020202020202B4
+:102D000002020202020202020202020202020202A3
+:102D10000202020202020202020202020202020293
+:102D20000202020202020202020202020202020283
+:102D30000202020202020202020202020202020273
+:102D40000202020202020202020202020202020263
+:102D50000202020202020202020202020202020253
+:102D60000202020202020202020202020202020243
+:102D70000202020202020202020202020202020233
+:102D80000202020202020202020202020202020223
+:102D90000202020202020202020202020202020213
+:102DA0000202020202020202020202020202020203
+:102DB00002020202020202020202020202020202F3
+:102DC00002020202020202020202020202020202E3
+:102DD00002020202020202020202020202020202D3
+:102DE00002020202020202020202020202020202C3
+:102DF00002020202020202020202020202020202B3
+:102E000002020202020202020202020202020202A2
+:102E10000202020202020202020202020202020292
+:102E20000202020202020202020202020202020282
+:102E30000202020202020202020202020202020272
+:102E40000202020202020202020202020202020262
+:102E50000202020202020202020202020202020252
+:102E60000202020202020202020202020202020242
+:102E70000202020202020202020202020202020232
+:102E80000202020202020202020202020202020222
+:102E90000202020202020202020202020202020212
+:102EA0000202020202020202020202020202020202
+:102EB00002020202020202020202020202020202F2
+:102EC00002020202020202020202020202020202E2
+:102ED00002020202020202020202020202020202D2
+:102EE00002020202020202020202020202020202C2
+:102EF00002020202020202020202020202020202B2
+:102F000002020202020202020202020202020202A1
+:102F10000202020202020202020202020202020291
+:102F20000202020202020202020202020202020281
+:102F30000202020202020202020202020202020271
+:102F40000202020202020202020202020202020261
+:102F50000202020202020202020202020202020251
+:102F60000202020202020202020202020202020241
+:102F70000202020202020202020202020202020231
+:102F80000202020202020202020202020202020221
+:102F90000202020202020202020202020202020211
+:102FA0000202020202020202020202020202020201
+:102FB00002020202020202020202020202020202F1
+:102FC00002020202020202020202020202020202E1
+:102FD00002020202020202020202020202020202D1
+:102FE00002020202020202020202020202020202C1
+:102FF00002020202020202020202020202020202B1
+:1030000002020202020202020202020202020202A0
+:103010000202020202020202020202020202020290
+:103020000202020202020202020202020202020280
+:103030000202020202020202020202020202020270
+:103040000202020202020202020202020202020260
+:103050000202020202020202020202020202020250
+:103060000202020202020202020202020202020240
+:103070000202020202020202020202020202020230
+:103080000202020202020202020202020202020220
+:103090000202020202020202020202020202020210
+:1030A0000202020202020202020202020202020200
+:1030B00002020202020202020202020202020202F0
+:1030C00002020202020202020202020202020202E0
+:1030D00002020202020202020202020202020202D0
+:1030E00002020202020202020202020202020202C0
+:1030F00002020202020202020202020202020202B0
+:10310000020202020202020202020202020202029F
+:10311000020202020202020202020202020202028F
+:10312000020202020202020202020202020202027F
+:10313000020202020202020202020202020202026F
+:10314000020202020202020202020202020202025F
+:10315000020202020202020202020202020202024F
+:10316000020202020202020202020202020202023F
+:10317000020202020202020202020202020202022F
+:10318000020202020202020202020202020202021F
+:10319000020202020202020202020202020202020F
+:1031A00002020202020202020202020202020202FF
+:1031B00002020202020202020202020202020202EF
+:1031C00002020202020202020202020202020202DF
+:1031D00002020202020202020202020202020202CF
+:1031E00002020202020202020202020202020202BF
+:1031F00002020202020202020202020202020202AF
+:10320000020202020202020202020202020202029E
+:10321000020202020202020202020202020202028E
+:10322000020202020202020202020202020202027E
+:10323000020202020202020202020202020202026E
+:10324000020202020202020202020202020202025E
+:10325000020202020202020202020202020202024E
+:10326000020202020202020202020202020202023E
+:10327000020202020202020202020202020202022E
+:10328000020202020202020202020202020202021E
+:10329000020202020202020202020202020202020E
+:1032A00002020202020202020202020202020202FE
+:1032B00002020202020202020202020202020202EE
+:1032C00002020202020202020202020202020202DE
+:1032D00002020202020202020202020202020202CE
+:1032E00002020202020202020202020202020202BE
+:1032F00002020202020202020202020202020202AE
+:10330000020202020202020202020202020202029D
+:10331000020202020202020202020202020202028D
+:10332000020202020202020202020202020202027D
+:10333000020202020202020202020202020202026D
+:10334000020202020202020202020202020202025D
+:10335000020202020202020202020202020202024D
+:10336000020202020202020202020202020202023D
+:10337000020202020202020202020202020202022D
+:10338000020202020202020202020202020202021D
+:10339000020202020202020202020202020202020D
+:1033A00002020202020202020202020202020202FD
+:1033B00002020202020202020202020202020202ED
+:1033C00002020202020202020202020202020202DD
+:1033D00002020202020202020202020202020202CD
+:1033E00002020202020202020202020202020202BD
+:1033F00002020202020202020202020202020202AD
+:10340000020202020202020202020202020202029C
+:10341000020202020202020202020202020202028C
+:10342000020202020202020202020202020202027C
+:10343000020202020202020202020202020202026C
+:10344000020202020202020202020202020202025C
+:10345000020202020202020202020202020202024C
+:10346000020202020202020202020202020202023C
+:10347000020202020202020202020202020202022C
+:10348000020202020202020202020202020202021C
+:10349000020202020202020202020202020202020C
+:1034A00002020202020202020202020202020202FC
+:1034B00002020202020202020202020202020202EC
+:1034C00002020202020202020202020202020202DC
+:1034D00002020202020202020202020202020202CC
+:1034E00002020202020202020202020202020202BC
+:1034F00002020202020202020202020202020202AC
+:10350000020202020202020202020202020202029B
+:10351000020202020202020202020202020202028B
+:10352000020202020202020202020202020202027B
+:10353000020202020202020202020202020202026B
+:10354000020202020202020202020202020202025B
+:10355000020202020202020202020202020202024B
+:10356000020202020202020202020202020202023B
+:10357000020202020202020202020202020202022B
+:10358000020202020202020202020202020202021B
+:10359000020202020202020202020202020202020B
+:1035A00002020202020202020202020202020202FB
+:1035B00002020202020202020202020202020202EB
+:1035C00002020202020202020202020202020202DB
+:1035D00002020202020202020202020202020202CB
+:1035E00002020202020202020202020202020202BB
+:1035F00002020202020202020202020202020202AB
+:10360000020202020202020202020202020202029A
+:10361000020202020202020202020202020202028A
+:10362000020202020202020202020202020202027A
+:10363000020202020202020202020202020202026A
+:10364000020202020202020202020202020202025A
+:10365000020202020202020202020202020202024A
+:10366000020202020202020202020202020202023A
+:10367000020202020202020202020202020202022A
+:10368000020202020202020202020202020202021A
+:10369000020202020202020202020202020202020A
+:1036A00002020202020202020202020202020202FA
+:1036B00002020202020202020202020202020202EA
+:1036C00002020202020202020202020202020202DA
+:1036D00002020202020202020202020202020202CA
+:1036E00002020202020202020202020202020202BA
+:1036F00002020202020202020202020202020202AA
+:103700000202020202020202020202020202020299
+:103710000202020202020202020202020202020289
+:103720000202020202020202020202020202020279
+:103730000202020202020202020202020202020269
+:103740000202020202020202020202020202020259
+:103750000202020202020202020202020202020249
+:103760000202020202020202020202020202020239
+:103770000202020202020202020202020202020229
+:103780000202020202020202020202020202020219
+:103790000202020202020202020202020202020209
+:1037A00002020202020202020202020202020202F9
+:1037B00002020202020202020202020202020202E9
+:1037C00002020202020202020202020202020202D9
+:1037D00002020202020202020202020202020202C9
+:1037E00002020202020202020202020202020202B9
+:1037F00002020202020202020202020202020202A9
+:103800000202020202020202020202020202020298
+:103810000202020202020202020202020202020288
+:103820000202020202020202020202020202020278
+:103830000202020202020202020202020202020268
+:103840000202020202020202020202020202020258
+:103850000202020202020202020202020202020248
+:103860000202020202020202020202020202020238
+:103870000202020202020202020202020202020228
+:103880000202020202020202020202020202020218
+:103890000202020202020202020202020202020208
+:1038A00002020202020202020202020202020202F8
+:1038B00002020202020202020202020202020202E8
+:1038C00002020202020202020202020202020202D8
+:1038D00002020202020202020202020202020202C8
+:1038E00002020202020202020202020202020202B8
+:1038F00002020202020202020202020202020202A8
+:103900000202020202020202020202020202020297
+:103910000202020202020202020202020202020287
+:103920000202020202020202020202020202020277
+:103930000202020202020202020202020202020267
+:103940000202020202020202020202020202020257
+:103950000202020202020202020202020202020247
+:103960000202020202020202020202020202020237
+:103970000202020202020202020202020202020227
+:103980000202020202020202020202020202020217
+:103990000202020202020202020202020202020207
+:1039A00002020202020202020202020202020202F7
+:1039B00002020202020202020202020202020202E7
+:1039C00002020202020202020202020202020202D7
+:1039D00002020202020202020202020202020202C7
+:1039E00002020202020202020202020202020202B7
+:1039F00002020202020202020202020202020202A7
+:103A00000202020202020202020202020202020296
+:103A10000202020202020202020202020202020286
+:103A20000202020202020202020202020202020276
+:103A30000202020202020202020202020202020266
+:103A40000202020202020202020202020202020256
+:103A50000202020202020202020202020202020246
+:103A60000202020202020202020202020202020236
+:103A70000202020202020202020202020202020226
+:103A80000202020202020202020202020202020216
+:103A90000202020202020202020202020202020206
+:103AA00002020202020202020202020202020202F6
+:103AB00002020202020202020202020202020202E6
+:103AC00002020202020202020202020202020202D6
+:103AD00002020202020202020202020202020202C6
+:103AE00002020202020202020202020202020202B6
+:103AF00002020202020202020202020202020202A6
+:103B00000202020202020202020202020202020295
+:103B10000202020202020202020202020202020285
+:103B20000202020202020202020202020202020275
+:103B30000202020202020202020202020202020265
+:103B40000202020202020202020202020202020255
+:103B50000202020202020202020202020202020245
+:103B60000202020202020202020202020202020235
+:103B70000202020202020202020202020202020225
+:103B80000202020202020202020202020202020215
+:103B90000202020202020202020202020202020205
+:103BA00002020202020202020202020202020202F5
+:103BB00002020202020202020202020202020202E5
+:103BC00002020202020202020202020202020202D5
+:103BD00002020202020202020202020202020202C5
+:103BE00002020202020202020202020202020202B5
+:103BF00002020202020202020202020202020202A5
+:103C00000202020202020202020202020202020294
+:103C10000202020202020202020202020202020284
+:103C20000202020202020202020202020202020274
+:103C30000202020202020202020202020202020264
+:103C40000202020202020202020202020202020254
+:103C50000202020202020202020202020202020244
+:103C60000202020202020202020202020202020234
+:103C70000202020202020202020202020202020224
+:103C80000202020202020202020202020202020214
+:103C90000202020202020202020202020202020204
+:103CA00002020202020202020202020202020202F4
+:103CB00002020202020202020202020202020202E4
+:103CC00002020202020202020202020202020202D4
+:103CD00002020202020202020202020202020202C4
+:103CE00002020202020202020202020202020202B4
+:103CF00002020202020202020202020202020202A4
+:103D00000202020202020202020202020202020293
+:103D10000202020202020202020202020202020283
+:103D20000202020202020202020202020202020273
+:103D30000202020202020202020202020202020263
+:103D40000202020202020202020202020202020253
+:103D50000202020202020202020202020202020243
+:103D60000202020202020202020202020202020233
+:103D70000202020202020202020202020202020223
+:103D80000202020202020202020202020202020213
+:103D90000202020202020202020202020202020203
+:103DA00002020202020202020202020202020202F3
+:103DB00002020202020202020202020202020202E3
+:103DC00002020202020202020202020202020202D3
+:103DD00002020202020202020202020202020202C3
+:103DE00002020202020202020202020202020202B3
+:103DF00002020202020202020202020202020202A3
+:103E00000202020202020202020202020202020292
+:103E10000202020202020202020202020202020282
+:103E20000202020202020202020202020202020272
+:103E30000202020202020202020202020202020262
+:103E40000202020202020202020202020202020252
+:103E50000202020202020202020202020202020242
+:103E60000202020202020202020202020202020232
+:103E70000202020202020202020202020202020222
+:103E80000202020202020202020202020202020212
+:103E90000202020202020202020202020202020202
+:103EA00002020202020202020202020202020202F2
+:103EB00002020202020202020202020202020202E2
+:103EC00002020202020202020202020202020202D2
+:103ED00002020202020202020202020202020202C2
+:103EE00002020202020202020202020202020202B2
+:103EF00002020202020202020202020202020202A2
+:103F00000202020202020202020202020202020291
+:103F10000202020202020202020202020202020281
+:103F20000202020202020202020202020202020271
+:103F30000202020202020202020202020202020261
+:103F40000202020202020202020202020202020251
+:103F50000202020202020202020202020202020241
+:103F60000202020202020202020202020202020231
+:103F70000202020202020202020202020202020221
+:103F80000202020202020202020202020202020211
+:103F90000202020202020202020202020202020201
+:103FA00002020202020202020202020202020202F1
+:103FB00002020202020202020202020202020202E1
+:103FC00002020202020202020202020202020202D1
+:103FD00002020202020202020202020202020202C1
+:103FE00002020202020202020202020202020202B1
+:103FF00002020202020202020202020202020202A1
+:104000000202020202020202020202020202020290
+:104010000202020202020202020202020202020280
+:104020000202020202020202020202020202020270
+:104030000202020202020202020202020202020260
+:104040000202020202020202020202020202020250
+:104050000202020202020202020202020202020240
+:104060000202020202020202020202020202020230
+:104070000202020202020202020202020202020220
+:104080000202020202020202020202020202020210
+:104090000202020202020202020202020202020200
+:1040A00002020202020202020202020202020202F0
+:1040B00002020202020202020202020202020202E0
+:1040C00002020202020202020202020202020202D0
+:1040D00002020202020202000000000000000000D2
+:1040E00000000000000000000000000000000000D0
+:1040F00000000000000000000000000000000000C0
+:1041000000000000000000000000000000000000AF
+:10411000000000000000000000000000000000009F
+:10412000000000000000000000000000000000008F
+:10413000000000000000000000000000000000007F
+:10414000000000000000000000000000000000006F
+:10415000000000000000000000000000000000005F
+:10416000000000000000000000000000000000004F
+:10417000000000000000000000000000000000003F
+:10418000000000000000000000000000000000002F
+:10419000000000000000000000000000000000001F
+:1041A000000000000000000000000000000000000F
+:1041B00000000000000000000000000000000000FF
+:1041C00000000000000000000000000000000000EF
+:1041D00000000000000000000000000000000000DF
+:1041E00000000000000000000000000000000000CF
+:1041F00000000000000000000000000000000000BF
+:1042000000000000000000000000000000000000AE
+:10421000000000000000000000000000000000009E
+:10422000000000000000000000000000000000008E
+:10423000000000000000000000000000000000007E
+:10424000000000000000000000000000000000006E
+:10425000000000000000000000000000000000005E
+:10426000000000000000000000000000000000004E
+:10427000000000000000000000000000000000003E
+:10428000000000000000000000000000000000002E
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000000000E
+:1042B00000000000000000000000000000000000FE
+:1042C00000000000000000000000000000000000EE
+:1042D00000000000000000000000000000000000DE
+:1042E00000000000000000000000000000000000CE
+:1042F00000000000000000000000000000000000BE
+:1043000000000000000000000000000000000000AD
+:10431000000000000000000000000000000000009D
+:10432000000000000000000000000000000000008D
+:10433000000000000000000000000000000000007D
+:10434000000000000000000000000000000000006D
+:10435000000000000000000000000000000000005D
+:10436000000000000000000000000000000000004D
+:10437000000000000000000000000000000000003D
+:10438000000000000000000000000000000000002D
+:10439000000000000000000000000000000000001D
+:1043A000000000000000000000000000000000000D
+:1043B00000000000000000000000000000000000FD
+:1043C00000000000000000000000000000000000ED
+:1043D00000000000000000000000000000000000DD
+:1043E00000000000000000000000000000000000CD
+:1043F00000000000000000000000000000000000BD
+:1044000000000000000000000000000000000000AC
+:10441000000000000000000000000000000000009C
+:10442000000000000000000000000000000000008C
+:10443000000000000000000000000000000000007C
+:10444000000000000000000000000000000000006C
+:10445000000000000000000000000000000000005C
+:10446000000000000000000000000000000000004C
+:10447000000000000000000000000000000000003C
+:10448000000000000000000000000000000000002C
+:10449000000000000000000000000000000000001C
+:1044A000000000000000000000000000000000000C
+:1044B00000000000000000000000000000000000FC
+:1044C00000000000000000000000000000000000EC
+:1044D00000000000000000000000000000000000DC
+:1044E00000000000000000000000000000000000CC
+:1044F00000000000000000000000000000000000BC
+:1045000000000000000000000000000000000000AB
+:10451000000000000000000000000000000000009B
+:10452000000000000000000000000000000000008B
+:10453000000000000000000000000000000000007B
+:10454000000000000000000000000000000000006B
+:10455000000000000000000000000000000000005B
+:10456000000000000000000000000000000000004B
+:10457000000000000000000000000000000000003B
+:10458000000000000000000000000000000000002B
+:10459000000000000000000000000000000000001B
+:1045A000000000000000000000000000000000000B
+:1045B00000000000000000000000000000000000FB
+:1045C00000000000000000000000000000000000EB
+:1045D00000000000000000000000000000000000DB
+:1045E00000000000000000000000000000000000CB
+:1045F00000000000000000000000000000000000BB
+:1046000000000000000000000000000000000000AA
+:10461000000000000000000000000000000000009A
+:10462000000000000000000000000000000000008A
+:10463000000000000000000000000000000000007A
+:10464000000000000000000000000000000000006A
+:10465000000000000000000000000000000000005A
+:10466000000000000000000000000000000000004A
+:10467000000000000000000000000000000000003A
+:10468000000000000000000000000000000000002A
+:10469000000000000000000000000000000000001A
+:1046A000000000000000000000000000000000000A
+:1046B00000000000000000000000000000000000FA
+:1046C00000000000000000000000000000000000EA
+:1046D00000000000000000000000000000000000DA
+:1046E00000000000000000000000000000000000CA
+:1046F00000000000000000000000000000000000BA
+:1047000000000000000000000000000000000000A9
+:104710000000000000000000000000000000000099
+:104720000000000000000000000000000000000089
+:104730000000000000000000000000000000000079
+:104740000000000000000000000000000000000069
+:104750000000000000000000000000000000000059
+:104760000000000000000000000000000000000049
+:104770000000000000000000000000000000000039
+:104780000000000000000000000000000000000029
+:104790000000000000000000000000000000000019
+:1047A0000000000000000000000000000000000009
+:1047B00000000000000000000000000000000000F9
+:1047C00000000000000000000000000000000000E9
+:1047D00000000000000000000000000000000000D9
+:1047E00000000000000000000000000000000000C9
+:1047F00000000000000000000000000000000000B9
+:1048000000000000000000000000000000000000A8
+:104810000000000000000000000000000000000098
+:104820000000000000000000000000000000000088
+:104830000000000000000000000000000000000078
+:104840000000000000000000000000000000000068
+:104850000000000000000000000000000000000058
+:104860000000000000000000000000000000000048
+:104870000000000000000000000000000000000038
+:104880000000000000000000000000000000000028
+:104890000000000000000000000000000000000018
+:1048A0000000000000000000000000000000000008
+:1048B00000000000000000000000000000000000F8
+:1048C00000000000000000000000000000000000E8
+:1048D00000000000000000000000000000000000D8
+:1048E00000000000000000000000000000000000C8
+:1048F00000000000000000000000000000000000B8
+:1049000000000000000000000000000000000000A7
+:104910000000000000000000000000000000000097
+:104920000000000000000000000000000000000087
+:104930000000000000000000000000000000000077
+:104940000000000000000000000000000000000067
+:104950000000000000000000000000000000000057
+:104960000000000000000000000000000000000047
+:104970000000000000000000000000000000000037
+:104980000000000000000000000000000000000027
+:104990000000000000000000000000000000000017
+:1049A0000000000000000000000000000000000007
+:1049B00000000000000000000000000000000000F7
+:1049C00000000000000000000000000000000000E7
+:1049D00000000000000000000000000000000000D7
+:1049E00000000000000000000000000000000000C7
+:1049F00000000000000000000000000000000000B7
+:104A000000000000000000000000000000000000A6
+:104A10000000000000000000000000000000000096
+:104A20000000000000000000000000000000000086
+:104A30000000000000000000000000000000000076
+:104A40000000000000000000000000000000000066
+:104A50000000000000000000000000000000000056
+:104A60000000000000000000000000000000000046
+:104A70000000000000000000000000000000000036
+:104A80000000000000000000000000000000000026
+:104A90000000000000000000000000000000000016
+:104AA0000000000000000000000000000000000006
+:104AB00000000000000000000000000000000000F6
+:104AC00000000000000000000000000000000000E6
+:104AD00000000000000000000000000000000000D6
+:104AE00000000000000000000000000000000000C6
+:104AF00000000000000000000000000000000000B6
+:104B000000000000000000000000000000000000A5
+:104B10000000000000000000000000000000000095
+:104B20000000000000000000000000000000000085
+:104B30000000000000000000000000000000000075
+:104B40000000000000000000000000000000000065
+:104B50000000000000000000000000000000000055
+:104B60000000000000000000000000000000000045
+:104B70000000000000000000000000000000000035
+:104B80000000000000000000000000000000000025
+:104B90000000000000000000000000000000000015
+:104BA0000000000000000000000000000000000005
+:104BB00000000000000000000000000000000000F5
+:104BC00000000000000000000000000000000000E5
+:104BD00000000000000000000000000000000000D5
+:104BE00000000000000000000000000000000000C5
+:104BF00000000000000000000000000000000000B5
+:104C000000000000000000000000000000000000A4
+:104C10000000000000000000000000000000000094
+:104C20000000000000000000000000000000000084
+:104C30000000000000000000000000000000000074
+:104C40000000000000000000000000000000000064
+:104C50000000000000000000000000000000000054
+:104C60000000000000000000000000000000000044
+:104C70000000000000000000000000000000000034
+:104C80000000000000000000000000000000000024
+:104C90000000000000000000000000000000000014
+:104CA0000000000000000000000000000000000004
+:104CB00000000000000000000000000000000000F4
+:104CC00000000000000000000000000000000000E4
+:104CD00000000000000000010101010101010101CB
+:104CE00001010101010101010101010101010101B4
+:104CF00001010101010101010101010101010101A4
+:104D00000101010101010101010101010101010193
+:104D10000101010101010101010101010101010183
+:104D20000101010101010101010101010101010173
+:104D30000101010101010101010101010101010163
+:104D40000101010101010101010101010101010153
+:104D50000101010101010101010101010101010143
+:104D60000101010101010101010101010101010133
+:104D70000101010101010101010101010101010123
+:104D80000101010101010101010101010101010113
+:104D90000101010101010101010101010101010103
+:104DA00001010101010101010101010101010101F3
+:104DB00001010101010101010101010101010101E3
+:104DC00001010101010101010101010101010101D3
+:104DD00001010101010101010101010101010101C3
+:104DE00001010101010101010101010101010101B3
+:104DF00001010101010101010101010101010101A3
+:104E00000101010101010101010101010101010192
+:104E10000101010101010101010101010101010182
+:104E20000101010101010101010101010101010172
+:104E30000101010101010101010101010101010162
+:104E40000101010101010101010101010101010152
+:104E50000101010101010101010101010101010142
+:104E60000101010101010101010101010101010132
+:104E70000101010101010101010101010101010122
+:104E80000101010101010101010101010101010112
+:104E90000101010101010101010101010101010102
+:104EA00001010101010101010101010101010101F2
+:104EB00001010101010101010101010101010101E2
+:104EC00001010101010101010101010101010101D2
+:104ED00001010101010101010101010101010101C2
+:104EE00001010101010101010101010101010101B2
+:104EF00001010101010101010101010101010101A2
+:104F00000101010101010101010101010101010191
+:104F10000101010101010101010101010101010181
+:104F20000101010101010101010101010101010171
+:104F30000101010101010101010101010101010161
+:104F40000101010101010101010101010101010151
+:104F50000101010101010101010101010101010141
+:104F60000101010101010101010101010101010131
+:104F70000101010101010101010101010101010121
+:104F80000101010101010101010101010101010111
+:104F90000101010101010101010101010101010101
+:104FA00001010101010101010101010101010101F1
+:104FB00001010101010101010101010101010101E1
+:104FC00001010101010101010101010101010101D1
+:104FD00001010101010101010101010101010101C1
+:104FE00001010101010101010101010101010101B1
+:104FF00001010101010101010101010101010101A1
+:105000000101010101010101010101010101010190
+:105010000101010101010101010101010101010180
+:105020000101010101010101010101010101010170
+:105030000101010101010101010101010101010160
+:105040000101010101010101010101010101010150
+:105050000101010101010101010101010101010140
+:105060000101010101010101010101010101010130
+:105070000101010101010101010101010101010120
+:105080000101010101010101010101010101010110
+:105090000101010101010101010101010101010100
+:1050A00001010101010101010101010101010101F0
+:1050B00001010101010101010101010101010101E0
+:1050C00001010101010101010101010101010101D0
+:1050D00001010101010101010101010101010101C0
+:1050E00001010101010101010101010101010101B0
+:1050F00001010101010101010101010101010101A0
+:10510000010101010101010101010101010101018F
+:10511000010101010101010101010101010101017F
+:10512000010101010101010101010101010101016F
+:10513000010101010101010101010101010101015F
+:10514000010101010101010101010101010101014F
+:10515000010101010101010101010101010101013F
+:10516000010101010101010101010101010101012F
+:10517000010101010101010101010101010101011F
+:10518000010101010101010101010101010101010F
+:1051900001010101010101010101010101010101FF
+:1051A00001010101010101010101010101010101EF
+:1051B00001010101010101010101010101010101DF
+:1051C00001010101010101010101010101010101CF
+:1051D00001010101010101010101010101010101BF
+:1051E00001010101010101010101010101010101AF
+:1051F000010101010101010101010101010101019F
+:10520000010101010101010101010101010101018E
+:10521000010101010101010101010101010101017E
+:10522000010101010101010101010101010101016E
+:10523000010101010101010101010101010101015E
+:10524000010101010101010101010101010101014E
+:10525000010101010101010101010101010101013E
+:10526000010101010101010101010101010101012E
+:10527000010101010101010101010101010101011E
+:10528000010101010101010101010101010101010E
+:1052900001010101010101010101010101010101FE
+:1052A00001010101010101010101010101010101EE
+:1052B00001010101010101010101010101010101DE
+:1052C00001010101010101010101010101010101CE
+:1052D00001010101010101010101010101010101BE
+:1052E00001010101010101010101010101010101AE
+:1052F000010101010101010101010101010101019E
+:10530000010101010101010101010101010101018D
+:10531000010101010101010101010101010101017D
+:10532000010101010101010101010101010101016D
+:10533000010101010101010101010101010101015D
+:10534000010101010101010101010101010101014D
+:10535000010101010101010101010101010101013D
+:10536000010101010101010101010101010101012D
+:10537000010101010101010101010101010101011D
+:10538000010101010101010101010101010101010D
+:1053900001010101010101010101010101010101FD
+:1053A00001010101010101010101010101010101ED
+:1053B00001010101010101010101010101010101DD
+:1053C00001010101010101010101010101010101CD
+:1053D00001010101010101010101010101010101BD
+:1053E00001010101010101010101010101010101AD
+:1053F000010101010101010101010101010101019D
+:10540000010101010101010101010101010101018C
+:10541000010101010101010101010101010101017C
+:10542000010101010101010101010101010101016C
+:10543000010101010101010101010101010101015C
+:10544000010101010101010101010101010101014C
+:10545000010101010101010101010101010101013C
+:10546000010101010101010101010101010101012C
+:10547000010101010101010101010101010101011C
+:10548000010101010101010101010101010101010C
+:1054900001010101010101010101010101010101FC
+:1054A00001010101010101010101010101010101EC
+:1054B00001010101010101010101010101010101DC
+:1054C00001010101010101010101010101010101CC
+:1054D00001010101010101010101010101010101BC
+:1054E00001010101010101010101010101010101AC
+:1054F000010101010101010101010101010101019C
+:10550000010101010101010101010101010101018B
+:10551000010101010101010101010101010101017B
+:10552000010101010101010101010101010101016B
+:10553000010101010101010101010101010101015B
+:10554000010101010101010101010101010101014B
+:10555000010101010101010101010101010101013B
+:10556000010101010101010101010101010101012B
+:10557000010101010101010101010101010101011B
+:10558000010101010101010101010101010101010B
+:1055900001010101010101010101010101010101FB
+:1055A00001010101010101010101010101010101EB
+:1055B00001010101010101010101010101010101DB
+:1055C00001010101010101010101010101010101CB
+:1055D00001010101010101010101010101010101BB
+:1055E00001010101010101010101010101010101AB
+:1055F000010101010101010101010101010101019B
+:10560000010101010101010101010101010101018A
+:10561000010101010101010101010101010101017A
+:10562000010101010101010101010101010101016A
+:10563000010101010101010101010101010101015A
+:10564000010101010101010101010101010101014A
+:10565000010101010101010101010101010101013A
+:10566000010101010101010101010101010101012A
+:10567000010101010101010101010101010101011A
+:10568000010101010101010101010101010101010A
+:1056900001010101010101010101010101010101FA
+:1056A00001010101010101010101010101010101EA
+:1056B00001010101010101010101010101010101DA
+:1056C00001010101010101010101010101010101CA
+:1056D00001010101010101010101010101010101BA
+:1056E00001010101010101010101010101010101AA
+:1056F000010101010101010101010101010101019A
+:105700000101010101010101010101010101010189
+:105710000101010101010101010101010101010179
+:105720000101010101010101010101010101010169
+:105730000101010101010101010101010101010159
+:105740000101010101010101010101010101010149
+:105750000101010101010101010101010101010139
+:105760000101010101010101010101010101010129
+:105770000101010101010101010101010101010119
+:105780000101010101010101010101010101010109
+:1057900001010101010101010101010101010101F9
+:1057A00001010101010101010101010101010101E9
+:1057B00001010101010101010101010101010101D9
+:1057C00001010101010101010101010101010101C9
+:1057D00001010101010101010101010101010101B9
+:1057E00001010101010101010101010101010101A9
+:1057F0000101010101010101010101010101010199
+:105800000101010101010101010101010101010188
+:105810000101010101010101010101010101010178
+:105820000101010101010101010101010101010168
+:105830000101010101010101010101010101010158
+:105840000101010101010101010101010101010148
+:105850000101010101010101010101010101010138
+:105860000101010101010101010101010101010128
+:105870000101010101010101010101010101010118
+:105880000101010101010101010101010101010108
+:1058900001010101010101010101010101010101F8
+:1058A00001010101010101010101010101010101E8
+:1058B00001010101010101010101010101010101D8
+:1058C00001010101010101010101010101010101C8
+:1058D00001010101010101010101010101010101B8
+:1058E00001010101010101010101010101010101A8
+:1058F0000101010101010101010101010101010198
+:105900000101010101010101010101010101010187
+:105910000101010101010101010101010101010177
+:105920000101010101010101010101010101010167
+:105930000101010101010101010101010101010157
+:105940000101010101010101010101010101010147
+:105950000101010101010101010101010101010137
+:105960000101010101010101010101010101010127
+:105970000101010101010101010101010101010117
+:105980000101010101010101010101010101010107
+:1059900001010101010101010101010101010101F7
+:1059A00001010101010101010101010101010101E7
+:1059B00001010101010101010101010101010101D7
+:1059C00001010101010101010101010101010101C7
+:1059D00001010101010101010101010101010101B7
+:1059E00001010101010101010101010101010101A7
+:1059F0000101010101010101010101010101010197
+:105A00000101010101010101010101010101010186
+:105A10000101010101010101010101010101010176
+:105A20000101010101010101010101010101010166
+:105A30000101010101010101010101010101010156
+:105A40000101010101010101010101010101010146
+:105A50000101010101010101010101010101010136
+:105A60000101010101010101010101010101010126
+:105A70000101010101010101010101010101010116
+:105A80000101010101010101010101010101010106
+:105A900001010101010101010101010101010101F6
+:105AA00001010101010101010101010101010101E6
+:105AB00001010101010101010101010101010101D6
+:105AC00001010101010101010101010101010101C6
+:105AD00001010101010101010101010101010101B6
+:105AE00001010101010101010101010101010101A6
+:105AF0000101010101010101010101010101010196
+:105B00000101010101010101010101010101010185
+:105B10000101010101010101010101010101010175
+:105B20000101010101010101010101010101010165
+:105B30000101010101010101010101010101010155
+:105B40000101010101010101010101010101010145
+:105B50000101010101010101010101010101010135
+:105B60000101010101010101010101010101010125
+:105B70000101010101010101010101010101010115
+:105B80000101010101010101010101010101010105
+:105B900001010101010101010101010101010101F5
+:105BA00001010101010101010101010101010101E5
+:105BB00001010101010101010101010101010101D5
+:105BC00001010101010101010101010101010101C5
+:105BD00001010101010101010101010101010101B5
+:105BE00001010101010101010101010101010101A5
+:105BF0000101010101010101010101010101010195
+:105C00000101010101010101010101010101010184
+:105C10000101010101010101010101010101010174
+:105C20000101010101010101010101010101010164
+:105C30000101010101010101010101010101010154
+:105C40000101010101010101010101010101010144
+:105C50000101010101010101010101010101010134
+:105C60000101010101010101010101010101010124
+:105C70000101010101010101010101010101010114
+:105C80000101010101010101010101010101010104
+:105C900001010101010101010101010101010101F4
+:105CA00001010101010101010101010101010101E4
+:105CB00001010101010101010101010101010101D4
+:105CC00001010101010101010101010101010101C4
+:105CD00001010101010101010101010101010101B4
+:105CE00001010101010101010101010101010101A4
+:105CF0000101010101010101010101010101010194
+:105D00000101010101010101010101010101010183
+:105D10000101010101010101010101010101010173
+:105D20000101010101010101010101010101010163
+:105D30000101010101010101010101010101010153
+:105D40000101010101010101010101010101010143
+:105D50000101010101010101010101010101010133
+:105D60000101010101010101010101010101010123
+:105D70000101010101010101010101010101010113
+:105D80000101010101010101010101010101010103
+:105D900001010101010101010101010101010101F3
+:105DA00001010101010101010101010101010101E3
+:105DB00001010101010101010101010101010101D3
+:105DC00001010101010101010101010101010101C3
+:105DD00001010101010101010101010101010101B3
+:105DE00001010101010101010101010101010101A3
+:105DF0000101010101010101010101010101010193
+:105E00000101010101010101010101010101010182
+:105E10000101010101010101010101010101010172
+:105E20000101010101010101010101010101010162
+:105E30000101010101010101010101010101010152
+:105E40000101010101010101010101010101010142
+:105E50000101010101010101010101010101010132
+:105E60000101010101010101010101010101010122
+:105E70000101010101010101010101010101010112
+:105E80000101010101010101010101010101010102
+:105E900001010101010101010101010101010101F2
+:105EA00001010101010101010101010101010101E2
+:105EB00001010101010101010101010101010101D2
+:105EC00001010101010101010101010101010101C2
+:105ED00001010101010101010101010101010101B2
+:105EE00001010101010101010101010101010101A2
+:105EF0000101010101010101010101010101010192
+:105F00000101010101010101010101010101010181
+:105F10000101010101010101010101010101010171
+:105F20000101010101010101010101010101010161
+:105F30000101010101010101010101010101010151
+:105F40000101010101010101010101010101010141
+:105F50000101010101010101010101010101010131
+:105F60000101010101010101010101010101010121
+:105F70000101010101010101010101010101010111
+:105F80000101010101010101010101010101010101
+:105F900001010101010101010101010101010101F1
+:105FA00001010101010101010101010101010101E1
+:105FB00001010101010101010101010101010101D1
+:105FC00001010101010101010101010101010101C1
+:105FD00001010101010101010101010101010101B1
+:105FE00001010101010101010101010101010101A1
+:105FF0000101010101010101010101010101010191
+:106000000101010101010101010101010101010180
+:106010000101010101010101010101010101010170
+:106020000101010101010101010101010101010160
+:106030000101010101010101010101010101010150
+:106040000101010101010101010101010101010140
+:106050000101010101010101010101010101010130
+:106060000101010101010101010101010101010120
+:106070000101010101010101010101010101010110
+:106080000101010101010101010101010101010100
+:1060900001010101010101010101010101010101F0
+:1060A00001010101010101010101010101010101E0
+:1060B00001010101010101010101010101010101D0
+:1060C00001010101010101010101010101010101C0
+:1060D00001010101010101010101010101010101B0
+:1060E00001010101010101010101010101010101A0
+:1060F0000101010101010101010101010101010190
+:10610000010101010101010101010101010101017F
+:10611000010101010101010101010101010101016F
+:10612000010101010101010101010101010101015F
+:10613000010101010101010101010101010101014F
+:10614000010101010101010101010101010101013F
+:10615000010101010101010101010101010101012F
+:10616000010101010101010101010101010101011F
+:10617000010101010101010101010101010101010F
+:1061800001010101010101010101010101010101FF
+:1061900001010101010101010101010101010101EF
+:1061A00001010101010101010101010101010101DF
+:1061B00001010101010101010101010101010101CF
+:1061C00001010101010101010101010101010101BF
+:1061D00001010101010101010101010101010101AF
+:1061E000010101010101010101010101010101019F
+:1061F000010101010101010101010101010101018F
+:10620000010101010101010101010101010101017E
+:10621000010101010101010101010101010101016E
+:10622000010101010101010101010101010101015E
+:10623000010101010101010101010101010101014E
+:10624000010101010101010101010101010101013E
+:10625000010101010101010101010101010101012E
+:10626000010101010101010101010101010101011E
+:10627000010101010101010101010101010101010E
+:1062800001010101010101010101010101010101FE
+:1062900001010101010101010101010101010101EE
+:1062A00001010101010101010101010101010101DE
+:1062B00001010101010101010101010101010101CE
+:1062C00001010101010101010101010101010101BE
+:1062D00001010101010101010101010101010101AE
+:1062E000010101010101010101010101010101019E
+:1062F000010101010101010101010101010101018E
+:10630000010101010101010101010101010101017D
+:10631000010101010101010101010101010101016D
+:10632000010101010101010101010101010101015D
+:10633000010101010101010101010101010101014D
+:10634000010101010101010101010101010101013D
+:10635000010101010101010101010101010101012D
+:10636000010101010101010101010101010101011D
+:10637000010101010101010101010101010101010D
+:1063800001010101010101010101010101010101FD
+:1063900001010101010101010101010101010101ED
+:1063A00001010101010101010101010101010101DD
+:1063B00001010101010101010101010101010101CD
+:1063C00001010101010101010101010101010101BD
+:1063D00001010101010101010101010101010101AD
+:1063E000010101010101010101010101010101019D
+:1063F000010101010101010101010101010101018D
+:10640000010101010101010101010101010101017C
+:10641000010101010101010101010101010101016C
+:10642000010101010101010101010101010101015C
+:10643000010101010101010101010101010101014C
+:10644000010101010101010101010101010101013C
+:10645000010101010101010101010101010101012C
+:10646000010101010101010101010101010101011C
+:10647000010101010101010101010101010101010C
+:1064800001010101010101010101010101010101FC
+:1064900001010101010101010101010101010101EC
+:1064A00001010101010101010101010101010101DC
+:1064B00001010101010101010101010101010101CC
+:1064C00001010101010101010101010101010101BC
+:1064D00001010101010101010101010101010101AC
+:1064E000010101010101010101010101010101019C
+:1064F000010101010101010101010101010101018C
+:10650000010101010101010101010101010101017B
+:10651000010101010101010101010101010101016B
+:10652000010101010101010101010101010101015B
+:10653000010101010101010101010101010101014B
+:10654000010101010101010101010101010101013B
+:10655000010101010101010101010101010101012B
+:10656000010101010101010101010101010101011B
+:10657000010101010101010101010101010101010B
+:1065800001010101010101010101010101010101FB
+:1065900001010101010101010101010101010101EB
+:1065A00001010101010101010101010101010101DB
+:1065B00001010101010101010101010101010101CB
+:1065C00001010101010101010101010101010101BB
+:1065D00001010101010101010101010101010101AB
+:1065E000010101010101010101010101010101019B
+:1065F000010101010101010101010101010101018B
+:10660000010101010101010101010101010101017A
+:10661000010101010101010101010101010101016A
+:10662000010101010101010101010101010101015A
+:10663000010101010101010101010101010101014A
+:10664000010101010101010101010101010101013A
+:10665000010101010101010101010101010101012A
+:10666000010101010101010101010101010101011A
+:10667000010101010101010101010101010101010A
+:1066800001010101010101010101010101010101FA
+:1066900001010101010101010101010101010101EA
+:1066A00001010101010101010101010101010101DA
+:1066B00001010101010101010101010101010101CA
+:1066C00001010101010101010101010101010101BA
+:1066D00001010101010101010101010101010101AA
+:1066E000010101010101010101010101010101019A
+:1066F000010101010101010101010101010101018A
+:106700000101010101010101010101010101010179
+:106710000101010101010101010101010101010169
+:106720000101010101010101010101010101010159
+:106730000101010101010101010101010101010149
+:106740000101010101010101010101010101010139
+:106750000101010101010101010101010101010129
+:106760000101010101010101010101010101010119
+:106770000101010101010101010101010101010109
+:1067800001010101010101010101010101010101F9
+:1067900001010101010101010101010101010101E9
+:1067A00001010101010101010101010101010101D9
+:1067B00001010101010101010101010101010101C9
+:1067C00001010101010101010101010101010101B9
+:1067D00001010101010101010101010101010101A9
+:1067E0000101010101010101010101010101010199
+:1067F0000101010101010101010101010101010189
+:106800000101010101010101010101010101010178
+:106810000101010101010101010101010101010168
+:106820000101010101010101010101010101010158
+:106830000101010101010101010101010101010148
+:106840000101010101010101010101010101010138
+:106850000101010101010101010101010101010128
+:106860000101010101010101010101010101010118
+:106870000101010101010101010101010101010108
+:1068800001010101010101010101010101010101F8
+:1068900001010101010101010101010101010101E8
+:1068A00001010101010101010101010101010101D8
+:1068B00001010101010101010101010101010101C8
+:1068C00001010101010101010101010101010101B8
+:1068D00001010101010101010101010101010101A8
+:1068E0000101010101010101010101010101010198
+:1068F0000101010101010101010101010101010188
+:106900000101010101010101010101010101010177
+:106910000101010101010101010101010101010167
+:106920000101010101010101010101010101010157
+:106930000101010101010101010101010101010147
+:106940000101010101010101010101010101010137
+:106950000101010101010101010101010101010127
+:106960000101010101010101010101010101010117
+:106970000101010101010101010101010101010107
+:1069800001010101010101010101010101010101F7
+:1069900001010101010101010101010101010101E7
+:1069A00001010101010101010101010101010101D7
+:1069B00001010101010101010101010101010101C7
+:1069C00001010101010101010101010101010101B7
+:1069D00001010101010101000000000000000000B0
+:1069E00000000000000000000000000000000000A7
+:1069F0000000000000000000000000000000000097
+:106A00000000000000000000000000000000000086
+:106A10000000000000000000000000000000000076
+:106A20000000000000000000000000000000000066
+:106A30000000000000000000000000000000000056
+:106A40000000000000000000000000000000000046
+:106A50000000000000000000000000000000000036
+:106A60000000000000000000000000000000000026
+:106A70000000000000000000000000000000000016
+:106A80000000000000000000000000000000000006
+:106A900000000000000000000000000000000000F6
+:106AA00000000000000000000000000000000000E6
+:106AB00000000000000000000000000000000000D6
+:106AC00000000000000000000000000000000000C6
+:106AD00000000000000000000000000000000000B6
+:106AE00000000000000000000000000000000000A6
+:106AF0000000000000000000000000000000000096
+:106B00000000000000000000000000000000000085
+:106B10000000000000000000000000000000000075
+:106B20000000000000000000000000000000000065
+:106B30000000000000000000000000000000000055
+:106B40000000000000000000000000000000000045
+:106B50000000000000000000000000000000000035
+:106B60000000000000000000000000000000000025
+:106B70000000000000000000000000000000000015
+:106B80000000000000000000000000000000000005
+:106B900000000000000000000000000000000000F5
+:106BA00000000000000000000000000000000000E5
+:106BB00000000000000000000000000000000000D5
+:106BC00000000000000000000000000000000000C5
+:106BD00000000000000000000000000000000000B5
+:106BE00000000000000000000000000000000000A5
+:106BF0000000000000000000000000000000000095
+:106C00000000000000000000000000000000000084
+:106C10000000000000000000000000000000000074
+:106C20000000000000000000000000000000000064
+:106C30000000000000000000000000000000000054
+:106C40000000000000000000000000000000000044
+:106C50000000000000000000000000000000000034
+:106C60000000000000000000000000000000000024
+:106C70000000000000000000000000000000000014
+:106C80000000000000000000000000000000000004
+:106C900000000000000000000000000000000000F4
+:106CA00000000000000000000000000000000000E4
+:106CB00000000000000000000000000000000000D4
+:106CC00000000000000000000000000000000000C4
+:106CD00000000000000000000000000000000000B4
+:106CE00000000000000000000000000000000000A4
+:106CF0000000000000000000000000000000000094
+:106D00000000000000000000000000000000000083
+:106D10000000000000000000000000000000000073
+:106D20000000000000000000000000000000000063
+:106D30000000000000000000000000000000000053
+:106D40000000000000000000000000000000000043
+:106D50000000000000000000000000000000000033
+:106D60000000000000000000000000000000000023
+:106D70000000000000000000000000000000000013
+:106D80000000000000000000000000000000000003
+:106D900000000000000000000000000000000000F3
+:106DA00000000000000000000000000000000000E3
+:106DB00000000000000000000000000000000000D3
+:106DC00000000000000000000000000000000000C3
+:106DD00000000000000000000000000000000000B3
+:106DE00000000000000000000000000000000000A3
+:106DF0000000000000000000000000000000000093
+:106E00000000000000000000000000000000000082
+:106E10000000000000000000000000000000000072
+:106E20000000000000000000000000000000000062
+:106E30000000000000000000000000000000000052
+:106E40000000000000000000000000000000000042
+:106E50000000000000000000000000000000000032
+:106E60000000000000000000000000000000000022
+:106E70000000000000000000000000000000000012
+:106E80000000000000000000000000000000000002
+:106E900000000000000000000000000000000000F2
+:106EA00000000000000000000000000000000000E2
+:106EB00000000000000000000000000000000000D2
+:106EC00000000000000000000000000000000000C2
+:106ED00000000000000000000000000000000000B2
+:106EE00000000000000000000000000000000000A2
+:106EF0000000000000000000000000000000000092
+:106F00000000000000000000000000000000000081
+:106F10000000000000000000000000000000000071
+:106F20000000000000000000000000000000000061
+:106F30000000000000000000000000000000000051
+:106F40000000000000000000000000000000000041
+:106F50000000000000000000000000000000000031
+:106F60000000000000000000000000000000000021
+:106F70000000000000000000000000000000000011
+:106F80000000000000000000000000000000000001
+:106F900000000000000000000000000000000000F1
+:106FA00000000000000000000000000000000000E1
+:106FB00000000000000000000000000000000000D1
+:106FC00000000000000000000000000000000000C1
+:106FD000000000000000000202020202020202029F
+:106FE0000202020202020202020202020202020281
+:106FF0000202020202020202020202020202020271
+:107000000202020202020202020202020202020260
+:107010000202020202020202020202020202020250
+:107020000202020202020202020202020202020240
+:107030000202020202020202020202020202020230
+:107040000202020202020202020202020202020220
+:107050000202020202020202020202020202020210
+:107060000202020202020202020202020202020200
+:1070700002020202020202020202020202020202F0
+:1070800002020202020202020202020202020202E0
+:1070900002020202020202020202020202020202D0
+:1070A00002020202020202020202020202020202C0
+:1070B00002020202020202020202020202020202B0
+:1070C00002020202020202020202020202020202A0
+:1070D0000202020202020202020202020202020290
+:1070E0000202020202020202020202020202020280
+:1070F0000202020202020202020202020202020270
+:10710000020202020202020202020202020202025F
+:10711000020202020202020202020202020202024F
+:10712000020202020202020202020202020202023F
+:10713000020202020202020202020202020202022F
+:10714000020202020202020202020202020202021F
+:10715000020202020202020202020202020202020F
+:1071600002020202020202020202020202020202FF
+:1071700002020202020202020202020202020202EF
+:1071800002020202020202020202020202020202DF
+:1071900002020202020202020202020202020202CF
+:1071A00002020202020202020202020202020202BF
+:1071B00002020202020202020202020202020202AF
+:1071C000020202020202020202020202020202029F
+:1071D000020202020202020202020202020202028F
+:1071E000020202020202020202020202020202027F
+:1071F000020202020202020202020202020202026F
+:10720000020202020202020202020202020202025E
+:10721000020202020202020202020202020202024E
+:10722000020202020202020202020202020202023E
+:10723000020202020202020202020202020202022E
+:10724000020202020202020202020202020202021E
+:10725000020202020202020202020202020202020E
+:1072600002020202020202020202020202020202FE
+:1072700002020202020202020202020202020202EE
+:1072800002020202020202020202020202020202DE
+:1072900002020202020202020202020202020202CE
+:1072A00002020202020202020202020202020202BE
+:1072B00002020202020202020202020202020202AE
+:1072C000020202020202020202020202020202029E
+:1072D000020202020202020202020202020202028E
+:1072E000020202020202020202020202020202027E
+:1072F000020202020202020202020202020202026E
+:10730000020202020202020202020202020202025D
+:10731000020202020202020202020202020202024D
+:10732000020202020202020202020202020202023D
+:10733000020202020202020202020202020202022D
+:10734000020202020202020202020202020202021D
+:10735000020202020202020202020202020202020D
+:1073600002020202020202020202020202020202FD
+:1073700002020202020202020202020202020202ED
+:1073800002020202020202020202020202020202DD
+:1073900002020202020202020202020202020202CD
+:1073A00002020202020202020202020202020202BD
+:1073B00002020202020202020202020202020202AD
+:1073C000020202020202020202020202020202029D
+:1073D000020202020202020202020202020202028D
+:1073E000020202020202020202020202020202027D
+:1073F000020202020202020202020202020202026D
+:10740000020202020202020202020202020202025C
+:10741000020202020202020202020202020202024C
+:10742000020202020202020202020202020202023C
+:10743000020202020202020202020202020202022C
+:10744000020202020202020202020202020202021C
+:10745000020202020202020202020202020202020C
+:1074600002020202020202020202020202020202FC
+:1074700002020202020202020202020202020202EC
+:1074800002020202020202020202020202020202DC
+:1074900002020202020202020202020202020202CC
+:1074A00002020202020202020202020202020202BC
+:1074B00002020202020202020202020202020202AC
+:1074C000020202020202020202020202020202029C
+:1074D000020202020202020202020202020202028C
+:1074E000020202020202020202020202020202027C
+:1074F000020202020202020202020202020202026C
+:10750000020202020202020202020202020202025B
+:10751000020202020202020202020202020202024B
+:10752000020202020202020202020202020202023B
+:10753000020202020202020202020202020202022B
+:10754000020202020202020202020202020202021B
+:10755000020202020202020202020202020202020B
+:1075600002020202020202020202020202020202FB
+:1075700002020202020202020202020202020202EB
+:1075800002020202020202020202020202020202DB
+:1075900002020202020202020202020202020202CB
+:1075A00002020202020202020202020202020202BB
+:1075B00002020202020202020202020202020202AB
+:1075C000020202020202020202020202020202029B
+:1075D000020202020202020202020202020202028B
+:1075E000020202020202020202020202020202027B
+:1075F000020202020202020202020202020202026B
+:10760000020202020202020202020202020202025A
+:10761000020202020202020202020202020202024A
+:10762000020202020202020202020202020202023A
+:10763000020202020202020202020202020202022A
+:10764000020202020202020202020202020202021A
+:10765000020202020202020202020202020202020A
+:1076600002020202020202020202020202020202FA
+:1076700002020202020202020202020202020202EA
+:1076800002020202020202020202020202020202DA
+:1076900002020202020202020202020202020202CA
+:1076A00002020202020202020202020202020202BA
+:1076B00002020202020202020202020202020202AA
+:1076C000020202020202020202020202020202029A
+:1076D000020202020202020202020202020202028A
+:1076E000020202020202020202020202020202027A
+:1076F000020202020202020202020202020202026A
+:107700000202020202020202020202020202020259
+:107710000202020202020202020202020202020249
+:107720000202020202020202020202020202020239
+:107730000202020202020202020202020202020229
+:107740000202020202020202020202020202020219
+:107750000202020202020202020202020202020209
+:1077600002020202020202020202020202020202F9
+:1077700002020202020202020202020202020202E9
+:1077800002020202020202020202020202020202D9
+:1077900002020202020202020202020202020202C9
+:1077A00002020202020202020202020202020202B9
+:1077B00002020202020202020202020202020202A9
+:1077C0000202020202020202020202020202020299
+:1077D0000202020202020202020202020202020289
+:1077E0000202020202020202020202020202020279
+:1077F0000202020202020202020202020202020269
+:107800000202020202020202020202020202020258
+:107810000202020202020202020202020202020248
+:107820000202020202020202020202020202020238
+:107830000202020202020202020202020202020228
+:107840000202020202020202020202020202020218
+:107850000202020202020202020202020202020208
+:1078600002020202020202020202020202020202F8
+:1078700002020202020202020202020202020202E8
+:1078800002020202020202020202020202020202D8
+:1078900002020202020202020202020202020202C8
+:1078A00002020202020202020202020202020202B8
+:1078B00002020202020202020202020202020202A8
+:1078C0000202020202020202020202020202020298
+:1078D0000202020202020202020202020202020288
+:1078E0000202020202020202020202020202020278
+:1078F0000202020202020202020202020202020268
+:107900000202020202020202020202020202020257
+:107910000202020202020202020202020202020247
+:107920000202020202020202020202020202020237
+:107930000202020202020202020202020202020227
+:107940000202020202020202020202020202020217
+:107950000202020202020202020202020202020207
+:1079600002020202020202020202020202020202F7
+:1079700002020202020202020202020202020202E7
+:1079800002020202020202020202020202020202D7
+:1079900002020202020202020202020202020202C7
+:1079A00002020202020202020202020202020202B7
+:1079B00002020202020202020202020202020202A7
+:1079C0000202020202020202020202020202020297
+:1079D0000202020202020202020202020202020287
+:1079E0000202020202020202020202020202020277
+:1079F0000202020202020202020202020202020267
+:107A00000202020202020202020202020202020256
+:107A10000202020202020202020202020202020246
+:107A20000202020202020202020202020202020236
+:107A30000202020202020202020202020202020226
+:107A40000202020202020202020202020202020216
+:107A50000202020202020202020202020202020206
+:107A600002020202020202020202020202020202F6
+:107A700002020202020202020202020202020202E6
+:107A800002020202020202020202020202020202D6
+:107A900002020202020202020202020202020202C6
+:107AA00002020202020202020202020202020202B6
+:107AB00002020202020202020202020202020202A6
+:107AC0000202020202020202020202020202020296
+:107AD0000202020202020202020202020202020286
+:107AE0000202020202020202020202020202020276
+:107AF0000202020202020202020202020202020266
+:107B00000202020202020202020202020202020255
+:107B10000202020202020202020202020202020245
+:107B20000202020202020202020202020202020235
+:107B30000202020202020202020202020202020225
+:107B40000202020202020202020202020202020215
+:107B50000202020202020202020202020202020205
+:107B600002020202020202020202020202020202F5
+:107B700002020202020202020202020202020202E5
+:107B800002020202020202020202020202020202D5
+:107B900002020202020202020202020202020202C5
+:107BA00002020202020202020202020202020202B5
+:107BB00002020202020202020202020202020202A5
+:107BC0000202020202020202020202020202020295
+:107BD0000202020202020202020202020202020285
+:107BE0000202020202020202020202020202020275
+:107BF0000202020202020202020202020202020265
+:107C00000202020202020202020202020202020254
+:107C10000202020202020202020202020202020244
+:107C20000202020202020202020202020202020234
+:107C30000202020202020202020202020202020224
+:107C40000202020202020202020202020202020214
+:107C50000202020202020202020202020202020204
+:107C600002020202020202020202020202020202F4
+:107C700002020202020202020202020202020202E4
+:107C800002020202020202020202020202020202D4
+:107C900002020202020202020202020202020202C4
+:107CA00002020202020202020202020202020202B4
+:107CB00002020202020202020202020202020202A4
+:107CC0000202020202020202020202020202020294
+:107CD0000202020202020202020202020202020284
+:107CE0000202020202020202020202020202020274
+:107CF0000202020202020202020202020202020264
+:107D00000202020202020202020202020202020253
+:107D10000202020202020202020202020202020243
+:107D20000202020202020202020202020202020233
+:107D30000202020202020202020202020202020223
+:107D40000202020202020202020202020202020213
+:107D50000202020202020202020202020202020203
+:107D600002020202020202020202020202020202F3
+:107D700002020202020202020202020202020202E3
+:107D800002020202020202020202020202020202D3
+:107D900002020202020202020202020202020202C3
+:107DA00002020202020202020202020202020202B3
+:107DB00002020202020202020202020202020202A3
+:107DC0000202020202020202020202020202020293
+:107DD0000202020202020202020202020202020283
+:107DE0000202020202020202020202020202020273
+:107DF0000202020202020202020202020202020263
+:107E00000202020202020202020202020202020252
+:107E10000202020202020202020202020202020242
+:107E20000202020202020202020202020202020232
+:107E30000202020202020202020202020202020222
+:107E40000202020202020202020202020202020212
+:107E50000202020202020202020202020202020202
+:107E600002020202020202020202020202020202F2
+:107E700002020202020202020202020202020202E2
+:107E800002020202020202020202020202020202D2
+:107E900002020202020202020202020202020202C2
+:107EA00002020202020202020202020202020202B2
+:107EB00002020202020202020202020202020202A2
+:107EC0000202020202020202020202020202020292
+:107ED0000202020202020202020202020202020282
+:107EE0000202020202020202020202020202020272
+:107EF0000202020202020202020202020202020262
+:107F00000202020202020202020202020202020251
+:107F10000202020202020202020202020202020241
+:107F20000202020202020202020202020202020231
+:107F30000202020202020202020202020202020221
+:107F40000202020202020202020202020202020211
+:107F50000202020202020202020202020202020201
+:107F600002020202020202020202020202020202F1
+:107F700002020202020202020202020202020202E1
+:107F800002020202020202020202020202020202D1
+:107F900002020202020202020202020202020202C1
+:107FA00002020202020202020202020202020202B1
+:107FB00002020202020202020202020202020202A1
+:107FC0000202020202020202020202020202020291
+:107FD0000202020202020202020202020202020281
+:107FE0000202020202020202020202020202020271
+:107FF0000202020202020202020202020202020261
+:108000000202020202020202020202020202020250
+:108010000202020202020202020202020202020240
+:108020000202020202020202020202020202020230
+:108030000202020202020202020202020202020220
+:108040000202020202020202020202020202020210
+:108050000202020202020202020202020202020200
+:1080600002020202020202020202020202020202F0
+:1080700002020202020202020202020202020202E0
+:1080800002020202020202020202020202020202D0
+:1080900002020202020202020202020202020202C0
+:1080A00002020202020202020202020202020202B0
+:1080B00002020202020202020202020202020202A0
+:1080C0000202020202020202020202020202020290
+:1080D0000202020202020202020202020202020280
+:1080E0000202020202020202020202020202020270
+:1080F0000202020202020202020202020202020260
+:10810000020202020202020202020202020202024F
+:10811000020202020202020202020202020202023F
+:10812000020202020202020202020202020202022F
+:10813000020202020202020202020202020202021F
+:10814000020202020202020202020202020202020F
+:1081500002020202020202020202020202020202FF
+:1081600002020202020202020202020202020202EF
+:1081700002020202020202020202020202020202DF
+:1081800002020202020202020202020202020202CF
+:1081900002020202020202020202020202020202BF
+:1081A00002020202020202020202020202020202AF
+:1081B000020202020202020202020202020202029F
+:1081C000020202020202020202020202020202028F
+:1081D000020202020202020202020202020202027F
+:1081E000020202020202020202020202020202026F
+:1081F000020202020202020202020202020202025F
+:10820000020202020202020202020202020202024E
+:10821000020202020202020202020202020202023E
+:10822000020202020202020202020202020202022E
+:10823000020202020202020202020202020202021E
+:10824000020202020202020202020202020202020E
+:1082500002020202020202020202020202020202FE
+:1082600002020202020202020202020202020202EE
+:1082700002020202020202020202020202020202DE
+:1082800002020202020202020202020202020202CE
+:1082900002020202020202020202020202020202BE
+:1082A00002020202020202020202020202020202AE
+:1082B000020202020202020202020202020202029E
+:1082C000020202020202020202020202020202028E
+:1082D000020202020202020202020202020202027E
+:1082E000020202020202020202020202020202026E
+:1082F000020202020202020202020202020202025E
+:10830000020202020202020202020202020202024D
+:10831000020202020202020202020202020202023D
+:10832000020202020202020202020202020202022D
+:10833000020202020202020202020202020202021D
+:10834000020202020202020202020202020202020D
+:1083500002020202020202020202020202020202FD
+:1083600002020202020202020202020202020202ED
+:1083700002020202020202020202020202020202DD
+:1083800002020202020202020202020202020202CD
+:1083900002020202020202020202020202020202BD
+:1083A00002020202020202020202020202020202AD
+:1083B000020202020202020202020202020202029D
+:1083C000020202020202020202020202020202028D
+:1083D000020202020202020202020202020202027D
+:1083E000020202020202020202020202020202026D
+:1083F000020202020202020202020202020202025D
+:10840000020202020202020202020202020202024C
+:10841000020202020202020202020202020202023C
+:10842000020202020202020202020202020202022C
+:10843000020202020202020202020202020202021C
+:10844000020202020202020202020202020202020C
+:1084500002020202020202020202020202020202FC
+:1084600002020202020202020202020202020202EC
+:1084700002020202020202020202020202020202DC
+:1084800002020202020202020202020202020202CC
+:1084900002020202020202020202020202020202BC
+:1084A00002020202020202020202020202020202AC
+:1084B000020202020202020202020202020202029C
+:1084C000020202020202020202020202020202028C
+:1084D000020202020202020202020202020202027C
+:1084E000020202020202020202020202020202026C
+:1084F000020202020202020202020202020202025C
+:10850000020202020202020202020202020202024B
+:10851000020202020202020202020202020202023B
+:10852000020202020202020202020202020202022B
+:10853000020202020202020202020202020202021B
+:10854000020202020202020202020202020202020B
+:1085500002020202020202020202020202020202FB
+:1085600002020202020202020202020202020202EB
+:1085700002020202020202020202020202020202DB
+:1085800002020202020202020202020202020202CB
+:1085900002020202020202020202020202020202BB
+:1085A00002020202020202020202020202020202AB
+:1085B000020202020202020202020202020202029B
+:1085C000020202020202020202020202020202028B
+:1085D000020202020202020202020202020202027B
+:1085E000020202020202020202020202020202026B
+:1085F000020202020202020202020202020202025B
+:10860000020202020202020202020202020202024A
+:10861000020202020202020202020202020202023A
+:10862000020202020202020202020202020202022A
+:10863000020202020202020202020202020202021A
+:10864000020202020202020202020202020202020A
+:1086500002020202020202020202020202020202FA
+:1086600002020202020202020202020202020202EA
+:1086700002020202020202020202020202020202DA
+:1086800002020202020202020202020202020202CA
+:1086900002020202020202020202020202020202BA
+:1086A00002020202020202020202020202020202AA
+:1086B000020202020202020202020202020202029A
+:1086C000020202020202020202020202020202028A
+:1086D000020202020202020202020202020202027A
+:1086E000020202020202020202020202020202026A
+:1086F000020202020202020202020202020202025A
+:108700000202020202020202020202020202020249
+:108710000202020202020202020202020202020239
+:108720000202020202020202020202020202020229
+:108730000202020202020202020202020202020219
+:108740000202020202020202020202020202020209
+:1087500002020202020202020202020202020202F9
+:1087600002020202020202020202020202020202E9
+:1087700002020202020202020202020202020202D9
+:1087800002020202020202020202020202020202C9
+:1087900002020202020202020202020202020202B9
+:1087A00002020202020202020202020202020202A9
+:1087B0000202020202020202020202020202020299
+:1087C0000202020202020202020202020202020289
+:1087D0000202020202020202020202020202020279
+:1087E0000202020202020202020202020202020269
+:1087F0000202020202020202020202020202020259
+:108800000202020202020202020202020202020248
+:108810000202020202020202020202020202020238
+:108820000202020202020202020202020202020228
+:108830000202020202020202020202020202020218
+:108840000202020202020202020202020202020208
+:1088500002020202020202020202020202020202F8
+:1088600002020202020202020202020202020202E8
+:1088700002020202020202020202020202020202D8
+:1088800002020202020202020202020202020202C8
+:1088900002020202020202020202020202020202B8
+:1088A00002020202020202020202020202020202A8
+:1088B0000202020202020202020202020202020298
+:1088C0000202020202020202020202020202020288
+:1088D0000202020202020202020202020202020278
+:1088E0000202020202020202020202020202020268
+:1088F0000202020202020202020202020202020258
+:108900000202020202020202020202020202020247
+:108910000202020202020202020202020202020237
+:108920000202020202020202020202020202020227
+:108930000202020202020202020202020202020217
+:108940000202020202020202020202020202020207
+:1089500002020202020202020202020202020202F7
+:1089600002020202020202020202020202020202E7
+:1089700002020202020202020202020202020202D7
+:1089800002020202020202020202020202020202C7
+:1089900002020202020202020202020202020202B7
+:1089A00002020202020202020202020202020202A7
+:1089B0000202020202020202020202020202020297
+:1089C0000202020202020202020202020202020287
+:1089D0000202020202020202020202020202020277
+:1089E0000202020202020202020202020202020267
+:1089F0000202020202020202020202020202020257
+:108A00000202020202020202020202020202020246
+:108A10000202020202020202020202020202020236
+:108A20000202020202020202020202020202020226
+:108A30000202020202020202020202020202020216
+:108A40000202020202020202020202020202020206
+:108A500002020202020202020202020202020202F6
+:108A600002020202020202020202020202020202E6
+:108A700002020202020202020202020202020202D6
+:108A800002020202020202020202020202020202C6
+:108A900002020202020202020202020202020202B6
+:108AA00002020202020202020202020202020202A6
+:108AB0000202020202020202020202020202020296
+:108AC0000202020202020202020202020202020286
+:108AD0000202020202020202020202020202020276
+:108AE0000202020202020202020202020202020266
+:108AF0000202020202020202020202020202020256
+:108B00000202020202020202020202020202020245
+:108B10000202020202020202020202020202020235
+:108B20000202020202020202020202020202020225
+:108B30000202020202020202020202020202020215
+:108B40000202020202020202020202020202020205
+:108B500002020202020202020202020202020202F5
+:108B600002020202020202020202020202020202E5
+:108B700002020202020202020202020202020202D5
+:108B800002020202020202020202020202020202C5
+:108B900002020202020202020202020202020202B5
+:108BA00002020202020202020202020202020202A5
+:108BB0000202020202020202020202020202020295
+:108BC0000202020202020202020202020202020285
+:108BD0000202020202020202020202020202020275
+:108BE0000202020202020202020202020202020265
+:108BF0000202020202020202020202020202020255
+:108C00000202020202020202020202020202020244
+:108C10000202020202020202020202020202020234
+:108C20000202020202020202020202020202020224
+:108C30000202020202020202020202020202020214
+:108C40000202020202020202020202020202020204
+:108C500002020202020202020202020202020202F4
+:108C600002020202020202020202020202020202E4
+:108C700002020202020202020202020202020202D4
+:108C800002020202020202020202020202020202C4
+:108C900002020202020202020202020202020202B4
+:108CA00002020202020202020202020202020202A4
+:108CB0000202020202020202020202020202020294
+:108CC0000202020202020202020202020202020284
+:108CD0000202020202020200000000000000000086
+:108CE0000000000000000000000000000000000084
+:108CF0000000000000000000000000000000000074
+:108D00000000000000000000000000000000000063
+:108D10000000000000000000000000000000000053
+:108D20000000000000000000000000000000000043
+:108D30000000000000000000000000000000000033
+:108D40000000000000000000000000000000000023
+:108D50000000000000000000000000000000000013
+:108D60000000000000000000000000000000000003
+:108D700000000000000000000000000000000000F3
+:108D800000000000000000000000000000000000E3
+:108D900000000000000000000000000000000000D3
+:108DA00000000000000000000000000000000000C3
+:108DB00000000000000000000000000000000000B3
+:108DC00000000000000000000000000000000000A3
+:108DD0000000000000000000000000000000000093
+:108DE0000000000000000000000000000000000083
+:108DF0000000000000000000000000000000000073
+:108E00000000000000000000000000000000000062
+:108E10000000000000000000000000000000000052
+:108E20000000000000000000000000000000000042
+:108E30000000000000000000000000000000000032
+:108E40000000000000000000000000000000000022
+:108E50000000000000000000000000000000000012
+:108E60000000000000000000000000000000000002
+:108E700000000000000000000000000000000000F2
+:108E800000000000000000000000000000000000E2
+:108E900000000000000000000000000000000000D2
+:108EA00000000000000000000000000000000000C2
+:108EB00000000000000000000000000000000000B2
+:108EC00000000000000000000000000000000000A2
+:108ED0000000000000000000000000000000000092
+:108EE0000000000000000000000000000000000082
+:108EF0000000000000000000000000000000000072
+:108F00000000000000000000000000000000000061
+:108F10000000000000000000000000000000000051
+:108F20000000000000000000000000000000000041
+:108F30000000000000000000000000000000000031
+:108F40000000000000000000000000000000000021
+:108F50000000000000000000000000000000000011
+:108F60000000000000000000000000000000000001
+:108F700000000000000000000000000000000000F1
+:108F800000000000000000000000000000000000E1
+:108F900000000000000000000000000000000000D1
+:108FA00000000000000000000000000000000000C1
+:108FB00000000000000000000000000000000000B1
+:108FC00000000000000000000000000000000000A1
+:108FD0000000000000000000000000000000000091
+:108FE0000000000000000000000000000000000081
+:108FF0000000000000000000000000000000000071
+:109000000000000000000000000000000000000060
+:109010000000000000000000000000000000000050
+:109020000000000000000000000000000000000040
+:109030000000000000000000000000000000000030
+:109040000000000000000000000000000000000020
+:109050000000000000000000000000000000000010
+:109060000000000000000000000000000000000000
+:1090700000000000000000000000000000000000F0
+:1090800000000000000000000000000000000000E0
+:1090900000000000000000000000000000000000D0
+:1090A00000000000000000000000000000000000C0
+:1090B00000000000000000000000000000000000B0
+:1090C00000000000000000000000000000000000A0
+:1090D0000000000000000000000000000000000090
+:1090E0000000000000000000000000000000000080
+:1090F0000000000000000000000000000000000070
+:10910000000000000000000000000000000000005F
+:10911000000000000000000000000000000000004F
+:10912000000000000000000000000000000000003F
+:10913000000000000000000000000000000000002F
+:10914000000000000000000000000000000000001F
+:10915000000000000000000000000000000000000F
+:1091600000000000000000000000000000000000FF
+:1091700000000000000000000000000000000000EF
+:1091800000000000000000000000000000000000DF
+:1091900000000000000000000000000000000000CF
+:1091A00000000000000000000000000000000000BF
+:1091B00000000000000000000000000000000000AF
+:1091C000000000000000000000000000000000009F
+:1091D000000000000000000000000000000000008F
+:1091E000000000000000000000000000000000007F
+:1091F000000000000000000000000000000000006F
+:10920000000000000000000000000000000000005E
+:10921000000000000000000000000000000000004E
+:10922000000000000000000000000000000000003E
+:10923000000000000000000000000000000000002E
+:10924000000000000000000000000000000000001E
+:10925000000000000000000000000000000000000E
+:1092600000000000000000000000000000000000FE
+:1092700000000000000000000000000000000000EE
+:1092800000000000000000000000000000000000DE
+:1092900000000000000000000000000000000000CE
+:1092A00000000000000000000000000000000000BE
+:1092B00000000000000000000000000000000000AE
+:1092C000000000000000000000000000000000009E
+:1092D000000000000000000000000000000000008E
+:1092E000000000000000000000000000000000007E
+:1092F000000000000000000000000000000000006E
+:10930000000000000000000000000000000000005D
+:10931000000000000000000000000000000000004D
+:10932000000000000000000000000000000000003D
+:10933000000000000000000000000000000000002D
+:10934000000000000000000000000000000000001D
+:10935000000000000000000000000000000000000D
+:1093600000000000000000000000000000000000FD
+:1093700000000000000000000000000000000000ED
+:1093800000000000000000000000000000000000DD
+:1093900000000000000000000000000000000000CD
+:1093A00000000000000000000000000000000000BD
+:1093B00000000000000000000000000000000000AD
+:1093C000000000000000000000000000000000009D
+:1093D000000000000000000000000000000000008D
+:1093E000000000000000000000000000000000007D
+:1093F000000000000000000000000000000000006D
+:10940000000000000000000000000000000000005C
+:10941000000000000000000000000000000000004C
+:10942000000000000000000000000000000000003C
+:10943000000000000000000000000000000000002C
+:10944000000000000000000000000000000000001C
+:10945000000000000000000000000000000000000C
+:1094600000000000000000000000000000000000FC
+:1094700000000000000000000000000000000000EC
+:1094800000000000000000000000000000000000DC
+:1094900000000000000000000000000000000000CC
+:1094A00000000000000000000000000000000000BC
+:1094B00000000000000000000000000000000000AC
+:1094C000000000000000000000000000000000009C
+:1094D000000000000000000000000000000000008C
+:1094E000000000000000000000000000000000007C
+:1094F000000000000000000000000000000000006C
+:10950000000000000000000000000000000000005B
+:10951000000000000000000000000000000000004B
+:10952000000000000000000000000000000000003B
+:10953000000000000000000000000000000000002B
+:10954000000000000000000000000000000000001B
+:10955000000000000000000000000000000000000B
+:1095600000000000000000000000000000000000FB
+:1095700000000000000000000000000000000000EB
+:1095800000000000000000000000000000000000DB
+:1095900000000000000000000000000000000000CB
+:1095A00000000000000000000000000000000000BB
+:1095B00000000000000000000000000000000000AB
+:1095C000000000000000000000000000000000009B
+:1095D0000000000000000081000000000000000109
+:1095E000010101010101010101010101010101016B
+:1095F000010101010101010101010101010101015B
+:10960000010101010101010101010101010101014A
+:10961000010101010101010101010101010101013A
+:10962000010101010101010101010101010101012A
+:10963000010101010101010101010101010101011A
+:10964000010101010101010101010101010101010A
+:1096500001010101010101010101010101010101FA
+:1096600001010101010101010101010101010101EA
+:1096700001010101010101010101010101010101DA
+:1096800001010101010101010101010101010101CA
+:1096900001010101010101010101010101010101BA
+:1096A00001010101010101010101010101010101AA
+:1096B000010101010101010101010101010101019A
+:1096C000010101010101010101010101010101018A
+:1096D000010101010101010101010101010101017A
+:1096E000010101010101010101010101010101016A
+:1096F000010101010101010101010101010101015A
+:109700000101010101010101010101010101010149
+:109710000101010101010101010101010101010139
+:109720000101010101010101010101010101010129
+:109730000101010101010101010101010101010119
+:109740000101010101010101010101010101010109
+:1097500001010101010101010101010101010101F9
+:1097600001010101010101010101010101010101E9
+:1097700001010101010101010101010101010101D9
+:1097800001010101010101010101010101010101C9
+:1097900001010101010101010101010101010101B9
+:1097A00001010101010101010101010101010101A9
+:1097B0000101010101010101010101010101010199
+:1097C0000101010101010101010101010101010189
+:1097D0000101010101010101010101010101010179
+:1097E0000101010101010101010101010101010169
+:1097F0000101010101010101010101010101010159
+:109800000101010101010101010101010101010148
+:109810000101010101010101010101010101010138
+:109820000101010101010101010101010101010128
+:109830000101010101010101010101010101010118
+:109840000101010101010101010101010101010108
+:1098500001010101010101010101010101010101F8
+:1098600001010101010101010101010101010101E8
+:1098700001010101010101010101010101010101D8
+:1098800001010101010101010101010101010101C8
+:1098900001010101010101010101010101010101B8
+:1098A00001010101010101010101010101010101A8
+:1098B0000101010101010101010101010101010198
+:1098C0000101010101010101010101010101010188
+:1098D0000101010101010101010101010101010178
+:1098E0000101010101010101010101010101010168
+:1098F0000101010101010101010101010101010158
+:109900000101010101010101010101010101010147
+:109910000101010101010101010101010101010137
+:109920000101010101010101010101010101010127
+:109930000101010101010101010101010101010117
+:109940000101010101010101010101010101010107
+:1099500001010101010101010101010101010101F7
+:1099600001010101010101010101010101010101E7
+:1099700001010101010101010101010101010101D7
+:1099800001010101010101010101010101010101C7
+:1099900001010101010101010101010101010101B7
+:1099A00001010101010101010101010101010101A7
+:1099B0000101010101010101010101010101010197
+:1099C0000101010101010101010101010101010187
+:1099D0000101010101010101010101010101010177
+:1099E0000101010101010101010101010101010167
+:1099F0000101010101010101010101010101010157
+:109A00000101010101010101010101010101010146
+:109A10000101010101010101010101010101010136
+:109A20000101010101010101010101010101010126
+:109A30000101010101010101010101010101010116
+:109A40000101010101010101010101010101010106
+:109A500001010101010101010101010101010101F6
+:109A600001010101010101010101010101010101E6
+:109A700001010101010101010101010101010101D6
+:109A800001010101010101010101010101010101C6
+:109A900001010101010101010101010101010101B6
+:109AA00001010101010101010101010101010101A6
+:109AB0000101010101010101010101010101010196
+:109AC0000101010101010101010101010101010186
+:109AD0000101010101010101010101010101010176
+:109AE0000101010101010101010101010101010166
+:109AF0000101010101010101010101010101010156
+:109B00000101010101010101010101010101010145
+:109B10000101010101010101010101010101010135
+:109B20000101010101010101010101010101010125
+:109B30000101010101010101010101010101010115
+:109B40000101010101010101010101010101010105
+:109B500001010101010101010101010101010101F5
+:109B600001010101010101010101010101010101E5
+:109B700001010101010101010101010101010101D5
+:109B800001010101010101010101010101010101C5
+:109B900001010101010101010101010101010101B5
+:109BA00001010101010101010101010101010101A5
+:109BB0000101010101010101010101010101010195
+:109BC0000101010101010101010101010101010185
+:109BD0000101010101010101010101010101010175
+:109BE0000101010101010101010101010101010165
+:109BF0000101010101010101010101010101010155
+:109C00000101010101010101010101010101010144
+:109C10000101010101010101010101010101010134
+:109C20000101010101010101010101010101010124
+:109C30000101010101010101010101010101010114
+:109C40000101010101010101010101010101010104
+:109C500001010101010101010101010101010101F4
+:109C600001010101010101010101010101010101E4
+:109C700001010101010101010101010101010101D4
+:109C800001010101010101010101010101010101C4
+:109C900001010101010101010101010101010101B4
+:109CA00001010101010101010101010101010101A4
+:109CB0000101010101010101010101010101010194
+:109CC0000101010101010101010101010101010184
+:109CD0000101010101010101010101010101010174
+:109CE0000101010101010101010101010101010164
+:109CF0000101010101010101010101010101010154
+:109D00000101010101010101010101010101010143
+:109D10000101010101010101010101010101010133
+:109D20000101010101010101010101010101010123
+:109D30000101010101010101010101010101010113
+:109D40000101010101010101010101010101010103
+:109D500001010101010101010101010101010101F3
+:109D600001010101010101010101010101010101E3
+:109D700001010101010101010101010101010101D3
+:109D800001010101010101010101010101010101C3
+:109D900001010101010101010101010101010101B3
+:109DA00001010101010101010101010101010101A3
+:109DB0000101010101010101010101010101010193
+:109DC0000101010101010101010101010101010183
+:109DD0000101010101010101010101010101010173
+:109DE0000101010101010101010101010101010163
+:109DF0000101010101010101010101010101010153
+:109E00000101010101010101010101010101010142
+:109E10000101010101010101010101010101010132
+:109E20000101010101010101010101010101010122
+:109E30000101010101010101010101010101010112
+:109E40000101010101010101010101010101010102
+:109E500001010101010101010101010101010101F2
+:109E600001010101010101010101010101010101E2
+:109E700001010101010101010101010101010101D2
+:109E800001010101010101010101010101010101C2
+:109E900001010101010101010101010101010101B2
+:109EA00001010101010101010101010101010101A2
+:109EB0000101010101010101010101010101010192
+:109EC0000101010101010101010101010101010182
+:109ED0000101010101010101010101010101010172
+:109EE0000101010101010101010101010101010162
+:109EF0000101010101010101010101010101010152
+:109F00000101010101010101010101010101010141
+:109F10000101010101010101010101010101010131
+:109F20000101010101010101010101010101010121
+:109F30000101010101010101010101010101010111
+:109F40000101010101010101010101010101010101
+:109F500001010101010101010101010101010101F1
+:109F600001010101010101010101010101010101E1
+:109F700001010101010101010101010101010101D1
+:109F800001010101010101010101010101010101C1
+:109F900001010101010101010101010101010101B1
+:109FA00001010101010101010101010101010101A1
+:109FB0000101010101010101010101010101010191
+:109FC0000101010101010101010101010101010181
+:109FD0000101010101010101010101010101010171
+:109FE0000101010101010101010101010101010161
+:109FF0000101010101010101010101010101010151
+:10A000000101010101010101010101010101010140
+:10A010000101010101010101010101010101010130
+:10A020000101010101010101010101010101010120
+:10A030000101010101010101010101010101010110
+:10A040000101010101010101010101010101010100
+:10A0500001010101010101010101010101010101F0
+:10A0600001010101010101010101010101010101E0
+:10A0700001010101010101010101010101010101D0
+:10A0800001010101010101010101010101010101C0
+:10A0900001010101010101010101010101010101B0
+:10A0A00001010101010101010101010101010101A0
+:10A0B0000101010101010101010101010101010190
+:10A0C0000101010101010101010101010101010180
+:10A0D0000101010101010101010101010101010170
+:10A0E0000101010101010101010101010101010160
+:10A0F0000101010101010101010101010101010150
+:10A10000010101010101010101010101010101013F
+:10A11000010101010101010101010101010101012F
+:10A12000010101010101010101010101010101011F
+:10A13000010101010101010101010101010101010F
+:10A1400001010101010101010101010101010101FF
+:10A1500001010101010101010101010101010101EF
+:10A1600001010101010101010101010101010101DF
+:10A1700001010101010101010101010101010101CF
+:10A1800001010101010101010101010101010101BF
+:10A1900001010101010101010101010101010101AF
+:10A1A000010101010101010101010101010101019F
+:10A1B000010101010101010101010101010101018F
+:10A1C000010101010101010101010101010101017F
+:10A1D000010101010101010101010101010101016F
+:10A1E000010101010101010101010101010101015F
+:10A1F000010101010101010101010101010101014F
+:10A20000010101010101010101010101010101013E
+:10A21000010101010101010101010101010101012E
+:10A22000010101010101010101010101010101011E
+:10A23000010101010101010101010101010101010E
+:10A2400001010101010101010101010101010101FE
+:10A2500001010101010101010101010101010101EE
+:10A2600001010101010101010101010101010101DE
+:10A2700001010101010101010101010101010101CE
+:10A2800001010101010101010101010101010101BE
+:10A2900001010101010101010101010101010101AE
+:10A2A000010101010101010101010101010101019E
+:10A2B000010101010101010101010101010101018E
+:10A2C000010101010101010101010101010101017E
+:10A2D000010101010101010101010101010101016E
+:10A2E000010101010101010101010101010101015E
+:10A2F000010101010101010101010101010101014E
+:10A30000010101010101010101010101010101013D
+:10A31000010101010101010101010101010101012D
+:10A32000010101010101010101010101010101011D
+:10A33000010101010101010101010101010101010D
+:10A3400001010101010101010101010101010101FD
+:10A3500001010101010101010101010101010101ED
+:10A3600001010101010101010101010101010101DD
+:10A3700001010101010101010101010101010101CD
+:10A3800001010101010101010101010101010101BD
+:10A3900001010101010101010101010101010101AD
+:10A3A000010101010101010101010101010101019D
+:10A3B000010101010101010101010101010101018D
+:10A3C000010101010101010101010101010101017D
+:10A3D000010101010101010101010101010101016D
+:10A3E000010101010101010101010101010101015D
+:10A3F000010101010101010101010101010101014D
+:10A40000010101010101010101010101010101013C
+:10A41000010101010101010101010101010101012C
+:10A42000010101010101010101010101010101011C
+:10A43000010101010101010101010101010101010C
+:10A4400001010101010101010101010101010101FC
+:10A4500001010101010101010101010101010101EC
+:10A4600001010101010101010101010101010101DC
+:10A4700001010101010101010101010101010101CC
+:10A4800001010101010101010101010101010101BC
+:10A4900001010101010101010101010101010101AC
+:10A4A000010101010101010101010101010101019C
+:10A4B000010101010101010101010101010101018C
+:10A4C000010101010101010101010101010101017C
+:10A4D000010101010101010101010101010101016C
+:10A4E000010101010101010101010101010101015C
+:10A4F000010101010101010101010101010101014C
+:10A50000010101010101010101010101010101013B
+:10A51000010101010101010101010101010101012B
+:10A52000010101010101010101010101010101011B
+:10A53000010101010101010101010101010101010B
+:10A5400001010101010101010101010101010101FB
+:10A5500001010101010101010101010101010101EB
+:10A5600001010101010101010101010101010101DB
+:10A5700001010101010101010101010101010101CB
+:10A5800001010101010101010101010101010101BB
+:10A5900001010101010101010101010101010101AB
+:10A5A000010101010101010101010101010101019B
+:10A5B000010101010101010101010101010101018B
+:10A5C000010101010101010101010101010101017B
+:10A5D000010101010101010101010101010101016B
+:10A5E000010101010101010101010101010101015B
+:10A5F000010101010101010101010101010101014B
+:10A60000010101010101010101010101010101013A
+:10A61000010101010101010101010101010101012A
+:10A62000010101010101010101010101010101011A
+:10A63000010101010101010101010101010101010A
+:10A6400001010101010101010101010101010101FA
+:10A6500001010101010101010101010101010101EA
+:10A6600001010101010101010101010101010101DA
+:10A6700001010101010101010101010101010101CA
+:10A6800001010101010101010101010101010101BA
+:10A6900001010101010101010101010101010101AA
+:10A6A000010101010101010101010101010101019A
+:10A6B000010101010101010101010101010101018A
+:10A6C000010101010101010101010101010101017A
+:10A6D000010101010101010101010101010101016A
+:10A6E000010101010101010101010101010101015A
+:10A6F000010101010101010101010101010101014A
+:10A700000101010101010101010101010101010139
+:10A710000101010101010101010101010101010129
+:10A720000101010101010101010101010101010119
+:10A730000101010101010101010101010101010109
+:10A7400001010101010101010101010101010101F9
+:10A7500001010101010101010101010101010101E9
+:10A7600001010101010101010101010101010101D9
+:10A7700001010101010101010101010101010101C9
+:10A7800001010101010101010101010101010101B9
+:10A7900001010101010101010101010101010101A9
+:10A7A0000101010101010101010101010101010199
+:10A7B0000101010101010101010101010101010189
+:10A7C0000101010101010101010101010101010179
+:10A7D0000101010101010101010101010101010169
+:10A7E0000101010101010101010101010101010159
+:10A7F0000101010101010101010101010101010149
+:10A800000101010101010101010101010101010138
+:10A810000101010101010101010101010101010128
+:10A820000101010101010101010101010101010118
+:10A830000101010101010101010101010101010108
+:10A8400001010101010101010101010101010101F8
+:10A8500001010101010101010101010101010101E8
+:10A8600001010101010101010101010101010101D8
+:10A8700001010101010101010101010101010101C8
+:10A8800001010101010101010101010101010101B8
+:10A8900001010101010101010101010101010101A8
+:10A8A0000101010101010101010101010101010198
+:10A8B0000101010101010101010101010101010188
+:10A8C0000101010101010101010101010101010178
+:10A8D0000101010101010101010101010101010168
+:10A8E0000101010101010101010101010101010158
+:10A8F0000101010101010101010101010101010148
+:10A900000101010101010101010101010101010137
+:10A910000101010101010101010101010101010127
+:10A920000101010101010101010101010101010117
+:10A930000101010101010101010101010101010107
+:10A9400001010101010101010101010101010101F7
+:10A9500001010101010101010101010101010101E7
+:10A9600001010101010101010101010101010101D7
+:10A9700001010101010101010101010101010101C7
+:10A9800001010101010101010101010101010101B7
+:10A9900001010101010101010101010101010101A7
+:10A9A0000101010101010101010101010101010197
+:10A9B0000101010101010101010101010101010187
+:10A9C0000101010101010101010101010101010177
+:10A9D0000101010101010101010101010101010167
+:10A9E0000101010101010101010101010101010157
+:10A9F0000101010101010101010101010101010147
+:10AA00000101010101010101010101010101010136
+:10AA10000101010101010101010101010101010126
+:10AA20000101010101010101010101010101010116
+:10AA30000101010101010101010101010101010106
+:10AA400001010101010101010101010101010101F6
+:10AA500001010101010101010101010101010101E6
+:10AA600001010101010101010101010101010101D6
+:10AA700001010101010101010101010101010101C6
+:10AA800001010101010101010101010101010101B6
+:10AA900001010101010101010101010101010101A6
+:10AAA0000101010101010101010101010101010196
+:10AAB0000101010101010101010101010101010186
+:10AAC0000101010101010101010101010101010176
+:10AAD0000101010101010101010101010101010166
+:10AAE0000101010101010101010101010101010156
+:10AAF0000101010101010101010101010101010146
+:10AB00000101010101010101010101010101010135
+:10AB10000101010101010101010101010101010125
+:10AB20000101010101010101010101010101010115
+:10AB30000101010101010101010101010101010105
+:10AB400001010101010101010101010101010101F5
+:10AB500001010101010101010101010101010101E5
+:10AB600001010101010101010101010101010101D5
+:10AB700001010101010101010101010101010101C5
+:10AB800001010101010101010101010101010101B5
+:10AB900001010101010101010101010101010101A5
+:10ABA0000101010101010101010101010101010195
+:10ABB0000101010101010101010101010101010185
+:10ABC0000101010101010101010101010101010175
+:10ABD0000101010101010101010101010101010165
+:10ABE0000101010101010101010101010101010155
+:10ABF0000101010101010101010101010101010145
+:10AC00000101010101010101010101010101010134
+:10AC10000101010101010101010101010101010124
+:10AC20000101010101010101010101010101010114
+:10AC30000101010101010101010101010101010104
+:10AC400001010101010101010101010101010101F4
+:10AC500001010101010101010101010101010101E4
+:10AC600001010101010101010101010101010101D4
+:10AC700001010101010101010101010101010101C4
+:10AC800001010101010101010101010101010101B4
+:10AC900001010101010101010101010101010101A4
+:10ACA0000101010101010101010101010101010194
+:10ACB0000101010101010101010101010101010184
+:10ACC0000101010101010101010101010101010174
+:10ACD0000101010101010101010101010101010164
+:10ACE0000101010101010101010101010101010154
+:10ACF0000101010101010101010101010101010144
+:10AD00000101010101010101010101010101010133
+:10AD10000101010101010101010101010101010123
+:10AD20000101010101010101010101010101010113
+:10AD30000101010101010101010101010101010103
+:10AD400001010101010101010101010101010101F3
+:10AD500001010101010101010101010101010101E3
+:10AD600001010101010101010101010101010101D3
+:10AD700001010101010101010101010101010101C3
+:10AD800001010101010101010101010101010101B3
+:10AD900001010101010101010101010101010101A3
+:10ADA0000101010101010101010101010101010193
+:10ADB0000101010101010101010101010101010183
+:10ADC0000101010101010101010101010101010173
+:10ADD0000101010101010101010101010101010163
+:10ADE0000101010101010101010101010101010153
+:10ADF0000101010101010101010101010101010143
+:10AE00000101010101010101010101010101010132
+:10AE10000101010101010101010101010101010122
+:10AE20000101010101010101010101010101010112
+:10AE30000101010101010101010101010101010102
+:10AE400001010101010101010101010101010101F2
+:10AE500001010101010101010101010101010101E2
+:10AE600001010101010101010101010101010101D2
+:10AE700001010101010101010101010101010101C2
+:10AE800001010101010101010101010101010101B2
+:10AE900001010101010101010101010101010101A2
+:10AEA0000101010101010101010101010101010192
+:10AEB0000101010101010101010101010101010182
+:10AEC0000101010101010101010101010101010172
+:10AED0000101010101010101010101010101010063
+: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
+:10B4D000000000000000000000000000000000026A
+:10B4E000020202020202020202020202020202023C
+:10B4F000020202020202020202020202020202022C
+:10B50000020202020202020202020202020202021B
+:10B51000020202020202020202020202020202020B
+:10B5200002020202020202020202020202020202FB
+:10B5300002020202020202020202020202020202EB
+:10B5400002020202020202020202020202020202DB
+:10B5500002020202020202020202020202020202CB
+:10B5600002020202020202020202020202020202BB
+:10B5700002020202020202020202020202020202AB
+:10B58000020202020202020202020202020202029B
+:10B59000020202020202020202020202020202028B
+:10B5A000020202020202020202020202020202027B
+:10B5B000020202020202020202020202020202026B
+:10B5C000020202020202020202020202020202025B
+:10B5D000020202020202020202020202020202024B
+:10B5E000020202020202020202020202020202023B
+:10B5F000020202020202020202020202020202022B
+:10B60000020202020202020202020202020202021A
+:10B61000020202020202020202020202020202020A
+:10B6200002020202020202020202020202020202FA
+:10B6300002020202020202020202020202020202EA
+:10B6400002020202020202020202020202020202DA
+:10B6500002020202020202020202020202020202CA
+:10B6600002020202020202020202020202020202BA
+:10B6700002020202020202020202020202020202AA
+:10B68000020202020202020202020202020202029A
+:10B69000020202020202020202020202020202028A
+:10B6A000020202020202020202020202020202027A
+:10B6B000020202020202020202020202020202026A
+:10B6C000020202020202020202020202020202025A
+:10B6D000020202020202020202020202020202024A
+:10B6E000020202020202020202020202020202023A
+:10B6F000020202020202020202020202020202022A
+:10B700000202020202020202020202020202020219
+:10B710000202020202020202020202020202020209
+:10B7200002020202020202020202020202020202F9
+:10B7300002020202020202020202020202020202E9
+:10B7400002020202020202020202020202020202D9
+:10B7500002020202020202020202020202020202C9
+:10B7600002020202020202020202020202020202B9
+:10B7700002020202020202020202020202020202A9
+:10B780000202020202020202020202020202020299
+:10B790000202020202020202020202020202020289
+:10B7A0000202020202020202020202020202020279
+:10B7B0000202020202020202020202020202020269
+:10B7C0000202020202020202020202020202020259
+:10B7D0000202020202020202020202020202020249
+:10B7E0000202020202020202020202020202020239
+:10B7F0000202020202020202020202020202020229
+:10B800000202020202020202020202020202020218
+:10B810000202020202020202020202020202020208
+:10B8200002020202020202020202020202020202F8
+:10B8300002020202020202020202020202020202E8
+:10B8400002020202020202020202020202020202D8
+:10B8500002020202020202020202020202020202C8
+:10B8600002020202020202020202020202020202B8
+:10B8700002020202020202020202020202020202A8
+:10B880000202020202020202020202020202020298
+:10B890000202020202020202020202020202020288
+:10B8A0000202020202020202020202020202020278
+:10B8B0000202020202020202020202020202020268
+:10B8C0000202020202020202020202020202020258
+:10B8D0000202020202020202020202020202020248
+:10B8E0000202020202020202020202020202020238
+:10B8F0000202020202020202020202020202020228
+:10B900000202020202020202020202020202020217
+:10B910000202020202020202020202020202020207
+:10B9200002020202020202020202020202020202F7
+:10B9300002020202020202020202020202020202E7
+:10B9400002020202020202020202020202020202D7
+:10B9500002020202020202020202020202020202C7
+:10B9600002020202020202020202020202020202B7
+:10B9700002020202020202020202020202020202A7
+:10B980000202020202020202020202020202020297
+:10B990000202020202020202020202020202020287
+:10B9A0000202020202020202020202020202020277
+:10B9B0000202020202020202020202020202020267
+:10B9C0000202020202020202020202020202020257
+:10B9D0000202020202020202020202020202020247
+:10B9E0000202020202020202020202020202020237
+:10B9F0000202020202020202020202020202020227
+:10BA00000202020202020202020202020202020216
+:10BA10000202020202020202020202020202020206
+:10BA200002020202020202020202020202020202F6
+:10BA300002020202020202020202020202020202E6
+:10BA400002020202020202020202020202020202D6
+:10BA500002020202020202020202020202020202C6
+:10BA600002020202020202020202020202020202B6
+:10BA700002020202020202020202020202020202A6
+:10BA80000202020202020202020202020202020296
+:10BA90000202020202020202020202020202020286
+:10BAA0000202020202020202020202020202020276
+:10BAB0000202020202020202020202020202020266
+:10BAC0000202020202020202020202020202020256
+:10BAD0000202020202020202020202020202020246
+:10BAE0000202020202020202020202020202020236
+:10BAF0000202020202020202020202020202020226
+:10BB00000202020202020202020202020202020215
+:10BB10000202020202020202020202020202020205
+:10BB200002020202020202020202020202020202F5
+:10BB300002020202020202020202020202020202E5
+:10BB400002020202020202020202020202020202D5
+:10BB500002020202020202020202020202020202C5
+:10BB600002020202020202020202020202020202B5
+:10BB700002020202020202020202020202020202A5
+:10BB80000202020202020202020202020202020295
+:10BB90000202020202020202020202020202020285
+:10BBA0000202020202020202020202020202020275
+:10BBB0000202020202020202020202020202020265
+:10BBC0000202020202020202020202020202020255
+:10BBD0000202020202020202020202020202020245
+:10BBE0000202020202020202020202020202020235
+:10BBF0000202020202020202020202020202020225
+:10BC00000202020202020202020202020202020214
+:10BC10000202020202020202020202020202020204
+:10BC200002020202020202020202020202020202F4
+:10BC300002020202020202020202020202020202E4
+:10BC400002020202020202020202020202020202D4
+:10BC500002020202020202020202020202020202C4
+:10BC600002020202020202020202020202020202B4
+:10BC700002020202020202020202020202020202A4
+:10BC80000202020202020202020202020202020294
+:10BC90000202020202020202020202020202020284
+:10BCA0000202020202020202020202020202020274
+:10BCB0000202020202020202020202020202020264
+:10BCC0000202020202020202020202020202020254
+:10BCD0000202020202020202020202020202020244
+:10BCE0000202020202020202020202020202020234
+:10BCF0000202020202020202020202020202020224
+:10BD00000202020202020202020202020202020213
+:10BD10000202020202020202020202020202020203
+:10BD200002020202020202020202020202020202F3
+:10BD300002020202020202020202020202020202E3
+:10BD400002020202020202020202020202020202D3
+:10BD500002020202020202020202020202020202C3
+:10BD600002020202020202020202020202020202B3
+:10BD700002020202020202020202020202020202A3
+:10BD80000202020202020202020202020202020293
+:10BD90000202020202020202020202020202020283
+:10BDA0000202020202020202020202020202020273
+:10BDB0000202020202020202020202020202020263
+:10BDC0000202020202020202020202020202020253
+:10BDD0000202020202020202020202020202020243
+:10BDE0000202020202020202020202020202020233
+:10BDF0000202020202020202020202020202020223
+:10BE00000202020202020202020202020202020212
+:10BE10000202020202020202020202020202020202
+:10BE200002020202020202020202020202020202F2
+:10BE300002020202020202020202020202020202E2
+:10BE400002020202020202020202020202020202D2
+:10BE500002020202020202020202020202020202C2
+:10BE600002020202020202020202020202020202B2
+:10BE700002020202020202020202020202020202A2
+:10BE80000202020202020202020202020202020292
+:10BE90000202020202020202020202020202020282
+:10BEA0000202020202020202020202020202020272
+:10BEB0000202020202020202020202020202020262
+:10BEC0000202020202020202020202020202020252
+:10BED0000202020202020202020202020202020242
+:10BEE0000202020202020202020202020202020232
+:10BEF0000202020202020202020202020202020222
+:10BF00000202020202020202020202020202020211
+:10BF10000202020202020202020202020202020201
+:10BF200002020202020202020202020202020202F1
+:10BF300002020202020202020202020202020202E1
+:10BF400002020202020202020202020202020202D1
+:10BF500002020202020202020202020202020202C1
+:10BF600002020202020202020202020202020202B1
+:10BF700002020202020202020202020202020202A1
+:10BF80000202020202020202020202020202020291
+:10BF90000202020202020202020202020202020281
+:10BFA0000202020202020202020202020202020271
+:10BFB0000202020202020202020202020202020261
+:10BFC0000202020202020202020202020202020251
+:10BFD0000202020202020202020202020202020241
+:10BFE0000202020202020202020202020202020231
+:10BFF0000202020202020202020202020202020221
+:10C000000202020202020202020202020202020210
+:10C010000202020202020202020202020202020200
+:10C0200002020202020202020202020202020202F0
+:10C0300002020202020202020202020202020202E0
+:10C0400002020202020202020202020202020202D0
+:10C0500002020202020202020202020202020202C0
+:10C0600002020202020202020202020202020202B0
+:10C0700002020202020202020202020202020202A0
+:10C080000202020202020202020202020202020290
+:10C090000202020202020202020202020202020280
+:10C0A0000202020202020202020202020202020270
+:10C0B0000202020202020202020202020202020260
+:10C0C0000202020202020202020202020202020250
+:10C0D0000202020202020202020202020202020240
+:10C0E0000202020202020202020202020202020230
+:10C0F0000202020202020202020202020202020220
+:10C10000020202020202020202020202020202020F
+:10C1100002020202020202020202020202020202FF
+:10C1200002020202020202020202020202020202EF
+:10C1300002020202020202020202020202020202DF
+:10C1400002020202020202020202020202020202CF
+:10C1500002020202020202020202020202020202BF
+:10C1600002020202020202020202020202020202AF
+:10C17000020202020202020202020202020202029F
+:10C18000020202020202020202020202020202028F
+:10C19000020202020202020202020202020202027F
+:10C1A000020202020202020202020202020202026F
+:10C1B000020202020202020202020202020202025F
+:10C1C000020202020202020202020202020202024F
+:10C1D000020202020202020202020202020202023F
+:10C1E000020202020202020202020202020202022F
+:10C1F000020202020202020202020202020202021F
+:10C20000020202020202020202020202020202020E
+:10C2100002020202020202020202020202020202FE
+:10C2200002020202020202020202020202020202EE
+:10C2300002020202020202020202020202020202DE
+:10C2400002020202020202020202020202020202CE
+:10C2500002020202020202020202020202020202BE
+:10C2600002020202020202020202020202020202AE
+:10C27000020202020202020202020202020202029E
+:10C28000020202020202020202020202020202028E
+:10C29000020202020202020202020202020202027E
+:10C2A000020202020202020202020202020202026E
+:10C2B000020202020202020202020202020202025E
+:10C2C000020202020202020202020202020202024E
+:10C2D000020202020202020202020202020202023E
+:10C2E000020202020202020202020202020202022E
+:10C2F000020202020202020202020202020202021E
+:10C30000020202020202020202020202020202020D
+:10C3100002020202020202020202020202020202FD
+:10C3200002020202020202020202020202020202ED
+:10C3300002020202020202020202020202020202DD
+:10C3400002020202020202020202020202020202CD
+:10C3500002020202020202020202020202020202BD
+:10C3600002020202020202020202020202020202AD
+:10C37000020202020202020202020202020202029D
+:10C38000020202020202020202020202020202028D
+:10C39000020202020202020202020202020202027D
+:10C3A000020202020202020202020202020202026D
+:10C3B000020202020202020202020202020202025D
+:10C3C000020202020202020202020202020202024D
+:10C3D000020202020202020202020202020202023D
+:10C3E000020202020202020202020202020202022D
+:10C3F000020202020202020202020202020202021D
+:10C40000020202020202020202020202020202020C
+:10C4100002020202020202020202020202020202FC
+:10C4200002020202020202020202020202020202EC
+:10C4300002020202020202020202020202020202DC
+:10C4400002020202020202020202020202020202CC
+:10C4500002020202020202020202020202020202BC
+:10C4600002020202020202020202020202020202AC
+:10C47000020202020202020202020202020202029C
+:10C48000020202020202020202020202020202028C
+:10C49000020202020202020202020202020202027C
+:10C4A000020202020202020202020202020202026C
+:10C4B000020202020202020202020202020202025C
+:10C4C000020202020202020202020202020202024C
+:10C4D000020202020202020202020202020202023C
+:10C4E000020202020202020202020202020202022C
+:10C4F000020202020202020202020202020202021C
+:10C50000020202020202020202020202020202020B
+:10C5100002020202020202020202020202020202FB
+:10C5200002020202020202020202020202020202EB
+:10C5300002020202020202020202020202020202DB
+:10C5400002020202020202020202020202020202CB
+:10C5500002020202020202020202020202020202BB
+:10C5600002020202020202020202020202020202AB
+:10C57000020202020202020202020202020202029B
+:10C58000020202020202020202020202020202028B
+:10C59000020202020202020202020202020202027B
+:10C5A000020202020202020202020202020202026B
+:10C5B000020202020202020202020202020202025B
+:10C5C000020202020202020202020202020202024B
+:10C5D000020202020202020202020202020202023B
+:10C5E000020202020202020202020202020202022B
+:10C5F000020202020202020202020202020202021B
+:10C60000020202020202020202020202020202020A
+:10C6100002020202020202020202020202020202FA
+:10C6200002020202020202020202020202020202EA
+:10C6300002020202020202020202020202020202DA
+:10C6400002020202020202020202020202020202CA
+:10C6500002020202020202020202020202020202BA
+:10C6600002020202020202020202020202020202AA
+:10C67000020202020202020202020202020202029A
+:10C68000020202020202020202020202020202028A
+:10C69000020202020202020202020202020202027A
+:10C6A000020202020202020202020202020202026A
+:10C6B000020202020202020202020202020202025A
+:10C6C000020202020202020202020202020202024A
+:10C6D000020202020202020202020202020202023A
+:10C6E000020202020202020202020202020202022A
+:10C6F000020202020202020202020202020202021A
+:10C700000202020202020202020202020202020209
+:10C7100002020202020202020202020202020202F9
+:10C7200002020202020202020202020202020202E9
+:10C7300002020202020202020202020202020202D9
+:10C7400002020202020202020202020202020202C9
+:10C7500002020202020202020202020202020202B9
+:10C7600002020202020202020202020202020202A9
+:10C770000202020202020202020202020202020299
+:10C780000202020202020202020202020202020289
+:10C790000202020202020202020202020202020279
+:10C7A0000202020202020202020202020202020269
+:10C7B0000202020202020202020202020202020259
+:10C7C0000202020202020202020202020202020249
+:10C7D0000202020202020202020202020202020239
+:10C7E0000202020202020202020202020202020229
+:10C7F0000202020202020202020202020202020219
+:10C800000202020202020202020202020202020208
+:10C8100002020202020202020202020202020202F8
+:10C8200002020202020202020202020202020202E8
+:10C8300002020202020202020202020202020202D8
+:10C8400002020202020202020202020202020202C8
+:10C8500002020202020202020202020202020202B8
+:10C8600002020202020202020202020202020202A8
+:10C870000202020202020202020202020202020298
+:10C880000202020202020202020202020202020288
+:10C890000202020202020202020202020202020278
+:10C8A0000202020202020202020202020202020268
+:10C8B0000202020202020202020202020202020258
+:10C8C0000202020202020202020202020202020248
+:10C8D0000202020202020202020202020202020238
+:10C8E0000202020202020202020202020202020228
+:10C8F0000202020202020202020202020202020218
+:10C900000202020202020202020202020202020207
+:10C9100002020202020202020202020202020202F7
+:10C9200002020202020202020202020202020202E7
+:10C9300002020202020202020202020202020202D7
+:10C9400002020202020202020202020202020202C7
+:10C9500002020202020202020202020202020202B7
+:10C9600002020202020202020202020202020202A7
+:10C970000202020202020202020202020202020297
+:10C980000202020202020202020202020202020287
+:10C990000202020202020202020202020202020277
+:10C9A0000202020202020202020202020202020267
+:10C9B0000202020202020202020202020202020257
+:10C9C0000202020202020202020202020202020247
+:10C9D0000202020202020202020202020202020237
+:10C9E0000202020202020202020202020202020227
+:10C9F0000202020202020202020202020202020217
+:10CA00000202020202020202020202020202020206
+:10CA100002020202020202020202020202020202F6
+:10CA200002020202020202020202020202020202E6
+:10CA300002020202020202020202020202020202D6
+:10CA400002020202020202020202020202020202C6
+:10CA500002020202020202020202020202020202B6
+:10CA600002020202020202020202020202020202A6
+:10CA70000202020202020202020202020202020296
+:10CA80000202020202020202020202020202020286
+:10CA90000202020202020202020202020202020276
+:10CAA0000202020202020202020202020202020266
+:10CAB0000202020202020202020202020202020256
+:10CAC0000202020202020202020202020202020246
+:10CAD0000202020202020202020202020202020236
+:10CAE0000202020202020202020202020202020226
+:10CAF0000202020202020202020202020202020216
+:10CB00000202020202020202020202020202020205
+:10CB100002020202020202020202020202020202F5
+:10CB200002020202020202020202020202020202E5
+:10CB300002020202020202020202020202020202D5
+:10CB400002020202020202020202020202020202C5
+:10CB500002020202020202020202020202020202B5
+:10CB600002020202020202020202020202020202A5
+:10CB70000202020202020202020202020202020295
+:10CB80000202020202020202020202020202020285
+:10CB90000202020202020202020202020202020275
+:10CBA0000202020202020202020202020202020265
+:10CBB0000202020202020202020202020202020255
+:10CBC0000202020202020202020202020202020245
+:10CBD0000202020202020202020202020202020235
+:10CBE0000202020202020202020202020202020225
+:10CBF0000202020202020202020202020202020215
+:10CC00000202020202020202020202020202020204
+:10CC100002020202020202020202020202020202F4
+:10CC200002020202020202020202020202020202E4
+:10CC300002020202020202020202020202020202D4
+:10CC400002020202020202020202020202020202C4
+:10CC500002020202020202020202020202020202B4
+:10CC600002020202020202020202020202020202A4
+:10CC70000202020202020202020202020202020294
+:10CC80000202020202020202020202020202020284
+:10CC90000202020202020202020202020202020274
+:10CCA0000202020202020202020202020202020264
+:10CCB0000202020202020202020202020202020254
+:10CCC0000202020202020202020202020202020244
+:10CCD0000202020202020202020202020202020234
+:10CCE0000202020202020202020202020202020224
+:10CCF0000202020202020202020202020202020214
+:10CD00000202020202020202020202020202020203
+:10CD100002020202020202020202020202020202F3
+:10CD200002020202020202020202020202020202E3
+:10CD300002020202020202020202020202020202D3
+:10CD400002020202020202020202020202020202C3
+:10CD500002020202020202020202020202020202B3
+:10CD600002020202020202020202020202020202A3
+:10CD70000202020202020202020202020202020293
+:10CD80000202020202020202020202020202020283
+:10CD90000202020202020202020202020202020273
+:10CDA0000202020202020202020202020202020263
+:10CDB0000202020202020202020202020202020253
+:10CDC0000202020202020202020202020202020243
+:10CDD0000202020202020202020202020202020035
+: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
+:10D7D0000000000000000000000000000000000148
+:10D7E0000101010101010101010101010101010129
+:10D7F0000101010101010101010101010101010119
+:10D800000101010101010101010101010101010108
+:10D8100001010101010101010101010101010101F8
+:10D8200001010101010101010101010101010101E8
+:10D8300001010101010101010101010101010101D8
+:10D8400001010101010101010101010101010101C8
+:10D8500001010101010101010101010101010101B8
+:10D8600001010101010101010101010101010101A8
+:10D870000101010101010101010101010101010198
+:10D880000101010101010101010101010101010188
+:10D890000101010101010101010101010101010178
+:10D8A0000101010101010101010101010101010168
+:10D8B0000101010101010101010101010101010158
+:10D8C0000101010101010101010101010101010148
+:10D8D0000101010101010101010101010101010138
+:10D8E0000101010101010101010101010101010128
+:10D8F0000101010101010101010101010101010118
+:10D900000101010101010101010101010101010107
+:10D9100001010101010101010101010101010101F7
+:10D9200001010101010101010101010101010101E7
+:10D9300001010101010101010101010101010101D7
+:10D9400001010101010101010101010101010101C7
+:10D9500001010101010101010101010101010101B7
+:10D9600001010101010101010101010101010101A7
+:10D970000101010101010101010101010101010197
+:10D980000101010101010101010101010101010187
+:10D990000101010101010101010101010101010177
+:10D9A0000101010101010101010101010101010167
+:10D9B0000101010101010101010101010101010157
+:10D9C0000101010101010101010101010101010147
+:10D9D0000101010101010101010101010101010137
+:10D9E0000101010101010101010101010101010127
+:10D9F0000101010101010101010101010101010117
+:10DA00000101010101010101010101010101010106
+:10DA100001010101010101010101010101010101F6
+:10DA200001010101010101010101010101010101E6
+:10DA300001010101010101010101010101010101D6
+:10DA400001010101010101010101010101010101C6
+:10DA500001010101010101010101010101010101B6
+:10DA600001010101010101010101010101010101A6
+:10DA70000101010101010101010101010101010196
+:10DA80000101010101010101010101010101010186
+:10DA90000101010101010101010101010101010176
+:10DAA0000101010101010101010101010101010166
+:10DAB0000101010101010101010101010101010156
+:10DAC0000101010101010101010101010101010146
+:10DAD0000101010101010101010101010101010136
+:10DAE0000101010101010101010101010101010126
+:10DAF0000101010101010101010101010101010116
+:10DB00000101010101010101010101010101010105
+:10DB100001010101010101010101010101010101F5
+:10DB200001010101010101010101010101010101E5
+:10DB300001010101010101010101010101010101D5
+:10DB400001010101010101010101010101010101C5
+:10DB500001010101010101010101010101010101B5
+:10DB600001010101010101010101010101010101A5
+:10DB70000101010101010101010101010101010195
+:10DB80000101010101010101010101010101010185
+:10DB90000101010101010101010101010101010175
+:10DBA0000101010101010101010101010101010165
+:10DBB0000101010101010101010101010101010155
+:10DBC0000101010101010101010101010101010145
+:10DBD0000101010101010101010101010101010135
+:10DBE0000101010101010101010101010101010125
+:10DBF0000101010101010101010101010101010115
+:10DC00000101010101010101010101010101010104
+:10DC100001010101010101010101010101010101F4
+:10DC200001010101010101010101010101010101E4
+:10DC300001010101010101010101010101010101D4
+:10DC400001010101010101010101010101010101C4
+:10DC500001010101010101010101010101010101B4
+:10DC600001010101010101010101010101010101A4
+:10DC70000101010101010101010101010101010194
+:10DC80000101010101010101010101010101010184
+:10DC90000101010101010101010101010101010174
+:10DCA0000101010101010101010101010101010164
+:10DCB0000101010101010101010101010101010154
+:10DCC0000101010101010101010101010101010144
+:10DCD0000101010101010101010101010101010134
+:10DCE0000101010101010101010101010101010124
+:10DCF0000101010101010101010101010101010114
+:10DD00000101010101010101010101010101010103
+:10DD100001010101010101010101010101010101F3
+:10DD200001010101010101010101010101010101E3
+:10DD300001010101010101010101010101010101D3
+:10DD400001010101010101010101010101010101C3
+:10DD500001010101010101010101010101010101B3
+:10DD600001010101010101010101010101010101A3
+:10DD70000101010101010101010101010101010193
+:10DD80000101010101010101010101010101010183
+:10DD90000101010101010101010101010101010173
+:10DDA0000101010101010101010101010101010163
+:10DDB0000101010101010101010101010101010153
+:10DDC0000101010101010101010101010101010143
+:10DDD0000101010101010101010101010101010133
+:10DDE0000101010101010101010101010101010123
+:10DDF0000101010101010101010101010101010113
+:10DE00000101010101010101010101010101010102
+:10DE100001010101010101010101010101010101F2
+:10DE200001010101010101010101010101010101E2
+:10DE300001010101010101010101010101010101D2
+:10DE400001010101010101010101010101010101C2
+:10DE500001010101010101010101010101010101B2
+:10DE600001010101010101010101010101010101A2
+:10DE70000101010101010101010101010101010192
+:10DE80000101010101010101010101010101010182
+:10DE90000101010101010101010101010101010172
+:10DEA0000101010101010101010101010101010162
+:10DEB0000101010101010101010101010101010152
+:10DEC0000101010101010101010101010101010142
+:10DED0000101010101010101010101010101010132
+:10DEE0000101010101010101010101010101010122
+:10DEF0000101010101010101010101010101010112
+:10DF00000101010101010101010101010101010101
+:10DF100001010101010101010101010101010101F1
+:10DF200001010101010101010101010101010101E1
+:10DF300001010101010101010101010101010101D1
+:10DF400001010101010101010101010101010101C1
+:10DF500001010101010101010101010101010101B1
+:10DF600001010101010101010101010101010101A1
+:10DF70000101010101010101010101010101010191
+:10DF80000101010101010101010101010101010181
+:10DF90000101010101010101010101010101010171
+:10DFA0000101010101010101010101010101010161
+:10DFB0000101010101010101010101010101010151
+:10DFC0000101010101010101010101010101010141
+:10DFD0000101010101010101010101010101010131
+:10DFE0000101010101010101010101010101010121
+:10DFF0000101010101010101010101010101010111
+:10E000000101010101010101010101010101010100
+:10E0100001010101010101010101010101010101F0
+:10E0200001010101010101010101010101010101E0
+:10E0300001010101010101010101010101010101D0
+:10E0400001010101010101010101010101010101C0
+:10E0500001010101010101010101010101010101B0
+:10E0600001010101010101010101010101010101A0
+:10E070000101010101010101010101010101010190
+:10E080000101010101010101010101010101010180
+:10E090000101010101010101010101010101010170
+:10E0A0000101010101010101010101010101010160
+:10E0B0000101010101010101010101010101010150
+:10E0C0000101010101010101010101010101010140
+:10E0D0000101010101010101010101010101010130
+:10E0E0000101010101010101010101010101010120
+:10E0F0000101010101010101010101010101010110
+:10E1000001010101010101010101010101010101FF
+:10E1100001010101010101010101010101010101EF
+:10E1200001010101010101010101010101010101DF
+:10E1300001010101010101010101010101010101CF
+:10E1400001010101010101010101010101010101BF
+:10E1500001010101010101010101010101010101AF
+:10E16000010101010101010101010101010101019F
+:10E17000010101010101010101010101010101018F
+:10E18000010101010101010101010101010101017F
+:10E19000010101010101010101010101010101016F
+:10E1A000010101010101010101010101010101015F
+:10E1B000010101010101010101010101010101014F
+:10E1C000010101010101010101010101010101013F
+:10E1D000010101010101010101010101010101012F
+:10E1E000010101010101010101010101010101011F
+:10E1F000010101010101010101010101010101010F
+:10E2000001010101010101010101010101010101FE
+:10E2100001010101010101010101010101010101EE
+:10E2200001010101010101010101010101010101DE
+:10E2300001010101010101010101010101010101CE
+:10E2400001010101010101010101010101010101BE
+:10E2500001010101010101010101010101010101AE
+:10E26000010101010101010101010101010101019E
+:10E27000010101010101010101010101010101018E
+:10E28000010101010101010101010101010101017E
+:10E29000010101010101010101010101010101016E
+:10E2A000010101010101010101010101010101015E
+:10E2B000010101010101010101010101010101014E
+:10E2C000010101010101010101010101010101013E
+:10E2D000010101010101010101010101010101012E
+:10E2E000010101010101010101010101010101011E
+:10E2F000010101010101010101010101010101010E
+:10E3000001010101010101010101010101010101FD
+:10E3100001010101010101010101010101010101ED
+:10E3200001010101010101010101010101010101DD
+:10E3300001010101010101010101010101010101CD
+:10E3400001010101010101010101010101010101BD
+:10E3500001010101010101010101010101010101AD
+:10E36000010101010101010101010101010101019D
+:10E37000010101010101010101010101010101018D
+:10E38000010101010101010101010101010101017D
+:10E39000010101010101010101010101010101016D
+:10E3A000010101010101010101010101010101015D
+:10E3B000010101010101010101010101010101014D
+:10E3C000010101010101010101010101010101013D
+:10E3D000010101010101010101010101010101012D
+:10E3E000010101010101010101010101010101011D
+:10E3F000010101010101010101010101010101010D
+:10E4000001010101010101010101010101010101FC
+:10E4100001010101010101010101010101010101EC
+:10E4200001010101010101010101010101010101DC
+:10E4300001010101010101010101010101010101CC
+:10E4400001010101010101010101010101010101BC
+:10E4500001010101010101010101010101010101AC
+:10E46000010101010101010101010101010101019C
+:10E47000010101010101010101010101010101018C
+:10E48000010101010101010101010101010101017C
+:10E49000010101010101010101010101010101016C
+:10E4A000010101010101010101010101010101015C
+:10E4B000010101010101010101010101010101014C
+:10E4C000010101010101010101010101010101013C
+:10E4D000010101010101010101010101010101012C
+:10E4E000010101010101010101010101010101011C
+:10E4F000010101010101010101010101010101010C
+:10E5000001010101010101010101010101010101FB
+:10E5100001010101010101010101010101010101EB
+:10E5200001010101010101010101010101010101DB
+:10E5300001010101010101010101010101010101CB
+:10E5400001010101010101010101010101010101BB
+:10E5500001010101010101010101010101010101AB
+:10E56000010101010101010101010101010101019B
+:10E57000010101010101010101010101010101018B
+:10E58000010101010101010101010101010101017B
+:10E59000010101010101010101010101010101016B
+:10E5A000010101010101010101010101010101015B
+:10E5B000010101010101010101010101010101014B
+:10E5C000010101010101010101010101010101013B
+:10E5D000010101010101010101010101010101012B
+:10E5E000010101010101010101010101010101011B
+:10E5F000010101010101010101010101010101010B
+:10E6000001010101010101010101010101010101FA
+:10E6100001010101010101010101010101010101EA
+:10E6200001010101010101010101010101010101DA
+:10E6300001010101010101010101010101010101CA
+:10E6400001010101010101010101010101010101BA
+:10E6500001010101010101010101010101010101AA
+:10E66000010101010101010101010101010101019A
+:10E67000010101010101010101010101010101018A
+:10E68000010101010101010101010101010101017A
+:10E69000010101010101010101010101010101016A
+:10E6A000010101010101010101010101010101015A
+:10E6B000010101010101010101010101010101014A
+:10E6C000010101010101010101010101010101013A
+:10E6D000010101010101010101010101010101012A
+:10E6E000010101010101010101010101010101011A
+:10E6F000010101010101010101010101010101010A
+:10E7000001010101010101010101010101010101F9
+:10E7100001010101010101010101010101010101E9
+:10E7200001010101010101010101010101010101D9
+:10E7300001010101010101010101010101010101C9
+:10E7400001010101010101010101010101010101B9
+:10E7500001010101010101010101010101010101A9
+:10E760000101010101010101010101010101010199
+:10E770000101010101010101010101010101010189
+:10E780000101010101010101010101010101010179
+:10E790000101010101010101010101010101010169
+:10E7A0000101010101010101010101010101010159
+:10E7B0000101010101010101010101010101010149
+:10E7C0000101010101010101010101010101010139
+:10E7D0000101010101010101010101010101010129
+:10E7E0000101010101010101010101010101010119
+:10E7F0000101010101010101010101010101010109
+:10E8000001010101010101010101010101010101F8
+:10E8100001010101010101010101010101010101E8
+:10E8200001010101010101010101010101010101D8
+:10E8300001010101010101010101010101010101C8
+:10E8400001010101010101010101010101010101B8
+:10E8500001010101010101010101010101010101A8
+:10E860000101010101010101010101010101010198
+:10E870000101010101010101010101010101010188
+:10E880000101010101010101010101010101010178
+:10E890000101010101010101010101010101010168
+:10E8A0000101010101010101010101010101010158
+:10E8B0000101010101010101010101010101010148
+:10E8C0000101010101010101010101010101010138
+:10E8D0000101010101010101010101010101010128
+:10E8E0000101010101010101010101010101010118
+:10E8F0000101010101010101010101010101010108
+:10E9000001010101010101010101010101010101F7
+:10E9100001010101010101010101010101010101E7
+:10E9200001010101010101010101010101010101D7
+:10E9300001010101010101010101010101010101C7
+:10E9400001010101010101010101010101010101B7
+:10E9500001010101010101010101010101010101A7
+:10E960000101010101010101010101010101010197
+:10E970000101010101010101010101010101010187
+:10E980000101010101010101010101010101010177
+:10E990000101010101010101010101010101010167
+:10E9A0000101010101010101010101010101010157
+:10E9B0000101010101010101010101010101010147
+:10E9C0000101010101010101010101010101010137
+:10E9D0000101010101010101010101010101010127
+:10E9E0000101010101010101010101010101010117
+:10E9F0000101010101010101010101010101010107
+:10EA000001010101010101010101010101010101F6
+:10EA100001010101010101010101010101010101E6
+:10EA200001010101010101010101010101010101D6
+:10EA300001010101010101010101010101010101C6
+:10EA400001010101010101010101010101010101B6
+:10EA500001010101010101010101010101010101A6
+:10EA60000101010101010101010101010101010196
+:10EA70000101010101010101010101010101010186
+:10EA80000101010101010101010101010101010176
+:10EA90000101010101010101010101010101010166
+:10EAA0000101010101010101010101010101010156
+:10EAB0000101010101010101010101010101010146
+:10EAC0000101010101010101010101010101010136
+:10EAD0000101010101010101010101010101010126
+:10EAE0000101010101010101010101010101010116
+:10EAF0000101010101010101010101010101010106
+:10EB000001010101010101010101010101010101F5
+:10EB100001010101010101010101010101010101E5
+:10EB200001010101010101010101010101010101D5
+:10EB300001010101010101010101010101010101C5
+:10EB400001010101010101010101010101010101B5
+:10EB500001010101010101010101010101010101A5
+:10EB60000101010101010101010101010101010195
+:10EB70000101010101010101010101010101010185
+:10EB80000101010101010101010101010101010175
+:10EB90000101010101010101010101010101010165
+:10EBA0000101010101010101010101010101010155
+:10EBB0000101010101010101010101010101010145
+:10EBC0000101010101010101010101010101010135
+:10EBD0000101010101010101010101010101010125
+:10EBE0000101010101010101010101010101010115
+:10EBF0000101010101010101010101010101010105
+:10EC000001010101010101010101010101010101F4
+:10EC100001010101010101010101010101010101E4
+:10EC200001010101010101010101010101010101D4
+:10EC300001010101010101010101010101010101C4
+:10EC400001010101010101010101010101010101B4
+:10EC500001010101010101010101010101010101A4
+:10EC60000101010101010101010101010101010194
+:10EC70000101010101010101010101010101010184
+:10EC80000101010101010101010101010101010174
+:10EC90000101010101010101010101010101010164
+:10ECA0000101010101010101010101010101010154
+:10ECB0000101010101010101010101010101010144
+:10ECC0000101010101010101010101010101010134
+:10ECD0000101010101010101010101010101010124
+:10ECE0000101010101010101010101010101010114
+:10ECF0000101010101010101010101010101010104
+:10ED000001010101010101010101010101010101F3
+:10ED100001010101010101010101010101010101E3
+:10ED200001010101010101010101010101010101D3
+:10ED300001010101010101010101010101010101C3
+:10ED400001010101010101010101010101010101B3
+:10ED500001010101010101010101010101010101A3
+:10ED60000101010101010101010101010101010193
+:10ED70000101010101010101010101010101010183
+:10ED80000101010101010101010101010101010173
+:10ED90000101010101010101010101010101010163
+:10EDA0000101010101010101010101010101010153
+:10EDB0000101010101010101010101010101010143
+:10EDC0000101010101010101010101010101010133
+:10EDD0000101010101010101010101010101010123
+:10EDE0000101010101010101010101010101010113
+:10EDF0000101010101010101010101010101010103
+:10EE000001010101010101010101010101010101F2
+:10EE100001010101010101010101010101010101E2
+:10EE200001010101010101010101010101010101D2
+:10EE300001010101010101010101010101010101C2
+:10EE400001010101010101010101010101010101B2
+:10EE500001010101010101010101010101010101A2
+:10EE60000101010101010101010101010101010192
+:10EE70000101010101010101010101010101010182
+:10EE80000101010101010101010101010101010172
+:10EE90000101010101010101010101010101010162
+:10EEA0000101010101010101010101010101010152
+:10EEB0000101010101010101010101010101010142
+:10EEC0000101010101010101010101010101010132
+:10EED0000101010101010101010101010101010122
+:10EEE0000101010101010101010101010101010112
+:10EEF0000101010101010101010101010101010102
+:10EF000001010101010101010101010101010101F1
+:10EF100001010101010101010101010101010101E1
+:10EF200001010101010101010101010101010101D1
+:10EF300001010101010101010101010101010101C1
+:10EF400001010101010101010101010101010101B1
+:10EF500001010101010101010101010101010101A1
+:10EF60000101010101010101010101010101010191
+:10EF70000101010101010101010101010101010181
+:10EF80000101010101010101010101010101010171
+:10EF90000101010101010101010101010101010161
+:10EFA0000101010101010101010101010101010151
+:10EFB0000101010101010101010101010101010141
+:10EFC0000101010101010101010101010101010131
+:10EFD0000101010101010101010101010101010121
+:10EFE0000101010101010101010101010101010111
+:10EFF0000101010101010101010101010101010101
+:10F0000001010101010101010101010101010101F0
+:10F0100001010101010101010101010101010101E0
+:10F0200001010101010101010101010101010101D0
+:10F0300001010101010101010101010101010101C0
+:10F0400001010101010101010101010101010101B0
+:10F0500001010101010101010101010101010101A0
+:10F060000101010101010101010101010101010190
+:10F070000101010101010101010101010101010180
+:10F080000101010101010101010101010101010170
+:10F090000101010101010101010101010101010160
+:10F0A0000101010101010101010101010101010150
+:10F0B0000101010101010101010101010101010140
+:10F0C0000101010101010101010101010101010130
+:10F0D0000101010101010101010101010101010021
+:10F0E0000000000000000000000000000000000020
+:10F0F0000000000000000000000000000000000010
+:10F1000000000000000000000000000000000000FF
+:10F1100000000000000000000000000000000000EF
+:10F1200000000000000000000000000000000000DF
+:10F1300000000000000000000000000000000000CF
+:10F1400000000000000000000000000000000000BF
+:10F1500000000000000000000000000000000000AF
+:10F16000000000000000000000000000000000009F
+:10F17000000000000000000000000000000000008F
+:10F18000000000000000000000000000000000007F
+:10F19000000000000000000000000000000000006F
+:10F1A000000000000000000000000000000000005F
+:10F1B000000000000000000000000000000000004F
+:10F1C000000000000000000000000000000000003F
+:10F1D000000000000000000000000000000000002F
+:10F1E000000000000000000000000000000000001F
+:10F1F000000000000000000000000000000000000F
+:10F2000000000000000000000000000000000000FE
+:10F2100000000000000000000000000000000000EE
+:10F2200000000000000000000000000000000000DE
+:10F2300000000000000000000000000000000000CE
+:10F2400000000000000000000000000000000000BE
+:10F2500000000000000000000000000000000000AE
+:10F26000000000000000000000000000000000009E
+:10F27000000000000000000000000000000000008E
+:10F28000000000000000000000000000000000007E
+:10F29000000000000000000000000000000000006E
+:10F2A000000000000000000000000000000000005E
+:10F2B000000000000000000000000000000000004E
+:10F2C000000000000000000000000000000000003E
+:10F2D000000000000000000000000000000000002E
+:10F2E000000000000000000000000000000000001E
+:10F2F000000000000000000000000000000000000E
+:10F3000000000000000000000000000000000000FD
+:10F3100000000000000000000000000000000000ED
+:10F3200000000000000000000000000000000000DD
+:10F3300000000000000000000000000000000000CD
+:10F3400000000000000000000000000000000000BD
+:10F3500000000000000000000000000000000000AD
+:10F36000000000000000000000000000000000009D
+:10F37000000000000000000000000000000000008D
+:10F38000000000000000000000000000000000007D
+:10F39000000000000000000000000000000000006D
+:10F3A000000000000000000000000000000000005D
+:10F3B000000000000000000000000000000000004D
+:10F3C000000000000000000000000000000000003D
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000000000000000000000000000000CC
+:10F4400000000000000000000000000000000000BC
+:10F4500000000000000000000000000000000000AC
+:10F46000000000000000000000000000000000009C
+:10F47000000000000000000000000000000000008C
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000004C
+:10F4C000000000000000000000000000000000003C
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000009B
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B000000000000000000000000000000000004B
+:10F5C000000000000000000000000000000000003B
+:10F5D000000000000000000000000000000000002B
+:10F5E000000000000000000000000000000000001B
+:10F5F000000000000000000000000000000000000B
+:10F6000000000000000000000000000000000000FA
+:10F6100000000000000000000000000000000000EA
+:10F6200000000000000000000000000000000000DA
+:10F6300000000000000000000000000000000000CA
+:10F6400000000000000000000000000000000000BA
+:10F6500000000000000000000000000000000000AA
+:10F66000000000000000000000000000000000009A
+:10F67000000000000000000000000000000000008A
+:10F68000000000000000000000000000000000007A
+:10F69000000000000000000000000000000000006A
+:10F6A000000000000000000000000000000000005A
+:10F6B000000000000000000000000000000000004A
+:10F6C000000000000000000000000000000000003A
+:10F6D0000000000000000000000000000000000228
+:10F6E00002020202020202020202020202020202FA
+:10F6F00002020202020202020202020202020202EA
+:10F7000002020202020202020202020202020202D9
+:10F7100002020202020202020202020202020202C9
+:10F7200002020202020202020202020202020202B9
+:10F7300002020202020202020202020202020202A9
+:10F740000202020202020202020202020202020299
+:10F750000202020202020202020202020202020289
+:10F760000202020202020202020202020202020279
+:10F770000202020202020202020202020202020269
+:10F780000202020202020202020202020202020259
+:10F790000202020202020202020202020202020249
+:10F7A0000202020202020202020202020202020239
+:10F7B0000202020202020202020202020202020229
+:10F7C0000202020202020202020202020202020219
+:10F7D0000202020202020202020202020202020209
+:10F7E00002020202020202020202020202020202F9
+:10F7F00002020202020202020202020202020202E9
+:10F8000002020202020202020202020202020202D8
+:10F8100002020202020202020202020202020202C8
+:10F8200002020202020202020202020202020202B8
+:10F8300002020202020202020202020202020202A8
+:10F840000202020202020202020202020202020298
+:10F850000202020202020202020202020202020288
+:10F860000202020202020202020202020202020278
+:10F870000202020202020202020202020202020268
+:10F880000202020202020202020202020202020258
+:10F890000202020202020202020202020202020248
+:10F8A0000202020202020202020202020202020238
+:10F8B0000202020202020202020202020202020228
+:10F8C0000202020202020202020202020202020218
+:10F8D0000202020202020202020202020202020208
+:10F8E00002020202020202020202020202020202F8
+:10F8F00002020202020202020202020202020202E8
+:10F9000002020202020202020202020202020202D7
+:10F9100002020202020202020202020202020202C7
+:10F9200002020202020202020202020202020202B7
+:10F9300002020202020202020202020202020202A7
+:10F940000202020202020202020202020202020297
+:10F950000202020202020202020202020202020287
+:10F960000202020202020202020202020202020277
+:10F970000202020202020202020202020202020267
+:10F980000202020202020202020202020202020257
+:10F990000202020202020202020202020202020247
+:10F9A0000202020202020202020202020202020237
+:10F9B0000202020202020202020202020202020227
+:10F9C0000202020202020202020202020202020217
+:10F9D0000202020202020202020202020202020207
+:10F9E00002020202020202020202020202020202F7
+:10F9F00002020202020202020202020202020202E7
+:10FA000002020202020202020202020202020202D6
+:10FA100002020202020202020202020202020202C6
+:10FA200002020202020202020202020202020202B6
+:10FA300002020202020202020202020202020202A6
+:10FA40000202020202020202020202020202020296
+:10FA50000202020202020202020202020202020286
+:10FA60000202020202020202020202020202020276
+:10FA70000202020202020202020202020202020266
+:10FA80000202020202020202020202020202020256
+:10FA90000202020202020202020202020202020246
+:10FAA0000202020202020202020202020202020236
+:10FAB0000202020202020202020202020202020226
+:10FAC0000202020202020202020202020202020216
+:10FAD0000202020202020202020202020202020206
+:10FAE00002020202020202020202020202020202F6
+:10FAF00002020202020202020202020202020202E6
+:10FB000002020202020202020202020202020202D5
+:10FB100002020202020202020202020202020202C5
+:10FB200002020202020202020202020202020202B5
+:10FB300002020202020202020202020202020202A5
+:10FB40000202020202020202020202020202020295
+:10FB50000202020202020202020202020202020285
+:10FB60000202020202020202020202020202020275
+:10FB70000202020202020202020202020202020265
+:10FB80000202020202020202020202020202020255
+:10FB90000202020202020202020202020202020245
+:10FBA0000202020202020202020202020202020235
+:10FBB0000202020202020202020202020202020225
+:10FBC0000202020202020202020202020202020215
+:10FBD0000202020202020202020202020202020205
+:10FBE00002020202020202020202020202020202F5
+:10FBF00002020202020202020202020202020202E5
+:10FC000002020202020202020202020202020202D4
+:10FC100002020202020202020202020202020202C4
+:10FC200002020202020202020202020202020202B4
+:10FC300002020202020202020202020202020202A4
+:10FC40000202020202020202020202020202020294
+:10FC50000202020202020202020202020202020284
+:10FC60000202020202020202020202020202020274
+:10FC70000202020202020202020202020202020264
+:10FC80000202020202020202020202020202020254
+:10FC90000202020202020202020202020202020244
+:10FCA0000202020202020202020202020202020234
+:10FCB0000202020202020202020202020202020224
+:10FCC0000202020202020202020202020202020214
+:10FCD0000202020202020202020202020202020204
+:10FCE00002020202020202020202020202020202F4
+:10FCF00002020202020202020202020202020202E4
+:10FD000002020202020202020202020202020202D3
+:10FD100002020202020202020202020202020202C3
+:10FD200002020202020202020202020202020202B3
+:10FD300002020202020202020202020202020202A3
+:10FD40000202020202020202020202020202020293
+:10FD50000202020202020202020202020202020283
+:10FD60000202020202020202020202020202020273
+:10FD70000202020202020202020202020202020263
+:10FD80000202020202020202020202020202020253
+:10FD90000202020202020202020202020202020243
+:10FDA0000202020202020202020202020202020233
+:10FDB0000202020202020202020202020202020223
+:10FDC0000202020202020202020202020202020213
+:10FDD0000202020202020202020202020202020203
+:10FDE00002020202020202020202020202020202F3
+:10FDF00002020202020202020202020202020202E3
+:10FE000002020202020202020202020202020202D2
+:10FE100002020202020202020202020202020202C2
+:10FE200002020202020202020202020202020202B2
+:10FE300002020202020202020202020202020202A2
+:10FE40000202020202020202020202020202020292
+:10FE50000202020202020202020202020202020282
+:10FE60000202020202020202020202020202020272
+:10FE70000202020202020202020202020202020262
+:10FE80000202020202020202020202020202020252
+:10FE90000202020202020202020202020202020242
+:10FEA0000202020202020202020202020202020232
+:10FEB0000202020202020202020202020202020222
+:10FEC0000202020202020202020202020202020212
+:10FED0000202020202020202020202020202020202
+:10FEE00002020202020202020202020202020202F2
+:10FEF00002020202020202020202020202020202E2
+:10FF000002020202020202020202020202020202D1
+:10FF100002020202020202020202020202020202C1
+:10FF200002020202020202020202020202020202B1
+:10FF300002020202020202020202020202020202A1
+:10FF40000202020202020202020202020202020291
+:10FF50000202020202020202020202020202020281
+:10FF60000202020202020202020202020202020271
+:10FF70000202020202020202020202020202020261
+:10FF80000202020202020202020202020202020251
+:10FF90000202020202020202020202020202020241
+:10FFA0000202020202020202020202020202020231
+:10FFB0000202020202020202020202020202020221
+:10FFC0000202020202020202020202020202020211
+:10FFD0000202020202020202020202020202020201
+:10FFE00002020202020202020202020202020202F1
+:10FFF00002020202020202020202020202020202E1
+:020000021000EC
+:1000000002020202020202020202020202020202D0
+:1000100002020202020202020202020202020202C0
+:1000200002020202020202020202020202020202B0
+:1000300002020202020202020202020202020202A0
+:100040000202020202020202020202020202020290
+:100050000202020202020202020202020202020280
+:100060000202020202020202020202020202020270
+:100070000202020202020202020202020202020260
+:100080000202020202020202020202020202020250
+:100090000202020202020202020202020202020240
+:1000A0000202020202020202020202020202020230
+:1000B0000202020202020202020202020202020220
+:1000C0000202020202020202020202020202020210
+:1000D0000202020202020202020202020202020200
+:1000E00002020202020202020202020202020202F0
+:1000F00002020202020202020202020202020202E0
+:1001000002020202020202020202020202020202CF
+:1001100002020202020202020202020202020202BF
+:1001200002020202020202020202020202020202AF
+:10013000020202020202020202020202020202029F
+:10014000020202020202020202020202020202028F
+:10015000020202020202020202020202020202027F
+:10016000020202020202020202020202020202026F
+:10017000020202020202020202020202020202025F
+:10018000020202020202020202020202020202024F
+:10019000020202020202020202020202020202023F
+:1001A000020202020202020202020202020202022F
+:1001B000020202020202020202020202020202021F
+:1001C000020202020202020202020202020202020F
+:1001D00002020202020202020202020202020202FF
+:1001E00002020202020202020202020202020202EF
+:1001F00002020202020202020202020202020202DF
+:1002000002020202020202020202020202020202CE
+:1002100002020202020202020202020202020202BE
+:1002200002020202020202020202020202020202AE
+:10023000020202020202020202020202020202029E
+:10024000020202020202020202020202020202028E
+:10025000020202020202020202020202020202027E
+:10026000020202020202020202020202020202026E
+:10027000020202020202020202020202020202025E
+:10028000020202020202020202020202020202024E
+:10029000020202020202020202020202020202023E
+:1002A000020202020202020202020202020202022E
+:1002B000020202020202020202020202020202021E
+:1002C000020202020202020202020202020202020E
+:1002D00002020202020202020202020202020202FE
+:1002E00002020202020202020202020202020202EE
+:1002F00002020202020202020202020202020202DE
+:1003000002020202020202020202020202020202CD
+:1003100002020202020202020202020202020202BD
+:1003200002020202020202020202020202020202AD
+:10033000020202020202020202020202020202029D
+:10034000020202020202020202020202020202028D
+:10035000020202020202020202020202020202027D
+:10036000020202020202020202020202020202026D
+:10037000020202020202020202020202020202025D
+:10038000020202020202020202020202020202024D
+:10039000020202020202020202020202020202023D
+:1003A000020202020202020202020202020202022D
+:1003B000020202020202020202020202020202021D
+:1003C000020202020202020202020202020202020D
+:1003D00002020202020202020202020202020202FD
+:1003E00002020202020202020202020202020202ED
+:1003F00002020202020202020202020202020202DD
+:1004000002020202020202020202020202020202CC
+:1004100002020202020202020202020202020202BC
+:1004200002020202020202020202020202020202AC
+:10043000020202020202020202020202020202029C
+:10044000020202020202020202020202020202028C
+:10045000020202020202020202020202020202027C
+:10046000020202020202020202020202020202026C
+:10047000020202020202020202020202020202025C
+:10048000020202020202020202020202020202024C
+:10049000020202020202020202020202020202023C
+:1004A000020202020202020202020202020202022C
+:1004B000020202020202020202020202020202021C
+:1004C000020202020202020202020202020202020C
+:1004D00002020202020202020202020202020202FC
+:1004E00002020202020202020202020202020202EC
+:1004F00002020202020202020202020202020202DC
+:1005000002020202020202020202020202020202CB
+:1005100002020202020202020202020202020202BB
+:1005200002020202020202020202020202020202AB
+:10053000020202020202020202020202020202029B
+:10054000020202020202020202020202020202028B
+:10055000020202020202020202020202020202027B
+:10056000020202020202020202020202020202026B
+:10057000020202020202020202020202020202025B
+:10058000020202020202020202020202020202024B
+:10059000020202020202020202020202020202023B
+:1005A000020202020202020202020202020202022B
+:1005B000020202020202020202020202020202021B
+:1005C000020202020202020202020202020202020B
+:1005D00002020202020202020202020202020202FB
+:1005E00002020202020202020202020202020202EB
+:1005F00002020202020202020202020202020202DB
+:1006000002020202020202020202020202020202CA
+:1006100002020202020202020202020202020202BA
+:1006200002020202020202020202020202020202AA
+:10063000020202020202020202020202020202029A
+:10064000020202020202020202020202020202028A
+:10065000020202020202020202020202020202027A
+:10066000020202020202020202020202020202026A
+:10067000020202020202020202020202020202025A
+:10068000020202020202020202020202020202024A
+:10069000020202020202020202020202020202023A
+:1006A000020202020202020202020202020202022A
+:1006B000020202020202020202020202020202021A
+:1006C000020202020202020202020202020202020A
+:1006D00002020202020202020202020202020202FA
+:1006E00002020202020202020202020202020202EA
+:1006F00002020202020202020202020202020202DA
+:1007000002020202020202020202020202020202C9
+:1007100002020202020202020202020202020202B9
+:1007200002020202020202020202020202020202A9
+:100730000202020202020202020202020202020299
+:100740000202020202020202020202020202020289
+:100750000202020202020202020202020202020279
+:100760000202020202020202020202020202020269
+:100770000202020202020202020202020202020259
+:100780000202020202020202020202020202020249
+:100790000202020202020202020202020202020239
+:1007A0000202020202020202020202020202020229
+:1007B0000202020202020202020202020202020219
+:1007C0000202020202020202020202020202020209
+:1007D00002020202020202020202020202020202F9
+:1007E00002020202020202020202020202020202E9
+:1007F00002020202020202020202020202020202D9
+:1008000002020202020202020202020202020202C8
+:1008100002020202020202020202020202020202B8
+:1008200002020202020202020202020202020202A8
+:100830000202020202020202020202020202020298
+:100840000202020202020202020202020202020288
+:100850000202020202020202020202020202020278
+:100860000202020202020202020202020202020268
+:100870000202020202020202020202020202020258
+:100880000202020202020202020202020202020248
+:100890000202020202020202020202020202020238
+:1008A0000202020202020202020202020202020228
+:1008B0000202020202020202020202020202020218
+:1008C0000202020202020202020202020202020208
+:1008D00002020202020202020202020202020202F8
+:1008E00002020202020202020202020202020202E8
+:1008F00002020202020202020202020202020202D8
+:1009000002020202020202020202020202020202C7
+:1009100002020202020202020202020202020202B7
+:1009200002020202020202020202020202020202A7
+:100930000202020202020202020202020202020297
+:100940000202020202020202020202020202020287
+:100950000202020202020202020202020202020277
+:100960000202020202020202020202020202020267
+:100970000202020202020202020202020202020257
+:100980000202020202020202020202020202020247
+:100990000202020202020202020202020202020237
+:1009A0000202020202020202020202020202020227
+:1009B0000202020202020202020202020202020217
+:1009C0000202020202020202020202020202020207
+:1009D00002020202020202020202020202020202F7
+:1009E00002020202020202020202020202020202E7
+:1009F00002020202020202020202020202020202D7
+:100A000002020202020202020202020202020202C6
+:100A100002020202020202020202020202020202B6
+:100A200002020202020202020202020202020202A6
+:100A30000202020202020202020202020202020296
+:100A40000202020202020202020202020202020286
+:100A50000202020202020202020202020202020276
+:100A60000202020202020202020202020202020266
+:100A70000202020202020202020202020202020256
+:100A80000202020202020202020202020202020246
+:100A90000202020202020202020202020202020236
+:100AA0000202020202020202020202020202020226
+:100AB0000202020202020202020202020202020216
+:100AC0000202020202020202020202020202020206
+:100AD00002020202020202020202020202020202F6
+:100AE00002020202020202020202020202020202E6
+:100AF00002020202020202020202020202020202D6
+:100B000002020202020202020202020202020202C5
+:100B100002020202020202020202020202020202B5
+:100B200002020202020202020202020202020202A5
+:100B30000202020202020202020202020202020295
+:100B40000202020202020202020202020202020285
+:100B50000202020202020202020202020202020275
+:100B60000202020202020202020202020202020265
+:100B70000202020202020202020202020202020255
+:100B80000202020202020202020202020202020245
+:100B90000202020202020202020202020202020235
+:100BA0000202020202020202020202020202020225
+:100BB0000202020202020202020202020202020215
+:100BC0000202020202020202020202020202020205
+:100BD00002020202020202020202020202020202F5
+:100BE00002020202020202020202020202020202E5
+:100BF00002020202020202020202020202020202D5
+:100C000002020202020202020202020202020202C4
+:100C100002020202020202020202020202020202B4
+:100C200002020202020202020202020202020202A4
+:100C30000202020202020202020202020202020294
+:100C40000202020202020202020202020202020284
+:100C50000202020202020202020202020202020274
+:100C60000202020202020202020202020202020264
+:100C70000202020202020202020202020202020254
+:100C80000202020202020202020202020202020244
+:100C90000202020202020202020202020202020234
+:100CA0000202020202020202020202020202020224
+:100CB0000202020202020202020202020202020214
+:100CC0000202020202020202020202020202020204
+:100CD00002020202020202020202020202020202F4
+:100CE00002020202020202020202020202020202E4
+:100CF00002020202020202020202020202020202D4
+:100D000002020202020202020202020202020202C3
+:100D100002020202020202020202020202020202B3
+:100D200002020202020202020202020202020202A3
+:100D30000202020202020202020202020202020293
+:100D40000202020202020202020202020202020283
+:100D50000202020202020202020202020202020273
+:100D60000202020202020202020202020202020263
+:100D70000202020202020202020202020202020253
+:100D80000202020202020202020202020202020243
+:100D90000202020202020202020202020202020233
+:100DA0000202020202020202020202020202020223
+:100DB0000202020202020202020202020202020213
+:100DC0000202020202020202020202020202020203
+:100DD00002020202020202020202020202020202F3
+:100DE00002020202020202020202020202020202E3
+:100DF00002020202020202020202020202020202D3
+:100E000002020202020202020202020202020202C2
+:100E100002020202020202020202020202020202B2
+:100E200002020202020202020202020202020202A2
+:100E30000202020202020202020202020202020292
+:100E40000202020202020202020202020202020282
+:100E50000202020202020202020202020202020272
+:100E60000202020202020202020202020202020262
+:100E70000202020202020202020202020202020252
+:100E80000202020202020202020202020202020242
+:100E90000202020202020202020202020202020232
+:100EA0000202020202020202020202020202020222
+:100EB0000202020202020202020202020202020212
+:100EC0000202020202020202020202020202020202
+:100ED00002020202020202020202020202020202F2
+:100EE00002020202020202020202020202020202E2
+:100EF00002020202020202020202020202020202D2
+:100F000002020202020202020202020202020202C1
+:100F100002020202020202020202020202020202B1
+:100F200002020202020202020202020202020202A1
+:100F30000202020202020202020202020202020291
+:100F40000202020202020202020202020202020281
+:100F50000202020202020202020202020202020271
+:100F60000202020202020202020202020202020261
+:100F70000202020202020202020202020202020251
+:100F80000202020202020202020202020202020241
+:100F90000202020202020202020202020202020231
+:100FA0000202020202020202020202020202020221
+:100FB0000202020202020202020202020202020211
+:100FC0000202020202020202020202020202020201
+:100FD00002020202020202020202020202020200F3
+:100FE0000000000000000000000000000000000001
+:100FF00000000000000000000000000000000000F1
+:1010000000000000000000000000000000000000E0
+:1010100000000000000000000000000000000000D0
+:1010200000000000000000000000000000000000C0
+:1010300000000000000000000000000000000000B0
+:1010400000000000000000000000000000000000A0
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000000000000000000000070
+:101080000000000000000000000000000000000060
+:101090000000000000000000000000000000000050
+:1010A0000000000000000000000000000000000040
+:1010B0000000000000000000000000000000000030
+:1010C0000000000000000000000000000000000020
+:1010D0000000000000000000000000000000000010
+:1010E0000000000000000000000000000000000000
+:1010F00000000000000000000000000000000000F0
+:1011000000000000000000000000000000000000DF
+:1011100000000000000000000000000000000000CF
+:1011200000000000000000000000000000000000BF
+:1011300000000000000000000000000000000000AF
+:10114000000000000000000000000000000000009F
+:10115000000000000000000000000000000000008F
+:10116000000000000000000000000000000000007F
+:10117000000000000000000000000000000000006F
+:10118000000000000000000000000000000000005F
+:10119000000000000000000000000000000000004F
+:1011A000000000000000000000000000000000003F
+:1011B000000000000000000000000000000000002F
+:1011C000000000000000000000000000000000001F
+:1011D000000000000000000000000000000000000F
+:1011E00000000000000000000000000000000000FF
+:1011F00000000000000000000000000000000000EF
+:1012000000000000000000000000000000000000DE
+:1012100000000000000000000000000000000000CE
+:1012200000000000000000000000000000000000BE
+:1012300000000000000000000000000000000000AE
+:10124000000000000000000000000000000000009E
+:10125000000000000000000000000000000000008E
+:10126000000000000000000000000000000000007E
+:10127000000000000000000000000000000000006E
+:10128000000000000000000000000000000000005E
+:10129000000000000000000000000000000000004E
+:1012A000000000000000000000000000000000003E
+:1012B000000000000000000000000000000000002E
+:1012C000000000000000000000000000000000001E
+:1012D000000000000000000000000000000000000E
+:1012E00000000000000000000000000000000000FE
+:1012F00000000000000000000000000000000000EE
+:1013000000000000000000000000000000000000DD
+:1013100000000000000000000000000000000000CD
+:1013200000000000000000000000000000000000BD
+:1013300000000000000000000000000000000000AD
+:10134000000000000000000000000000000000009D
+:10135000000000000000000000000000000000008D
+:10136000000000000000000000000000000000007D
+:10137000000000000000000000000000000000006D
+:10138000000000000000000000000000000000005D
+:10139000000000000000000000000000000000004D
+:1013A000000000000000000000000000000000003D
+:1013B000000000000000000000000000000000002D
+:1013C000000000000000000000000000000000001D
+:1013D000000000000000000000000000000000000D
+:1013E00000000000000000000000000000000000FD
+:1013F00000000000000000000000000000000000ED
+:1014000000000000000000000000000000000000DC
+:1014100000000000000000000000000000000000CC
+:1014200000000000000000000000000000000000BC
+:1014300000000000000000000000000000000000AC
+:10144000000000000000000000000000000000009C
+:10145000000000000000000000000000000000008C
+:10146000000000000000000000000000000000007C
+:10147000000000000000000000000000000000006C
+:10148000000000000000000000000000000000005C
+:10149000000000000000000000000000000000004C
+:1014A000000000000000000000000000000000003C
+:1014B000000000000000000000000000000000002C
+:1014C000000000000000000000000000000000001C
+:1014D000000000000000000000000000000000000C
+:1014E00000000000000000000000000000000000FC
+:1014F00000000000000000000000000000000000EC
+:1015000000000000000000000000000000000000DB
+:1015100000000000000000000000000000000000CB
+:1015200000000000000000000000000000000000BB
+:1015300000000000000000000000000000000000AB
+:10154000000000000000000000000000000000009B
+:10155000000000000000000000000000000000008B
+:10156000000000000000000000000000000000007B
+:10157000000000000000000000000000000000006B
+:10158000000000000000000000000000000000005B
+:10159000000000000000000000000000000000004B
+:1015A000000000000000000000000000000000003B
+:1015B000000000000000000000000000000000002B
+:1015C000000000000000000000000000000000001B
+:1015D000000000000000000000000000000000000B
+:1015E00000000000000000000000000000000000FB
+:1015F00000000000000000000000000000000000EB
+:1016000000000000000000000000000000000000DA
+:1016100000000000000000000000000000000000CA
+:1016200000000000000000000000000000000000BA
+:1016300000000000000000000000000000000000AA
+:10164000000000000000000000000000000000009A
+:10165000000000000000000000000000000000008A
+:10166000000000000000000000000000000000007A
+:10167000000000000000000000000000000000006A
+:10168000000000000000000000000000000000005A
+:10169000000000000000000000000000000000004A
+:1016A000000000000000000000000000000000003A
+:1016B000000000000000000000000000000000002A
+:1016C000000000000000000000000000000000001A
+:1016D0000000000000000000000000000000006F9B
+:1016E00000000000000000010101010101010101F1
+:1016F00001010101010101010101010101010101DA
+:1017000001010101010101010101010101010101C9
+:1017100001010101010101010101010101010101B9
+:1017200001010101010101010101010101010101A9
+:101730000101010101010101010101010101010199
+:101740000101010101010101010101010101010189
+:101750000101010101010101010101010101010179
+:101760000101010101010101010101010101010169
+:101770000101010101010101010101010101010159
+:101780000101010101010101010101010101010149
+:101790000101010101010101010101010101010139
+:1017A0000101010101010101010101010101010129
+:1017B0000101010101010101010101010101010119
+:1017C0000101010101010101010101010101010109
+:1017D00001010101010101010101010101010101F9
+:1017E00001010101010101010101010101010101E9
+:1017F00001010101010101010101010101010101D9
+:1018000001010101010101010101010101010101C8
+:1018100001010101010101010101010101010101B8
+:1018200001010101010101010101010101010101A8
+:101830000101010101010101010101010101010198
+:101840000101010101010101010101010101010188
+:101850000101010101010101010101010101010178
+:101860000101010101010101010101010101010168
+:101870000101010101010101010101010101010158
+:101880000101010101010101010101010101010148
+:101890000101010101010101010101010101010138
+:1018A0000101010101010101010101010101010128
+:1018B0000101010101010101010101010101010118
+:1018C0000101010101010101010101010101010108
+:1018D00001010101010101010101010101010101F8
+:1018E00001010101010101010101010101010101E8
+:1018F00001010101010101010101010101010101D8
+:1019000001010101010101010101010101010101C7
+:1019100001010101010101010101010101010101B7
+:1019200001010101010101010101010101010101A7
+:101930000101010101010101010101010101010197
+:101940000101010101010101010101010101010187
+:101950000101010101010101010101010101010177
+:101960000101010101010101010101010101010167
+:101970000101010101010101010101010101010157
+:101980000101010101010101010101010101010147
+:101990000101010101010101010101010101010137
+:1019A0000101010101010101010101010101010127
+:1019B0000101010101010101010101010101010117
+:1019C0000101010101010101010101010101010107
+:1019D00001010101010101010101010101010101F7
+:1019E00001010101010101010101010101010101E7
+:1019F00001010101010101010101010101010101D7
+:101A000001010101010101010101010101010101C6
+:101A100001010101010101010101010101010101B6
+:101A200001010101010101010101010101010101A6
+:101A30000101010101010101010101010101010196
+:101A40000101010101010101010101010101010186
+:101A50000101010101010101010101010101010176
+:101A60000101010101010101010101010101010166
+:101A70000101010101010101010101010101010156
+:101A80000101010101010101010101010101010146
+:101A90000101010101010101010101010101010136
+:101AA0000101010101010101010101010101010126
+:101AB0000101010101010101010101010101010116
+:101AC0000101010101010101010101010101010106
+:101AD00001010101010101010101010101010101F6
+:101AE00001010101010101010101010101010101E6
+:101AF00001010101010101010101010101010101D6
+:101B000001010101010101010101010101010101C5
+:101B100001010101010101010101010101010101B5
+:101B200001010101010101010101010101010101A5
+:101B30000101010101010101010101010101010195
+:101B40000101010101010101010101010101010185
+:101B50000101010101010101010101010101010175
+:101B60000101010101010101010101010101010165
+:101B70000101010101010101010101010101010155
+:101B80000101010101010101010101010101010145
+:101B90000101010101010101010101010101010135
+:101BA0000101010101010101010101010101010125
+:101BB0000101010101010101010101010101010115
+:101BC0000101010101010101010101010101010105
+:101BD00001010101010101010101010101010101F5
+:101BE00001010101010101010101010101010101E5
+:101BF00001010101010101010101010101010101D5
+:101C000001010101010101010101010101010101C4
+:101C100001010101010101010101010101010101B4
+:101C200001010101010101010101010101010101A4
+:101C30000101010101010101010101010101010194
+:101C40000101010101010101010101010101010184
+:101C50000101010101010101010101010101010174
+:101C60000101010101010101010101010101010164
+:101C70000101010101010101010101010101010154
+:101C80000101010101010101010101010101010144
+:101C90000101010101010101010101010101010134
+:101CA0000101010101010101010101010101010124
+:101CB0000101010101010101010101010101010114
+:101CC0000101010101010101010101010101010104
+:101CD00001010101010101010101010101010101F4
+:101CE00001010101010101010101010101010101E4
+:101CF00001010101010101010101010101010101D4
+:101D000001010101010101010101010101010101C3
+:101D100001010101010101010101010101010101B3
+:101D200001010101010101010101010101010101A3
+:101D30000101010101010101010101010101010193
+:101D40000101010101010101010101010101010183
+:101D50000101010101010101010101010101010173
+:101D60000101010101010101010101010101010163
+:101D70000101010101010101010101010101010153
+:101D80000101010101010101010101010101010143
+:101D90000101010101010101010101010101010133
+:101DA0000101010101010101010101010101010123
+:101DB0000101010101010101010101010101010113
+:101DC0000101010101010101010101010101010103
+:101DD00001010101010101010101010101010101F3
+:101DE00001010101010101010101010101010101E3
+:101DF00001010101010101010101010101010101D3
+:101E000001010101010101010101010101010101C2
+:101E100001010101010101010101010101010101B2
+:101E200001010101010101010101010101010101A2
+:101E30000101010101010101010101010101010192
+:101E40000101010101010101010101010101010182
+:101E50000101010101010101010101010101010172
+:101E60000101010101010101010101010101010162
+:101E70000101010101010101010101010101010152
+:101E80000101010101010101010101010101010142
+:101E90000101010101010101010101010101010132
+:101EA0000101010101010101010101010101010122
+:101EB0000101010101010101010101010101010112
+:101EC0000101010101010101010101010101010102
+:101ED00001010101010101010101010101010101F2
+:101EE00001010101010101010101010101010101E2
+:101EF00001010101010101010101010101010101D2
+:101F000001010101010101010101010101010101C1
+:101F100001010101010101010101010101010101B1
+:101F200001010101010101010101010101010101A1
+:101F30000101010101010101010101010101010191
+:101F40000101010101010101010101010101010181
+:101F50000101010101010101010101010101010171
+:101F60000101010101010101010101010101010161
+:101F70000101010101010101010101010101010151
+:101F80000101010101010101010101010101010141
+:101F90000101010101010101010101010101010131
+:101FA0000101010101010101010101010101010121
+:101FB0000101010101010101010101010101010111
+:101FC0000101010101010101010101010101010101
+:101FD00001010101010101010101010101010101F1
+:101FE00001010101010101010101010101010101E1
+:101FF00001010101010101010101010101010101D1
+:1020000001010101010101010101010101010101C0
+:1020100001010101010101010101010101010101B0
+:1020200001010101010101010101010101010101A0
+:102030000101010101010101010101010101010190
+:102040000101010101010101010101010101010180
+:102050000101010101010101010101010101010170
+:102060000101010101010101010101010101010160
+:102070000101010101010101010101010101010150
+:102080000101010101010101010101010101010140
+:102090000101010101010101010101010101010130
+:1020A0000101010101010101010101010101010120
+:1020B0000101010101010101010101010101010110
+:1020C0000101010101010101010101010101010100
+:1020D00001010101010101010101010101010101F0
+:1020E00001010101010101010101010101010101E0
+:1020F00001010101010101010101010101010101D0
+:1021000001010101010101010101010101010101BF
+:1021100001010101010101010101010101010101AF
+:10212000010101010101010101010101010101019F
+:10213000010101010101010101010101010101018F
+:10214000010101010101010101010101010101017F
+:10215000010101010101010101010101010101016F
+:10216000010101010101010101010101010101015F
+:10217000010101010101010101010101010101014F
+:10218000010101010101010101010101010101013F
+:10219000010101010101010101010101010101012F
+:1021A000010101010101010101010101010101011F
+:1021B000010101010101010101010101010101010F
+:1021C00001010101010101010101010101010101FF
+:1021D00001010101010101010101010101010101EF
+:1021E00001010101010101010101010101010101DF
+:1021F00001010101010101010101010101010101CF
+:1022000001010101010101010101010101010101BE
+:1022100001010101010101010101010101010101AE
+:10222000010101010101010101010101010101019E
+:10223000010101010101010101010101010101018E
+:10224000010101010101010101010101010101017E
+:10225000010101010101010101010101010101016E
+:10226000010101010101010101010101010101015E
+:10227000010101010101010101010101010101014E
+:10228000010101010101010101010101010101013E
+:10229000010101010101010101010101010101012E
+:1022A000010101010101010101010101010101011E
+:1022B000010101010101010101010101010101010E
+:1022C00001010101010101010101010101010101FE
+:1022D00001010101010101010101010101010101EE
+:1022E00001010101010101010101010101010101DE
+:1022F00001010101010101010101010101010101CE
+:1023000001010101010101010101010101010101BD
+:1023100001010101010101010101010101010101AD
+:10232000010101010101010101010101010101019D
+:10233000010101010101010101010101010101018D
+:10234000010101010101010101010101010101017D
+:10235000010101010101010101010101010101016D
+:10236000010101010101010101010101010101015D
+:10237000010101010101010101010101010101014D
+:10238000010101010101010101010101010101013D
+:10239000010101010101010101010101010101012D
+:1023A000010101010101010101010101010101011D
+:1023B000010101010101010101010101010101010D
+:1023C00001010101010101010101010101010101FD
+:1023D00001010101010101010101010101010101ED
+:1023E00001010101010101010101010101010101DD
+:1023F00001010101010101010101010101010101CD
+:1024000001010101010101010101010101010101BC
+:1024100001010101010101010101010101010101AC
+:10242000010101010101010101010101010101019C
+:10243000010101010101010101010101010101018C
+:10244000010101010101010101010101010101017C
+:10245000010101010101010101010101010101016C
+:10246000010101010101010101010101010101015C
+:10247000010101010101010101010101010101014C
+:10248000010101010101010101010101010101013C
+:10249000010101010101010101010101010101012C
+:1024A000010101010101010101010101010101011C
+:1024B000010101010101010101010101010101010C
+:1024C00001010101010101010101010101010101FC
+:1024D00001010101010101010101010101010101EC
+:1024E00001010101010101010101010101010101DC
+:1024F00001010101010101010101010101010101CC
+:1025000001010101010101010101010101010101BB
+:1025100001010101010101010101010101010101AB
+:10252000010101010101010101010101010101019B
+:10253000010101010101010101010101010101018B
+:10254000010101010101010101010101010101017B
+:10255000010101010101010101010101010101016B
+:10256000010101010101010101010101010101015B
+:10257000010101010101010101010101010101014B
+:10258000010101010101010101010101010101013B
+:10259000010101010101010101010101010101012B
+:1025A000010101010101010101010101010101011B
+:1025B000010101010101010101010101010101010B
+:1025C00001010101010101010101010101010101FB
+:1025D00001010101010101010101010101010101EB
+:1025E00001010101010101010101010101010101DB
+:1025F00001010101010101010101010101010101CB
+:1026000001010101010101010101010101010101BA
+:1026100001010101010101010101010101010101AA
+:10262000010101010101010101010101010101019A
+:10263000010101010101010101010101010101018A
+:10264000010101010101010101010101010101017A
+:10265000010101010101010101010101010101016A
+:10266000010101010101010101010101010101015A
+:10267000010101010101010101010101010101014A
+:10268000010101010101010101010101010101013A
+:10269000010101010101010101010101010101012A
+:1026A000010101010101010101010101010101011A
+:1026B000010101010101010101010101010101010A
+:1026C00001010101010101010101010101010101FA
+:1026D00001010101010101010101010101010101EA
+:1026E00001010101010101010101010101010101DA
+:1026F00001010101010101010101010101010101CA
+:1027000001010101010101010101010101010101B9
+:1027100001010101010101010101010101010101A9
+:102720000101010101010101010101010101010199
+:102730000101010101010101010101010101010189
+:102740000101010101010101010101010101010179
+:102750000101010101010101010101010101010169
+:102760000101010101010101010101010101010159
+:102770000101010101010101010101010101010149
+:102780000101010101010101010101010101010139
+:102790000101010101010101010101010101010129
+:1027A0000101010101010101010101010101010119
+:1027B0000101010101010101010101010101010109
+:1027C00001010101010101010101010101010101F9
+:1027D00001010101010101010101010101010101E9
+:1027E00001010101010101010101010101010101D9
+:1027F00001010101010101010101010101010101C9
+:1028000001010101010101010101010101010101B8
+:1028100001010101010101010101010101010101A8
+:102820000101010101010101010101010101010198
+:102830000101010101010101010101010101010188
+:102840000101010101010101010101010101010178
+:102850000101010101010101010101010101010168
+:102860000101010101010101010101010101010158
+:102870000101010101010101010101010101010148
+:102880000101010101010101010101010101010138
+:102890000101010101010101010101010101010128
+:1028A0000101010101010101010101010101010118
+:1028B0000101010101010101010101010101010108
+:1028C00001010101010101010101010101010101F8
+:1028D00001010101010101010101010101010101E8
+:1028E00001010101010101010101010101010101D8
+:1028F00001010101010101010101010101010101C8
+:1029000001010101010101010101010101010101B7
+:1029100001010101010101010101010101010101A7
+:102920000101010101010101010101010101010197
+:102930000101010101010101010101010101010187
+:102940000101010101010101010101010101010177
+:102950000101010101010101010101010101010167
+:102960000101010101010101010101010101010157
+:102970000101010101010101010101010101010147
+:102980000101010101010101010101010101010137
+:102990000101010101010101010101010101010127
+:1029A0000101010101010101010101010101010117
+:1029B0000101010101010101010101010101010107
+:1029C00001010101010101010101010101010101F7
+:1029D00001010101010101010101010101010101E7
+:1029E00001010101010101010101010101010101D7
+:1029F00001010101010101010101010101010101C7
+:102A000001010101010101010101010101010101B6
+:102A100001010101010101010101010101010101A6
+:102A20000101010101010101010101010101010196
+:102A30000101010101010101010101010101010186
+:102A40000101010101010101010101010101010176
+:102A50000101010101010101010101010101010166
+:102A60000101010101010101010101010101010156
+:102A70000101010101010101010101010101010146
+:102A80000101010101010101010101010101010136
+:102A90000101010101010101010101010101010126
+:102AA0000101010101010101010101010101010116
+:102AB0000101010101010101010101010101010106
+:102AC00001010101010101010101010101010101F6
+:102AD00001010101010101010101010101010101E6
+:102AE00001010101010101010101010101010101D6
+:102AF00001010101010101010101010101010101C6
+:102B000001010101010101010101010101010101B5
+:102B100001010101010101010101010101010101A5
+:102B20000101010101010101010101010101010195
+:102B30000101010101010101010101010101010185
+:102B40000101010101010101010101010101010175
+:102B50000101010101010101010101010101010165
+:102B60000101010101010101010101010101010155
+:102B70000101010101010101010101010101010145
+:102B80000101010101010101010101010101010135
+:102B90000101010101010101010101010101010125
+:102BA0000101010101010101010101010101010115
+:102BB0000101010101010101010101010101010105
+:102BC00001010101010101010101010101010101F5
+:102BD00001010101010101010101010101010101E5
+:102BE00001010101010101010101010101010101D5
+:102BF00001010101010101010101010101010101C5
+:102C000001010101010101010101010101010101B4
+:102C100001010101010101010101010101010101A4
+:102C20000101010101010101010101010101010194
+:102C30000101010101010101010101010101010184
+:102C40000101010101010101010101010101010174
+:102C50000101010101010101010101010101010164
+:102C60000101010101010101010101010101010154
+:102C70000101010101010101010101010101010144
+:102C80000101010101010101010101010101010134
+:102C90000101010101010101010101010101010124
+:102CA0000101010101010101010101010101010114
+:102CB0000101010101010101010101010101010104
+:102CC00001010101010101010101010101010101F4
+:102CD00001010101010101010101010101010101E4
+:102CE00001010101010101000000000000000000DD
+:102CF00000000000000000000000000000000000D4
+:102D000000000000000000000000000000000000C3
+:102D100000000000000000000000000000000000B3
+:102D200000000000000000000000000000000000A3
+:102D30000000000000000000000000000000000093
+:102D40000000000000000000000000000000000083
+:102D50000000000000000000000000000000000073
+:102D60000000000000000000000000000000000063
+:102D70000000000000000000000000000000000053
+:102D80000000000000000000000000000000000043
+:102D90000000000000000000000000000000000033
+:102DA0000000000000000000000000000000000023
+:102DB0000000000000000000000000000000000013
+:102DC0000000000000000000000000000000000003
+:102DD00000000000000000000000000000000000F3
+:102DE00000000000000000000000000000000000E3
+:102DF00000000000000000000000000000000000D3
+:102E000000000000000000000000000000000000C2
+:102E100000000000000000000000000000000000B2
+:102E200000000000000000000000000000000000A2
+:102E30000000000000000000000000000000000092
+:102E40000000000000000000000000000000000082
+:102E50000000000000000000000000000000000072
+:102E60000000000000000000000000000000000062
+:102E70000000000000000000000000000000000052
+:102E80000000000000000000000000000000000042
+:102E90000000000000000000000000000000000032
+:102EA0000000000000000000000000000000000022
+:102EB0000000000000000000000000000000000012
+:102EC0000000000000000000000000000000000002
+:102ED00000000000000000000000000000000000F2
+:102EE00000000000000000000000000000000000E2
+:102EF00000000000000000000000000000000000D2
+:102F000000000000000000000000000000000000C1
+:102F100000000000000000000000000000000000B1
+:102F200000000000000000000000000000000000A1
+:102F30000000000000000000000000000000000091
+:102F40000000000000000000000000000000000081
+:102F50000000000000000000000000000000000071
+:102F60000000000000000000000000000000000061
+:102F70000000000000000000000000000000000051
+:102F80000000000000000000000000000000000041
+:102F90000000000000000000000000000000000031
+:102FA0000000000000000000000000000000000021
+:102FB0000000000000000000000000000000000011
+:102FC0000000000000000000000000000000000001
+:102FD00000000000000000000000000000000000F1
+:102FE00000000000000000000000000000000000E1
+:102FF00000000000000000000000000000000000D1
+:1030000000000000000000000000000000000000C0
+:1030100000000000000000000000000000000000B0
+:1030200000000000000000000000000000000000A0
+:103030000000000000000000000000000000000090
+:103040000000000000000000000000000000000080
+:103050000000000000000000000000000000000070
+:103060000000000000000000000000000000000060
+:103070000000000000000000000000000000000050
+:103080000000000000000000000000000000000040
+:103090000000000000000000000000000000000030
+:1030A0000000000000000000000000000000000020
+:1030B0000000000000000000000000000000000010
+:1030C0000000000000000000000000000000000000
+:1030D00000000000000000000000000000000000F0
+:1030E00000000000000000020202020202020202CE
+:1030F00002020202020202020202020202020202B0
+:10310000020202020202020202020202020202029F
+:10311000020202020202020202020202020202028F
+:10312000020202020202020202020202020202027F
+:10313000020202020202020202020202020202026F
+:10314000020202020202020202020202020202025F
+:10315000020202020202020202020202020202024F
+:10316000020202020202020202020202020202023F
+:10317000020202020202020202020202020202022F
+:10318000020202020202020202020202020202021F
+:10319000020202020202020202020202020202020F
+:1031A00002020202020202020202020202020202FF
+:1031B00002020202020202020202020202020202EF
+:1031C00002020202020202020202020202020202DF
+:1031D00002020202020202020202020202020202CF
+:1031E00002020202020202020202020202020202BF
+:1031F00002020202020202020202020202020202AF
+:10320000020202020202020202020202020202029E
+:10321000020202020202020202020202020202028E
+:10322000020202020202020202020202020202027E
+:10323000020202020202020202020202020202026E
+:10324000020202020202020202020202020202025E
+:10325000020202020202020202020202020202024E
+:10326000020202020202020202020202020202023E
+:10327000020202020202020202020202020202022E
+:10328000020202020202020202020202020202021E
+:10329000020202020202020202020202020202020E
+:1032A00002020202020202020202020202020202FE
+:1032B00002020202020202020202020202020202EE
+:1032C00002020202020202020202020202020202DE
+:1032D00002020202020202020202020202020202CE
+:1032E00002020202020202020202020202020202BE
+:1032F00002020202020202020202020202020202AE
+:10330000020202020202020202020202020202029D
+:10331000020202020202020202020202020202028D
+:10332000020202020202020202020202020202027D
+:10333000020202020202020202020202020202026D
+:10334000020202020202020202020202020202025D
+:10335000020202020202020202020202020202024D
+:10336000020202020202020202020202020202023D
+:10337000020202020202020202020202020202022D
+:10338000020202020202020202020202020202021D
+:10339000020202020202020202020202020202020D
+:1033A00002020202020202020202020202020202FD
+:1033B00002020202020202020202020202020202ED
+:1033C00002020202020202020202020202020202DD
+:1033D00002020202020202020202020202020202CD
+:1033E00002020202020202020202020202020202BD
+:1033F00002020202020202020202020202020202AD
+:10340000020202020202020202020202020202029C
+:10341000020202020202020202020202020202028C
+:10342000020202020202020202020202020202027C
+:10343000020202020202020202020202020202026C
+:10344000020202020202020202020202020202025C
+:10345000020202020202020202020202020202024C
+:10346000020202020202020202020202020202023C
+:10347000020202020202020202020202020202022C
+:10348000020202020202020202020202020202021C
+:10349000020202020202020202020202020202020C
+:1034A00002020202020202020202020202020202FC
+:1034B00002020202020202020202020202020202EC
+:1034C00002020202020202020202020202020202DC
+:1034D00002020202020202020202020202020202CC
+:1034E00002020202020202020202020202020202BC
+:1034F00002020202020202020202020202020202AC
+:10350000020202020202020202020202020202029B
+:10351000020202020202020202020202020202028B
+:10352000020202020202020202020202020202027B
+:10353000020202020202020202020202020202026B
+:10354000020202020202020202020202020202025B
+:10355000020202020202020202020202020202024B
+:10356000020202020202020202020202020202023B
+:10357000020202020202020202020202020202022B
+:10358000020202020202020202020202020202021B
+:10359000020202020202020202020202020202020B
+:1035A00002020202020202020202020202020202FB
+:1035B00002020202020202020202020202020202EB
+:1035C00002020202020202020202020202020202DB
+:1035D00002020202020202020202020202020202CB
+:1035E00002020202020202020202020202020202BB
+:1035F00002020202020202020202020202020202AB
+:10360000020202020202020202020202020202029A
+:10361000020202020202020202020202020202028A
+:10362000020202020202020202020202020202027A
+:10363000020202020202020202020202020202026A
+:10364000020202020202020202020202020202025A
+:10365000020202020202020202020202020202024A
+:10366000020202020202020202020202020202023A
+:10367000020202020202020202020202020202022A
+:10368000020202020202020202020202020202021A
+:10369000020202020202020202020202020202020A
+:1036A00002020202020202020202020202020202FA
+:1036B00002020202020202020202020202020202EA
+:1036C00002020202020202020202020202020202DA
+:1036D00002020202020202020202020202020202CA
+:1036E00002020202020202020202020202020202BA
+:1036F00002020202020202020202020202020202AA
+:103700000202020202020202020202020202020299
+:103710000202020202020202020202020202020289
+:103720000202020202020202020202020202020279
+:103730000202020202020202020202020202020269
+:103740000202020202020202020202020202020259
+:103750000202020202020202020202020202020249
+:103760000202020202020202020202020202020239
+:103770000202020202020202020202020202020229
+:103780000202020202020202020202020202020219
+:103790000202020202020202020202020202020209
+:1037A00002020202020202020202020202020202F9
+:1037B00002020202020202020202020202020202E9
+:1037C00002020202020202020202020202020202D9
+:1037D00002020202020202020202020202020202C9
+:1037E00002020202020202020202020202020202B9
+:1037F00002020202020202020202020202020202A9
+:103800000202020202020202020202020202020298
+:103810000202020202020202020202020202020288
+:103820000202020202020202020202020202020278
+:103830000202020202020202020202020202020268
+:103840000202020202020202020202020202020258
+:103850000202020202020202020202020202020248
+:103860000202020202020202020202020202020238
+:103870000202020202020202020202020202020228
+:103880000202020202020202020202020202020218
+:103890000202020202020202020202020202020208
+:1038A00002020202020202020202020202020202F8
+:1038B00002020202020202020202020202020202E8
+:1038C00002020202020202020202020202020202D8
+:1038D00002020202020202020202020202020202C8
+:1038E00002020202020202020202020202020202B8
+:1038F00002020202020202020202020202020202A8
+:103900000202020202020202020202020202020297
+:103910000202020202020202020202020202020287
+:103920000202020202020202020202020202020277
+:103930000202020202020202020202020202020267
+:103940000202020202020202020202020202020257
+:103950000202020202020202020202020202020247
+:103960000202020202020202020202020202020237
+:103970000202020202020202020202020202020227
+:103980000202020202020202020202020202020217
+:103990000202020202020202020202020202020207
+:1039A00002020202020202020202020202020202F7
+:1039B00002020202020202020202020202020202E7
+:1039C00002020202020202020202020202020202D7
+:1039D00002020202020202020202020202020202C7
+:1039E00002020202020202020202020202020202B7
+:1039F00002020202020202020202020202020202A7
+:103A00000202020202020202020202020202020296
+:103A10000202020202020202020202020202020286
+:103A20000202020202020202020202020202020276
+:103A30000202020202020202020202020202020266
+:103A40000202020202020202020202020202020256
+:103A50000202020202020202020202020202020246
+:103A60000202020202020202020202020202020236
+:103A70000202020202020202020202020202020226
+:103A80000202020202020202020202020202020216
+:103A90000202020202020202020202020202020206
+:103AA00002020202020202020202020202020202F6
+:103AB00002020202020202020202020202020202E6
+:103AC00002020202020202020202020202020202D6
+:103AD00002020202020202020202020202020202C6
+:103AE00002020202020202020202020202020202B6
+:103AF00002020202020202020202020202020202A6
+:103B00000202020202020202020202020202020295
+:103B10000202020202020202020202020202020285
+:103B20000202020202020202020202020202020275
+:103B30000202020202020202020202020202020265
+:103B40000202020202020202020202020202020255
+:103B50000202020202020202020202020202020245
+:103B60000202020202020202020202020202020235
+:103B70000202020202020202020202020202020225
+:103B80000202020202020202020202020202020215
+:103B90000202020202020202020202020202020205
+:103BA00002020202020202020202020202020202F5
+:103BB00002020202020202020202020202020202E5
+:103BC00002020202020202020202020202020202D5
+:103BD00002020202020202020202020202020202C5
+:103BE00002020202020202020202020202020202B5
+:103BF00002020202020202020202020202020202A5
+:103C00000202020202020202020202020202020294
+:103C10000202020202020202020202020202020284
+:103C20000202020202020202020202020202020274
+:103C30000202020202020202020202020202020264
+:103C40000202020202020202020202020202020254
+:103C50000202020202020202020202020202020244
+:103C60000202020202020202020202020202020234
+:103C70000202020202020202020202020202020224
+:103C80000202020202020202020202020202020214
+:103C90000202020202020202020202020202020204
+:103CA00002020202020202020202020202020202F4
+:103CB00002020202020202020202020202020202E4
+:103CC00002020202020202020202020202020202D4
+:103CD00002020202020202020202020202020202C4
+:103CE00002020202020202020202020202020202B4
+:103CF00002020202020202020202020202020202A4
+:103D00000202020202020202020202020202020293
+:103D10000202020202020202020202020202020283
+:103D20000202020202020202020202020202020273
+:103D30000202020202020202020202020202020263
+:103D40000202020202020202020202020202020253
+:103D50000202020202020202020202020202020243
+:103D60000202020202020202020202020202020233
+:103D70000202020202020202020202020202020223
+:103D80000202020202020202020202020202020213
+:103D90000202020202020202020202020202020203
+:103DA00002020202020202020202020202020202F3
+:103DB00002020202020202020202020202020202E3
+:103DC00002020202020202020202020202020202D3
+:103DD00002020202020202020202020202020202C3
+:103DE00002020202020202020202020202020202B3
+:103DF00002020202020202020202020202020202A3
+:103E00000202020202020202020202020202020292
+:103E10000202020202020202020202020202020282
+:103E20000202020202020202020202020202020272
+:103E30000202020202020202020202020202020262
+:103E40000202020202020202020202020202020252
+:103E50000202020202020202020202020202020242
+:103E60000202020202020202020202020202020232
+:103E70000202020202020202020202020202020222
+:103E80000202020202020202020202020202020212
+:103E90000202020202020202020202020202020202
+:103EA00002020202020202020202020202020202F2
+:103EB00002020202020202020202020202020202E2
+:103EC00002020202020202020202020202020202D2
+:103ED00002020202020202020202020202020202C2
+:103EE00002020202020202020202020202020202B2
+:103EF00002020202020202020202020202020202A2
+:103F00000202020202020202020202020202020291
+:103F10000202020202020202020202020202020281
+:103F20000202020202020202020202020202020271
+:103F30000202020202020202020202020202020261
+:103F40000202020202020202020202020202020251
+:103F50000202020202020202020202020202020241
+:103F60000202020202020202020202020202020231
+:103F70000202020202020202020202020202020221
+:103F80000202020202020202020202020202020211
+:103F90000202020202020202020202020202020201
+:103FA00002020202020202020202020202020202F1
+:103FB00002020202020202020202020202020202E1
+:103FC00002020202020202020202020202020202D1
+:103FD00002020202020202020202020202020202C1
+:103FE00002020202020202020202020202020202B1
+:103FF00002020202020202020202020202020202A1
+:104000000202020202020202020202020202020290
+:104010000202020202020202020202020202020280
+:104020000202020202020202020202020202020270
+:104030000202020202020202020202020202020260
+:104040000202020202020202020202020202020250
+:104050000202020202020202020202020202020240
+:104060000202020202020202020202020202020230
+:104070000202020202020202020202020202020220
+:104080000202020202020202020202020202020210
+:104090000202020202020202020202020202020200
+:1040A00002020202020202020202020202020202F0
+:1040B00002020202020202020202020202020202E0
+:1040C00002020202020202020202020202020202D0
+:1040D00002020202020202020202020202020202C0
+:1040E00002020202020202020202020202020202B0
+:1040F00002020202020202020202020202020202A0
+:10410000020202020202020202020202020202028F
+:10411000020202020202020202020202020202027F
+:10412000020202020202020202020202020202026F
+:10413000020202020202020202020202020202025F
+:10414000020202020202020202020202020202024F
+:10415000020202020202020202020202020202023F
+:10416000020202020202020202020202020202022F
+:10417000020202020202020202020202020202021F
+:10418000020202020202020202020202020202020F
+:1041900002020202020202020202020202020202FF
+:1041A00002020202020202020202020202020202EF
+:1041B00002020202020202020202020202020202DF
+:1041C00002020202020202020202020202020202CF
+:1041D00002020202020202020202020202020202BF
+:1041E00002020202020202020202020202020202AF
+:1041F000020202020202020202020202020202029F
+:10420000020202020202020202020202020202028E
+:10421000020202020202020202020202020202027E
+:10422000020202020202020202020202020202026E
+:10423000020202020202020202020202020202025E
+:10424000020202020202020202020202020202024E
+:10425000020202020202020202020202020202023E
+:10426000020202020202020202020202020202022E
+:10427000020202020202020202020202020202021E
+:10428000020202020202020202020202020202020E
+:1042900002020202020202020202020202020202FE
+:1042A00002020202020202020202020202020202EE
+:1042B00002020202020202020202020202020202DE
+:1042C00002020202020202020202020202020202CE
+:1042D00002020202020202020202020202020202BE
+:1042E00002020202020202020202020202020202AE
+:1042F000020202020202020202020202020202029E
+:10430000020202020202020202020202020202028D
+:10431000020202020202020202020202020202027D
+:10432000020202020202020202020202020202026D
+:10433000020202020202020202020202020202025D
+:10434000020202020202020202020202020202024D
+:10435000020202020202020202020202020202023D
+:10436000020202020202020202020202020202022D
+:10437000020202020202020202020202020202021D
+:10438000020202020202020202020202020202020D
+:1043900002020202020202020202020202020202FD
+:1043A00002020202020202020202020202020202ED
+:1043B00002020202020202020202020202020202DD
+:1043C00002020202020202020202020202020202CD
+:1043D00002020202020202020202020202020202BD
+:1043E00002020202020202020202020202020202AD
+:1043F000020202020202020202020202020202029D
+:10440000020202020202020202020202020202028C
+:10441000020202020202020202020202020202027C
+:10442000020202020202020202020202020202026C
+:10443000020202020202020202020202020202025C
+:10444000020202020202020202020202020202024C
+:10445000020202020202020202020202020202023C
+:10446000020202020202020202020202020202022C
+:10447000020202020202020202020202020202021C
+:10448000020202020202020202020202020202020C
+:1044900002020202020202020202020202020202FC
+:1044A00002020202020202020202020202020202EC
+:1044B00002020202020202020202020202020202DC
+:1044C00002020202020202020202020202020202CC
+:1044D00002020202020202020202020202020202BC
+:1044E00002020202020202020202020202020202AC
+:1044F000020202020202020202020202020202029C
+:10450000020202020202020202020202020202028B
+:10451000020202020202020202020202020202027B
+:10452000020202020202020202020202020202026B
+:10453000020202020202020202020202020202025B
+:10454000020202020202020202020202020202024B
+:10455000020202020202020202020202020202023B
+:10456000020202020202020202020202020202022B
+:10457000020202020202020202020202020202021B
+:10458000020202020202020202020202020202020B
+:1045900002020202020202020202020202020202FB
+:1045A00002020202020202020202020202020202EB
+:1045B00002020202020202020202020202020202DB
+:1045C00002020202020202020202020202020202CB
+:1045D00002020202020202020202020202020202BB
+:1045E00002020202020202020202020202020202AB
+:1045F000020202020202020202020202020202029B
+:10460000020202020202020202020202020202028A
+:10461000020202020202020202020202020202027A
+:10462000020202020202020202020202020202026A
+:10463000020202020202020202020202020202025A
+:10464000020202020202020202020202020202024A
+:10465000020202020202020202020202020202023A
+:10466000020202020202020202020202020202022A
+:10467000020202020202020202020202020202021A
+:10468000020202020202020202020202020202020A
+:1046900002020202020202020202020202020202FA
+:1046A00002020202020202020202020202020202EA
+:1046B00002020202020202020202020202020202DA
+:1046C00002020202020202020202020202020202CA
+:1046D00002020202020202020202020202020202BA
+:1046E00002020202020202000000000000000000BC
+:1046F00000000000000000000000000000000000BA
+:1047000000000000000000000000000000000000A9
+:104710000000000000000000000000000000000099
+:104720000000000000000000000000000000000089
+:104730000000000000000000000000000000000079
+:104740000000000000000000000000000000000069
+:104750000000000000000000000000000000000059
+:104760000000000000000000000000000000000049
+:104770000000000000000000000000000000000039
+:104780000000000000000000000000000000000029
+:104790000000000000000000000000000000000019
+:1047A0000000000000000000000000000000000009
+:1047B00000000000000000000000000000000000F9
+:1047C00000000000000000000000000000000000E9
+:1047D00000000000000000000000000000000000D9
+:1047E00000000000000000000000000000000000C9
+:1047F00000000000000000000000000000000000B9
+:1048000000000000000000000000000000000000A8
+:104810000000000000000000000000000000000098
+:104820000000000000000000000000000000000088
+:104830000000000000000000000000000000000078
+:104840000000000000000000000000000000000068
+:104850000000000000000000000000000000000058
+:104860000000000000000000000000000000000048
+:104870000000000000000000000000000000000038
+:104880000000000000000000000000000000000028
+:104890000000000000000000000000000000000018
+:1048A0000000000000000000000000000000000008
+:1048B00000000000000000000000000000000000F8
+:1048C00000000000000000000000000000000000E8
+:1048D00000000000000000000000000000000000D8
+:1048E00000000000000000000000000000000000C8
+:1048F00000000000000000000000000000000000B8
+:1049000000000000000000000000000000000000A7
+:104910000000000000000000000000000000000097
+:104920000000000000000000000000000000000087
+:104930000000000000000000000000000000000077
+:104940000000000000000000000000000000000067
+:104950000000000000000000000000000000000057
+:104960000000000000000000000000000000000047
+:104970000000000000000000000000000000000037
+:104980000000000000000000000000000000000027
+:104990000000000000000000000000000000000017
+:1049A0000000000000000000000000000000000007
+:1049B00000000000000000000000000000000000F7
+:1049C00000000000000000000000000000000000E7
+:1049D00000000000000000000000000000000000D7
+:1049E00000000000000000000000000000000000C7
+:1049F00000000000000000000000000000000000B7
+:104A000000000000000000000000000000000000A6
+:104A10000000000000000000000000000000000096
+:104A20000000000000000000000000000000000086
+:104A30000000000000000000000000000000000076
+:104A40000000000000000000000000000000000066
+:104A50000000000000000000000000000000000056
+:104A60000000000000000000000000000000000046
+:104A70000000000000000000000000000000000036
+:104A80000000000000000000000000000000000026
+:104A90000000000000000000000000000000000016
+:104AA0000000000000000000000000000000000006
+:104AB00000000000000000000000000000000000F6
+:104AC00000000000000000000000000000000000E6
+:104AD00000000000000000000000000000000000D6
+:104AE00000000000000000000000000000000000C6
+:104AF00000000000000000000000000000000000B6
+:104B000000000000000000000000000000000000A5
+:104B10000000000000000000000000000000000095
+:104B20000000000000000000000000000000000085
+:104B30000000000000000000000000000000000075
+:104B40000000000000000000000000000000000065
+:104B50000000000000000000000000000000000055
+:104B60000000000000000000000000000000000045
+:104B70000000000000000000000000000000000035
+:104B80000000000000000000000000000000000025
+:104B90000000000000000000000000000000000015
+:104BA0000000000000000000000000000000000005
+:104BB00000000000000000000000000000000000F5
+:104BC00000000000000000000000000000000000E5
+:104BD00000000000000000000000000000000000D5
+:104BE00000000000000000000000000000000000C5
+:104BF00000000000000000000000000000000000B5
+:104C000000000000000000000000000000000000A4
+:104C10000000000000000000000000000000000094
+:104C20000000000000000000000000000000000084
+:104C30000000000000000000000000000000000074
+:104C40000000000000000000000000000000000064
+:104C50000000000000000000000000000000000054
+:104C60000000000000000000000000000000000044
+:104C70000000000000000000000000000000000034
+:104C80000000000000000000000000000000000024
+:104C90000000000000000000000000000000000014
+:104CA0000000000000000000000000000000000004
+:104CB00000000000000000000000000000000000F4
+:104CC00000000000000000000000000000000000E4
+:104CD00000000000000000000000000000000000D4
+:104CE00000000000000000000000000000000000C4
+:104CF00000000000000000000000000000000000B4
+:104D000000000000000000000000000000000000A3
+:104D10000000000000000000000000000000000093
+:104D20000000000000000000000000000000000083
+:104D30000000000000000000000000000000000073
+:104D40000000000000000000000000000000000063
+:104D50000000000000000000000000000000000053
+:104D60000000000000000000000000000000000043
+:104D70000000000000000000000000000000000033
+:104D80000000000000000000000000000000000023
+:104D90000000000000000000000000000000000013
+:104DA0000000000000000000000000000000000003
+:104DB00000000000000000000000000000000000F3
+:104DC00000000000000000000000000000000000E3
+:104DD00000000000000000000000000000000000D3
+:104DE00000000000000000000000000000000000C3
+:104DF00000000000000000000000000000000000B3
+:104E000000000000000000000000000000000000A2
+:104E10000000000000000000000000000000000092
+:104E20000000000000000000000000000000000082
+:104E30000000000000000000000000000000000072
+:104E40000000000000000000000000000000000062
+:104E50000000000000000000000000000000000052
+:104E60000000000000000000000000000000000042
+:104E70000000000000000000000000000000000032
+:104E80000000000000000000000000000000000022
+:104E90000000000000000000000000000000000012
+:104EA0000000000000000000000000000000000002
+:104EB00000000000000000000000000000000000F2
+:104EC00000000000000000000000000000000000E2
+:104ED00000000000000000000000000000000000D2
+:104EE00000000000000000000000000000000000C2
+:104EF00000000000000000000000000000000000B2
+:104F000000000000000000000000000000000000A1
+:104F10000000000000000000000000000000000091
+:104F20000000000000000000000000000000000081
+:104F30000000000000000000000000000000000071
+:104F40000000000000000000000000000000000061
+:104F50000000000000000000000000000000000051
+:104F60000000000000000000000000000000000041
+:104F70000000000000000000000000000000000031
+:104F80000000000000000000000000000000000021
+:104F90000000000000000000000000000000000011
+:104FA0000000000000000000000000000000000001
+:104FB00000000000000000000000000000000000F1
+:104FC00000000000000000000000000000000000E1
+:104FD00000000000000000000000000000000000D1
+:104FE00000000000000000010101010101010101B8
+:104FF00001010101010101010101010101010101A1
+:105000000101010101010101010101010101010190
+:105010000101010101010101010101010101010180
+:105020000101010101010101010101010101010170
+:105030000101010101010101010101010101010160
+:105040000101010101010101010101010101010150
+:105050000101010101010101010101010101010140
+:105060000101010101010101010101010101010130
+:105070000101010101010101010101010101010120
+:105080000101010101010101010101010101010110
+:105090000101010101010101010101010101010100
+:1050A00001010101010101010101010101010101F0
+:1050B00001010101010101010101010101010101E0
+:1050C00001010101010101010101010101010101D0
+:1050D00001010101010101010101010101010101C0
+:1050E00001010101010101010101010101010101B0
+:1050F00001010101010101010101010101010101A0
+:10510000010101010101010101010101010101018F
+:10511000010101010101010101010101010101017F
+:10512000010101010101010101010101010101016F
+:10513000010101010101010101010101010101015F
+:10514000010101010101010101010101010101014F
+:10515000010101010101010101010101010101013F
+:10516000010101010101010101010101010101012F
+:10517000010101010101010101010101010101011F
+:10518000010101010101010101010101010101010F
+:1051900001010101010101010101010101010101FF
+:1051A00001010101010101010101010101010101EF
+:1051B00001010101010101010101010101010101DF
+:1051C00001010101010101010101010101010101CF
+:1051D00001010101010101010101010101010101BF
+:1051E00001010101010101010101010101010101AF
+:1051F000010101010101010101010101010101019F
+:10520000010101010101010101010101010101018E
+:10521000010101010101010101010101010101017E
+:10522000010101010101010101010101010101016E
+:10523000010101010101010101010101010101015E
+:10524000010101010101010101010101010101014E
+:10525000010101010101010101010101010101013E
+:10526000010101010101010101010101010101012E
+:10527000010101010101010101010101010101011E
+:10528000010101010101010101010101010101010E
+:1052900001010101010101010101010101010101FE
+:1052A00001010101010101010101010101010101EE
+:1052B00001010101010101010101010101010101DE
+:1052C00001010101010101010101010101010101CE
+:1052D00001010101010101010101010101010101BE
+:1052E00001010101010101010101010101010101AE
+:1052F000010101010101010101010101010101019E
+:10530000010101010101010101010101010101018D
+:10531000010101010101010101010101010101017D
+:10532000010101010101010101010101010101016D
+:10533000010101010101010101010101010101015D
+:10534000010101010101010101010101010101014D
+:10535000010101010101010101010101010101013D
+:10536000010101010101010101010101010101012D
+:10537000010101010101010101010101010101011D
+:10538000010101010101010101010101010101010D
+:1053900001010101010101010101010101010101FD
+:1053A00001010101010101010101010101010101ED
+:1053B00001010101010101010101010101010101DD
+:1053C00001010101010101010101010101010101CD
+:1053D00001010101010101010101010101010101BD
+:1053E00001010101010101010101010101010101AD
+:1053F000010101010101010101010101010101019D
+:10540000010101010101010101010101010101018C
+:10541000010101010101010101010101010101017C
+:10542000010101010101010101010101010101016C
+:10543000010101010101010101010101010101015C
+:10544000010101010101010101010101010101014C
+:10545000010101010101010101010101010101013C
+:10546000010101010101010101010101010101012C
+:10547000010101010101010101010101010101011C
+:10548000010101010101010101010101010101010C
+:1054900001010101010101010101010101010101FC
+:1054A00001010101010101010101010101010101EC
+:1054B00001010101010101010101010101010101DC
+:1054C00001010101010101010101010101010101CC
+:1054D00001010101010101010101010101010101BC
+:1054E00001010101010101010101010101010101AC
+:1054F000010101010101010101010101010101019C
+:10550000010101010101010101010101010101018B
+:10551000010101010101010101010101010101017B
+:10552000010101010101010101010101010101016B
+:10553000010101010101010101010101010101015B
+:10554000010101010101010101010101010101014B
+:10555000010101010101010101010101010101013B
+:10556000010101010101010101010101010101012B
+:10557000010101010101010101010101010101011B
+:10558000010101010101010101010101010101010B
+:1055900001010101010101010101010101010101FB
+:1055A00001010101010101010101010101010101EB
+:1055B00001010101010101010101010101010101DB
+:1055C00001010101010101010101010101010101CB
+:1055D00001010101010101010101010101010101BB
+:1055E00001010101010101010101010101010101AB
+:1055F000010101010101010101010101010101019B
+:10560000010101010101010101010101010101018A
+:10561000010101010101010101010101010101017A
+:10562000010101010101010101010101010101016A
+:10563000010101010101010101010101010101015A
+:10564000010101010101010101010101010101014A
+:10565000010101010101010101010101010101013A
+:10566000010101010101010101010101010101012A
+:10567000010101010101010101010101010101011A
+:10568000010101010101010101010101010101010A
+:1056900001010101010101010101010101010101FA
+:1056A00001010101010101010101010101010101EA
+:1056B00001010101010101010101010101010101DA
+:1056C00001010101010101010101010101010101CA
+:1056D00001010101010101010101010101010101BA
+:1056E00001010101010101010101010101010101AA
+:1056F000010101010101010101010101010101019A
+:105700000101010101010101010101010101010189
+:105710000101010101010101010101010101010179
+:105720000101010101010101010101010101010169
+:105730000101010101010101010101010101010159
+:105740000101010101010101010101010101010149
+:105750000101010101010101010101010101010139
+:105760000101010101010101010101010101010129
+:105770000101010101010101010101010101010119
+:105780000101010101010101010101010101010109
+:1057900001010101010101010101010101010101F9
+:1057A00001010101010101010101010101010101E9
+:1057B00001010101010101010101010101010101D9
+:1057C00001010101010101010101010101010101C9
+:1057D00001010101010101010101010101010101B9
+:1057E00001010101010101010101010101010101A9
+:1057F0000101010101010101010101010101010199
+:105800000101010101010101010101010101010188
+:105810000101010101010101010101010101010178
+:105820000101010101010101010101010101010168
+:105830000101010101010101010101010101010158
+:105840000101010101010101010101010101010148
+:105850000101010101010101010101010101010138
+:105860000101010101010101010101010101010128
+:105870000101010101010101010101010101010118
+:105880000101010101010101010101010101010108
+:1058900001010101010101010101010101010101F8
+:1058A00001010101010101010101010101010101E8
+:1058B00001010101010101010101010101010101D8
+:1058C00001010101010101010101010101010101C8
+:1058D00001010101010101010101010101010101B8
+:1058E00001010101010101010101010101010101A8
+:1058F0000101010101010101010101010101010198
+:105900000101010101010101010101010101010187
+:105910000101010101010101010101010101010177
+:105920000101010101010101010101010101010167
+:105930000101010101010101010101010101010157
+:105940000101010101010101010101010101010147
+:105950000101010101010101010101010101010137
+:105960000101010101010101010101010101010127
+:105970000101010101010101010101010101010117
+:105980000101010101010101010101010101010107
+:1059900001010101010101010101010101010101F7
+:1059A00001010101010101010101010101010101E7
+:1059B00001010101010101010101010101010101D7
+:1059C00001010101010101010101010101010101C7
+:1059D00001010101010101010101010101010101B7
+:1059E00001010101010101010101010101010101A7
+:1059F0000101010101010101010101010101010197
+:105A00000101010101010101010101010101010186
+:105A10000101010101010101010101010101010176
+:105A20000101010101010101010101010101010166
+:105A30000101010101010101010101010101010156
+:105A40000101010101010101010101010101010146
+:105A50000101010101010101010101010101010136
+:105A60000101010101010101010101010101010126
+:105A70000101010101010101010101010101010116
+:105A80000101010101010101010101010101010106
+:105A900001010101010101010101010101010101F6
+:105AA00001010101010101010101010101010101E6
+:105AB00001010101010101010101010101010101D6
+:105AC00001010101010101010101010101010101C6
+:105AD00001010101010101010101010101010101B6
+:105AE00001010101010101010101010101010101A6
+:105AF0000101010101010101010101010101010196
+:105B00000101010101010101010101010101010185
+:105B10000101010101010101010101010101010175
+:105B20000101010101010101010101010101010165
+:105B30000101010101010101010101010101010155
+:105B40000101010101010101010101010101010145
+:105B50000101010101010101010101010101010135
+:105B60000101010101010101010101010101010125
+:105B70000101010101010101010101010101010115
+:105B80000101010101010101010101010101010105
+:105B900001010101010101010101010101010101F5
+:105BA00001010101010101010101010101010101E5
+:105BB00001010101010101010101010101010101D5
+:105BC00001010101010101010101010101010101C5
+:105BD00001010101010101010101010101010101B5
+:105BE00001010101010101010101010101010101A5
+:105BF0000101010101010101010101010101010195
+:105C00000101010101010101010101010101010184
+:105C10000101010101010101010101010101010174
+:105C20000101010101010101010101010101010164
+:105C30000101010101010101010101010101010154
+:105C40000101010101010101010101010101010144
+:105C50000101010101010101010101010101010134
+:105C60000101010101010101010101010101010124
+:105C70000101010101010101010101010101010114
+:105C80000101010101010101010101010101010104
+:105C900001010101010101010101010101010101F4
+:105CA00001010101010101010101010101010101E4
+:105CB00001010101010101010101010101010101D4
+:105CC00001010101010101010101010101010101C4
+:105CD00001010101010101010101010101010101B4
+:105CE00001010101010101010101010101010101A4
+:105CF0000101010101010101010101010101010194
+:105D00000101010101010101010101010101010183
+:105D10000101010101010101010101010101010173
+:105D20000101010101010101010101010101010163
+:105D30000101010101010101010101010101010153
+:105D40000101010101010101010101010101010143
+:105D50000101010101010101010101010101010133
+:105D60000101010101010101010101010101010123
+:105D70000101010101010101010101010101010113
+:105D80000101010101010101010101010101010103
+:105D900001010101010101010101010101010101F3
+:105DA00001010101010101010101010101010101E3
+:105DB00001010101010101010101010101010101D3
+:105DC00001010101010101010101010101010101C3
+:105DD00001010101010101010101010101010101B3
+:105DE00001010101010101010101010101010101A3
+:105DF0000101010101010101010101010101010193
+:105E00000101010101010101010101010101010182
+:105E10000101010101010101010101010101010172
+:105E20000101010101010101010101010101010162
+:105E30000101010101010101010101010101010152
+:105E40000101010101010101010101010101010142
+:105E50000101010101010101010101010101010132
+:105E60000101010101010101010101010101010122
+:105E70000101010101010101010101010101010112
+:105E80000101010101010101010101010101010102
+:105E900001010101010101010101010101010101F2
+:105EA00001010101010101010101010101010101E2
+:105EB00001010101010101010101010101010101D2
+:105EC00001010101010101010101010101010101C2
+:105ED00001010101010101010101010101010101B2
+:105EE00001010101010101010101010101010101A2
+:105EF0000101010101010101010101010101010192
+:105F00000101010101010101010101010101010181
+:105F10000101010101010101010101010101010171
+:105F20000101010101010101010101010101010161
+:105F30000101010101010101010101010101010151
+:105F40000101010101010101010101010101010141
+:105F50000101010101010101010101010101010131
+:105F60000101010101010101010101010101010121
+:105F70000101010101010101010101010101010111
+:105F80000101010101010101010101010101010101
+:105F900001010101010101010101010101010101F1
+:105FA00001010101010101010101010101010101E1
+:105FB00001010101010101010101010101010101D1
+:105FC00001010101010101010101010101010101C1
+:105FD00001010101010101010101010101010101B1
+:105FE00001010101010101010101010101010101A1
+:105FF0000101010101010101010101010101010191
+:106000000101010101010101010101010101010180
+:106010000101010101010101010101010101010170
+:106020000101010101010101010101010101010160
+:106030000101010101010101010101010101010150
+:106040000101010101010101010101010101010140
+:106050000101010101010101010101010101010130
+:106060000101010101010101010101010101010120
+:106070000101010101010101010101010101010110
+:106080000101010101010101010101010101010100
+:1060900001010101010101010101010101010101F0
+:1060A00001010101010101010101010101010101E0
+:1060B00001010101010101010101010101010101D0
+:1060C00001010101010101010101010101010101C0
+:1060D00001010101010101010101010101010101B0
+:1060E00001010101010101010101010101010101A0
+:1060F0000101010101010101010101010101010190
+:10610000010101010101010101010101010101017F
+:10611000010101010101010101010101010101016F
+:10612000010101010101010101010101010101015F
+:10613000010101010101010101010101010101014F
+:10614000010101010101010101010101010101013F
+:10615000010101010101010101010101010101012F
+:10616000010101010101010101010101010101011F
+:10617000010101010101010101010101010101010F
+:1061800001010101010101010101010101010101FF
+:1061900001010101010101010101010101010101EF
+:1061A00001010101010101010101010101010101DF
+:1061B00001010101010101010101010101010101CF
+:1061C00001010101010101010101010101010101BF
+:1061D00001010101010101010101010101010101AF
+:1061E000010101010101010101010101010101019F
+:1061F000010101010101010101010101010101018F
+:10620000010101010101010101010101010101017E
+:10621000010101010101010101010101010101016E
+:10622000010101010101010101010101010101015E
+:10623000010101010101010101010101010101014E
+:10624000010101010101010101010101010101013E
+:10625000010101010101010101010101010101012E
+:10626000010101010101010101010101010101011E
+:10627000010101010101010101010101010101010E
+:1062800001010101010101010101010101010101FE
+:1062900001010101010101010101010101010101EE
+:1062A00001010101010101010101010101010101DE
+:1062B00001010101010101010101010101010101CE
+:1062C00001010101010101010101010101010101BE
+:1062D00001010101010101010101010101010101AE
+:1062E000010101010101010101010101010101019E
+:1062F000010101010101010101010101010101018E
+:10630000010101010101010101010101010101017D
+:10631000010101010101010101010101010101016D
+:10632000010101010101010101010101010101015D
+:10633000010101010101010101010101010101014D
+:10634000010101010101010101010101010101013D
+:10635000010101010101010101010101010101012D
+:10636000010101010101010101010101010101011D
+:10637000010101010101010101010101010101010D
+:1063800001010101010101010101010101010101FD
+:1063900001010101010101010101010101010101ED
+:1063A00001010101010101010101010101010101DD
+:1063B00001010101010101010101010101010101CD
+:1063C00001010101010101010101010101010101BD
+:1063D00001010101010101010101010101010101AD
+:1063E000010101010101010101010101010101019D
+:1063F000010101010101010101010101010101018D
+:10640000010101010101010101010101010101017C
+:10641000010101010101010101010101010101016C
+:10642000010101010101010101010101010101015C
+:10643000010101010101010101010101010101014C
+:10644000010101010101010101010101010101013C
+:10645000010101010101010101010101010101012C
+:10646000010101010101010101010101010101011C
+:10647000010101010101010101010101010101010C
+:1064800001010101010101010101010101010101FC
+:1064900001010101010101010101010101010101EC
+:1064A00001010101010101010101010101010101DC
+:1064B00001010101010101010101010101010101CC
+:1064C00001010101010101010101010101010101BC
+:1064D00001010101010101010101010101010101AC
+:1064E000010101010101010101010101010101019C
+:1064F000010101010101010101010101010101018C
+:10650000010101010101010101010101010101017B
+:10651000010101010101010101010101010101016B
+:10652000010101010101010101010101010101015B
+:10653000010101010101010101010101010101014B
+:10654000010101010101010101010101010101013B
+:10655000010101010101010101010101010101012B
+:10656000010101010101010101010101010101011B
+:10657000010101010101010101010101010101010B
+:1065800001010101010101010101010101010101FB
+:1065900001010101010101010101010101010101EB
+:1065A00001010101010101010101010101010101DB
+:1065B00001010101010101010101010101010101CB
+:1065C00001010101010101010101010101010101BB
+:1065D00001010101010101010101010101010101AB
+:1065E00001010101010101000000000000000000A4
+:1065F000000000000000000000000000000000009B
+:10660000000000000000000000000000000000008A
+:10661000000000000000000000000000000000007A
+:10662000000000000000000000000000000000006A
+:10663000000000000000000000000000000000005A
+:10664000000000000000000000000000000000004A
+:10665000000000000000000000000000000000003A
+:10666000000000000000000000000000000000002A
+:10667000000000000000000000000000000000001A
+:10668000000000000000000000000000000000000A
+:1066900000000000000000000000000000000000FA
+:1066A00000000000000000000000000000000000EA
+:1066B00000000000000000000000000000000000DA
+:1066C00000000000000000000000000000000000CA
+:1066D00000000000000000000000000000000000BA
+:1066E00000000000000000000000000000000000AA
+:1066F000000000000000000000000000000000009A
+:106700000000000000000000000000000000000089
+:106710000000000000000000000000000000000079
+:106720000000000000000000000000000000000069
+:106730000000000000000000000000000000000059
+:106740000000000000000000000000000000000049
+:106750000000000000000000000000000000000039
+:106760000000000000000000000000000000000029
+:106770000000000000000000000000000000000019
+:106780000000000000000000000000000000000009
+:1067900000000000000000000000000000000000F9
+:1067A00000000000000000000000000000000000E9
+:1067B00000000000000000000000000000000000D9
+:1067C00000000000000000000000000000000000C9
+:1067D00000000000000000000000000000000000B9
+:1067E00000000000000000000000000000000000A9
+:1067F0000000000000000000000000000000000099
+:106800000000000000000000000000000000000088
+:106810000000000000000000000000000000000078
+:106820000000000000000000000000000000000068
+:106830000000000000000000000000000000000058
+:106840000000000000000000000000000000000048
+:106850000000000000000000000000000000000038
+:106860000000000000000000000000000000000028
+:106870000000000000000000000000000000000018
+:106880000000000000000000000000000000000008
+:1068900000000000000000000000000000000000F8
+:1068A00000000000000000000000000000000000E8
+:1068B00000000000000000000000000000000000D8
+:1068C00000000000000000000000000000000000C8
+:1068D00000000000000000000000000000000000B8
+:1068E00000000000000000000000000000000000A8
+:1068F0000000000000000000000000000000000098
+:106900000000000000000000000000000000000087
+:106910000000000000000000000000000000000077
+:106920000000000000000000000000000000000067
+:106930000000000000000000000000000000000057
+:106940000000000000000000000000000000000047
+:106950000000000000000000000000000000000037
+:106960000000000000000000000000000000000027
+:106970000000000000000000000000000000000017
+:106980000000000000000000000000000000000007
+:1069900000000000000000000000000000000000F7
+:1069A00000000000000000000000000000000000E7
+:1069B00000000000000000000000000000000000D7
+:1069C00000000000000000000000000000000000C7
+:1069D00000000000000000000000000000000000B7
+:1069E0000000000000000002020202020202020295
+:1069F0000202020202020202020202020202020277
+:106A00000202020202020202020202020202020266
+:106A10000202020202020202020202020202020256
+:106A20000202020202020202020202020202020246
+:106A30000202020202020202020202020202020236
+:106A40000202020202020202020202020202020226
+:106A50000202020202020202020202020202020216
+:106A60000202020202020202020202020202020206
+:106A700002020202020202020202020202020202F6
+:106A800002020202020202020202020202020202E6
+:106A900002020202020202020202020202020202D6
+:106AA00002020202020202020202020202020202C6
+:106AB00002020202020202020202020202020202B6
+:106AC00002020202020202020202020202020202A6
+:106AD0000202020202020202020202020202020296
+:106AE0000202020202020202020202020202020286
+:106AF0000202020202020202020202020202020276
+:106B00000202020202020202020202020202020265
+:106B10000202020202020202020202020202020255
+:106B20000202020202020202020202020202020245
+:106B30000202020202020202020202020202020235
+:106B40000202020202020202020202020202020225
+:106B50000202020202020202020202020202020215
+:106B60000202020202020202020202020202020205
+:106B700002020202020202020202020202020202F5
+:106B800002020202020202020202020202020202E5
+:106B900002020202020202020202020202020202D5
+:106BA00002020202020202020202020202020202C5
+:106BB00002020202020202020202020202020202B5
+:106BC00002020202020202020202020202020202A5
+:106BD0000202020202020202020202020202020295
+:106BE0000202020202020202020202020202020285
+:106BF0000202020202020202020202020202020275
+:106C00000202020202020202020202020202020264
+:106C10000202020202020202020202020202020254
+:106C20000202020202020202020202020202020244
+:106C30000202020202020202020202020202020234
+:106C40000202020202020202020202020202020224
+:106C50000202020202020202020202020202020214
+:106C60000202020202020202020202020202020204
+:106C700002020202020202020202020202020202F4
+:106C800002020202020202020202020202020202E4
+:106C900002020202020202020202020202020202D4
+:106CA00002020202020202020202020202020202C4
+:106CB00002020202020202020202020202020202B4
+:106CC00002020202020202020202020202020202A4
+:106CD0000202020202020202020202020202020294
+:106CE0000202020202020202020202020202020284
+:106CF0000202020202020202020202020202020274
+:106D00000202020202020202020202020202020263
+:106D10000202020202020202020202020202020253
+:106D20000202020202020202020202020202020243
+:106D30000202020202020202020202020202020233
+:106D40000202020202020202020202020202020223
+:106D50000202020202020202020202020202020213
+:106D60000202020202020202020202020202020203
+:106D700002020202020202020202020202020202F3
+:106D800002020202020202020202020202020202E3
+:106D900002020202020202020202020202020202D3
+:106DA00002020202020202020202020202020202C3
+:106DB00002020202020202020202020202020202B3
+:106DC00002020202020202020202020202020202A3
+:106DD0000202020202020202020202020202020293
+:106DE0000202020202020202020202020202020283
+:106DF0000202020202020202020202020202020273
+:106E00000202020202020202020202020202020262
+:106E10000202020202020202020202020202020252
+:106E20000202020202020202020202020202020242
+:106E30000202020202020202020202020202020232
+:106E40000202020202020202020202020202020222
+:106E50000202020202020202020202020202020212
+:106E60000202020202020202020202020202020202
+:106E700002020202020202020202020202020202F2
+:106E800002020202020202020202020202020202E2
+:106E900002020202020202020202020202020202D2
+:106EA00002020202020202020202020202020202C2
+:106EB00002020202020202020202020202020202B2
+:106EC00002020202020202020202020202020202A2
+:106ED0000202020202020202020202020202020292
+:106EE0000202020202020202020202020202020282
+:106EF0000202020202020202020202020202020272
+:106F00000202020202020202020202020202020261
+:106F10000202020202020202020202020202020251
+:106F20000202020202020202020202020202020241
+:106F30000202020202020202020202020202020231
+:106F40000202020202020202020202020202020221
+:106F50000202020202020202020202020202020211
+:106F60000202020202020202020202020202020201
+:106F700002020202020202020202020202020202F1
+:106F800002020202020202020202020202020202E1
+:106F900002020202020202020202020202020202D1
+:106FA00002020202020202020202020202020202C1
+:106FB00002020202020202020202020202020202B1
+:106FC00002020202020202020202020202020202A1
+:106FD0000202020202020202020202020202020291
+:106FE0000202020202020202020202020202020281
+:106FF0000202020202020202020202020202020271
+:107000000202020202020202020202020202020260
+:107010000202020202020202020202020202020250
+:107020000202020202020202020202020202020240
+:107030000202020202020202020202020202020230
+:107040000202020202020202020202020202020220
+:107050000202020202020202020202020202020210
+:107060000202020202020202020202020202020200
+:1070700002020202020202020202020202020202F0
+:1070800002020202020202020202020202020202E0
+:1070900002020202020202020202020202020202D0
+:1070A00002020202020202020202020202020202C0
+:1070B00002020202020202020202020202020202B0
+:1070C00002020202020202020202020202020202A0
+:1070D0000202020202020202020202020202020290
+:1070E0000202020202020202020202020202020280
+:1070F0000202020202020202020202020202020270
+:10710000020202020202020202020202020202025F
+:10711000020202020202020202020202020202024F
+:10712000020202020202020202020202020202023F
+:10713000020202020202020202020202020202022F
+:10714000020202020202020202020202020202021F
+:10715000020202020202020202020202020202020F
+:1071600002020202020202020202020202020202FF
+:1071700002020202020202020202020202020202EF
+:1071800002020202020202020202020202020202DF
+:1071900002020202020202020202020202020202CF
+:1071A00002020202020202020202020202020202BF
+:1071B00002020202020202020202020202020202AF
+:1071C000020202020202020202020202020202029F
+:1071D000020202020202020202020202020202028F
+:1071E000020202020202020202020202020202027F
+:1071F000020202020202020202020202020202026F
+:10720000020202020202020202020202020202025E
+:10721000020202020202020202020202020202024E
+:10722000020202020202020202020202020202023E
+:10723000020202020202020202020202020202022E
+:10724000020202020202020202020202020202021E
+:10725000020202020202020202020202020202020E
+:1072600002020202020202020202020202020202FE
+:1072700002020202020202020202020202020202EE
+:1072800002020202020202020202020202020202DE
+:1072900002020202020202020202020202020202CE
+:1072A00002020202020202020202020202020202BE
+:1072B00002020202020202020202020202020202AE
+:1072C000020202020202020202020202020202029E
+:1072D000020202020202020202020202020202028E
+:1072E000020202020202020202020202020202027E
+:1072F000020202020202020202020202020202026E
+:10730000020202020202020202020202020202025D
+:10731000020202020202020202020202020202024D
+:10732000020202020202020202020202020202023D
+:10733000020202020202020202020202020202022D
+:10734000020202020202020202020202020202021D
+:10735000020202020202020202020202020202020D
+:1073600002020202020202020202020202020202FD
+:1073700002020202020202020202020202020202ED
+:1073800002020202020202020202020202020202DD
+:1073900002020202020202020202020202020202CD
+:1073A00002020202020202020202020202020202BD
+:1073B00002020202020202020202020202020202AD
+:1073C000020202020202020202020202020202029D
+:1073D000020202020202020202020202020202028D
+:1073E000020202020202020202020202020202027D
+:1073F000020202020202020202020202020202026D
+:10740000020202020202020202020202020202025C
+:10741000020202020202020202020202020202024C
+:10742000020202020202020202020202020202023C
+:10743000020202020202020202020202020202022C
+:10744000020202020202020202020202020202021C
+:10745000020202020202020202020202020202020C
+:1074600002020202020202020202020202020202FC
+:1074700002020202020202020202020202020202EC
+:1074800002020202020202020202020202020202DC
+:1074900002020202020202020202020202020202CC
+:1074A00002020202020202020202020202020202BC
+:1074B00002020202020202020202020202020202AC
+:1074C000020202020202020202020202020202029C
+:1074D000020202020202020202020202020202028C
+:1074E000020202020202020202020202020202027C
+:1074F000020202020202020202020202020202026C
+:10750000020202020202020202020202020202025B
+:10751000020202020202020202020202020202024B
+:10752000020202020202020202020202020202023B
+:10753000020202020202020202020202020202022B
+:10754000020202020202020202020202020202021B
+:10755000020202020202020202020202020202020B
+:1075600002020202020202020202020202020202FB
+:1075700002020202020202020202020202020202EB
+:1075800002020202020202020202020202020202DB
+:1075900002020202020202020202020202020202CB
+:1075A00002020202020202020202020202020202BB
+:1075B00002020202020202020202020202020202AB
+:1075C000020202020202020202020202020202029B
+:1075D000020202020202020202020202020202028B
+:1075E000020202020202020202020202020202027B
+:1075F000020202020202020202020202020202026B
+:10760000020202020202020202020202020202025A
+:10761000020202020202020202020202020202024A
+:10762000020202020202020202020202020202023A
+:10763000020202020202020202020202020202022A
+:10764000020202020202020202020202020202021A
+:10765000020202020202020202020202020202020A
+:1076600002020202020202020202020202020202FA
+:1076700002020202020202020202020202020202EA
+:1076800002020202020202020202020202020202DA
+:1076900002020202020202020202020202020202CA
+:1076A00002020202020202020202020202020202BA
+:1076B00002020202020202020202020202020202AA
+:1076C000020202020202020202020202020202029A
+:1076D000020202020202020202020202020202028A
+:1076E000020202020202020202020202020202027A
+:1076F000020202020202020202020202020202026A
+:107700000202020202020202020202020202020259
+:107710000202020202020202020202020202020249
+:107720000202020202020202020202020202020239
+:107730000202020202020202020202020202020229
+:107740000202020202020202020202020202020219
+:107750000202020202020202020202020202020209
+:1077600002020202020202020202020202020202F9
+:1077700002020202020202020202020202020202E9
+:1077800002020202020202020202020202020202D9
+:1077900002020202020202020202020202020202C9
+:1077A00002020202020202020202020202020202B9
+:1077B00002020202020202020202020202020202A9
+:1077C0000202020202020202020202020202020299
+:1077D0000202020202020202020202020202020289
+:1077E0000202020202020202020202020202020279
+:1077F0000202020202020202020202020202020269
+:107800000202020202020202020202020202020258
+:107810000202020202020202020202020202020248
+:107820000202020202020202020202020202020238
+:107830000202020202020202020202020202020228
+:107840000202020202020202020202020202020218
+:107850000202020202020202020202020202020208
+:1078600002020202020202020202020202020202F8
+:1078700002020202020202020202020202020202E8
+:1078800002020202020202020202020202020202D8
+:1078900002020202020202020202020202020202C8
+:1078A00002020202020202020202020202020202B8
+:1078B00002020202020202020202020202020202A8
+:1078C0000202020202020202020202020202020298
+:1078D0000202020202020202020202020202020288
+:1078E0000202020202020202020202020202020278
+:1078F0000202020202020202020202020202020268
+:107900000202020202020202020202020202020257
+:107910000202020202020202020202020202020247
+:107920000202020202020202020202020202020237
+:107930000202020202020202020202020202020227
+:107940000202020202020202020202020202020217
+:107950000202020202020202020202020202020207
+:1079600002020202020202020202020202020202F7
+:1079700002020202020202020202020202020202E7
+:1079800002020202020202020202020202020202D7
+:1079900002020202020202020202020202020202C7
+:1079A00002020202020202020202020202020202B7
+:1079B00002020202020202020202020202020202A7
+:1079C0000202020202020202020202020202020297
+:1079D0000202020202020202020202020202020287
+:1079E0000202020202020202020202020202020277
+:1079F0000202020202020202020202020202020267
+:107A00000202020202020202020202020202020256
+:107A10000202020202020202020202020202020246
+:107A20000202020202020202020202020202020236
+:107A30000202020202020202020202020202020226
+:107A40000202020202020202020202020202020216
+:107A50000202020202020202020202020202020206
+:107A600002020202020202020202020202020202F6
+:107A700002020202020202020202020202020202E6
+:107A800002020202020202020202020202020202D6
+:107A900002020202020202020202020202020202C6
+:107AA00002020202020202020202020202020202B6
+:107AB00002020202020202020202020202020202A6
+:107AC0000202020202020202020202020202020296
+:107AD0000202020202020202020202020202020286
+:107AE0000202020202020202020202020202020276
+:107AF0000202020202020202020202020202020266
+:107B00000202020202020202020202020202020255
+:107B10000202020202020202020202020202020245
+:107B20000202020202020202020202020202020235
+:107B30000202020202020202020202020202020225
+:107B40000202020202020202020202020202020215
+:107B50000202020202020202020202020202020205
+:107B600002020202020202020202020202020202F5
+:107B700002020202020202020202020202020202E5
+:107B800002020202020202020202020202020202D5
+:107B900002020202020202020202020202020202C5
+:107BA00002020202020202020202020202020202B5
+:107BB00002020202020202020202020202020202A5
+:107BC0000202020202020202020202020202020295
+:107BD0000202020202020202020202020202020285
+:107BE0000202020202020202020202020202020275
+:107BF0000202020202020202020202020202020265
+:107C00000202020202020202020202020202020254
+:107C10000202020202020202020202020202020244
+:107C20000202020202020202020202020202020234
+:107C30000202020202020202020202020202020224
+:107C40000202020202020202020202020202020214
+:107C50000202020202020202020202020202020204
+:107C600002020202020202020202020202020202F4
+:107C700002020202020202020202020202020202E4
+:107C800002020202020202020202020202020202D4
+:107C900002020202020202020202020202020202C4
+:107CA00002020202020202020202020202020202B4
+:107CB00002020202020202020202020202020202A4
+:107CC0000202020202020202020202020202020294
+:107CD0000202020202020202020202020202020284
+:107CE0000202020202020202020202020202020274
+:107CF0000202020202020202020202020202020264
+:107D00000202020202020202020202020202020253
+:107D10000202020202020202020202020202020243
+:107D20000202020202020202020202020202020233
+:107D30000202020202020202020202020202020223
+:107D40000202020202020202020202020202020213
+:107D50000202020202020202020202020202020203
+:107D600002020202020202020202020202020202F3
+:107D700002020202020202020202020202020202E3
+:107D800002020202020202020202020202020202D3
+:107D900002020202020202020202020202020202C3
+:107DA00002020202020202020202020202020202B3
+:107DB00002020202020202020202020202020202A3
+:107DC0000202020202020202020202020202020293
+:107DD0000202020202020202020202020202020283
+:107DE0000202020202020202020202020202020273
+:107DF0000202020202020202020202020202020263
+:107E00000202020202020202020202020202020252
+:107E10000202020202020202020202020202020242
+:107E20000202020202020202020202020202020232
+:107E30000202020202020202020202020202020222
+:107E40000202020202020202020202020202020212
+:107E50000202020202020202020202020202020202
+:107E600002020202020202020202020202020202F2
+:107E700002020202020202020202020202020202E2
+:107E800002020202020202020202020202020202D2
+:107E900002020202020202020202020202020202C2
+:107EA00002020202020202020202020202020202B2
+:107EB00002020202020202020202020202020202A2
+:107EC0000202020202020202020202020202020292
+:107ED0000202020202020202020202020202020282
+:107EE0000202020202020202020202020202020272
+:107EF0000202020202020202020202020202020262
+:107F00000202020202020202020202020202020251
+:107F10000202020202020202020202020202020241
+:107F20000202020202020202020202020202020231
+:107F30000202020202020202020202020202020221
+:107F40000202020202020202020202020202020211
+:107F50000202020202020202020202020202020201
+:107F600002020202020202020202020202020202F1
+:107F700002020202020202020202020202020202E1
+:107F800002020202020202020202020202020202D1
+:107F900002020202020202020202020202020202C1
+:107FA00002020202020202020202020202020202B1
+:107FB00002020202020202020202020202020202A1
+:107FC0000202020202020202020202020202020291
+:107FD0000202020202020202020202020202020281
+:107FE0000202020202020200000000000000000083
+:107FF0000000000000000000000000000000000081
+:108000000000000000000000000000000000000070
+:108010000000000000000000000000000000000060
+:108020000000000000000000000000000000000050
+:108030000000000000000000000000000000000040
+:108040000000000000000000000000000000000030
+:108050000000000000000000000000000000000020
+:108060000000000000000000000000000000000010
+:108070000000000000000000000000000000000000
+:1080800000000000000000000000000000000000F0
+:1080900000000000000000000000000000000000E0
+:1080A00000000000000000000000000000000000D0
+:1080B00000000000000000000000000000000000C0
+:1080C00000000000000000000000000000000000B0
+:1080D00000000000000000000000000000000000A0
+:1080E0000000000000000000000000000000000090
+:1080F0000000000000000000000000000000000080
+:10810000000000000000000000000000000000006F
+:10811000000000000000000000000000000000005F
+:10812000000000000000000000000000000000004F
+:10813000000000000000000000000000000000003F
+:10814000000000000000000000000000000000002F
+:10815000000000000000000000000000000000001F
+:10816000000000000000000000000000000000000F
+:1081700000000000000000000000000000000000FF
+:1081800000000000000000000000000000000000EF
+:1081900000000000000000000000000000000000DF
+:1081A00000000000000000000000000000000000CF
+:1081B00000000000000000000000000000000000BF
+:1081C00000000000000000000000000000000000AF
+:1081D000000000000000000000000000000000009F
+:1081E000000000000000000000000000000000008F
+:1081F000000000000000000000000000000000007F
+:10820000000000000000000000000000000000006E
+:10821000000000000000000000000000000000005E
+:10822000000000000000000000000000000000004E
+:10823000000000000000000000000000000000003E
+:10824000000000000000000000000000000000002E
+:10825000000000000000000000000000000000001E
+:10826000000000000000000000000000000000000E
+:1082700000000000000000000000000000000000FE
+:1082800000000000000000000000000000000000EE
+:1082900000000000000000000000000000000000DE
+:1082A00000000000000000000000000000000000CE
+:1082B00000000000000000000000000000000000BE
+:1082C00000000000000000000000000000000000AE
+:1082D000000000000000000000000000000000009E
+:1082E000000000000000000000000000000000008E
+:1082F000000000000000000000000000000000007E
+:10830000000000000000000000000000000000006D
+:10831000000000000000000000000000000000005D
+:10832000000000000000000000000000000000004D
+:10833000000000000000000000000000000000003D
+:10834000000000000000000000000000000000002D
+:10835000000000000000000000000000000000001D
+:10836000000000000000000000000000000000000D
+:1083700000000000000000000000000000000000FD
+:1083800000000000000000000000000000000000ED
+:1083900000000000000000000000000000000000DD
+:1083A00000000000000000000000000000000000CD
+:1083B00000000000000000000000000000000000BD
+:1083C00000000000000000000000000000000000AD
+:1083D000000000000000000000000000000000009D
+:1083E000000000000000000000000000000000008D
+:1083F000000000000000000000000000000000007D
+:10840000000000000000000000000000000000006C
+:10841000000000000000000000000000000000005C
+:10842000000000000000000000000000000000004C
+:10843000000000000000000000000000000000003C
+:10844000000000000000000000000000000000002C
+:10845000000000000000000000000000000000001C
+:10846000000000000000000000000000000000000C
+:1084700000000000000000000000000000000000FC
+:1084800000000000000000000000000000000000EC
+:1084900000000000000000000000000000000000DC
+:1084A00000000000000000000000000000000000CC
+:1084B00000000000000000000000000000000000BC
+:1084C00000000000000000000000000000000000AC
+:1084D000000000000000000000000000000000009C
+:1084E000000000000000000000000000000000008C
+:1084F000000000000000000000000000000000007C
+:10850000000000000000000000000000000000006B
+:10851000000000000000000000000000000000005B
+:10852000000000000000000000000000000000004B
+:10853000000000000000000000000000000000003B
+:10854000000000000000000000000000000000002B
+:10855000000000000000000000000000000000001B
+:10856000000000000000000000000000000000000B
+:1085700000000000000000000000000000000000FB
+:1085800000000000000000000000000000000000EB
+:1085900000000000000000000000000000000000DB
+:1085A00000000000000000000000000000000000CB
+:1085B00000000000000000000000000000000000BB
+:1085C00000000000000000000000000000000000AB
+:1085D000000000000000000000000000000000009B
+:1085E000000000000000006D00000000000000011D
+:1085F000010101010101010101010101010101016B
+:10860000010101010101010101010101010101015A
+:10861000010101010101010101010101010101014A
+:10862000010101010101010101010101010101013A
+:10863000010101010101010101010101010101012A
+:10864000010101010101010101010101010101011A
+:10865000010101010101010101010101010101010A
+:1086600001010101010101010101010101010101FA
+:1086700001010101010101010101010101010101EA
+:1086800001010101010101010101010101010101DA
+:1086900001010101010101010101010101010101CA
+:1086A00001010101010101010101010101010101BA
+:1086B00001010101010101010101010101010101AA
+:1086C000010101010101010101010101010101019A
+:1086D000010101010101010101010101010101018A
+:1086E000010101010101010101010101010101017A
+:1086F000010101010101010101010101010101016A
+:108700000101010101010101010101010101010159
+:108710000101010101010101010101010101010149
+:108720000101010101010101010101010101010139
+:108730000101010101010101010101010101010129
+:108740000101010101010101010101010101010119
+:108750000101010101010101010101010101010109
+:1087600001010101010101010101010101010101F9
+:1087700001010101010101010101010101010101E9
+:1087800001010101010101010101010101010101D9
+:1087900001010101010101010101010101010101C9
+:1087A00001010101010101010101010101010101B9
+:1087B00001010101010101010101010101010101A9
+:1087C0000101010101010101010101010101010199
+:1087D0000101010101010101010101010101010189
+:1087E0000101010101010101010101010101010179
+:1087F0000101010101010101010101010101010169
+:108800000101010101010101010101010101010158
+:108810000101010101010101010101010101010148
+:108820000101010101010101010101010101010138
+:108830000101010101010101010101010101010128
+:108840000101010101010101010101010101010118
+:108850000101010101010101010101010101010108
+:1088600001010101010101010101010101010101F8
+:1088700001010101010101010101010101010101E8
+:1088800001010101010101010101010101010101D8
+:1088900001010101010101010101010101010101C8
+:1088A00001010101010101010101010101010101B8
+:1088B00001010101010101010101010101010101A8
+:1088C0000101010101010101010101010101010198
+:1088D0000101010101010101010101010101010188
+:1088E0000101010101010101010101010101010178
+:1088F0000101010101010101010101010101010168
+:108900000101010101010101010101010101010157
+:108910000101010101010101010101010101010147
+:108920000101010101010101010101010101010137
+:108930000101010101010101010101010101010127
+:108940000101010101010101010101010101010117
+:108950000101010101010101010101010101010107
+:1089600001010101010101010101010101010101F7
+:1089700001010101010101010101010101010101E7
+:1089800001010101010101010101010101010101D7
+:1089900001010101010101010101010101010101C7
+:1089A00001010101010101010101010101010101B7
+:1089B00001010101010101010101010101010101A7
+:1089C0000101010101010101010101010101010197
+:1089D0000101010101010101010101010101010187
+:1089E0000101010101010101010101010101010177
+:1089F0000101010101010101010101010101010167
+:108A00000101010101010101010101010101010156
+:108A10000101010101010101010101010101010146
+:108A20000101010101010101010101010101010136
+:108A30000101010101010101010101010101010126
+:108A40000101010101010101010101010101010116
+:108A50000101010101010101010101010101010106
+:108A600001010101010101010101010101010101F6
+:108A700001010101010101010101010101010101E6
+:108A800001010101010101010101010101010101D6
+:108A900001010101010101010101010101010101C6
+:108AA00001010101010101010101010101010101B6
+:108AB00001010101010101010101010101010101A6
+:108AC0000101010101010101010101010101010196
+:108AD0000101010101010101010101010101010186
+:108AE0000101010101010101010101010101010176
+:108AF0000101010101010101010101010101010166
+:108B00000101010101010101010101010101010155
+:108B10000101010101010101010101010101010145
+:108B20000101010101010101010101010101010135
+:108B30000101010101010101010101010101010125
+:108B40000101010101010101010101010101010115
+:108B50000101010101010101010101010101010105
+:108B600001010101010101010101010101010101F5
+:108B700001010101010101010101010101010101E5
+:108B800001010101010101010101010101010101D5
+:108B900001010101010101010101010101010101C5
+:108BA00001010101010101010101010101010101B5
+:108BB00001010101010101010101010101010101A5
+:108BC0000101010101010101010101010101010195
+:108BD0000101010101010101010101010101010185
+:108BE0000101010101010101010101010101010175
+:108BF0000101010101010101010101010101010165
+:108C00000101010101010101010101010101010154
+:108C10000101010101010101010101010101010144
+:108C20000101010101010101010101010101010134
+:108C30000101010101010101010101010101010124
+:108C40000101010101010101010101010101010114
+:108C50000101010101010101010101010101010104
+:108C600001010101010101010101010101010101F4
+:108C700001010101010101010101010101010101E4
+:108C800001010101010101010101010101010101D4
+:108C900001010101010101010101010101010101C4
+:108CA00001010101010101010101010101010101B4
+:108CB00001010101010101010101010101010101A4
+:108CC0000101010101010101010101010101010194
+:108CD0000101010101010101010101010101010184
+:108CE0000101010101010101010101010101010174
+:108CF0000101010101010101010101010101010164
+:108D00000101010101010101010101010101010153
+:108D10000101010101010101010101010101010143
+:108D20000101010101010101010101010101010133
+:108D30000101010101010101010101010101010123
+:108D40000101010101010101010101010101010113
+:108D50000101010101010101010101010101010103
+:108D600001010101010101010101010101010101F3
+:108D700001010101010101010101010101010101E3
+:108D800001010101010101010101010101010101D3
+:108D900001010101010101010101010101010101C3
+:108DA00001010101010101010101010101010101B3
+:108DB00001010101010101010101010101010101A3
+:108DC0000101010101010101010101010101010193
+:108DD0000101010101010101010101010101010183
+:108DE0000101010101010101010101010101010173
+:108DF0000101010101010101010101010101010163
+:108E00000101010101010101010101010101010152
+:108E10000101010101010101010101010101010142
+:108E20000101010101010101010101010101010132
+:108E30000101010101010101010101010101010122
+:108E40000101010101010101010101010101010112
+:108E50000101010101010101010101010101010102
+:108E600001010101010101010101010101010101F2
+:108E700001010101010101010101010101010101E2
+:108E800001010101010101010101010101010101D2
+:108E900001010101010101010101010101010101C2
+:108EA00001010101010101010101010101010101B2
+:108EB00001010101010101010101010101010101A2
+:108EC0000101010101010101010101010101010192
+:108ED0000101010101010101010101010101010182
+:108EE0000101010101010101010101010101010172
+:108EF0000101010101010101010101010101010162
+:108F00000101010101010101010101010101010151
+:108F10000101010101010101010101010101010141
+:108F20000101010101010101010101010101010131
+:108F30000101010101010101010101010101010121
+:108F40000101010101010101010101010101010111
+:108F50000101010101010101010101010101010101
+:108F600001010101010101010101010101010101F1
+:108F700001010101010101010101010101010101E1
+:108F800001010101010101010101010101010101D1
+:108F900001010101010101010101010101010101C1
+:108FA00001010101010101010101010101010101B1
+:108FB00001010101010101010101010101010101A1
+:108FC0000101010101010101010101010101010191
+:108FD0000101010101010101010101010101010181
+:108FE0000101010101010101010101010101010171
+:108FF0000101010101010101010101010101010161
+:109000000101010101010101010101010101010150
+:109010000101010101010101010101010101010140
+:109020000101010101010101010101010101010130
+:109030000101010101010101010101010101010120
+:109040000101010101010101010101010101010110
+:109050000101010101010101010101010101010100
+:1090600001010101010101010101010101010101F0
+:1090700001010101010101010101010101010101E0
+:1090800001010101010101010101010101010101D0
+:1090900001010101010101010101010101010101C0
+:1090A00001010101010101010101010101010101B0
+:1090B00001010101010101010101010101010101A0
+:1090C0000101010101010101010101010101010190
+:1090D0000101010101010101010101010101010180
+:1090E0000101010101010101010101010101010170
+:1090F0000101010101010101010101010101010160
+:10910000010101010101010101010101010101014F
+:10911000010101010101010101010101010101013F
+:10912000010101010101010101010101010101012F
+:10913000010101010101010101010101010101011F
+:10914000010101010101010101010101010101010F
+:1091500001010101010101010101010101010101FF
+:1091600001010101010101010101010101010101EF
+:1091700001010101010101010101010101010101DF
+:1091800001010101010101010101010101010101CF
+:1091900001010101010101010101010101010101BF
+:1091A00001010101010101010101010101010101AF
+:1091B000010101010101010101010101010101019F
+:1091C000010101010101010101010101010101018F
+:1091D000010101010101010101010101010101017F
+:1091E000010101010101010101010101010101016F
+:1091F000010101010101010101010101010101015F
+:10920000010101010101010101010101010101014E
+:10921000010101010101010101010101010101013E
+:10922000010101010101010101010101010101012E
+:10923000010101010101010101010101010101011E
+:10924000010101010101010101010101010101010E
+:1092500001010101010101010101010101010101FE
+:1092600001010101010101010101010101010101EE
+:1092700001010101010101010101010101010101DE
+:1092800001010101010101010101010101010101CE
+:1092900001010101010101010101010101010101BE
+:1092A00001010101010101010101010101010101AE
+:1092B000010101010101010101010101010101019E
+:1092C000010101010101010101010101010101018E
+:1092D000010101010101010101010101010101017E
+:1092E000010101010101010101010101010101016E
+:1092F000010101010101010101010101010101015E
+:10930000010101010101010101010101010101014D
+:10931000010101010101010101010101010101013D
+:10932000010101010101010101010101010101012D
+:10933000010101010101010101010101010101011D
+:10934000010101010101010101010101010101010D
+:1093500001010101010101010101010101010101FD
+:1093600001010101010101010101010101010101ED
+:1093700001010101010101010101010101010101DD
+:1093800001010101010101010101010101010101CD
+:1093900001010101010101010101010101010101BD
+:1093A00001010101010101010101010101010101AD
+:1093B000010101010101010101010101010101019D
+:1093C000010101010101010101010101010101018D
+:1093D000010101010101010101010101010101017D
+:1093E000010101010101010101010101010101016D
+:1093F000010101010101010101010101010101015D
+:10940000010101010101010101010101010101014C
+:10941000010101010101010101010101010101013C
+:10942000010101010101010101010101010101012C
+:10943000010101010101010101010101010101011C
+:10944000010101010101010101010101010101010C
+:1094500001010101010101010101010101010101FC
+:1094600001010101010101010101010101010101EC
+:1094700001010101010101010101010101010101DC
+:1094800001010101010101010101010101010101CC
+:1094900001010101010101010101010101010101BC
+:1094A00001010101010101010101010101010101AC
+:1094B000010101010101010101010101010101019C
+:1094C000010101010101010101010101010101018C
+:1094D000010101010101010101010101010101017C
+:1094E000010101010101010101010101010101016C
+:1094F000010101010101010101010101010101015C
+:10950000010101010101010101010101010101014B
+:10951000010101010101010101010101010101013B
+:10952000010101010101010101010101010101012B
+:10953000010101010101010101010101010101011B
+:10954000010101010101010101010101010101010B
+:1095500001010101010101010101010101010101FB
+:1095600001010101010101010101010101010101EB
+:1095700001010101010101010101010101010101DB
+:1095800001010101010101010101010101010101CB
+:1095900001010101010101010101010101010101BB
+:1095A00001010101010101010101010101010101AB
+:1095B000010101010101010101010101010101019B
+:1095C000010101010101010101010101010101018B
+:1095D000010101010101010101010101010101017B
+:1095E000010101010101010101010101010101016B
+:1095F000010101010101010101010101010101015B
+:10960000010101010101010101010101010101014A
+:10961000010101010101010101010101010101013A
+:10962000010101010101010101010101010101012A
+:10963000010101010101010101010101010101011A
+:10964000010101010101010101010101010101010A
+:1096500001010101010101010101010101010101FA
+:1096600001010101010101010101010101010101EA
+:1096700001010101010101010101010101010101DA
+:1096800001010101010101010101010101010101CA
+:1096900001010101010101010101010101010101BA
+:1096A00001010101010101010101010101010101AA
+:1096B000010101010101010101010101010101019A
+:1096C000010101010101010101010101010101018A
+:1096D000010101010101010101010101010101017A
+:1096E000010101010101010101010101010101016A
+:1096F000010101010101010101010101010101015A
+:109700000101010101010101010101010101010149
+:109710000101010101010101010101010101010139
+:109720000101010101010101010101010101010129
+:109730000101010101010101010101010101010119
+:109740000101010101010101010101010101010109
+:1097500001010101010101010101010101010101F9
+:1097600001010101010101010101010101010101E9
+:1097700001010101010101010101010101010101D9
+:1097800001010101010101010101010101010101C9
+:1097900001010101010101010101010101010101B9
+:1097A00001010101010101010101010101010101A9
+:1097B0000101010101010101010101010101010199
+:1097C0000101010101010101010101010101010189
+:1097D0000101010101010101010101010101010179
+:1097E0000101010101010101010101010101010169
+:1097F0000101010101010101010101010101010159
+:109800000101010101010101010101010101010148
+:109810000101010101010101010101010101010138
+:109820000101010101010101010101010101010128
+:109830000101010101010101010101010101010118
+:109840000101010101010101010101010101010108
+:1098500001010101010101010101010101010101F8
+:1098600001010101010101010101010101010101E8
+:1098700001010101010101010101010101010101D8
+:1098800001010101010101010101010101010101C8
+:1098900001010101010101010101010101010101B8
+:1098A00001010101010101010101010101010101A8
+:1098B0000101010101010101010101010101010198
+:1098C0000101010101010101010101010101010188
+:1098D0000101010101010101010101010101010178
+:1098E0000101010101010101010101010101010168
+:1098F0000101010101010101010101010101010158
+:109900000101010101010101010101010101010147
+:109910000101010101010101010101010101010137
+:109920000101010101010101010101010101010127
+:109930000101010101010101010101010101010117
+:109940000101010101010101010101010101010107
+:1099500001010101010101010101010101010101F7
+:1099600001010101010101010101010101010101E7
+:1099700001010101010101010101010101010101D7
+:1099800001010101010101010101010101010101C7
+:1099900001010101010101010101010101010101B7
+:1099A00001010101010101010101010101010101A7
+:1099B0000101010101010101010101010101010197
+:1099C0000101010101010101010101010101010187
+:1099D0000101010101010101010101010101010177
+:1099E0000101010101010101010101010101010167
+:1099F0000101010101010101010101010101010157
+:109A00000101010101010101010101010101010146
+:109A10000101010101010101010101010101010136
+:109A20000101010101010101010101010101010126
+:109A30000101010101010101010101010101010116
+:109A40000101010101010101010101010101010106
+:109A500001010101010101010101010101010101F6
+:109A600001010101010101010101010101010101E6
+:109A700001010101010101010101010101010101D6
+:109A800001010101010101010101010101010101C6
+:109A900001010101010101010101010101010101B6
+:109AA00001010101010101010101010101010101A6
+:109AB0000101010101010101010101010101010196
+:109AC0000101010101010101010101010101010186
+:109AD0000101010101010101010101010101010176
+:109AE0000101010101010101010101010101010166
+:109AF0000101010101010101010101010101010156
+:109B00000101010101010101010101010101010145
+:109B10000101010101010101010101010101010135
+:109B20000101010101010101010101010101010125
+:109B30000101010101010101010101010101010115
+:109B40000101010101010101010101010101010105
+:109B500001010101010101010101010101010101F5
+:109B600001010101010101010101010101010101E5
+:109B700001010101010101010101010101010101D5
+:109B800001010101010101010101010101010101C5
+:109B900001010101010101010101010101010101B5
+:109BA00001010101010101010101010101010101A5
+:109BB0000101010101010101010101010101010195
+:109BC0000101010101010101010101010101010185
+:109BD0000101010101010101010101010101010175
+:109BE0000101010101010101010101010101010066
+:109BF0000000000000000000000000000000000065
+:109C00000000000000000000000000000000000054
+:109C10000000000000000000000000000000000044
+:109C20000000000000000000000000000000000034
+:109C30000000000000000000000000000000000024
+:109C40000000000000000000000000000000000014
+:109C50000000000000000000000000000000000004
+:109C600000000000000000000000000000000000F4
+:109C700000000000000000000000000000000000E4
+:109C800000000000000000000000000000000000D4
+:109C900000000000000000000000000000000000C4
+:109CA00000000000000000000000000000000000B4
+:109CB00000000000000000000000000000000000A4
+:109CC0000000000000000000000000000000000094
+:109CD0000000000000000000000000000000000084
+:109CE0000000000000000000000000000000000074
+:109CF0000000000000000000000000000000000064
+:109D00000000000000000000000000000000000053
+:109D10000000000000000000000000000000000043
+:109D20000000000000000000000000000000000033
+:109D30000000000000000000000000000000000023
+:109D40000000000000000000000000000000000013
+:109D50000000000000000000000000000000000003
+:109D600000000000000000000000000000000000F3
+:109D700000000000000000000000000000000000E3
+:109D800000000000000000000000000000000000D3
+:109D900000000000000000000000000000000000C3
+:109DA00000000000000000000000000000000000B3
+:109DB00000000000000000000000000000000000A3
+:109DC0000000000000000000000000000000000093
+:109DD0000000000000000000000000000000000083
+:109DE0000000000000000000000000000000000073
+:109DF0000000000000000000000000000000000063
+:109E00000000000000000000000000000000000052
+:109E10000000000000000000000000000000000042
+:109E20000000000000000000000000000000000032
+:109E30000000000000000000000000000000000022
+:109E40000000000000000000000000000000000012
+:109E50000000000000000000000000000000000002
+:109E600000000000000000000000000000000000F2
+:109E700000000000000000000000000000000000E2
+:109E800000000000000000000000000000000000D2
+:109E900000000000000000000000000000000000C2
+:109EA00000000000000000000000000000000000B2
+:109EB00000000000000000000000000000000000A2
+:109EC0000000000000000000000000000000000092
+:109ED0000000000000000000000000000000000082
+:109EE0000000000000000000000000000000000072
+:109EF0000000000000000000000000000000000062
+:109F00000000000000000000000000000000000051
+:109F10000000000000000000000000000000000041
+:109F20000000000000000000000000000000000031
+:109F30000000000000000000000000000000000021
+:109F40000000000000000000000000000000000011
+:109F50000000000000000000000000000000000001
+:109F600000000000000000000000000000000000F1
+:109F700000000000000000000000000000000000E1
+:109F800000000000000000000000000000000000D1
+:109F900000000000000000000000000000000000C1
+:109FA00000000000000000000000000000000000B1
+:109FB00000000000000000000000000000000000A1
+:109FC0000000000000000000000000000000000091
+:109FD0000000000000000000000000000000000081
+:109FE000000000000000000000000000000000026F
+:109FF0000202020202020202020202020202020241
+:10A000000202020202020202020202020202020230
+:10A010000202020202020202020202020202020220
+:10A020000202020202020202020202020202020210
+:10A030000202020202020202020202020202020200
+:10A0400002020202020202020202020202020202F0
+:10A0500002020202020202020202020202020202E0
+:10A0600002020202020202020202020202020202D0
+:10A0700002020202020202020202020202020202C0
+:10A0800002020202020202020202020202020202B0
+:10A0900002020202020202020202020202020202A0
+:10A0A0000202020202020202020202020202020290
+:10A0B0000202020202020202020202020202020280
+:10A0C0000202020202020202020202020202020270
+:10A0D0000202020202020202020202020202020260
+:10A0E0000202020202020202020202020202020250
+:10A0F0000202020202020202020202020202020240
+:10A10000020202020202020202020202020202022F
+:10A11000020202020202020202020202020202021F
+:10A12000020202020202020202020202020202020F
+:10A1300002020202020202020202020202020202FF
+:10A1400002020202020202020202020202020202EF
+:10A1500002020202020202020202020202020202DF
+:10A1600002020202020202020202020202020202CF
+:10A1700002020202020202020202020202020202BF
+:10A1800002020202020202020202020202020202AF
+:10A19000020202020202020202020202020202029F
+:10A1A000020202020202020202020202020202028F
+:10A1B000020202020202020202020202020202027F
+:10A1C000020202020202020202020202020202026F
+:10A1D000020202020202020202020202020202025F
+:10A1E000020202020202020202020202020202024F
+:10A1F000020202020202020202020202020202023F
+:10A20000020202020202020202020202020202022E
+:10A21000020202020202020202020202020202021E
+:10A22000020202020202020202020202020202020E
+:10A2300002020202020202020202020202020202FE
+:10A2400002020202020202020202020202020202EE
+:10A2500002020202020202020202020202020202DE
+:10A2600002020202020202020202020202020202CE
+:10A2700002020202020202020202020202020202BE
+:10A2800002020202020202020202020202020202AE
+:10A29000020202020202020202020202020202029E
+:10A2A000020202020202020202020202020202028E
+:10A2B000020202020202020202020202020202027E
+:10A2C000020202020202020202020202020202026E
+:10A2D000020202020202020202020202020202025E
+:10A2E000020202020202020202020202020202024E
+:10A2F000020202020202020202020202020202023E
+:10A30000020202020202020202020202020202022D
+:10A31000020202020202020202020202020202021D
+:10A32000020202020202020202020202020202020D
+:10A3300002020202020202020202020202020202FD
+:10A3400002020202020202020202020202020202ED
+:10A3500002020202020202020202020202020202DD
+:10A3600002020202020202020202020202020202CD
+:10A3700002020202020202020202020202020202BD
+:10A3800002020202020202020202020202020202AD
+:10A39000020202020202020202020202020202029D
+:10A3A000020202020202020202020202020202028D
+:10A3B000020202020202020202020202020202027D
+:10A3C000020202020202020202020202020202026D
+:10A3D000020202020202020202020202020202025D
+:10A3E000020202020202020202020202020202024D
+:10A3F000020202020202020202020202020202023D
+:10A40000020202020202020202020202020202022C
+:10A41000020202020202020202020202020202021C
+:10A42000020202020202020202020202020202020C
+:10A4300002020202020202020202020202020202FC
+:10A4400002020202020202020202020202020202EC
+:10A4500002020202020202020202020202020202DC
+:10A4600002020202020202020202020202020202CC
+:10A4700002020202020202020202020202020202BC
+:10A4800002020202020202020202020202020202AC
+:10A49000020202020202020202020202020202029C
+:10A4A000020202020202020202020202020202028C
+:10A4B000020202020202020202020202020202027C
+:10A4C000020202020202020202020202020202026C
+:10A4D000020202020202020202020202020202025C
+:10A4E000020202020202020202020202020202024C
+:10A4F000020202020202020202020202020202023C
+:10A50000020202020202020202020202020202022B
+:10A51000020202020202020202020202020202021B
+:10A52000020202020202020202020202020202020B
+:10A5300002020202020202020202020202020202FB
+:10A5400002020202020202020202020202020202EB
+:10A5500002020202020202020202020202020202DB
+:10A5600002020202020202020202020202020202CB
+:10A5700002020202020202020202020202020202BB
+:10A5800002020202020202020202020202020202AB
+:10A59000020202020202020202020202020202029B
+:10A5A000020202020202020202020202020202028B
+:10A5B000020202020202020202020202020202027B
+:10A5C000020202020202020202020202020202026B
+:10A5D000020202020202020202020202020202025B
+:10A5E000020202020202020202020202020202024B
+:10A5F000020202020202020202020202020202023B
+:10A60000020202020202020202020202020202022A
+:10A61000020202020202020202020202020202021A
+:10A62000020202020202020202020202020202020A
+:10A6300002020202020202020202020202020202FA
+:10A6400002020202020202020202020202020202EA
+:10A6500002020202020202020202020202020202DA
+:10A6600002020202020202020202020202020202CA
+:10A6700002020202020202020202020202020202BA
+:10A6800002020202020202020202020202020202AA
+:10A69000020202020202020202020202020202029A
+:10A6A000020202020202020202020202020202028A
+:10A6B000020202020202020202020202020202027A
+:10A6C000020202020202020202020202020202026A
+:10A6D000020202020202020202020202020202025A
+:10A6E000020202020202020202020202020202024A
+:10A6F000020202020202020202020202020202023A
+:10A700000202020202020202020202020202020229
+:10A710000202020202020202020202020202020219
+:10A720000202020202020202020202020202020209
+:10A7300002020202020202020202020202020202F9
+:10A7400002020202020202020202020202020202E9
+:10A7500002020202020202020202020202020202D9
+:10A7600002020202020202020202020202020202C9
+:10A7700002020202020202020202020202020202B9
+:10A7800002020202020202020202020202020202A9
+:10A790000202020202020202020202020202020299
+:10A7A0000202020202020202020202020202020289
+:10A7B0000202020202020202020202020202020279
+:10A7C0000202020202020202020202020202020269
+:10A7D0000202020202020202020202020202020259
+:10A7E0000202020202020202020202020202020249
+:10A7F0000202020202020202020202020202020239
+:10A800000202020202020202020202020202020228
+:10A810000202020202020202020202020202020218
+:10A820000202020202020202020202020202020208
+:10A8300002020202020202020202020202020202F8
+:10A8400002020202020202020202020202020202E8
+:10A8500002020202020202020202020202020202D8
+:10A8600002020202020202020202020202020202C8
+:10A8700002020202020202020202020202020202B8
+:10A8800002020202020202020202020202020202A8
+:10A890000202020202020202020202020202020298
+:10A8A0000202020202020202020202020202020288
+:10A8B0000202020202020202020202020202020278
+:10A8C0000202020202020202020202020202020268
+:10A8D0000202020202020202020202020202020258
+:10A8E0000202020202020202020202020202020248
+:10A8F0000202020202020202020202020202020238
+:10A900000202020202020202020202020202020227
+:10A910000202020202020202020202020202020217
+:10A920000202020202020202020202020202020207
+:10A9300002020202020202020202020202020202F7
+:10A9400002020202020202020202020202020202E7
+:10A9500002020202020202020202020202020202D7
+:10A9600002020202020202020202020202020202C7
+:10A9700002020202020202020202020202020202B7
+:10A9800002020202020202020202020202020202A7
+:10A990000202020202020202020202020202020297
+:10A9A0000202020202020202020202020202020287
+:10A9B0000202020202020202020202020202020277
+:10A9C0000202020202020202020202020202020267
+:10A9D0000202020202020202020202020202020257
+:10A9E0000202020202020202020202020202020247
+:10A9F0000202020202020202020202020202020237
+:10AA00000202020202020202020202020202020226
+:10AA10000202020202020202020202020202020216
+:10AA20000202020202020202020202020202020206
+:10AA300002020202020202020202020202020202F6
+:10AA400002020202020202020202020202020202E6
+:10AA500002020202020202020202020202020202D6
+:10AA600002020202020202020202020202020202C6
+:10AA700002020202020202020202020202020202B6
+:10AA800002020202020202020202020202020202A6
+:10AA90000202020202020202020202020202020296
+:10AAA0000202020202020202020202020202020286
+:10AAB0000202020202020202020202020202020276
+:10AAC0000202020202020202020202020202020266
+:10AAD0000202020202020202020202020202020256
+:10AAE0000202020202020202020202020202020246
+:10AAF0000202020202020202020202020202020236
+:10AB00000202020202020202020202020202020225
+:10AB10000202020202020202020202020202020215
+:10AB20000202020202020202020202020202020205
+:10AB300002020202020202020202020202020202F5
+:10AB400002020202020202020202020202020202E5
+:10AB500002020202020202020202020202020202D5
+:10AB600002020202020202020202020202020202C5
+:10AB700002020202020202020202020202020202B5
+:10AB800002020202020202020202020202020202A5
+:10AB90000202020202020202020202020202020295
+:10ABA0000202020202020202020202020202020285
+:10ABB0000202020202020202020202020202020275
+:10ABC0000202020202020202020202020202020265
+:10ABD0000202020202020202020202020202020255
+:10ABE0000202020202020202020202020202020245
+:10ABF0000202020202020202020202020202020235
+:10AC00000202020202020202020202020202020224
+:10AC10000202020202020202020202020202020214
+:10AC20000202020202020202020202020202020204
+:10AC300002020202020202020202020202020202F4
+:10AC400002020202020202020202020202020202E4
+:10AC500002020202020202020202020202020202D4
+:10AC600002020202020202020202020202020202C4
+:10AC700002020202020202020202020202020202B4
+:10AC800002020202020202020202020202020202A4
+:10AC90000202020202020202020202020202020294
+:10ACA0000202020202020202020202020202020284
+:10ACB0000202020202020202020202020202020274
+:10ACC0000202020202020202020202020202020264
+:10ACD0000202020202020202020202020202020254
+:10ACE0000202020202020202020202020202020244
+:10ACF0000202020202020202020202020202020234
+:10AD00000202020202020202020202020202020223
+:10AD10000202020202020202020202020202020213
+:10AD20000202020202020202020202020202020203
+:10AD300002020202020202020202020202020202F3
+:10AD400002020202020202020202020202020202E3
+:10AD500002020202020202020202020202020202D3
+:10AD600002020202020202020202020202020202C3
+:10AD700002020202020202020202020202020202B3
+:10AD800002020202020202020202020202020202A3
+:10AD90000202020202020202020202020202020293
+:10ADA0000202020202020202020202020202020283
+:10ADB0000202020202020202020202020202020273
+:10ADC0000202020202020202020202020202020263
+:10ADD0000202020202020202020202020202020253
+:10ADE0000202020202020202020202020202020243
+:10ADF0000202020202020202020202020202020233
+:10AE00000202020202020202020202020202020222
+:10AE10000202020202020202020202020202020212
+:10AE20000202020202020202020202020202020202
+:10AE300002020202020202020202020202020202F2
+:10AE400002020202020202020202020202020202E2
+:10AE500002020202020202020202020202020202D2
+:10AE600002020202020202020202020202020202C2
+:10AE700002020202020202020202020202020202B2
+:10AE800002020202020202020202020202020202A2
+:10AE90000202020202020202020202020202020292
+:10AEA0000202020202020202020202020202020282
+:10AEB0000202020202020202020202020202020272
+:10AEC0000202020202020202020202020202020262
+:10AED0000202020202020202020202020202020252
+:10AEE0000202020202020202020202020202020242
+:10AEF0000202020202020202020202020202020232
+:10AF00000202020202020202020202020202020221
+:10AF10000202020202020202020202020202020211
+:10AF20000202020202020202020202020202020201
+:10AF300002020202020202020202020202020202F1
+:10AF400002020202020202020202020202020202E1
+:10AF500002020202020202020202020202020202D1
+:10AF600002020202020202020202020202020202C1
+:10AF700002020202020202020202020202020202B1
+:10AF800002020202020202020202020202020202A1
+:10AF90000202020202020202020202020202020291
+:10AFA0000202020202020202020202020202020281
+:10AFB0000202020202020202020202020202020271
+:10AFC0000202020202020202020202020202020261
+:10AFD0000202020202020202020202020202020251
+:10AFE0000202020202020202020202020202020241
+:10AFF0000202020202020202020202020202020231
+:10B000000202020202020202020202020202020220
+:10B010000202020202020202020202020202020210
+:10B020000202020202020202020202020202020200
+:10B0300002020202020202020202020202020202F0
+:10B0400002020202020202020202020202020202E0
+:10B0500002020202020202020202020202020202D0
+:10B0600002020202020202020202020202020202C0
+:10B0700002020202020202020202020202020202B0
+:10B0800002020202020202020202020202020202A0
+:10B090000202020202020202020202020202020290
+:10B0A0000202020202020202020202020202020280
+:10B0B0000202020202020202020202020202020270
+:10B0C0000202020202020202020202020202020260
+:10B0D0000202020202020202020202020202020250
+:10B0E0000202020202020202020202020202020240
+:10B0F0000202020202020202020202020202020230
+:10B10000020202020202020202020202020202021F
+:10B11000020202020202020202020202020202020F
+:10B1200002020202020202020202020202020202FF
+:10B1300002020202020202020202020202020202EF
+:10B1400002020202020202020202020202020202DF
+:10B1500002020202020202020202020202020202CF
+:10B1600002020202020202020202020202020202BF
+:10B1700002020202020202020202020202020202AF
+:10B18000020202020202020202020202020202029F
+:10B19000020202020202020202020202020202028F
+:10B1A000020202020202020202020202020202027F
+:10B1B000020202020202020202020202020202026F
+:10B1C000020202020202020202020202020202025F
+:10B1D000020202020202020202020202020202024F
+:10B1E000020202020202020202020202020202023F
+:10B1F000020202020202020202020202020202022F
+:10B20000020202020202020202020202020202021E
+:10B21000020202020202020202020202020202020E
+:10B2200002020202020202020202020202020202FE
+:10B2300002020202020202020202020202020202EE
+:10B2400002020202020202020202020202020202DE
+:10B2500002020202020202020202020202020202CE
+:10B2600002020202020202020202020202020202BE
+:10B2700002020202020202020202020202020202AE
+:10B28000020202020202020202020202020202029E
+:10B29000020202020202020202020202020202028E
+:10B2A000020202020202020202020202020202027E
+:10B2B000020202020202020202020202020202026E
+:10B2C000020202020202020202020202020202025E
+:10B2D000020202020202020202020202020202024E
+:10B2E000020202020202020202020202020202023E
+:10B2F000020202020202020202020202020202022E
+:10B30000020202020202020202020202020202021D
+:10B31000020202020202020202020202020202020D
+:10B3200002020202020202020202020202020202FD
+:10B3300002020202020202020202020202020202ED
+:10B3400002020202020202020202020202020202DD
+:10B3500002020202020202020202020202020202CD
+:10B3600002020202020202020202020202020202BD
+:10B3700002020202020202020202020202020202AD
+:10B38000020202020202020202020202020202029D
+:10B39000020202020202020202020202020202028D
+:10B3A000020202020202020202020202020202027D
+:10B3B000020202020202020202020202020202026D
+:10B3C000020202020202020202020202020202025D
+:10B3D000020202020202020202020202020202024D
+:10B3E000020202020202020202020202020202023D
+:10B3F000020202020202020202020202020202022D
+:10B40000020202020202020202020202020202021C
+:10B41000020202020202020202020202020202020C
+:10B4200002020202020202020202020202020202FC
+:10B4300002020202020202020202020202020202EC
+:10B4400002020202020202020202020202020202DC
+:10B4500002020202020202020202020202020202CC
+:10B4600002020202020202020202020202020202BC
+:10B4700002020202020202020202020202020202AC
+:10B48000020202020202020202020202020202029C
+:10B49000020202020202020202020202020202028C
+:10B4A000020202020202020202020202020202027C
+:10B4B000020202020202020202020202020202026C
+:10B4C000020202020202020202020202020202025C
+:10B4D000020202020202020202020202020202024C
+:10B4E000020202020202020202020202020202023C
+:10B4F000020202020202020202020202020202022C
+:10B50000020202020202020202020202020202021B
+:10B51000020202020202020202020202020202020B
+:10B5200002020202020202020202020202020202FB
+:10B5300002020202020202020202020202020202EB
+:10B5400002020202020202020202020202020202DB
+:10B5500002020202020202020202020202020202CB
+:10B5600002020202020202020202020202020202BB
+:10B5700002020202020202020202020202020202AB
+:10B58000020202020202020202020202020202029B
+:10B59000020202020202020202020202020202028B
+:10B5A000020202020202020202020202020202027B
+:10B5B000020202020202020202020202020202026B
+:10B5C000020202020202020202020202020202025B
+:10B5D000020202020202020202020202020202024B
+:10B5E000020202020202020202020202020202003D
+: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
+:10BDE0000000000000000000000000000000000152
+:10BDF0000101010101010101010101010101010133
+:10BE00000101010101010101010101010101010122
+:10BE10000101010101010101010101010101010112
+:10BE20000101010101010101010101010101010102
+:10BE300001010101010101010101010101010101F2
+:10BE400001010101010101010101010101010101E2
+:10BE500001010101010101010101010101010101D2
+:10BE600001010101010101010101010101010101C2
+:10BE700001010101010101010101010101010101B2
+:10BE800001010101010101010101010101010101A2
+:10BE90000101010101010101010101010101010192
+:10BEA0000101010101010101010101010101010182
+:10BEB0000101010101010101010101010101010172
+:10BEC0000101010101010101010101010101010162
+:10BED0000101010101010101010101010101010152
+:10BEE0000101010101010101010101010101010142
+:10BEF0000101010101010101010101010101010132
+:10BF00000101010101010101010101010101010121
+:10BF10000101010101010101010101010101010111
+:10BF20000101010101010101010101010101010101
+:10BF300001010101010101010101010101010101F1
+:10BF400001010101010101010101010101010101E1
+:10BF500001010101010101010101010101010101D1
+:10BF600001010101010101010101010101010101C1
+:10BF700001010101010101010101010101010101B1
+:10BF800001010101010101010101010101010101A1
+:10BF90000101010101010101010101010101010191
+:10BFA0000101010101010101010101010101010181
+:10BFB0000101010101010101010101010101010171
+:10BFC0000101010101010101010101010101010161
+:10BFD0000101010101010101010101010101010151
+:10BFE0000101010101010101010101010101010141
+:10BFF0000101010101010101010101010101010131
+:10C000000101010101010101010101010101010120
+:10C010000101010101010101010101010101010110
+:10C020000101010101010101010101010101010100
+:10C0300001010101010101010101010101010101F0
+:10C0400001010101010101010101010101010101E0
+:10C0500001010101010101010101010101010101D0
+:10C0600001010101010101010101010101010101C0
+:10C0700001010101010101010101010101010101B0
+:10C0800001010101010101010101010101010101A0
+:10C090000101010101010101010101010101010190
+:10C0A0000101010101010101010101010101010180
+:10C0B0000101010101010101010101010101010170
+:10C0C0000101010101010101010101010101010160
+:10C0D0000101010101010101010101010101010150
+:10C0E0000101010101010101010101010101010140
+:10C0F0000101010101010101010101010101010130
+:10C10000010101010101010101010101010101011F
+:10C11000010101010101010101010101010101010F
+:10C1200001010101010101010101010101010101FF
+:10C1300001010101010101010101010101010101EF
+:10C1400001010101010101010101010101010101DF
+:10C1500001010101010101010101010101010101CF
+:10C1600001010101010101010101010101010101BF
+:10C1700001010101010101010101010101010101AF
+:10C18000010101010101010101010101010101019F
+:10C19000010101010101010101010101010101018F
+:10C1A000010101010101010101010101010101017F
+:10C1B000010101010101010101010101010101016F
+:10C1C000010101010101010101010101010101015F
+:10C1D000010101010101010101010101010101014F
+:10C1E000010101010101010101010101010101013F
+:10C1F000010101010101010101010101010101012F
+:10C20000010101010101010101010101010101011E
+:10C21000010101010101010101010101010101010E
+:10C2200001010101010101010101010101010101FE
+:10C2300001010101010101010101010101010101EE
+:10C2400001010101010101010101010101010101DE
+:10C2500001010101010101010101010101010101CE
+:10C2600001010101010101010101010101010101BE
+:10C2700001010101010101010101010101010101AE
+:10C28000010101010101010101010101010101019E
+:10C29000010101010101010101010101010101018E
+:10C2A000010101010101010101010101010101017E
+:10C2B000010101010101010101010101010101016E
+:10C2C000010101010101010101010101010101015E
+:10C2D000010101010101010101010101010101014E
+:10C2E000010101010101010101010101010101013E
+:10C2F000010101010101010101010101010101012E
+:10C30000010101010101010101010101010101011D
+:10C31000010101010101010101010101010101010D
+:10C3200001010101010101010101010101010101FD
+:10C3300001010101010101010101010101010101ED
+:10C3400001010101010101010101010101010101DD
+:10C3500001010101010101010101010101010101CD
+:10C3600001010101010101010101010101010101BD
+:10C3700001010101010101010101010101010101AD
+:10C38000010101010101010101010101010101019D
+:10C39000010101010101010101010101010101018D
+:10C3A000010101010101010101010101010101017D
+:10C3B000010101010101010101010101010101016D
+:10C3C000010101010101010101010101010101015D
+:10C3D000010101010101010101010101010101014D
+:10C3E000010101010101010101010101010101013D
+:10C3F000010101010101010101010101010101012D
+:10C40000010101010101010101010101010101011C
+:10C41000010101010101010101010101010101010C
+:10C4200001010101010101010101010101010101FC
+:10C4300001010101010101010101010101010101EC
+:10C4400001010101010101010101010101010101DC
+:10C4500001010101010101010101010101010101CC
+:10C4600001010101010101010101010101010101BC
+:10C4700001010101010101010101010101010101AC
+:10C48000010101010101010101010101010101019C
+:10C49000010101010101010101010101010101018C
+:10C4A000010101010101010101010101010101017C
+:10C4B000010101010101010101010101010101016C
+:10C4C000010101010101010101010101010101015C
+:10C4D000010101010101010101010101010101014C
+:10C4E000010101010101010101010101010101013C
+:10C4F000010101010101010101010101010101012C
+:10C50000010101010101010101010101010101011B
+:10C51000010101010101010101010101010101010B
+:10C5200001010101010101010101010101010101FB
+:10C5300001010101010101010101010101010101EB
+:10C5400001010101010101010101010101010101DB
+:10C5500001010101010101010101010101010101CB
+:10C5600001010101010101010101010101010101BB
+:10C5700001010101010101010101010101010101AB
+:10C58000010101010101010101010101010101019B
+:10C59000010101010101010101010101010101018B
+:10C5A000010101010101010101010101010101017B
+:10C5B000010101010101010101010101010101016B
+:10C5C000010101010101010101010101010101015B
+:10C5D000010101010101010101010101010101014B
+:10C5E000010101010101010101010101010101013B
+:10C5F000010101010101010101010101010101012B
+:10C60000010101010101010101010101010101011A
+:10C61000010101010101010101010101010101010A
+:10C6200001010101010101010101010101010101FA
+:10C6300001010101010101010101010101010101EA
+:10C6400001010101010101010101010101010101DA
+:10C6500001010101010101010101010101010101CA
+:10C6600001010101010101010101010101010101BA
+:10C6700001010101010101010101010101010101AA
+:10C68000010101010101010101010101010101019A
+:10C69000010101010101010101010101010101018A
+:10C6A000010101010101010101010101010101017A
+:10C6B000010101010101010101010101010101016A
+:10C6C000010101010101010101010101010101015A
+:10C6D000010101010101010101010101010101014A
+:10C6E000010101010101010101010101010101013A
+:10C6F000010101010101010101010101010101012A
+:10C700000101010101010101010101010101010119
+:10C710000101010101010101010101010101010109
+:10C7200001010101010101010101010101010101F9
+:10C7300001010101010101010101010101010101E9
+:10C7400001010101010101010101010101010101D9
+:10C7500001010101010101010101010101010101C9
+:10C7600001010101010101010101010101010101B9
+:10C7700001010101010101010101010101010101A9
+:10C780000101010101010101010101010101010199
+:10C790000101010101010101010101010101010189
+:10C7A0000101010101010101010101010101010179
+:10C7B0000101010101010101010101010101010169
+:10C7C0000101010101010101010101010101010159
+:10C7D0000101010101010101010101010101010149
+:10C7E0000101010101010101010101010101010139
+:10C7F0000101010101010101010101010101010129
+:10C800000101010101010101010101010101010118
+:10C810000101010101010101010101010101010108
+:10C8200001010101010101010101010101010101F8
+:10C8300001010101010101010101010101010101E8
+:10C8400001010101010101010101010101010101D8
+:10C8500001010101010101010101010101010101C8
+:10C8600001010101010101010101010101010101B8
+:10C8700001010101010101010101010101010101A8
+:10C880000101010101010101010101010101010198
+:10C890000101010101010101010101010101010188
+:10C8A0000101010101010101010101010101010178
+:10C8B0000101010101010101010101010101010168
+:10C8C0000101010101010101010101010101010158
+:10C8D0000101010101010101010101010101010148
+:10C8E0000101010101010101010101010101010138
+:10C8F0000101010101010101010101010101010128
+:10C900000101010101010101010101010101010117
+:10C910000101010101010101010101010101010107
+:10C9200001010101010101010101010101010101F7
+:10C9300001010101010101010101010101010101E7
+:10C9400001010101010101010101010101010101D7
+:10C9500001010101010101010101010101010101C7
+:10C9600001010101010101010101010101010101B7
+:10C9700001010101010101010101010101010101A7
+:10C980000101010101010101010101010101010197
+:10C990000101010101010101010101010101010187
+:10C9A0000101010101010101010101010101010177
+:10C9B0000101010101010101010101010101010167
+:10C9C0000101010101010101010101010101010157
+:10C9D0000101010101010101010101010101010147
+:10C9E0000101010101010101010101010101010137
+:10C9F0000101010101010101010101010101010127
+:10CA00000101010101010101010101010101010116
+:10CA10000101010101010101010101010101010106
+:10CA200001010101010101010101010101010101F6
+:10CA300001010101010101010101010101010101E6
+:10CA400001010101010101010101010101010101D6
+:10CA500001010101010101010101010101010101C6
+:10CA600001010101010101010101010101010101B6
+:10CA700001010101010101010101010101010101A6
+:10CA80000101010101010101010101010101010196
+:10CA90000101010101010101010101010101010186
+:10CAA0000101010101010101010101010101010176
+:10CAB0000101010101010101010101010101010166
+:10CAC0000101010101010101010101010101010156
+:10CAD0000101010101010101010101010101010146
+:10CAE0000101010101010101010101010101010136
+:10CAF0000101010101010101010101010101010126
+:10CB00000101010101010101010101010101010115
+:10CB10000101010101010101010101010101010105
+:10CB200001010101010101010101010101010101F5
+:10CB300001010101010101010101010101010101E5
+:10CB400001010101010101010101010101010101D5
+:10CB500001010101010101010101010101010101C5
+:10CB600001010101010101010101010101010101B5
+:10CB700001010101010101010101010101010101A5
+:10CB80000101010101010101010101010101010195
+:10CB90000101010101010101010101010101010185
+:10CBA0000101010101010101010101010101010175
+:10CBB0000101010101010101010101010101010165
+:10CBC0000101010101010101010101010101010155
+:10CBD0000101010101010101010101010101010145
+:10CBE0000101010101010101010101010101010135
+:10CBF0000101010101010101010101010101010125
+:10CC00000101010101010101010101010101010114
+:10CC10000101010101010101010101010101010104
+:10CC200001010101010101010101010101010101F4
+:10CC300001010101010101010101010101010101E4
+:10CC400001010101010101010101010101010101D4
+:10CC500001010101010101010101010101010101C4
+:10CC600001010101010101010101010101010101B4
+:10CC700001010101010101010101010101010101A4
+:10CC80000101010101010101010101010101010194
+:10CC90000101010101010101010101010101010184
+:10CCA0000101010101010101010101010101010174
+:10CCB0000101010101010101010101010101010164
+:10CCC0000101010101010101010101010101010154
+:10CCD0000101010101010101010101010101010144
+:10CCE0000101010101010101010101010101010134
+:10CCF0000101010101010101010101010101010124
+:10CD00000101010101010101010101010101010113
+:10CD10000101010101010101010101010101010103
+:10CD200001010101010101010101010101010101F3
+:10CD300001010101010101010101010101010101E3
+:10CD400001010101010101010101010101010101D3
+:10CD500001010101010101010101010101010101C3
+:10CD600001010101010101010101010101010101B3
+:10CD700001010101010101010101010101010101A3
+:10CD80000101010101010101010101010101010193
+:10CD90000101010101010101010101010101010183
+:10CDA0000101010101010101010101010101010173
+:10CDB0000101010101010101010101010101010163
+:10CDC0000101010101010101010101010101010153
+:10CDD0000101010101010101010101010101010143
+:10CDE0000101010101010101010101010101010133
+:10CDF0000101010101010101010101010101010123
+:10CE00000101010101010101010101010101010112
+:10CE10000101010101010101010101010101010102
+:10CE200001010101010101010101010101010101F2
+:10CE300001010101010101010101010101010101E2
+:10CE400001010101010101010101010101010101D2
+:10CE500001010101010101010101010101010101C2
+:10CE600001010101010101010101010101010101B2
+:10CE700001010101010101010101010101010101A2
+:10CE80000101010101010101010101010101010192
+:10CE90000101010101010101010101010101010182
+:10CEA0000101010101010101010101010101010172
+:10CEB0000101010101010101010101010101010162
+:10CEC0000101010101010101010101010101010152
+:10CED0000101010101010101010101010101010142
+:10CEE0000101010101010101010101010101010132
+:10CEF0000101010101010101010101010101010122
+:10CF00000101010101010101010101010101010111
+:10CF10000101010101010101010101010101010101
+:10CF200001010101010101010101010101010101F1
+:10CF300001010101010101010101010101010101E1
+:10CF400001010101010101010101010101010101D1
+:10CF500001010101010101010101010101010101C1
+:10CF600001010101010101010101010101010101B1
+:10CF700001010101010101010101010101010101A1
+:10CF80000101010101010101010101010101010191
+:10CF90000101010101010101010101010101010181
+:10CFA0000101010101010101010101010101010171
+:10CFB0000101010101010101010101010101010161
+:10CFC0000101010101010101010101010101010151
+:10CFD0000101010101010101010101010101010141
+:10CFE0000101010101010101010101010101010131
+:10CFF0000101010101010101010101010101010121
+:10D000000101010101010101010101010101010110
+:10D010000101010101010101010101010101010100
+:10D0200001010101010101010101010101010101F0
+:10D0300001010101010101010101010101010101E0
+:10D0400001010101010101010101010101010101D0
+:10D0500001010101010101010101010101010101C0
+:10D0600001010101010101010101010101010101B0
+:10D0700001010101010101010101010101010101A0
+:10D080000101010101010101010101010101010190
+:10D090000101010101010101010101010101010180
+:10D0A0000101010101010101010101010101010170
+:10D0B0000101010101010101010101010101010160
+:10D0C0000101010101010101010101010101010150
+:10D0D0000101010101010101010101010101010140
+:10D0E0000101010101010101010101010101010130
+:10D0F0000101010101010101010101010101010120
+:10D10000010101010101010101010101010101010F
+:10D1100001010101010101010101010101010101FF
+:10D1200001010101010101010101010101010101EF
+:10D1300001010101010101010101010101010101DF
+:10D1400001010101010101010101010101010101CF
+:10D1500001010101010101010101010101010101BF
+:10D1600001010101010101010101010101010101AF
+:10D17000010101010101010101010101010101019F
+:10D18000010101010101010101010101010101018F
+:10D19000010101010101010101010101010101017F
+:10D1A000010101010101010101010101010101016F
+:10D1B000010101010101010101010101010101015F
+:10D1C000010101010101010101010101010101014F
+:10D1D000010101010101010101010101010101013F
+:10D1E000010101010101010101010101010101012F
+:10D1F000010101010101010101010101010101011F
+:10D20000010101010101010101010101010101010E
+:10D2100001010101010101010101010101010101FE
+:10D2200001010101010101010101010101010101EE
+:10D2300001010101010101010101010101010101DE
+:10D2400001010101010101010101010101010101CE
+:10D2500001010101010101010101010101010101BE
+:10D2600001010101010101010101010101010101AE
+:10D27000010101010101010101010101010101019E
+:10D28000010101010101010101010101010101018E
+:10D29000010101010101010101010101010101017E
+:10D2A000010101010101010101010101010101016E
+:10D2B000010101010101010101010101010101015E
+:10D2C000010101010101010101010101010101014E
+:10D2D000010101010101010101010101010101013E
+:10D2E000010101010101010101010101010101012E
+:10D2F000010101010101010101010101010101011E
+:10D30000010101010101010101010101010101010D
+:10D3100001010101010101010101010101010101FD
+:10D3200001010101010101010101010101010101ED
+:10D3300001010101010101010101010101010101DD
+:10D3400001010101010101010101010101010101CD
+:10D3500001010101010101010101010101010101BD
+:10D3600001010101010101010101010101010101AD
+:10D37000010101010101010101010101010101019D
+:10D38000010101010101010101010101010101018D
+:10D39000010101010101010101010101010101017D
+:10D3A000010101010101010101010101010101016D
+:10D3B000010101010101010101010101010101015D
+:10D3C000010101010101010101010101010101014D
+:10D3D000010101010101010101010101010101013D
+:10D3E000010101010101010101010101010101002E
+: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
+:10D7E0000000000000000000000000000000000237
+:10D7F0000202020202020202020202020202020209
+:10D8000002020202020202020202020202020202F8
+:10D8100002020202020202020202020202020202E8
+:10D8200002020202020202020202020202020202D8
+:10D8300002020202020202020202020202020202C8
+:10D8400002020202020202020202020202020202B8
+:10D8500002020202020202020202020202020202A8
+:10D860000202020202020202020202020202020298
+:10D870000202020202020202020202020202020288
+:10D880000202020202020202020202020202020278
+:10D890000202020202020202020202020202020268
+:10D8A0000202020202020202020202020202020258
+:10D8B0000202020202020202020202020202020248
+:10D8C0000202020202020202020202020202020238
+:10D8D0000202020202020202020202020202020228
+:10D8E0000202020202020202020202020202020218
+:10D8F0000202020202020202020202020202020208
+:10D9000002020202020202020202020202020202F7
+:10D9100002020202020202020202020202020202E7
+:10D9200002020202020202020202020202020202D7
+:10D9300002020202020202020202020202020202C7
+:10D9400002020202020202020202020202020202B7
+:10D9500002020202020202020202020202020202A7
+:10D960000202020202020202020202020202020297
+:10D970000202020202020202020202020202020287
+:10D980000202020202020202020202020202020277
+:10D990000202020202020202020202020202020267
+:10D9A0000202020202020202020202020202020257
+:10D9B0000202020202020202020202020202020247
+:10D9C0000202020202020202020202020202020237
+:10D9D0000202020202020202020202020202020227
+:10D9E0000202020202020202020202020202020217
+:10D9F0000202020202020202020202020202020207
+:10DA000002020202020202020202020202020202F6
+:10DA100002020202020202020202020202020202E6
+:10DA200002020202020202020202020202020202D6
+:10DA300002020202020202020202020202020202C6
+:10DA400002020202020202020202020202020202B6
+:10DA500002020202020202020202020202020202A6
+:10DA60000202020202020202020202020202020296
+:10DA70000202020202020202020202020202020286
+:10DA80000202020202020202020202020202020276
+:10DA90000202020202020202020202020202020266
+:10DAA0000202020202020202020202020202020256
+:10DAB0000202020202020202020202020202020246
+:10DAC0000202020202020202020202020202020236
+:10DAD0000202020202020202020202020202020226
+:10DAE0000202020202020202020202020202020216
+:10DAF0000202020202020202020202020202020206
+:10DB000002020202020202020202020202020202F5
+:10DB100002020202020202020202020202020202E5
+:10DB200002020202020202020202020202020202D5
+:10DB300002020202020202020202020202020202C5
+:10DB400002020202020202020202020202020202B5
+:10DB500002020202020202020202020202020202A5
+:10DB60000202020202020202020202020202020295
+:10DB70000202020202020202020202020202020285
+:10DB80000202020202020202020202020202020275
+:10DB90000202020202020202020202020202020265
+:10DBA0000202020202020202020202020202020255
+:10DBB0000202020202020202020202020202020245
+:10DBC0000202020202020202020202020202020235
+:10DBD0000202020202020202020202020202020225
+:10DBE0000202020202020202020202020202020215
+:10DBF0000202020202020202020202020202020205
+:10DC000002020202020202020202020202020202F4
+:10DC100002020202020202020202020202020202E4
+:10DC200002020202020202020202020202020202D4
+:10DC300002020202020202020202020202020202C4
+:10DC400002020202020202020202020202020202B4
+:10DC500002020202020202020202020202020202A4
+:10DC60000202020202020202020202020202020294
+:10DC70000202020202020202020202020202020284
+:10DC80000202020202020202020202020202020274
+:10DC90000202020202020202020202020202020264
+:10DCA0000202020202020202020202020202020254
+:10DCB0000202020202020202020202020202020244
+:10DCC0000202020202020202020202020202020234
+:10DCD0000202020202020202020202020202020224
+:10DCE0000202020202020202020202020202020214
+:10DCF0000202020202020202020202020202020204
+:10DD000002020202020202020202020202020202F3
+:10DD100002020202020202020202020202020202E3
+:10DD200002020202020202020202020202020202D3
+:10DD300002020202020202020202020202020202C3
+:10DD400002020202020202020202020202020202B3
+:10DD500002020202020202020202020202020202A3
+:10DD60000202020202020202020202020202020293
+:10DD70000202020202020202020202020202020283
+:10DD80000202020202020202020202020202020273
+:10DD90000202020202020202020202020202020263
+:10DDA0000202020202020202020202020202020253
+:10DDB0000202020202020202020202020202020243
+:10DDC0000202020202020202020202020202020233
+:10DDD0000202020202020202020202020202020223
+:10DDE0000202020202020202020202020202020213
+:10DDF0000202020202020202020202020202020203
+:10DE000002020202020202020202020202020202F2
+:10DE100002020202020202020202020202020202E2
+:10DE200002020202020202020202020202020202D2
+:10DE300002020202020202020202020202020202C2
+:10DE400002020202020202020202020202020202B2
+:10DE500002020202020202020202020202020202A2
+:10DE60000202020202020202020202020202020292
+:10DE70000202020202020202020202020202020282
+:10DE80000202020202020202020202020202020272
+:10DE90000202020202020202020202020202020262
+:10DEA0000202020202020202020202020202020252
+:10DEB0000202020202020202020202020202020242
+:10DEC0000202020202020202020202020202020232
+:10DED0000202020202020202020202020202020222
+:10DEE0000202020202020202020202020202020212
+:10DEF0000202020202020202020202020202020202
+:10DF000002020202020202020202020202020202F1
+:10DF100002020202020202020202020202020202E1
+:10DF200002020202020202020202020202020202D1
+:10DF300002020202020202020202020202020202C1
+:10DF400002020202020202020202020202020202B1
+:10DF500002020202020202020202020202020202A1
+:10DF60000202020202020202020202020202020291
+:10DF70000202020202020202020202020202020281
+:10DF80000202020202020202020202020202020271
+:10DF90000202020202020202020202020202020261
+:10DFA0000202020202020202020202020202020251
+:10DFB0000202020202020202020202020202020241
+:10DFC0000202020202020202020202020202020231
+:10DFD0000202020202020202020202020202020221
+:10DFE0000202020202020202020202020202020211
+:10DFF0000202020202020202020202020202020201
+:10E0000002020202020202020202020202020202F0
+:10E0100002020202020202020202020202020202E0
+:10E0200002020202020202020202020202020202D0
+:10E0300002020202020202020202020202020202C0
+:10E0400002020202020202020202020202020202B0
+:10E0500002020202020202020202020202020202A0
+:10E060000202020202020202020202020202020290
+:10E070000202020202020202020202020202020280
+:10E080000202020202020202020202020202020270
+:10E090000202020202020202020202020202020260
+:10E0A0000202020202020202020202020202020250
+:10E0B0000202020202020202020202020202020240
+:10E0C0000202020202020202020202020202020230
+:10E0D0000202020202020202020202020202020220
+:10E0E0000202020202020202020202020202020210
+:10E0F0000202020202020202020202020202020200
+:10E1000002020202020202020202020202020202EF
+:10E1100002020202020202020202020202020202DF
+:10E1200002020202020202020202020202020202CF
+:10E1300002020202020202020202020202020202BF
+:10E1400002020202020202020202020202020202AF
+:10E15000020202020202020202020202020202029F
+:10E16000020202020202020202020202020202028F
+:10E17000020202020202020202020202020202027F
+:10E18000020202020202020202020202020202026F
+:10E19000020202020202020202020202020202025F
+:10E1A000020202020202020202020202020202024F
+:10E1B000020202020202020202020202020202023F
+:10E1C000020202020202020202020202020202022F
+:10E1D000020202020202020202020202020202021F
+:10E1E000020202020202020202020202020202020F
+:10E1F00002020202020202020202020202020202FF
+:10E2000002020202020202020202020202020202EE
+:10E2100002020202020202020202020202020202DE
+:10E2200002020202020202020202020202020202CE
+:10E2300002020202020202020202020202020202BE
+:10E2400002020202020202020202020202020202AE
+:10E25000020202020202020202020202020202029E
+:10E26000020202020202020202020202020202028E
+:10E27000020202020202020202020202020202027E
+:10E28000020202020202020202020202020202026E
+:10E29000020202020202020202020202020202025E
+:10E2A000020202020202020202020202020202024E
+:10E2B000020202020202020202020202020202023E
+:10E2C000020202020202020202020202020202022E
+:10E2D000020202020202020202020202020202021E
+:10E2E000020202020202020202020202020202020E
+:10E2F00002020202020202020202020202020202FE
+:10E3000002020202020202020202020202020202ED
+:10E3100002020202020202020202020202020202DD
+:10E3200002020202020202020202020202020202CD
+:10E3300002020202020202020202020202020202BD
+:10E3400002020202020202020202020202020202AD
+:10E35000020202020202020202020202020202029D
+:10E36000020202020202020202020202020202028D
+:10E37000020202020202020202020202020202027D
+:10E38000020202020202020202020202020202026D
+:10E39000020202020202020202020202020202025D
+:10E3A000020202020202020202020202020202024D
+:10E3B000020202020202020202020202020202023D
+:10E3C000020202020202020202020202020202022D
+:10E3D000020202020202020202020202020202021D
+:10E3E000020202020202020202020202020202020D
+:10E3F00002020202020202020202020202020202FD
+:10E4000002020202020202020202020202020202EC
+:10E4100002020202020202020202020202020202DC
+:10E4200002020202020202020202020202020202CC
+:10E4300002020202020202020202020202020202BC
+:10E4400002020202020202020202020202020202AC
+:10E45000020202020202020202020202020202029C
+:10E46000020202020202020202020202020202028C
+:10E47000020202020202020202020202020202027C
+:10E48000020202020202020202020202020202026C
+:10E49000020202020202020202020202020202025C
+:10E4A000020202020202020202020202020202024C
+:10E4B000020202020202020202020202020202023C
+:10E4C000020202020202020202020202020202022C
+:10E4D000020202020202020202020202020202021C
+:10E4E000020202020202020202020202020202020C
+:10E4F00002020202020202020202020202020202FC
+:10E5000002020202020202020202020202020202EB
+:10E5100002020202020202020202020202020202DB
+:10E5200002020202020202020202020202020202CB
+:10E5300002020202020202020202020202020202BB
+:10E5400002020202020202020202020202020202AB
+:10E55000020202020202020202020202020202029B
+:10E56000020202020202020202020202020202028B
+:10E57000020202020202020202020202020202027B
+:10E58000020202020202020202020202020202026B
+:10E59000020202020202020202020202020202025B
+:10E5A000020202020202020202020202020202024B
+:10E5B000020202020202020202020202020202023B
+:10E5C000020202020202020202020202020202022B
+:10E5D000020202020202020202020202020202021B
+:10E5E000020202020202020202020202020202020B
+:10E5F00002020202020202020202020202020202FB
+:10E6000002020202020202020202020202020202EA
+:10E6100002020202020202020202020202020202DA
+:10E6200002020202020202020202020202020202CA
+:10E6300002020202020202020202020202020202BA
+:10E6400002020202020202020202020202020202AA
+:10E65000020202020202020202020202020202029A
+:10E66000020202020202020202020202020202028A
+:10E67000020202020202020202020202020202027A
+:10E68000020202020202020202020202020202026A
+:10E69000020202020202020202020202020202025A
+:10E6A000020202020202020202020202020202024A
+:10E6B000020202020202020202020202020202023A
+:10E6C000020202020202020202020202020202022A
+:10E6D000020202020202020202020202020202021A
+:10E6E000020202020202020202020202020202020A
+:10E6F00002020202020202020202020202020202FA
+:10E7000002020202020202020202020202020202E9
+:10E7100002020202020202020202020202020202D9
+:10E7200002020202020202020202020202020202C9
+:10E7300002020202020202020202020202020202B9
+:10E7400002020202020202020202020202020202A9
+:10E750000202020202020202020202020202020299
+:10E760000202020202020202020202020202020289
+:10E770000202020202020202020202020202020279
+:10E780000202020202020202020202020202020269
+:10E790000202020202020202020202020202020259
+:10E7A0000202020202020202020202020202020249
+:10E7B0000202020202020202020202020202020239
+:10E7C0000202020202020202020202020202020229
+:10E7D0000202020202020202020202020202020219
+:10E7E0000202020202020202020202020202020209
+:10E7F00002020202020202020202020202020202F9
+:10E8000002020202020202020202020202020202E8
+:10E8100002020202020202020202020202020202D8
+:10E8200002020202020202020202020202020202C8
+:10E8300002020202020202020202020202020202B8
+:10E8400002020202020202020202020202020202A8
+:10E850000202020202020202020202020202020298
+:10E860000202020202020202020202020202020288
+:10E870000202020202020202020202020202020278
+:10E880000202020202020202020202020202020268
+:10E890000202020202020202020202020202020258
+:10E8A0000202020202020202020202020202020248
+:10E8B0000202020202020202020202020202020238
+:10E8C0000202020202020202020202020202020228
+:10E8D0000202020202020202020202020202020218
+:10E8E0000202020202020202020202020202020208
+:10E8F00002020202020202020202020202020202F8
+:10E9000002020202020202020202020202020202E7
+:10E9100002020202020202020202020202020202D7
+:10E9200002020202020202020202020202020202C7
+:10E9300002020202020202020202020202020202B7
+:10E9400002020202020202020202020202020202A7
+:10E950000202020202020202020202020202020297
+:10E960000202020202020202020202020202020287
+:10E970000202020202020202020202020202020277
+:10E980000202020202020202020202020202020267
+:10E990000202020202020202020202020202020257
+:10E9A0000202020202020202020202020202020247
+:10E9B0000202020202020202020202020202020237
+:10E9C0000202020202020202020202020202020227
+:10E9D0000202020202020202020202020202020217
+:10E9E0000202020202020202020202020202020207
+:10E9F00002020202020202020202020202020202F7
+:10EA000002020202020202020202020202020202E6
+:10EA100002020202020202020202020202020202D6
+:10EA200002020202020202020202020202020202C6
+:10EA300002020202020202020202020202020202B6
+:10EA400002020202020202020202020202020202A6
+:10EA50000202020202020202020202020202020296
+:10EA60000202020202020202020202020202020286
+:10EA70000202020202020202020202020202020276
+:10EA80000202020202020202020202020202020266
+:10EA90000202020202020202020202020202020256
+:10EAA0000202020202020202020202020202020246
+:10EAB0000202020202020202020202020202020236
+:10EAC0000202020202020202020202020202020226
+:10EAD0000202020202020202020202020202020216
+:10EAE0000202020202020202020202020202020206
+:10EAF00002020202020202020202020202020202F6
+:10EB000002020202020202020202020202020202E5
+:10EB100002020202020202020202020202020202D5
+:10EB200002020202020202020202020202020202C5
+:10EB300002020202020202020202020202020202B5
+:10EB400002020202020202020202020202020202A5
+:10EB50000202020202020202020202020202020295
+:10EB60000202020202020202020202020202020285
+:10EB70000202020202020202020202020202020275
+:10EB80000202020202020202020202020202020265
+:10EB90000202020202020202020202020202020255
+:10EBA0000202020202020202020202020202020245
+:10EBB0000202020202020202020202020202020235
+:10EBC0000202020202020202020202020202020225
+:10EBD0000202020202020202020202020202020215
+:10EBE0000202020202020202020202020202020205
+:10EBF00002020202020202020202020202020202F5
+:10EC000002020202020202020202020202020202E4
+:10EC100002020202020202020202020202020202D4
+:10EC200002020202020202020202020202020202C4
+:10EC300002020202020202020202020202020202B4
+:10EC400002020202020202020202020202020202A4
+:10EC50000202020202020202020202020202020294
+:10EC60000202020202020202020202020202020284
+:10EC70000202020202020202020202020202020274
+:10EC80000202020202020202020202020202020264
+:10EC90000202020202020202020202020202020254
+:10ECA0000202020202020202020202020202020244
+:10ECB0000202020202020202020202020202020234
+:10ECC0000202020202020202020202020202020224
+:10ECD0000202020202020202020202020202020214
+:10ECE0000202020202020202020202020202020204
+:10ECF00002020202020202020202020202020202F4
+:10ED000002020202020202020202020202020202E3
+:10ED100002020202020202020202020202020202D3
+:10ED200002020202020202020202020202020202C3
+:10ED300002020202020202020202020202020202B3
+:10ED400002020202020202020202020202020202A3
+:10ED50000202020202020202020202020202020293
+:10ED60000202020202020202020202020202020283
+:10ED70000202020202020202020202020202020273
+:10ED80000202020202020202020202020202020263
+:10ED90000202020202020202020202020202020253
+:10EDA0000202020202020202020202020202020243
+:10EDB0000202020202020202020202020202020233
+:10EDC0000202020202020202020202020202020223
+:10EDD0000202020202020202020202020202020213
+:10EDE0000202020202020202020202020202020005
+:10EDF0000000000000000000000000000000000013
+:10EE00000000000000000000000000000000000002
+:10EE100000000000000000000000000000000000F2
+:10EE200000000000000000000000000000000000E2
+:10EE300000000000000000000000000000000000D2
+:10EE400000000000000000000000000000000000C2
+:10EE500000000000000000000000000000000000B2
+:10EE600000000000000000000000000000000000A2
+:10EE70000000000000000000000000000000000092
+:10EE80000000000000000000000000000000000082
+:10EE90000000000000000000000000000000000072
+:10EEA0000000000000000000000000000000000062
+:10EEB0000000000000000000000000000000000052
+:10EEC0000000000000000000000000000000000042
+:10EED0000000000000000000000000000000000032
+:10EEE0000000000000000000000000000000000022
+:10EEF0000000000000000000000000000000000012
+:10EF00000000000000000000000000000000000001
+:10EF100000000000000000000000000000000000F1
+:10EF200000000000000000000000000000000000E1
+:10EF300000000000000000000000000000000000D1
+:10EF400000000000000000000000000000000000C1
+:10EF500000000000000000000000000000000000B1
+:10EF600000000000000000000000000000000000A1
+:10EF70000000000000000000000000000000000091
+:10EF80000000000000000000000000000000000081
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB0000000000000000000000000000000000051
+:10EFC0000000000000000000000000000000000041
+:10EFD0000000000000000000000000000000000031
+:10EFE0000000000000000000000000000000000021
+:10EFF0000000000000000000000000000000000011
+:10F000000000000000000000000000000000000000
+:10F0100000000000000000000000000000000000F0
+:10F0200000000000000000000000000000000000E0
+:10F0300000000000000000000000000000000000D0
+:10F0400000000000000000000000000000000000C0
+:10F0500000000000000000000000000000000000B0
+:10F0600000000000000000000000000000000000A0
+:10F070000000000000000000000000000000000090
+:10F080000000000000000000000000000000000080
+:10F090000000000000000000000000000000000070
+:10F0A0000000000000000000000000000000000060
+:10F0B0000000000000000000000000000000000050
+:10F0C0000000000000000000000000000000000040
+:10F0D0000000000000000000000000000000000030
+:10F0E0000000000000000000000000000000000020
+:10F0F0000000000000000000000000000000000010
+:10F1000000000000000000000000000000000000FF
+:10F1100000000000000000000000000000000000EF
+:10F1200000000000000000000000000000000000DF
+:10F1300000000000000000000000000000000000CF
+:10F1400000000000000000000000000000000000BF
+:10F1500000000000000000000000000000000000AF
+:10F16000000000000000000000000000000000009F
+:10F17000000000000000000000000000000000008F
+:10F18000000000000000000000000000000000007F
+:10F19000000000000000000000000000000000006F
+:10F1A000000000000000000000000000000000005F
+:10F1B000000000000000000000000000000000004F
+:10F1C000000000000000000000000000000000003F
+:10F1D000000000000000000000000000000000002F
+:10F1E000000000000000000000000000000000001F
+:10F1F000000000000000000000000000000000000F
+:10F2000000000000000000000000000000000000FE
+:10F2100000000000000000000000000000000000EE
+:10F2200000000000000000000000000000000000DE
+:10F2300000000000000000000000000000000000CE
+:10F2400000000000000000000000000000000000BE
+:10F2500000000000000000000000000000000000AE
+:10F26000000000000000000000000000000000009E
+:10F27000000000000000000000000000000000008E
+:10F28000000000000000000000000000000000007E
+:10F29000000000000000000000000000000000006E
+:10F2A000000000000000000000000000000000005E
+:10F2B000000000000000000000000000000000004E
+:10F2C000000000000000000000000000000000003E
+:10F2D000000000000000000000000000000000002E
+:10F2E0000000000000000000000000000000006BB3
+:10F2F0000000000000000001010101010101010105
+:10F3000001010101010101010101010101010101ED
+:10F3100001010101010101010101010101010101DD
+:10F3200001010101010101010101010101010101CD
+:10F3300001010101010101010101010101010101BD
+:10F3400001010101010101010101010101010101AD
+:10F35000010101010101010101010101010101019D
+:10F36000010101010101010101010101010101018D
+:10F37000010101010101010101010101010101017D
+:10F38000010101010101010101010101010101016D
+:10F39000010101010101010101010101010101015D
+:10F3A000010101010101010101010101010101014D
+:10F3B000010101010101010101010101010101013D
+:10F3C000010101010101010101010101010101012D
+:10F3D000010101010101010101010101010101011D
+:10F3E000010101010101010101010101010101010D
+:10F3F00001010101010101010101010101010101FD
+:10F4000001010101010101010101010101010101EC
+:10F4100001010101010101010101010101010101DC
+:10F4200001010101010101010101010101010101CC
+:10F4300001010101010101010101010101010101BC
+:10F4400001010101010101010101010101010101AC
+:10F45000010101010101010101010101010101019C
+:10F46000010101010101010101010101010101018C
+:10F47000010101010101010101010101010101017C
+:10F48000010101010101010101010101010101016C
+:10F49000010101010101010101010101010101015C
+:10F4A000010101010101010101010101010101014C
+:10F4B000010101010101010101010101010101013C
+:10F4C000010101010101010101010101010101012C
+:10F4D000010101010101010101010101010101011C
+:10F4E000010101010101010101010101010101010C
+:10F4F00001010101010101010101010101010101FC
+:10F5000001010101010101010101010101010101EB
+:10F5100001010101010101010101010101010101DB
+:10F5200001010101010101010101010101010101CB
+:10F5300001010101010101010101010101010101BB
+:10F5400001010101010101010101010101010101AB
+:10F55000010101010101010101010101010101019B
+:10F56000010101010101010101010101010101018B
+:10F57000010101010101010101010101010101017B
+:10F58000010101010101010101010101010101016B
+:10F59000010101010101010101010101010101015B
+:10F5A000010101010101010101010101010101014B
+:10F5B000010101010101010101010101010101013B
+:10F5C000010101010101010101010101010101012B
+:10F5D000010101010101010101010101010101011B
+:10F5E000010101010101010101010101010101010B
+:10F5F00001010101010101010101010101010101FB
+:10F6000001010101010101010101010101010101EA
+:10F6100001010101010101010101010101010101DA
+:10F6200001010101010101010101010101010101CA
+:10F6300001010101010101010101010101010101BA
+:10F6400001010101010101010101010101010101AA
+:10F65000010101010101010101010101010101019A
+:10F66000010101010101010101010101010101018A
+:10F67000010101010101010101010101010101017A
+:10F68000010101010101010101010101010101016A
+:10F69000010101010101010101010101010101015A
+:10F6A000010101010101010101010101010101014A
+:10F6B000010101010101010101010101010101013A
+:10F6C000010101010101010101010101010101012A
+:10F6D000010101010101010101010101010101011A
+:10F6E000010101010101010101010101010101010A
+:10F6F00001010101010101010101010101010101FA
+:10F7000001010101010101010101010101010101E9
+:10F7100001010101010101010101010101010101D9
+:10F7200001010101010101010101010101010101C9
+:10F7300001010101010101010101010101010101B9
+:10F7400001010101010101010101010101010101A9
+:10F750000101010101010101010101010101010199
+:10F760000101010101010101010101010101010189
+:10F770000101010101010101010101010101010179
+:10F780000101010101010101010101010101010169
+:10F790000101010101010101010101010101010159
+:10F7A0000101010101010101010101010101010149
+:10F7B0000101010101010101010101010101010139
+:10F7C0000101010101010101010101010101010129
+:10F7D0000101010101010101010101010101010119
+:10F7E0000101010101010101010101010101010109
+:10F7F00001010101010101010101010101010101F9
+:10F8000001010101010101010101010101010101E8
+:10F8100001010101010101010101010101010101D8
+:10F8200001010101010101010101010101010101C8
+:10F8300001010101010101010101010101010101B8
+:10F8400001010101010101010101010101010101A8
+:10F850000101010101010101010101010101010198
+:10F860000101010101010101010101010101010188
+:10F870000101010101010101010101010101010178
+:10F880000101010101010101010101010101010168
+:10F890000101010101010101010101010101010158
+:10F8A0000101010101010101010101010101010148
+:10F8B0000101010101010101010101010101010138
+:10F8C0000101010101010101010101010101010128
+:10F8D0000101010101010101010101010101010118
+:10F8E0000101010101010101010101010101010108
+:10F8F00001010101010101010101010101010101F8
+:10F9000001010101010101010101010101010101E7
+:10F9100001010101010101010101010101010101D7
+:10F9200001010101010101010101010101010101C7
+:10F9300001010101010101010101010101010101B7
+:10F9400001010101010101010101010101010101A7
+:10F950000101010101010101010101010101010197
+:10F960000101010101010101010101010101010187
+:10F970000101010101010101010101010101010177
+:10F980000101010101010101010101010101010167
+:10F990000101010101010101010101010101010157
+:10F9A0000101010101010101010101010101010147
+:10F9B0000101010101010101010101010101010137
+:10F9C0000101010101010101010101010101010127
+:10F9D0000101010101010101010101010101010117
+:10F9E0000101010101010101010101010101010107
+:10F9F00001010101010101010101010101010101F7
+:10FA000001010101010101010101010101010101E6
+:10FA100001010101010101010101010101010101D6
+:10FA200001010101010101010101010101010101C6
+:10FA300001010101010101010101010101010101B6
+:10FA400001010101010101010101010101010101A6
+:10FA50000101010101010101010101010101010196
+:10FA60000101010101010101010101010101010186
+:10FA70000101010101010101010101010101010176
+:10FA80000101010101010101010101010101010166
+:10FA90000101010101010101010101010101010156
+:10FAA0000101010101010101010101010101010146
+:10FAB0000101010101010101010101010101010136
+:10FAC0000101010101010101010101010101010126
+:10FAD0000101010101010101010101010101010116
+:10FAE0000101010101010101010101010101010106
+:10FAF00001010101010101010101010101010101F6
+:10FB000001010101010101010101010101010101E5
+:10FB100001010101010101010101010101010101D5
+:10FB200001010101010101010101010101010101C5
+:10FB300001010101010101010101010101010101B5
+:10FB400001010101010101010101010101010101A5
+:10FB50000101010101010101010101010101010195
+:10FB60000101010101010101010101010101010185
+:10FB70000101010101010101010101010101010175
+:10FB80000101010101010101010101010101010165
+:10FB90000101010101010101010101010101010155
+:10FBA0000101010101010101010101010101010145
+:10FBB0000101010101010101010101010101010135
+:10FBC0000101010101010101010101010101010125
+:10FBD0000101010101010101010101010101010115
+:10FBE0000101010101010101010101010101010105
+:10FBF00001010101010101010101010101010101F5
+:10FC000001010101010101010101010101010101E4
+:10FC100001010101010101010101010101010101D4
+:10FC200001010101010101010101010101010101C4
+:10FC300001010101010101010101010101010101B4
+:10FC400001010101010101010101010101010101A4
+:10FC50000101010101010101010101010101010194
+:10FC60000101010101010101010101010101010184
+:10FC70000101010101010101010101010101010174
+:10FC80000101010101010101010101010101010164
+:10FC90000101010101010101010101010101010154
+:10FCA0000101010101010101010101010101010144
+:10FCB0000101010101010101010101010101010134
+:10FCC0000101010101010101010101010101010124
+:10FCD0000101010101010101010101010101010114
+:10FCE0000101010101010101010101010101010104
+:10FCF00001010101010101010101010101010101F4
+:10FD000001010101010101010101010101010101E3
+:10FD100001010101010101010101010101010101D3
+:10FD200001010101010101010101010101010101C3
+:10FD300001010101010101010101010101010101B3
+:10FD400001010101010101010101010101010101A3
+:10FD50000101010101010101010101010101010193
+:10FD60000101010101010101010101010101010183
+:10FD70000101010101010101010101010101010173
+:10FD80000101010101010101010101010101010163
+:10FD90000101010101010101010101010101010153
+:10FDA0000101010101010101010101010101010143
+:10FDB0000101010101010101010101010101010133
+:10FDC0000101010101010101010101010101010123
+:10FDD0000101010101010101010101010101010113
+:10FDE0000101010101010101010101010101010103
+:10FDF00001010101010101010101010101010101F3
+:10FE000001010101010101010101010101010101E2
+:10FE100001010101010101010101010101010101D2
+:10FE200001010101010101010101010101010101C2
+:10FE300001010101010101010101010101010101B2
+:10FE400001010101010101010101010101010101A2
+:10FE50000101010101010101010101010101010192
+:10FE60000101010101010101010101010101010182
+:10FE70000101010101010101010101010101010172
+:10FE80000101010101010101010101010101010162
+:10FE90000101010101010101010101010101010152
+:10FEA0000101010101010101010101010101010142
+:10FEB0000101010101010101010101010101010132
+:10FEC0000101010101010101010101010101010122
+:10FED0000101010101010101010101010101010112
+:10FEE0000101010101010101010101010101010102
+:10FEF00001010101010101010101010101010101F2
+:10FF000001010101010101010101010101010101E1
+:10FF100001010101010101010101010101010101D1
+:10FF200001010101010101010101010101010101C1
+:10FF300001010101010101010101010101010101B1
+:10FF400001010101010101010101010101010101A1
+:10FF50000101010101010101010101010101010191
+:10FF60000101010101010101010101010101010181
+:10FF70000101010101010101010101010101010171
+:10FF80000101010101010101010101010101010161
+:10FF90000101010101010101010101010101010151
+:10FFA0000101010101010101010101010101010141
+:10FFB0000101010101010101010101010101010131
+:10FFC0000101010101010101010101010101010121
+:10FFD0000101010101010101010101010101010111
+:10FFE0000101010101010101010101010101010101
+:10FFF00001010101010101010101010101010101F1
+:020000022000DC
+:1000000001010101010101010101010101010101E0
+:1000100001010101010101010101010101010101D0
+:1000200001010101010101010101010101010101C0
+:1000300001010101010101010101010101010101B0
+:1000400001010101010101010101010101010101A0
+:100050000101010101010101010101010101010190
+:100060000101010101010101010101010101010180
+:100070000101010101010101010101010101010170
+:100080000101010101010101010101010101010160
+:100090000101010101010101010101010101010150
+:1000A0000101010101010101010101010101010140
+:1000B0000101010101010101010101010101010130
+:1000C0000101010101010101010101010101010120
+:1000D0000101010101010101010101010101010110
+:1000E0000101010101010101010101010101010100
+:1000F00001010101010101010101010101010101F0
+:1001000001010101010101010101010101010101DF
+:1001100001010101010101010101010101010101CF
+:1001200001010101010101010101010101010101BF
+:1001300001010101010101010101010101010101AF
+:10014000010101010101010101010101010101019F
+:10015000010101010101010101010101010101018F
+:10016000010101010101010101010101010101017F
+:10017000010101010101010101010101010101016F
+:10018000010101010101010101010101010101015F
+:10019000010101010101010101010101010101014F
+:1001A000010101010101010101010101010101013F
+:1001B000010101010101010101010101010101012F
+:1001C000010101010101010101010101010101011F
+:1001D000010101010101010101010101010101010F
+:1001E00001010101010101010101010101010101FF
+:1001F00001010101010101010101010101010101EF
+:1002000001010101010101010101010101010101DE
+:1002100001010101010101010101010101010101CE
+:1002200001010101010101010101010101010101BE
+:1002300001010101010101010101010101010101AE
+:10024000010101010101010101010101010101019E
+:10025000010101010101010101010101010101018E
+:10026000010101010101010101010101010101017E
+:10027000010101010101010101010101010101016E
+:10028000010101010101010101010101010101015E
+:10029000010101010101010101010101010101014E
+:1002A000010101010101010101010101010101013E
+:1002B000010101010101010101010101010101012E
+:1002C000010101010101010101010101010101011E
+:1002D000010101010101010101010101010101010E
+:1002E00001010101010101010101010101010101FE
+:1002F00001010101010101010101010101010101EE
+:1003000001010101010101010101010101010101DD
+:1003100001010101010101010101010101010101CD
+:1003200001010101010101010101010101010101BD
+:1003300001010101010101010101010101010101AD
+:10034000010101010101010101010101010101019D
+:10035000010101010101010101010101010101018D
+:10036000010101010101010101010101010101017D
+:10037000010101010101010101010101010101016D
+:10038000010101010101010101010101010101015D
+:10039000010101010101010101010101010101014D
+:1003A000010101010101010101010101010101013D
+:1003B000010101010101010101010101010101012D
+:1003C000010101010101010101010101010101011D
+:1003D000010101010101010101010101010101010D
+:1003E00001010101010101010101010101010101FD
+:1003F00001010101010101010101010101010101ED
+:1004000001010101010101010101010101010101DC
+:1004100001010101010101010101010101010101CC
+:1004200001010101010101010101010101010101BC
+:1004300001010101010101010101010101010101AC
+:10044000010101010101010101010101010101019C
+:10045000010101010101010101010101010101018C
+:10046000010101010101010101010101010101017C
+:10047000010101010101010101010101010101016C
+:10048000010101010101010101010101010101015C
+:10049000010101010101010101010101010101014C
+:1004A000010101010101010101010101010101013C
+:1004B000010101010101010101010101010101012C
+:1004C000010101010101010101010101010101011C
+:1004D000010101010101010101010101010101010C
+:1004E00001010101010101010101010101010101FC
+:1004F00001010101010101010101010101010101EC
+:1005000001010101010101010101010101010101DB
+:1005100001010101010101010101010101010101CB
+:1005200001010101010101010101010101010101BB
+:1005300001010101010101010101010101010101AB
+:10054000010101010101010101010101010101019B
+:10055000010101010101010101010101010101018B
+:10056000010101010101010101010101010101017B
+:10057000010101010101010101010101010101016B
+:10058000010101010101010101010101010101015B
+:10059000010101010101010101010101010101014B
+:1005A000010101010101010101010101010101013B
+:1005B000010101010101010101010101010101012B
+:1005C000010101010101010101010101010101011B
+:1005D000010101010101010101010101010101010B
+:1005E00001010101010101010101010101010101FB
+:1005F00001010101010101010101010101010101EB
+:1006000001010101010101010101010101010101DA
+:1006100001010101010101010101010101010101CA
+:1006200001010101010101010101010101010101BA
+:1006300001010101010101010101010101010101AA
+:10064000010101010101010101010101010101019A
+:10065000010101010101010101010101010101018A
+:10066000010101010101010101010101010101017A
+:10067000010101010101010101010101010101016A
+:10068000010101010101010101010101010101015A
+:10069000010101010101010101010101010101014A
+:1006A000010101010101010101010101010101013A
+:1006B000010101010101010101010101010101012A
+:1006C000010101010101010101010101010101011A
+:1006D000010101010101010101010101010101010A
+:1006E00001010101010101010101010101010101FA
+:1006F00001010101010101000000000000000000F3
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000000000000000000000C9
+:1007300000000000000000000000000000000000B9
+:1007400000000000000000000000000000000000A9
+:100750000000000000000000000000000000000099
+:100760000000000000000000000000000000000089
+:100770000000000000000000000000000000000079
+:100780000000000000000000000000000000000069
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000000029
+:1007D0000000000000000000000000000000000019
+:1007E0000000000000000000000000000000000009
+:1007F00000000000000000000000000000000000F9
+:1008000000000000000000000000000000000000E8
+:1008100000000000000000000000000000000000D8
+:1008200000000000000000000000000000000000C8
+:1008300000000000000000000000000000000000B8
+:1008400000000000000000000000000000000000A8
+:100850000000000000000000000000000000000098
+:100860000000000000000000000000000000000088
+:100870000000000000000000000000000000000078
+:100880000000000000000000000000000000000068
+:100890000000000000000000000000000000000058
+:1008A0000000000000000000000000000000000048
+:1008B0000000000000000000000000000000000038
+:1008C0000000000000000000000000000000000028
+:1008D0000000000000000000000000000000000018
+:1008E0000000000000000000000000000000000008
+:1008F00000000000000000000000000000000000F8
+:1009000000000000000000000000000000000000E7
+:1009100000000000000000000000000000000000D7
+:1009200000000000000000000000000000000000C7
+:1009300000000000000000000000000000000000B7
+:1009400000000000000000000000000000000000A7
+:100950000000000000000000000000000000000097
+:100960000000000000000000000000000000000087
+:100970000000000000000000000000000000000077
+:100980000000000000000000000000000000000067
+:100990000000000000000000000000000000000057
+:1009A0000000000000000000000000000000000047
+:1009B0000000000000000000000000000000000037
+:1009C0000000000000000000000000000000000027
+:1009D0000000000000000000000000000000000017
+:1009E0000000000000000000000000000000000007
+:1009F00000000000000000000000000000000000F7
+:100A000000000000000000000000000000000000E6
+:100A100000000000000000000000000000000000D6
+:100A200000000000000000000000000000000000C6
+:100A300000000000000000000000000000000000B6
+:100A400000000000000000000000000000000000A6
+:100A50000000000000000000000000000000000096
+:100A60000000000000000000000000000000000086
+:100A70000000000000000000000000000000000076
+:100A80000000000000000000000000000000000066
+:100A90000000000000000000000000000000000056
+:100AA0000000000000000000000000000000000046
+:100AB0000000000000000000000000000000000036
+:100AC0000000000000000000000000000000000026
+:100AD0000000000000000000000000000000000016
+:100AE0000000000000000000000000000000000006
+:100AF00000000000000000000000000000000000F6
+:100B000000000000000000000000000000000000E5
+:100B100000000000000000000000000000000000D5
+:100B200000000000000000000000000000000000C5
+:100B300000000000000000000000000000000000B5
+:100B400000000000000000000000000000000000A5
+:100B50000000000000000000000000000000000095
+:100B60000000000000000000000000000000000085
+:100B70000000000000000000000000000000000075
+:100B80000000000000000000000000000000000065
+:100B90000000000000000000000000000000000055
+:100BA0000000000000000000000000000000000045
+:100BB0000000000000000000000000000000000035
+:100BC0000000000000000000000000000000000025
+:100BD0000000000000000000000000000000000015
+:100BE0000000000000000000000000000000000005
+:100BF00000000000000000000000000000000000F5
+:100C000000000000000000000000000000000000E4
+:100C100000000000000000000000000000000000D4
+:100C200000000000000000000000000000000000C4
+:100C300000000000000000000000000000000000B4
+:100C400000000000000000000000000000000000A4
+:100C50000000000000000000000000000000000094
+:100C60000000000000000000000000000000000084
+:100C70000000000000000000000000000000000074
+:100C80000000000000000000000000000000000064
+:100C90000000000000000000000000000000000054
+:100CA0000000000000000000000000000000000044
+:100CB0000000000000000000000000000000000034
+:100CC0000000000000000000000000000000000024
+:100CD0000000000000000000000000000000000014
+:100CE0000000000000000000000000000000000004
+:100CF00000000000000000020202020202020202E2
+:100D000002020202020202020202020202020202C3
+:100D100002020202020202020202020202020202B3
+:100D200002020202020202020202020202020202A3
+:100D30000202020202020202020202020202020293
+:100D40000202020202020202020202020202020283
+:100D50000202020202020202020202020202020273
+:100D60000202020202020202020202020202020263
+:100D70000202020202020202020202020202020253
+:100D80000202020202020202020202020202020243
+:100D90000202020202020202020202020202020233
+:100DA0000202020202020202020202020202020223
+:100DB0000202020202020202020202020202020213
+:100DC0000202020202020202020202020202020203
+:100DD00002020202020202020202020202020202F3
+:100DE00002020202020202020202020202020202E3
+:100DF00002020202020202020202020202020202D3
+:100E000002020202020202020202020202020202C2
+:100E100002020202020202020202020202020202B2
+:100E200002020202020202020202020202020202A2
+:100E30000202020202020202020202020202020292
+:100E40000202020202020202020202020202020282
+:100E50000202020202020202020202020202020272
+:100E60000202020202020202020202020202020262
+:100E70000202020202020202020202020202020252
+:100E80000202020202020202020202020202020242
+:100E90000202020202020202020202020202020232
+:100EA0000202020202020202020202020202020222
+:100EB0000202020202020202020202020202020212
+:100EC0000202020202020202020202020202020202
+:100ED00002020202020202020202020202020202F2
+:100EE00002020202020202020202020202020202E2
+:100EF00002020202020202020202020202020202D2
+:100F000002020202020202020202020202020202C1
+:100F100002020202020202020202020202020202B1
+:100F200002020202020202020202020202020202A1
+:100F30000202020202020202020202020202020291
+:100F40000202020202020202020202020202020281
+:100F50000202020202020202020202020202020271
+:100F60000202020202020202020202020202020261
+:100F70000202020202020202020202020202020251
+:100F80000202020202020202020202020202020241
+:100F90000202020202020202020202020202020231
+:100FA0000202020202020202020202020202020221
+:100FB0000202020202020202020202020202020211
+:100FC0000202020202020202020202020202020201
+:100FD00002020202020202020202020202020202F1
+:100FE00002020202020202020202020202020202E1
+:100FF00002020202020202020202020202020202D1
+:1010000002020202020202020202020202020202C0
+:1010100002020202020202020202020202020202B0
+:1010200002020202020202020202020202020202A0
+:101030000202020202020202020202020202020290
+:101040000202020202020202020202020202020280
+:101050000202020202020202020202020202020270
+:101060000202020202020202020202020202020260
+:101070000202020202020202020202020202020250
+:101080000202020202020202020202020202020240
+:101090000202020202020202020202020202020230
+:1010A0000202020202020202020202020202020220
+:1010B0000202020202020202020202020202020210
+:1010C0000202020202020202020202020202020200
+:1010D00002020202020202020202020202020202F0
+:1010E00002020202020202020202020202020202E0
+:1010F00002020202020202020202020202020202D0
+:1011000002020202020202020202020202020202BF
+:1011100002020202020202020202020202020202AF
+:10112000020202020202020202020202020202029F
+:10113000020202020202020202020202020202028F
+:10114000020202020202020202020202020202027F
+:10115000020202020202020202020202020202026F
+:10116000020202020202020202020202020202025F
+:10117000020202020202020202020202020202024F
+:10118000020202020202020202020202020202023F
+:10119000020202020202020202020202020202022F
+:1011A000020202020202020202020202020202021F
+:1011B000020202020202020202020202020202020F
+:1011C00002020202020202020202020202020202FF
+:1011D00002020202020202020202020202020202EF
+:1011E00002020202020202020202020202020202DF
+:1011F00002020202020202020202020202020202CF
+:1012000002020202020202020202020202020202BE
+:1012100002020202020202020202020202020202AE
+:10122000020202020202020202020202020202029E
+:10123000020202020202020202020202020202028E
+:10124000020202020202020202020202020202027E
+:10125000020202020202020202020202020202026E
+:10126000020202020202020202020202020202025E
+:10127000020202020202020202020202020202024E
+:10128000020202020202020202020202020202023E
+:10129000020202020202020202020202020202022E
+:1012A000020202020202020202020202020202021E
+:1012B000020202020202020202020202020202020E
+:1012C00002020202020202020202020202020202FE
+:1012D00002020202020202020202020202020202EE
+:1012E00002020202020202020202020202020202DE
+:1012F00002020202020202020202020202020202CE
+:1013000002020202020202020202020202020202BD
+:1013100002020202020202020202020202020202AD
+:10132000020202020202020202020202020202029D
+:10133000020202020202020202020202020202028D
+:10134000020202020202020202020202020202027D
+:10135000020202020202020202020202020202026D
+:10136000020202020202020202020202020202025D
+:10137000020202020202020202020202020202024D
+:10138000020202020202020202020202020202023D
+:10139000020202020202020202020202020202022D
+:1013A000020202020202020202020202020202021D
+:1013B000020202020202020202020202020202020D
+:1013C00002020202020202020202020202020202FD
+:1013D00002020202020202020202020202020202ED
+:1013E00002020202020202020202020202020202DD
+:1013F00002020202020202020202020202020202CD
+:1014000002020202020202020202020202020202BC
+:1014100002020202020202020202020202020202AC
+:10142000020202020202020202020202020202029C
+:10143000020202020202020202020202020202028C
+:10144000020202020202020202020202020202027C
+:10145000020202020202020202020202020202026C
+:10146000020202020202020202020202020202025C
+:10147000020202020202020202020202020202024C
+:10148000020202020202020202020202020202023C
+:10149000020202020202020202020202020202022C
+:1014A000020202020202020202020202020202021C
+:1014B000020202020202020202020202020202020C
+:1014C00002020202020202020202020202020202FC
+:1014D00002020202020202020202020202020202EC
+:1014E00002020202020202020202020202020202DC
+:1014F00002020202020202020202020202020202CC
+:1015000002020202020202020202020202020202BB
+:1015100002020202020202020202020202020202AB
+:10152000020202020202020202020202020202029B
+:10153000020202020202020202020202020202028B
+:10154000020202020202020202020202020202027B
+:10155000020202020202020202020202020202026B
+:10156000020202020202020202020202020202025B
+:10157000020202020202020202020202020202024B
+:10158000020202020202020202020202020202023B
+:10159000020202020202020202020202020202022B
+:1015A000020202020202020202020202020202021B
+:1015B000020202020202020202020202020202020B
+:1015C00002020202020202020202020202020202FB
+:1015D00002020202020202020202020202020202EB
+:1015E00002020202020202020202020202020202DB
+:1015F00002020202020202020202020202020202CB
+:1016000002020202020202020202020202020202BA
+:1016100002020202020202020202020202020202AA
+:10162000020202020202020202020202020202029A
+:10163000020202020202020202020202020202028A
+:10164000020202020202020202020202020202027A
+:10165000020202020202020202020202020202026A
+:10166000020202020202020202020202020202025A
+:10167000020202020202020202020202020202024A
+:10168000020202020202020202020202020202023A
+:10169000020202020202020202020202020202022A
+:1016A000020202020202020202020202020202021A
+:1016B000020202020202020202020202020202020A
+:1016C00002020202020202020202020202020202FA
+:1016D00002020202020202020202020202020202EA
+:1016E00002020202020202020202020202020202DA
+:1016F00002020202020202020202020202020202CA
+:1017000002020202020202020202020202020202B9
+:1017100002020202020202020202020202020202A9
+:101720000202020202020202020202020202020299
+:101730000202020202020202020202020202020289
+:101740000202020202020202020202020202020279
+:101750000202020202020202020202020202020269
+:101760000202020202020202020202020202020259
+:101770000202020202020202020202020202020249
+:101780000202020202020202020202020202020239
+:101790000202020202020202020202020202020229
+:1017A0000202020202020202020202020202020219
+:1017B0000202020202020202020202020202020209
+:1017C00002020202020202020202020202020202F9
+:1017D00002020202020202020202020202020202E9
+:1017E00002020202020202020202020202020202D9
+:1017F00002020202020202020202020202020202C9
+:1018000002020202020202020202020202020202B8
+:1018100002020202020202020202020202020202A8
+:101820000202020202020202020202020202020298
+:101830000202020202020202020202020202020288
+:101840000202020202020202020202020202020278
+:101850000202020202020202020202020202020268
+:101860000202020202020202020202020202020258
+:101870000202020202020202020202020202020248
+:101880000202020202020202020202020202020238
+:101890000202020202020202020202020202020228
+:1018A0000202020202020202020202020202020218
+:1018B0000202020202020202020202020202020208
+:1018C00002020202020202020202020202020202F8
+:1018D00002020202020202020202020202020202E8
+:1018E00002020202020202020202020202020202D8
+:1018F00002020202020202020202020202020202C8
+:1019000002020202020202020202020202020202B7
+:1019100002020202020202020202020202020202A7
+:101920000202020202020202020202020202020297
+:101930000202020202020202020202020202020287
+:101940000202020202020202020202020202020277
+:101950000202020202020202020202020202020267
+:101960000202020202020202020202020202020257
+:101970000202020202020202020202020202020247
+:101980000202020202020202020202020202020237
+:101990000202020202020202020202020202020227
+:1019A0000202020202020202020202020202020217
+:1019B0000202020202020202020202020202020207
+:1019C00002020202020202020202020202020202F7
+:1019D00002020202020202020202020202020202E7
+:1019E00002020202020202020202020202020202D7
+:1019F00002020202020202020202020202020202C7
+:101A000002020202020202020202020202020202B6
+:101A100002020202020202020202020202020202A6
+:101A20000202020202020202020202020202020296
+:101A30000202020202020202020202020202020286
+:101A40000202020202020202020202020202020276
+:101A50000202020202020202020202020202020266
+:101A60000202020202020202020202020202020256
+:101A70000202020202020202020202020202020246
+:101A80000202020202020202020202020202020236
+:101A90000202020202020202020202020202020226
+:101AA0000202020202020202020202020202020216
+:101AB0000202020202020202020202020202020206
+:101AC00002020202020202020202020202020202F6
+:101AD00002020202020202020202020202020202E6
+:101AE00002020202020202020202020202020202D6
+:101AF00002020202020202020202020202020202C6
+:101B000002020202020202020202020202020202B5
+:101B100002020202020202020202020202020202A5
+:101B20000202020202020202020202020202020295
+:101B30000202020202020202020202020202020285
+:101B40000202020202020202020202020202020275
+:101B50000202020202020202020202020202020265
+:101B60000202020202020202020202020202020255
+:101B70000202020202020202020202020202020245
+:101B80000202020202020202020202020202020235
+:101B90000202020202020202020202020202020225
+:101BA0000202020202020202020202020202020215
+:101BB0000202020202020202020202020202020205
+:101BC00002020202020202020202020202020202F5
+:101BD00002020202020202020202020202020202E5
+:101BE00002020202020202020202020202020202D5
+:101BF00002020202020202020202020202020202C5
+:101C000002020202020202020202020202020202B4
+:101C100002020202020202020202020202020202A4
+:101C20000202020202020202020202020202020294
+:101C30000202020202020202020202020202020284
+:101C40000202020202020202020202020202020274
+:101C50000202020202020202020202020202020264
+:101C60000202020202020202020202020202020254
+:101C70000202020202020202020202020202020244
+:101C80000202020202020202020202020202020234
+:101C90000202020202020202020202020202020224
+:101CA0000202020202020202020202020202020214
+:101CB0000202020202020202020202020202020204
+:101CC00002020202020202020202020202020202F4
+:101CD00002020202020202020202020202020202E4
+:101CE00002020202020202020202020202020202D4
+:101CF00002020202020202020202020202020202C4
+:101D000002020202020202020202020202020202B3
+:101D100002020202020202020202020202020202A3
+:101D20000202020202020202020202020202020293
+:101D30000202020202020202020202020202020283
+:101D40000202020202020202020202020202020273
+:101D50000202020202020202020202020202020263
+:101D60000202020202020202020202020202020253
+:101D70000202020202020202020202020202020243
+:101D80000202020202020202020202020202020233
+:101D90000202020202020202020202020202020223
+:101DA0000202020202020202020202020202020213
+:101DB0000202020202020202020202020202020203
+:101DC00002020202020202020202020202020202F3
+:101DD00002020202020202020202020202020202E3
+:101DE00002020202020202020202020202020202D3
+:101DF00002020202020202020202020202020202C3
+:101E000002020202020202020202020202020202B2
+:101E100002020202020202020202020202020202A2
+:101E20000202020202020202020202020202020292
+:101E30000202020202020202020202020202020282
+:101E40000202020202020202020202020202020272
+:101E50000202020202020202020202020202020262
+:101E60000202020202020202020202020202020252
+:101E70000202020202020202020202020202020242
+:101E80000202020202020202020202020202020232
+:101E90000202020202020202020202020202020222
+:101EA0000202020202020202020202020202020212
+:101EB0000202020202020202020202020202020202
+:101EC00002020202020202020202020202020202F2
+:101ED00002020202020202020202020202020202E2
+:101EE00002020202020202020202020202020202D2
+:101EF00002020202020202020202020202020202C2
+:101F000002020202020202020202020202020202B1
+:101F100002020202020202020202020202020202A1
+:101F20000202020202020202020202020202020291
+:101F30000202020202020202020202020202020281
+:101F40000202020202020202020202020202020271
+:101F50000202020202020202020202020202020261
+:101F60000202020202020202020202020202020251
+:101F70000202020202020202020202020202020241
+:101F80000202020202020202020202020202020231
+:101F90000202020202020202020202020202020221
+:101FA0000202020202020202020202020202020211
+:101FB0000202020202020202020202020202020201
+:101FC00002020202020202020202020202020202F1
+:101FD00002020202020202020202020202020202E1
+:101FE00002020202020202020202020202020202D1
+:101FF00002020202020202020202020202020202C1
+:1020000002020202020202020202020202020202B0
+:1020100002020202020202020202020202020202A0
+:102020000202020202020202020202020202020290
+:102030000202020202020202020202020202020280
+:102040000202020202020202020202020202020270
+:102050000202020202020202020202020202020260
+:102060000202020202020202020202020202020250
+:102070000202020202020202020202020202020240
+:102080000202020202020202020202020202020230
+:102090000202020202020202020202020202020220
+:1020A0000202020202020202020202020202020210
+:1020B0000202020202020202020202020202020200
+:1020C00002020202020202020202020202020202F0
+:1020D00002020202020202020202020202020202E0
+:1020E00002020202020202020202020202020202D0
+:1020F00002020202020202000000000000000000D2
+:1021000000000000000000000000000000000000CF
+:1021100000000000000000000000000000000000BF
+:1021200000000000000000000000000000000000AF
+:10213000000000000000000000000000000000009F
+:10214000000000000000000000000000000000008F
+:10215000000000000000000000000000000000007F
+:10216000000000000000000000000000000000006F
+:10217000000000000000000000000000000000005F
+:10218000000000000000000000000000000000004F
+:10219000000000000000000000000000000000003F
+:1021A000000000000000000000000000000000002F
+:1021B000000000000000000000000000000000001F
+:1021C000000000000000000000000000000000000F
+:1021D00000000000000000000000000000000000FF
+:1021E00000000000000000000000000000000000EF
+:1021F00000000000000000000000000000000000DF
+:1022000000000000000000000000000000000000CE
+:1022100000000000000000000000000000000000BE
+:1022200000000000000000000000000000000000AE
+:10223000000000000000000000000000000000009E
+:10224000000000000000000000000000000000008E
+:10225000000000000000000000000000000000007E
+:10226000000000000000000000000000000000006E
+:10227000000000000000000000000000000000005E
+:10228000000000000000000000000000000000004E
+:10229000000000000000000000000000000000003E
+:1022A000000000000000000000000000000000002E
+:1022B000000000000000000000000000000000001E
+:1022C000000000000000000000000000000000000E
+:1022D00000000000000000000000000000000000FE
+:1022E00000000000000000000000000000000000EE
+:1022F00000000000000000000000000000000000DE
+:1023000000000000000000000000000000000000CD
+:1023100000000000000000000000000000000000BD
+:1023200000000000000000000000000000000000AD
+:10233000000000000000000000000000000000009D
+:10234000000000000000000000000000000000008D
+:10235000000000000000000000000000000000007D
+:10236000000000000000000000000000000000006D
+:10237000000000000000000000000000000000005D
+:10238000000000000000000000000000000000004D
+:10239000000000000000000000000000000000003D
+:1023A000000000000000000000000000000000002D
+:1023B000000000000000000000000000000000001D
+:1023C000000000000000000000000000000000000D
+:1023D00000000000000000000000000000000000FD
+:1023E00000000000000000000000000000000000ED
+:1023F00000000000000000000000000000000000DD
+:1024000000000000000000000000000000000000CC
+:1024100000000000000000000000000000000000BC
+:1024200000000000000000000000000000000000AC
+:10243000000000000000000000000000000000009C
+:10244000000000000000000000000000000000008C
+:10245000000000000000000000000000000000007C
+:10246000000000000000000000000000000000006C
+:10247000000000000000000000000000000000005C
+:10248000000000000000000000000000000000004C
+:10249000000000000000000000000000000000003C
+:1024A000000000000000000000000000000000002C
+:1024B000000000000000000000000000000000001C
+:1024C000000000000000000000000000000000000C
+:1024D00000000000000000000000000000000000FC
+:1024E00000000000000000000000000000000000EC
+:1024F00000000000000000000000000000000000DC
+:1025000000000000000000000000000000000000CB
+:1025100000000000000000000000000000000000BB
+:1025200000000000000000000000000000000000AB
+:10253000000000000000000000000000000000009B
+:10254000000000000000000000000000000000008B
+:10255000000000000000000000000000000000007B
+:10256000000000000000000000000000000000006B
+:10257000000000000000000000000000000000005B
+:10258000000000000000000000000000000000004B
+:10259000000000000000000000000000000000003B
+:1025A000000000000000000000000000000000002B
+:1025B000000000000000000000000000000000001B
+:1025C000000000000000000000000000000000000B
+:1025D00000000000000000000000000000000000FB
+:1025E00000000000000000000000000000000000EB
+:1025F00000000000000000000000000000000000DB
+:1026000000000000000000000000000000000000CA
+:1026100000000000000000000000000000000000BA
+:1026200000000000000000000000000000000000AA
+:10263000000000000000000000000000000000009A
+:10264000000000000000000000000000000000008A
+:10265000000000000000000000000000000000007A
+:10266000000000000000000000000000000000006A
+:10267000000000000000000000000000000000005A
+:10268000000000000000000000000000000000004A
+:10269000000000000000000000000000000000003A
+:1026A000000000000000000000000000000000002A
+:1026B000000000000000000000000000000000001A
+:1026C000000000000000000000000000000000000A
+:1026D00000000000000000000000000000000000FA
+:1026E00000000000000000000000000000000000EA
+:1026F00000000000000000000000000000000000DA
+:1027000000000000000000000000000000000000C9
+:1027100000000000000000000000000000000000B9
+:1027200000000000000000000000000000000000A9
+:102730000000000000000000000000000000000099
+:102740000000000000000000000000000000000089
+:102750000000000000000000000000000000000079
+:102760000000000000000000000000000000000069
+:102770000000000000000000000000000000000059
+:102780000000000000000000000000000000000049
+:102790000000000000000000000000000000000039
+:1027A0000000000000000000000000000000000029
+:1027B0000000000000000000000000000000000019
+:1027C0000000000000000000000000000000000009
+:1027D00000000000000000000000000000000000F9
+:1027E00000000000000000000000000000000000E9
+:1027F00000000000000000000000000000000000D9
+:1028000000000000000000000000000000000000C8
+:1028100000000000000000000000000000000000B8
+:1028200000000000000000000000000000000000A8
+:102830000000000000000000000000000000000098
+:102840000000000000000000000000000000000088
+:102850000000000000000000000000000000000078
+:102860000000000000000000000000000000000068
+:102870000000000000000000000000000000000058
+:102880000000000000000000000000000000000048
+:102890000000000000000000000000000000000038
+:1028A0000000000000000000000000000000000028
+:1028B0000000000000000000000000000000000018
+:1028C0000000000000000000000000000000000008
+:1028D00000000000000000000000000000000000F8
+:1028E00000000000000000000000000000000000E8
+:1028F00000000000000000000000000000000000D8
+:1029000000000000000000000000000000000000C7
+:1029100000000000000000000000000000000000B7
+:1029200000000000000000000000000000000000A7
+:102930000000000000000000000000000000000097
+:102940000000000000000000000000000000000087
+:102950000000000000000000000000000000000077
+:102960000000000000000000000000000000000067
+:102970000000000000000000000000000000000057
+:102980000000000000000000000000000000000047
+:102990000000000000000000000000000000000037
+:1029A0000000000000000000000000000000000027
+:1029B0000000000000000000000000000000000017
+:1029C0000000000000000000000000000000000007
+:1029D00000000000000000000000000000000000F7
+:1029E00000000000000000000000000000000000E7
+:1029F00000000000000000010101010101010101CE
+:102A000001010101010101010101010101010101B6
+:102A100001010101010101010101010101010101A6
+:102A20000101010101010101010101010101010196
+:102A30000101010101010101010101010101010186
+:102A40000101010101010101010101010101010176
+:102A50000101010101010101010101010101010166
+:102A60000101010101010101010101010101010156
+:102A70000101010101010101010101010101010146
+:102A80000101010101010101010101010101010136
+:102A90000101010101010101010101010101010126
+:102AA0000101010101010101010101010101010116
+:102AB0000101010101010101010101010101010106
+:102AC00001010101010101010101010101010101F6
+:102AD00001010101010101010101010101010101E6
+:102AE00001010101010101010101010101010101D6
+:102AF00001010101010101010101010101010101C6
+:102B000001010101010101010101010101010101B5
+:102B100001010101010101010101010101010101A5
+:102B20000101010101010101010101010101010195
+:102B30000101010101010101010101010101010185
+:102B40000101010101010101010101010101010175
+:102B50000101010101010101010101010101010165
+:102B60000101010101010101010101010101010155
+:102B70000101010101010101010101010101010145
+:102B80000101010101010101010101010101010135
+:102B90000101010101010101010101010101010125
+:102BA0000101010101010101010101010101010115
+:102BB0000101010101010101010101010101010105
+:102BC00001010101010101010101010101010101F5
+:102BD00001010101010101010101010101010101E5
+:102BE00001010101010101010101010101010101D5
+:102BF00001010101010101010101010101010101C5
+:102C000001010101010101010101010101010101B4
+:102C100001010101010101010101010101010101A4
+:102C20000101010101010101010101010101010194
+:102C30000101010101010101010101010101010184
+:102C40000101010101010101010101010101010174
+:102C50000101010101010101010101010101010164
+:102C60000101010101010101010101010101010154
+:102C70000101010101010101010101010101010144
+:102C80000101010101010101010101010101010134
+:102C90000101010101010101010101010101010124
+:102CA0000101010101010101010101010101010114
+:102CB0000101010101010101010101010101010104
+:102CC00001010101010101010101010101010101F4
+:102CD00001010101010101010101010101010101E4
+:102CE00001010101010101010101010101010101D4
+:102CF00001010101010101010101010101010101C4
+:102D000001010101010101010101010101010101B3
+:102D100001010101010101010101010101010101A3
+:102D20000101010101010101010101010101010193
+:102D30000101010101010101010101010101010183
+:102D40000101010101010101010101010101010173
+:102D50000101010101010101010101010101010163
+:102D60000101010101010101010101010101010153
+:102D70000101010101010101010101010101010143
+:102D80000101010101010101010101010101010133
+:102D90000101010101010101010101010101010123
+:102DA0000101010101010101010101010101010113
+:102DB0000101010101010101010101010101010103
+:102DC00001010101010101010101010101010101F3
+:102DD00001010101010101010101010101010101E3
+:102DE00001010101010101010101010101010101D3
+:102DF00001010101010101010101010101010101C3
+:102E000001010101010101010101010101010101B2
+:102E100001010101010101010101010101010101A2
+:102E20000101010101010101010101010101010192
+:102E30000101010101010101010101010101010182
+:102E40000101010101010101010101010101010172
+:102E50000101010101010101010101010101010162
+:102E60000101010101010101010101010101010152
+:102E70000101010101010101010101010101010142
+:102E80000101010101010101010101010101010132
+:102E90000101010101010101010101010101010122
+:102EA0000101010101010101010101010101010112
+:102EB0000101010101010101010101010101010102
+:102EC00001010101010101010101010101010101F2
+:102ED00001010101010101010101010101010101E2
+:102EE00001010101010101010101010101010101D2
+:102EF00001010101010101010101010101010101C2
+:102F000001010101010101010101010101010101B1
+:102F100001010101010101010101010101010101A1
+:102F20000101010101010101010101010101010191
+:102F30000101010101010101010101010101010181
+:102F40000101010101010101010101010101010171
+:102F50000101010101010101010101010101010161
+:102F60000101010101010101010101010101010151
+:102F70000101010101010101010101010101010141
+:102F80000101010101010101010101010101010131
+:102F90000101010101010101010101010101010121
+:102FA0000101010101010101010101010101010111
+:102FB0000101010101010101010101010101010101
+:102FC00001010101010101010101010101010101F1
+:102FD00001010101010101010101010101010101E1
+:102FE00001010101010101010101010101010101D1
+:102FF00001010101010101010101010101010101C1
+:1030000001010101010101010101010101010101B0
+:1030100001010101010101010101010101010101A0
+:103020000101010101010101010101010101010190
+:103030000101010101010101010101010101010180
+:103040000101010101010101010101010101010170
+:103050000101010101010101010101010101010160
+:103060000101010101010101010101010101010150
+:103070000101010101010101010101010101010140
+:103080000101010101010101010101010101010130
+:103090000101010101010101010101010101010120
+:1030A0000101010101010101010101010101010110
+:1030B0000101010101010101010101010101010100
+:1030C00001010101010101010101010101010101F0
+:1030D00001010101010101010101010101010101E0
+:1030E00001010101010101010101010101010101D0
+:1030F00001010101010101010101010101010101C0
+:1031000001010101010101010101010101010101AF
+:10311000010101010101010101010101010101019F
+:10312000010101010101010101010101010101018F
+:10313000010101010101010101010101010101017F
+:10314000010101010101010101010101010101016F
+:10315000010101010101010101010101010101015F
+:10316000010101010101010101010101010101014F
+:10317000010101010101010101010101010101013F
+:10318000010101010101010101010101010101012F
+:10319000010101010101010101010101010101011F
+:1031A000010101010101010101010101010101010F
+:1031B00001010101010101010101010101010101FF
+:1031C00001010101010101010101010101010101EF
+:1031D00001010101010101010101010101010101DF
+:1031E00001010101010101010101010101010101CF
+:1031F00001010101010101010101010101010101BF
+:1032000001010101010101010101010101010101AE
+:10321000010101010101010101010101010101019E
+:10322000010101010101010101010101010101018E
+:10323000010101010101010101010101010101017E
+:10324000010101010101010101010101010101016E
+:10325000010101010101010101010101010101015E
+:10326000010101010101010101010101010101014E
+:10327000010101010101010101010101010101013E
+:10328000010101010101010101010101010101012E
+:10329000010101010101010101010101010101011E
+:1032A000010101010101010101010101010101010E
+:1032B00001010101010101010101010101010101FE
+:1032C00001010101010101010101010101010101EE
+:1032D00001010101010101010101010101010101DE
+:1032E00001010101010101010101010101010101CE
+:1032F00001010101010101010101010101010101BE
+:1033000001010101010101010101010101010101AD
+:10331000010101010101010101010101010101019D
+:10332000010101010101010101010101010101018D
+:10333000010101010101010101010101010101017D
+:10334000010101010101010101010101010101016D
+:10335000010101010101010101010101010101015D
+:10336000010101010101010101010101010101014D
+:10337000010101010101010101010101010101013D
+:10338000010101010101010101010101010101012D
+:10339000010101010101010101010101010101011D
+:1033A000010101010101010101010101010101010D
+:1033B00001010101010101010101010101010101FD
+:1033C00001010101010101010101010101010101ED
+:1033D00001010101010101010101010101010101DD
+:1033E00001010101010101010101010101010101CD
+:1033F00001010101010101010101010101010101BD
+:1034000001010101010101010101010101010101AC
+:10341000010101010101010101010101010101019C
+:10342000010101010101010101010101010101018C
+:10343000010101010101010101010101010101017C
+:10344000010101010101010101010101010101016C
+:10345000010101010101010101010101010101015C
+:10346000010101010101010101010101010101014C
+:10347000010101010101010101010101010101013C
+:10348000010101010101010101010101010101012C
+:10349000010101010101010101010101010101011C
+:1034A000010101010101010101010101010101010C
+:1034B00001010101010101010101010101010101FC
+:1034C00001010101010101010101010101010101EC
+:1034D00001010101010101010101010101010101DC
+:1034E00001010101010101010101010101010101CC
+:1034F00001010101010101010101010101010101BC
+:1035000001010101010101010101010101010101AB
+:10351000010101010101010101010101010101019B
+:10352000010101010101010101010101010101018B
+:10353000010101010101010101010101010101017B
+:10354000010101010101010101010101010101016B
+:10355000010101010101010101010101010101015B
+:10356000010101010101010101010101010101014B
+:10357000010101010101010101010101010101013B
+:10358000010101010101010101010101010101012B
+:10359000010101010101010101010101010101011B
+:1035A000010101010101010101010101010101010B
+:1035B00001010101010101010101010101010101FB
+:1035C00001010101010101010101010101010101EB
+:1035D00001010101010101010101010101010101DB
+:1035E00001010101010101010101010101010101CB
+:1035F00001010101010101010101010101010101BB
+:1036000001010101010101010101010101010101AA
+:10361000010101010101010101010101010101019A
+:10362000010101010101010101010101010101018A
+:10363000010101010101010101010101010101017A
+:10364000010101010101010101010101010101016A
+:10365000010101010101010101010101010101015A
+:10366000010101010101010101010101010101014A
+:10367000010101010101010101010101010101013A
+:10368000010101010101010101010101010101012A
+:10369000010101010101010101010101010101011A
+:1036A000010101010101010101010101010101010A
+:1036B00001010101010101010101010101010101FA
+:1036C00001010101010101010101010101010101EA
+:1036D00001010101010101010101010101010101DA
+:1036E00001010101010101010101010101010101CA
+:1036F00001010101010101010101010101010101BA
+:1037000001010101010101010101010101010101A9
+:103710000101010101010101010101010101010199
+:103720000101010101010101010101010101010189
+:103730000101010101010101010101010101010179
+:103740000101010101010101010101010101010169
+:103750000101010101010101010101010101010159
+:103760000101010101010101010101010101010149
+:103770000101010101010101010101010101010139
+:103780000101010101010101010101010101010129
+:103790000101010101010101010101010101010119
+:1037A0000101010101010101010101010101010109
+:1037B00001010101010101010101010101010101F9
+:1037C00001010101010101010101010101010101E9
+:1037D00001010101010101010101010101010101D9
+:1037E00001010101010101010101010101010101C9
+:1037F00001010101010101010101010101010101B9
+:1038000001010101010101010101010101010101A8
+:103810000101010101010101010101010101010198
+:103820000101010101010101010101010101010188
+:103830000101010101010101010101010101010178
+:103840000101010101010101010101010101010168
+:103850000101010101010101010101010101010158
+:103860000101010101010101010101010101010148
+:103870000101010101010101010101010101010138
+:103880000101010101010101010101010101010128
+:103890000101010101010101010101010101010118
+:1038A0000101010101010101010101010101010108
+:1038B00001010101010101010101010101010101F8
+:1038C00001010101010101010101010101010101E8
+:1038D00001010101010101010101010101010101D8
+:1038E00001010101010101010101010101010101C8
+:1038F00001010101010101010101010101010101B8
+:1039000001010101010101010101010101010101A7
+:103910000101010101010101010101010101010197
+:103920000101010101010101010101010101010187
+:103930000101010101010101010101010101010177
+:103940000101010101010101010101010101010167
+:103950000101010101010101010101010101010157
+:103960000101010101010101010101010101010147
+:103970000101010101010101010101010101010137
+:103980000101010101010101010101010101010127
+:103990000101010101010101010101010101010117
+:1039A0000101010101010101010101010101010107
+:1039B00001010101010101010101010101010101F7
+:1039C00001010101010101010101010101010101E7
+:1039D00001010101010101010101010101010101D7
+:1039E00001010101010101010101010101010101C7
+:1039F00001010101010101010101010101010101B7
+:103A000001010101010101010101010101010101A6
+:103A10000101010101010101010101010101010196
+:103A20000101010101010101010101010101010186
+:103A30000101010101010101010101010101010176
+:103A40000101010101010101010101010101010166
+:103A50000101010101010101010101010101010156
+:103A60000101010101010101010101010101010146
+:103A70000101010101010101010101010101010136
+:103A80000101010101010101010101010101010126
+:103A90000101010101010101010101010101010116
+:103AA0000101010101010101010101010101010106
+:103AB00001010101010101010101010101010101F6
+:103AC00001010101010101010101010101010101E6
+:103AD00001010101010101010101010101010101D6
+:103AE00001010101010101010101010101010101C6
+:103AF00001010101010101010101010101010101B6
+:103B000001010101010101010101010101010101A5
+:103B10000101010101010101010101010101010195
+:103B20000101010101010101010101010101010185
+:103B30000101010101010101010101010101010175
+:103B40000101010101010101010101010101010165
+:103B50000101010101010101010101010101010155
+:103B60000101010101010101010101010101010145
+:103B70000101010101010101010101010101010135
+:103B80000101010101010101010101010101010125
+:103B90000101010101010101010101010101010115
+:103BA0000101010101010101010101010101010105
+:103BB00001010101010101010101010101010101F5
+:103BC00001010101010101010101010101010101E5
+:103BD00001010101010101010101010101010101D5
+:103BE00001010101010101010101010101010101C5
+:103BF00001010101010101010101010101010101B5
+:103C000001010101010101010101010101010101A4
+:103C10000101010101010101010101010101010194
+:103C20000101010101010101010101010101010184
+:103C30000101010101010101010101010101010174
+:103C40000101010101010101010101010101010164
+:103C50000101010101010101010101010101010154
+:103C60000101010101010101010101010101010144
+:103C70000101010101010101010101010101010134
+:103C80000101010101010101010101010101010124
+:103C90000101010101010101010101010101010114
+:103CA0000101010101010101010101010101010104
+:103CB00001010101010101010101010101010101F4
+:103CC00001010101010101010101010101010101E4
+:103CD00001010101010101010101010101010101D4
+:103CE00001010101010101010101010101010101C4
+:103CF00001010101010101010101010101010101B4
+:103D000001010101010101010101010101010101A3
+:103D10000101010101010101010101010101010193
+:103D20000101010101010101010101010101010183
+:103D30000101010101010101010101010101010173
+:103D40000101010101010101010101010101010163
+:103D50000101010101010101010101010101010153
+:103D60000101010101010101010101010101010143
+:103D70000101010101010101010101010101010133
+:103D80000101010101010101010101010101010123
+:103D90000101010101010101010101010101010113
+:103DA0000101010101010101010101010101010103
+:103DB00001010101010101010101010101010101F3
+:103DC00001010101010101010101010101010101E3
+:103DD00001010101010101010101010101010101D3
+:103DE00001010101010101010101010101010101C3
+:103DF00001010101010101000000000000000000BC
+:103E000000000000000000000000000000000000B2
+:103E100000000000000000000000000000000000A2
+:103E20000000000000000000000000000000000092
+:103E30000000000000000000000000000000000082
+:103E40000000000000000000000000000000000072
+:103E50000000000000000000000000000000000062
+:103E60000000000000000000000000000000000052
+:103E70000000000000000000000000000000000042
+:103E80000000000000000000000000000000000032
+:103E90000000000000000000000000000000000022
+:103EA0000000000000000000000000000000000012
+:103EB0000000000000000000000000000000000002
+:103EC00000000000000000000000000000000000F2
+:103ED00000000000000000000000000000000000E2
+:103EE00000000000000000000000000000000000D2
+:103EF00000000000000000000000000000000000C2
+:103F000000000000000000000000000000000000B1
+:103F100000000000000000000000000000000000A1
+:103F20000000000000000000000000000000000091
+:103F30000000000000000000000000000000000081
+:103F40000000000000000000000000000000000071
+:103F50000000000000000000000000000000000061
+:103F60000000000000000000000000000000000051
+:103F70000000000000000000000000000000000041
+:103F80000000000000000000000000000000000031
+:103F90000000000000000000000000000000000021
+:103FA0000000000000000000000000000000000011
+:103FB0000000000000000000000000000000000001
+:103FC00000000000000000000000000000000000F1
+:103FD00000000000000000000000000000000000E1
+:103FE00000000000000000000000000000000000D1
+:103FF00000000000000000000000000000000000C1
+:1040000000000000000000000000000000000000B0
+:1040100000000000000000000000000000000000A0
+:104020000000000000000000000000000000000090
+:104030000000000000000000000000000000000080
+:104040000000000000000000000000000000000070
+:104050000000000000000000000000000000000060
+:104060000000000000000000000000000000000050
+:104070000000000000000000000000000000000040
+:104080000000000000000000000000000000000030
+:104090000000000000000000000000000000000020
+:1040A0000000000000000000000000000000000010
+:1040B0000000000000000000000000000000000000
+:1040C00000000000000000000000000000000000F0
+:1040D00000000000000000000000000000000000E0
+:1040E00000000000000000000000000000000000D0
+:1040F00000000000000000000000000000000000C0
+:1041000000000000000000000000000000000000AF
+:10411000000000000000000000000000000000009F
+:10412000000000000000000000000000000000008F
+:10413000000000000000000000000000000000007F
+:10414000000000000000000000000000000000006F
+:10415000000000000000000000000000000000005F
+:10416000000000000000000000000000000000004F
+:10417000000000000000000000000000000000003F
+:10418000000000000000000000000000000000002F
+:10419000000000000000000000000000000000001F
+:1041A000000000000000000000000000000000000F
+:1041B00000000000000000000000000000000000FF
+:1041C00000000000000000000000000000000000EF
+:1041D00000000000000000000000000000000000DF
+:1041E00000000000000000000000000000000000CF
+:1041F00000000000000000000000000000000000BF
+:1042000000000000000000000000000000000000AE
+:10421000000000000000000000000000000000009E
+:10422000000000000000000000000000000000008E
+:10423000000000000000000000000000000000007E
+:10424000000000000000000000000000000000006E
+:10425000000000000000000000000000000000005E
+:10426000000000000000000000000000000000004E
+:10427000000000000000000000000000000000003E
+:10428000000000000000000000000000000000002E
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000000000E
+:1042B00000000000000000000000000000000000FE
+:1042C00000000000000000000000000000000000EE
+:1042D00000000000000000000000000000000000DE
+:1042E00000000000000000000000000000000000CE
+:1042F00000000000000000000000000000000000BE
+:1043000000000000000000000000000000000000AD
+:10431000000000000000000000000000000000009D
+:10432000000000000000000000000000000000008D
+:10433000000000000000000000000000000000007D
+:10434000000000000000000000000000000000006D
+:10435000000000000000000000000000000000005D
+:10436000000000000000000000000000000000004D
+:10437000000000000000000000000000000000003D
+:10438000000000000000000000000000000000002D
+:10439000000000000000000000000000000000001D
+:1043A000000000000000000000000000000000000D
+:1043B00000000000000000000000000000000000FD
+:1043C00000000000000000000000000000000000ED
+:1043D00000000000000000000000000000000000DD
+:1043E00000000000000000000000000000000000CD
+:1043F00000000000000000020202020202020202AB
+:10440000020202020202020202020202020202028C
+:10441000020202020202020202020202020202027C
+:10442000020202020202020202020202020202026C
+:10443000020202020202020202020202020202025C
+:10444000020202020202020202020202020202024C
+:10445000020202020202020202020202020202023C
+:10446000020202020202020202020202020202022C
+:10447000020202020202020202020202020202021C
+:10448000020202020202020202020202020202020C
+:1044900002020202020202020202020202020202FC
+:1044A00002020202020202020202020202020202EC
+:1044B00002020202020202020202020202020202DC
+:1044C00002020202020202020202020202020202CC
+:1044D00002020202020202020202020202020202BC
+:1044E00002020202020202020202020202020202AC
+:1044F000020202020202020202020202020202029C
+:10450000020202020202020202020202020202028B
+:10451000020202020202020202020202020202027B
+:10452000020202020202020202020202020202026B
+:10453000020202020202020202020202020202025B
+:10454000020202020202020202020202020202024B
+:10455000020202020202020202020202020202023B
+:10456000020202020202020202020202020202022B
+:10457000020202020202020202020202020202021B
+:10458000020202020202020202020202020202020B
+:1045900002020202020202020202020202020202FB
+:1045A00002020202020202020202020202020202EB
+:1045B00002020202020202020202020202020202DB
+:1045C00002020202020202020202020202020202CB
+:1045D00002020202020202020202020202020202BB
+:1045E00002020202020202020202020202020202AB
+:1045F000020202020202020202020202020202029B
+:10460000020202020202020202020202020202028A
+:10461000020202020202020202020202020202027A
+:10462000020202020202020202020202020202026A
+:10463000020202020202020202020202020202025A
+:10464000020202020202020202020202020202024A
+:10465000020202020202020202020202020202023A
+:10466000020202020202020202020202020202022A
+:10467000020202020202020202020202020202021A
+:10468000020202020202020202020202020202020A
+:1046900002020202020202020202020202020202FA
+:1046A00002020202020202020202020202020202EA
+:1046B00002020202020202020202020202020202DA
+:1046C00002020202020202020202020202020202CA
+:1046D00002020202020202020202020202020202BA
+:1046E00002020202020202020202020202020202AA
+:1046F000020202020202020202020202020202029A
+:104700000202020202020202020202020202020289
+:104710000202020202020202020202020202020279
+:104720000202020202020202020202020202020269
+:104730000202020202020202020202020202020259
+:104740000202020202020202020202020202020249
+:104750000202020202020202020202020202020239
+:104760000202020202020202020202020202020229
+:104770000202020202020202020202020202020219
+:104780000202020202020202020202020202020209
+:1047900002020202020202020202020202020202F9
+:1047A00002020202020202020202020202020202E9
+:1047B00002020202020202020202020202020202D9
+:1047C00002020202020202020202020202020202C9
+:1047D00002020202020202020202020202020202B9
+:1047E00002020202020202020202020202020202A9
+:1047F0000202020202020202020202020202020299
+:104800000202020202020202020202020202020288
+:104810000202020202020202020202020202020278
+:104820000202020202020202020202020202020268
+:104830000202020202020202020202020202020258
+:104840000202020202020202020202020202020248
+:104850000202020202020202020202020202020238
+:104860000202020202020202020202020202020228
+:104870000202020202020202020202020202020218
+:104880000202020202020202020202020202020208
+:1048900002020202020202020202020202020202F8
+:1048A00002020202020202020202020202020202E8
+:1048B00002020202020202020202020202020202D8
+:1048C00002020202020202020202020202020202C8
+:1048D00002020202020202020202020202020202B8
+:1048E00002020202020202020202020202020202A8
+:1048F0000202020202020202020202020202020298
+:104900000202020202020202020202020202020287
+:104910000202020202020202020202020202020277
+:104920000202020202020202020202020202020267
+:104930000202020202020202020202020202020257
+:104940000202020202020202020202020202020247
+:104950000202020202020202020202020202020237
+:104960000202020202020202020202020202020227
+:104970000202020202020202020202020202020217
+:104980000202020202020202020202020202020207
+:1049900002020202020202020202020202020202F7
+:1049A00002020202020202020202020202020202E7
+:1049B00002020202020202020202020202020202D7
+:1049C00002020202020202020202020202020202C7
+:1049D00002020202020202020202020202020202B7
+:1049E00002020202020202020202020202020202A7
+:1049F0000202020202020202020202020202020297
+:104A00000202020202020202020202020202020286
+:104A10000202020202020202020202020202020276
+:104A20000202020202020202020202020202020266
+:104A30000202020202020202020202020202020256
+:104A40000202020202020202020202020202020246
+:104A50000202020202020202020202020202020236
+:104A60000202020202020202020202020202020226
+:104A70000202020202020202020202020202020216
+:104A80000202020202020202020202020202020206
+:104A900002020202020202020202020202020202F6
+:104AA00002020202020202020202020202020202E6
+:104AB00002020202020202020202020202020202D6
+:104AC00002020202020202020202020202020202C6
+:104AD00002020202020202020202020202020202B6
+:104AE00002020202020202020202020202020202A6
+:104AF0000202020202020202020202020202020296
+:104B00000202020202020202020202020202020285
+:104B10000202020202020202020202020202020275
+:104B20000202020202020202020202020202020265
+:104B30000202020202020202020202020202020255
+:104B40000202020202020202020202020202020245
+:104B50000202020202020202020202020202020235
+:104B60000202020202020202020202020202020225
+:104B70000202020202020202020202020202020215
+:104B80000202020202020202020202020202020205
+:104B900002020202020202020202020202020202F5
+:104BA00002020202020202020202020202020202E5
+:104BB00002020202020202020202020202020202D5
+:104BC00002020202020202020202020202020202C5
+:104BD00002020202020202020202020202020202B5
+:104BE00002020202020202020202020202020202A5
+:104BF0000202020202020202020202020202020295
+:104C00000202020202020202020202020202020284
+:104C10000202020202020202020202020202020274
+:104C20000202020202020202020202020202020264
+:104C30000202020202020202020202020202020254
+:104C40000202020202020202020202020202020244
+:104C50000202020202020202020202020202020234
+:104C60000202020202020202020202020202020224
+:104C70000202020202020202020202020202020214
+:104C80000202020202020202020202020202020204
+:104C900002020202020202020202020202020202F4
+:104CA00002020202020202020202020202020202E4
+:104CB00002020202020202020202020202020202D4
+:104CC00002020202020202020202020202020202C4
+:104CD00002020202020202020202020202020202B4
+:104CE00002020202020202020202020202020202A4
+:104CF0000202020202020202020202020202020294
+:104D00000202020202020202020202020202020283
+:104D10000202020202020202020202020202020273
+:104D20000202020202020202020202020202020263
+:104D30000202020202020202020202020202020253
+:104D40000202020202020202020202020202020243
+:104D50000202020202020202020202020202020233
+:104D60000202020202020202020202020202020223
+:104D70000202020202020202020202020202020213
+:104D80000202020202020202020202020202020203
+:104D900002020202020202020202020202020202F3
+:104DA00002020202020202020202020202020202E3
+:104DB00002020202020202020202020202020202D3
+:104DC00002020202020202020202020202020202C3
+:104DD00002020202020202020202020202020202B3
+:104DE00002020202020202020202020202020202A3
+:104DF0000202020202020202020202020202020293
+:104E00000202020202020202020202020202020282
+:104E10000202020202020202020202020202020272
+:104E20000202020202020202020202020202020262
+:104E30000202020202020202020202020202020252
+:104E40000202020202020202020202020202020242
+:104E50000202020202020202020202020202020232
+:104E60000202020202020202020202020202020222
+:104E70000202020202020202020202020202020212
+:104E80000202020202020202020202020202020202
+:104E900002020202020202020202020202020202F2
+:104EA00002020202020202020202020202020202E2
+:104EB00002020202020202020202020202020202D2
+:104EC00002020202020202020202020202020202C2
+:104ED00002020202020202020202020202020202B2
+:104EE00002020202020202020202020202020202A2
+:104EF0000202020202020202020202020202020292
+:104F00000202020202020202020202020202020281
+:104F10000202020202020202020202020202020271
+:104F20000202020202020202020202020202020261
+:104F30000202020202020202020202020202020251
+:104F40000202020202020202020202020202020241
+:104F50000202020202020202020202020202020231
+:104F60000202020202020202020202020202020221
+:104F70000202020202020202020202020202020211
+:104F80000202020202020202020202020202020201
+:104F900002020202020202020202020202020202F1
+:104FA00002020202020202020202020202020202E1
+:104FB00002020202020202020202020202020202D1
+:104FC00002020202020202020202020202020202C1
+:104FD00002020202020202020202020202020202B1
+:104FE00002020202020202020202020202020202A1
+:104FF0000202020202020202020202020202020291
+:105000000202020202020202020202020202020280
+:105010000202020202020202020202020202020270
+:105020000202020202020202020202020202020260
+:105030000202020202020202020202020202020250
+:105040000202020202020202020202020202020240
+:105050000202020202020202020202020202020230
+:105060000202020202020202020202020202020220
+:105070000202020202020202020202020202020210
+:105080000202020202020202020202020202020200
+:1050900002020202020202020202020202020202F0
+:1050A00002020202020202020202020202020202E0
+:1050B00002020202020202020202020202020202D0
+:1050C00002020202020202020202020202020202C0
+:1050D00002020202020202020202020202020202B0
+:1050E00002020202020202020202020202020202A0
+:1050F0000202020202020202020202020202020290
+:10510000020202020202020202020202020202027F
+:10511000020202020202020202020202020202026F
+:10512000020202020202020202020202020202025F
+:10513000020202020202020202020202020202024F
+:10514000020202020202020202020202020202023F
+:10515000020202020202020202020202020202022F
+:10516000020202020202020202020202020202021F
+:10517000020202020202020202020202020202020F
+:1051800002020202020202020202020202020202FF
+:1051900002020202020202020202020202020202EF
+:1051A00002020202020202020202020202020202DF
+:1051B00002020202020202020202020202020202CF
+:1051C00002020202020202020202020202020202BF
+:1051D00002020202020202020202020202020202AF
+:1051E000020202020202020202020202020202029F
+:1051F000020202020202020202020202020202028F
+:10520000020202020202020202020202020202027E
+:10521000020202020202020202020202020202026E
+:10522000020202020202020202020202020202025E
+:10523000020202020202020202020202020202024E
+:10524000020202020202020202020202020202023E
+:10525000020202020202020202020202020202022E
+:10526000020202020202020202020202020202021E
+:10527000020202020202020202020202020202020E
+:1052800002020202020202020202020202020202FE
+:1052900002020202020202020202020202020202EE
+:1052A00002020202020202020202020202020202DE
+:1052B00002020202020202020202020202020202CE
+:1052C00002020202020202020202020202020202BE
+:1052D00002020202020202020202020202020202AE
+:1052E000020202020202020202020202020202029E
+:1052F000020202020202020202020202020202028E
+:10530000020202020202020202020202020202027D
+:10531000020202020202020202020202020202026D
+:10532000020202020202020202020202020202025D
+:10533000020202020202020202020202020202024D
+:10534000020202020202020202020202020202023D
+:10535000020202020202020202020202020202022D
+:10536000020202020202020202020202020202021D
+:10537000020202020202020202020202020202020D
+:1053800002020202020202020202020202020202FD
+:1053900002020202020202020202020202020202ED
+:1053A00002020202020202020202020202020202DD
+:1053B00002020202020202020202020202020202CD
+:1053C00002020202020202020202020202020202BD
+:1053D00002020202020202020202020202020202AD
+:1053E000020202020202020202020202020202029D
+:1053F000020202020202020202020202020202028D
+:10540000020202020202020202020202020202027C
+:10541000020202020202020202020202020202026C
+:10542000020202020202020202020202020202025C
+:10543000020202020202020202020202020202024C
+:10544000020202020202020202020202020202023C
+:10545000020202020202020202020202020202022C
+:10546000020202020202020202020202020202021C
+:10547000020202020202020202020202020202020C
+:1054800002020202020202020202020202020202FC
+:1054900002020202020202020202020202020202EC
+:1054A00002020202020202020202020202020202DC
+:1054B00002020202020202020202020202020202CC
+:1054C00002020202020202020202020202020202BC
+:1054D00002020202020202020202020202020202AC
+:1054E000020202020202020202020202020202029C
+:1054F000020202020202020202020202020202028C
+:10550000020202020202020202020202020202027B
+:10551000020202020202020202020202020202026B
+:10552000020202020202020202020202020202025B
+:10553000020202020202020202020202020202024B
+:10554000020202020202020202020202020202023B
+:10555000020202020202020202020202020202022B
+:10556000020202020202020202020202020202021B
+:10557000020202020202020202020202020202020B
+:1055800002020202020202020202020202020202FB
+:1055900002020202020202020202020202020202EB
+:1055A00002020202020202020202020202020202DB
+:1055B00002020202020202020202020202020202CB
+:1055C00002020202020202020202020202020202BB
+:1055D00002020202020202020202020202020202AB
+:1055E000020202020202020202020202020202029B
+:1055F000020202020202020202020202020202028B
+:10560000020202020202020202020202020202027A
+:10561000020202020202020202020202020202026A
+:10562000020202020202020202020202020202025A
+:10563000020202020202020202020202020202024A
+:10564000020202020202020202020202020202023A
+:10565000020202020202020202020202020202022A
+:10566000020202020202020202020202020202021A
+:10567000020202020202020202020202020202020A
+:1056800002020202020202020202020202020202FA
+:1056900002020202020202020202020202020202EA
+:1056A00002020202020202020202020202020202DA
+:1056B00002020202020202020202020202020202CA
+:1056C00002020202020202020202020202020202BA
+:1056D00002020202020202020202020202020202AA
+:1056E000020202020202020202020202020202029A
+:1056F000020202020202020202020202020202028A
+:105700000202020202020202020202020202020279
+:105710000202020202020202020202020202020269
+:105720000202020202020202020202020202020259
+:105730000202020202020202020202020202020249
+:105740000202020202020202020202020202020239
+:105750000202020202020202020202020202020229
+:105760000202020202020202020202020202020219
+:105770000202020202020202020202020202020209
+:1057800002020202020202020202020202020202F9
+:1057900002020202020202020202020202020202E9
+:1057A00002020202020202020202020202020202D9
+:1057B00002020202020202020202020202020202C9
+:1057C00002020202020202020202020202020202B9
+:1057D00002020202020202020202020202020202A9
+:1057E0000202020202020202020202020202020299
+:1057F000020202020202020000000000000000009B
+:105800000000000000000000000000000000000098
+:105810000000000000000000000000000000000088
+:105820000000000000000000000000000000000078
+:105830000000000000000000000000000000000068
+:105840000000000000000000000000000000000058
+:105850000000000000000000000000000000000048
+:105860000000000000000000000000000000000038
+:105870000000000000000000000000000000000028
+:105880000000000000000000000000000000000018
+:105890000000000000000000000000000000000008
+:1058A00000000000000000000000000000000000F8
+:1058B00000000000000000000000000000000000E8
+:1058C00000000000000000000000000000000000D8
+:1058D00000000000000000000000000000000000C8
+:1058E00000000000000000000000000000000000B8
+:1058F00000000000000000000000000000000000A8
+:105900000000000000000000000000000000000097
+:105910000000000000000000000000000000000087
+:105920000000000000000000000000000000000077
+:105930000000000000000000000000000000000067
+:105940000000000000000000000000000000000057
+:105950000000000000000000000000000000000047
+:105960000000000000000000000000000000000037
+:105970000000000000000000000000000000000027
+:105980000000000000000000000000000000000017
+:105990000000000000000000000000000000000007
+:1059A00000000000000000000000000000000000F7
+:1059B00000000000000000000000000000000000E7
+:1059C00000000000000000000000000000000000D7
+:1059D00000000000000000000000000000000000C7
+:1059E00000000000000000000000000000000000B7
+:1059F00000000000000000000000000000000000A7
+:105A00000000000000000000000000000000000096
+:105A10000000000000000000000000000000000086
+:105A20000000000000000000000000000000000076
+:105A30000000000000000000000000000000000066
+:105A40000000000000000000000000000000000056
+:105A50000000000000000000000000000000000046
+:105A60000000000000000000000000000000000036
+:105A70000000000000000000000000000000000026
+:105A80000000000000000000000000000000000016
+:105A90000000000000000000000000000000000006
+:105AA00000000000000000000000000000000000F6
+:105AB00000000000000000000000000000000000E6
+:105AC00000000000000000000000000000000000D6
+:105AD00000000000000000000000000000000000C6
+:105AE00000000000000000000000000000000000B6
+:105AF00000000000000000000000000000000000A6
+:105B00000000000000000000000000000000000095
+:105B10000000000000000000000000000000000085
+:105B20000000000000000000000000000000000075
+:105B30000000000000000000000000000000000065
+:105B40000000000000000000000000000000000055
+:105B50000000000000000000000000000000000045
+:105B60000000000000000000000000000000000035
+:105B70000000000000000000000000000000000025
+:105B80000000000000000000000000000000000015
+:105B90000000000000000000000000000000000005
+:105BA00000000000000000000000000000000000F5
+:105BB00000000000000000000000000000000000E5
+:105BC00000000000000000000000000000000000D5
+:105BD00000000000000000000000000000000000C5
+:105BE00000000000000000000000000000000000B5
+:105BF00000000000000000000000000000000000A5
+:105C00000000000000000000000000000000000094
+:105C10000000000000000000000000000000000084
+:105C20000000000000000000000000000000000074
+:105C30000000000000000000000000000000000064
+:105C40000000000000000000000000000000000054
+:105C50000000000000000000000000000000000044
+:105C60000000000000000000000000000000000034
+:105C70000000000000000000000000000000000024
+:105C80000000000000000000000000000000000014
+:105C90000000000000000000000000000000000004
+:105CA00000000000000000000000000000000000F4
+:105CB00000000000000000000000000000000000E4
+:105CC00000000000000000000000000000000000D4
+:105CD00000000000000000000000000000000000C4
+:105CE00000000000000000000000000000000000B4
+:105CF00000000000000000000000000000000000A4
+:105D00000000000000000000000000000000000093
+:105D10000000000000000000000000000000000083
+:105D20000000000000000000000000000000000073
+:105D30000000000000000000000000000000000063
+:105D40000000000000000000000000000000000053
+:105D50000000000000000000000000000000000043
+:105D60000000000000000000000000000000000033
+:105D70000000000000000000000000000000000023
+:105D80000000000000000000000000000000000013
+:105D90000000000000000000000000000000000003
+:105DA00000000000000000000000000000000000F3
+:105DB00000000000000000000000000000000000E3
+:105DC00000000000000000000000000000000000D3
+:105DD00000000000000000000000000000000000C3
+:105DE00000000000000000000000000000000000B3
+:105DF000000000000000006300000000000000013F
+:105E00000101010101010101010101010101010182
+:105E10000101010101010101010101010101010172
+:105E20000101010101010101010101010101010162
+:105E30000101010101010101010101010101010152
+:105E40000101010101010101010101010101010142
+:105E50000101010101010101010101010101010132
+:105E60000101010101010101010101010101010122
+:105E70000101010101010101010101010101010112
+:105E80000101010101010101010101010101010102
+:105E900001010101010101010101010101010101F2
+:105EA00001010101010101010101010101010101E2
+:105EB00001010101010101010101010101010101D2
+:105EC00001010101010101010101010101010101C2
+:105ED00001010101010101010101010101010101B2
+:105EE00001010101010101010101010101010101A2
+:105EF0000101010101010101010101010101010192
+:105F00000101010101010101010101010101010181
+:105F10000101010101010101010101010101010171
+:105F20000101010101010101010101010101010161
+:105F30000101010101010101010101010101010151
+:105F40000101010101010101010101010101010141
+:105F50000101010101010101010101010101010131
+:105F60000101010101010101010101010101010121
+:105F70000101010101010101010101010101010111
+:105F80000101010101010101010101010101010101
+:105F900001010101010101010101010101010101F1
+:105FA00001010101010101010101010101010101E1
+:105FB00001010101010101010101010101010101D1
+:105FC00001010101010101010101010101010101C1
+:105FD00001010101010101010101010101010101B1
+:105FE00001010101010101010101010101010101A1
+:105FF0000101010101010101010101010101010191
+:106000000101010101010101010101010101010180
+:106010000101010101010101010101010101010170
+:106020000101010101010101010101010101010160
+:106030000101010101010101010101010101010150
+:106040000101010101010101010101010101010140
+:106050000101010101010101010101010101010130
+:106060000101010101010101010101010101010120
+:106070000101010101010101010101010101010110
+:106080000101010101010101010101010101010100
+:1060900001010101010101010101010101010101F0
+:1060A00001010101010101010101010101010101E0
+:1060B00001010101010101010101010101010101D0
+:1060C00001010101010101010101010101010101C0
+:1060D00001010101010101010101010101010101B0
+:1060E00001010101010101010101010101010101A0
+:1060F0000101010101010101010101010101010190
+:10610000010101010101010101010101010101017F
+:10611000010101010101010101010101010101016F
+:10612000010101010101010101010101010101015F
+:10613000010101010101010101010101010101014F
+:10614000010101010101010101010101010101013F
+:10615000010101010101010101010101010101012F
+:10616000010101010101010101010101010101011F
+:10617000010101010101010101010101010101010F
+:1061800001010101010101010101010101010101FF
+:1061900001010101010101010101010101010101EF
+:1061A00001010101010101010101010101010101DF
+:1061B00001010101010101010101010101010101CF
+:1061C00001010101010101010101010101010101BF
+:1061D00001010101010101010101010101010101AF
+:1061E000010101010101010101010101010101019F
+:1061F000010101010101010101010101010101018F
+:10620000010101010101010101010101010101017E
+:10621000010101010101010101010101010101016E
+:10622000010101010101010101010101010101015E
+:10623000010101010101010101010101010101014E
+:10624000010101010101010101010101010101013E
+:10625000010101010101010101010101010101012E
+:10626000010101010101010101010101010101011E
+:10627000010101010101010101010101010101010E
+:1062800001010101010101010101010101010101FE
+:1062900001010101010101010101010101010101EE
+:1062A00001010101010101010101010101010101DE
+:1062B00001010101010101010101010101010101CE
+:1062C00001010101010101010101010101010101BE
+:1062D00001010101010101010101010101010101AE
+:1062E000010101010101010101010101010101019E
+:1062F000010101010101010101010101010101018E
+:10630000010101010101010101010101010101017D
+:10631000010101010101010101010101010101016D
+:10632000010101010101010101010101010101015D
+:10633000010101010101010101010101010101014D
+:10634000010101010101010101010101010101013D
+:10635000010101010101010101010101010101012D
+:10636000010101010101010101010101010101011D
+:10637000010101010101010101010101010101010D
+:1063800001010101010101010101010101010101FD
+:1063900001010101010101010101010101010101ED
+:1063A00001010101010101010101010101010101DD
+:1063B00001010101010101010101010101010101CD
+:1063C00001010101010101010101010101010101BD
+:1063D00001010101010101010101010101010101AD
+:1063E000010101010101010101010101010101019D
+:1063F000010101010101010101010101010101018D
+:10640000010101010101010101010101010101017C
+:10641000010101010101010101010101010101016C
+:10642000010101010101010101010101010101015C
+:10643000010101010101010101010101010101014C
+:10644000010101010101010101010101010101013C
+:10645000010101010101010101010101010101012C
+:10646000010101010101010101010101010101011C
+:10647000010101010101010101010101010101010C
+:1064800001010101010101010101010101010101FC
+:1064900001010101010101010101010101010101EC
+:1064A00001010101010101010101010101010101DC
+:1064B00001010101010101010101010101010101CC
+:1064C00001010101010101010101010101010101BC
+:1064D00001010101010101010101010101010101AC
+:1064E000010101010101010101010101010101019C
+:1064F000010101010101010101010101010101018C
+:10650000010101010101010101010101010101017B
+:10651000010101010101010101010101010101016B
+:10652000010101010101010101010101010101015B
+:10653000010101010101010101010101010101014B
+:10654000010101010101010101010101010101013B
+:10655000010101010101010101010101010101012B
+:10656000010101010101010101010101010101011B
+:10657000010101010101010101010101010101010B
+:1065800001010101010101010101010101010101FB
+:1065900001010101010101010101010101010101EB
+:1065A00001010101010101010101010101010101DB
+:1065B00001010101010101010101010101010101CB
+:1065C00001010101010101010101010101010101BB
+:1065D00001010101010101010101010101010101AB
+:1065E000010101010101010101010101010101019B
+:1065F000010101010101010101010101010101018B
+:10660000010101010101010101010101010101017A
+:10661000010101010101010101010101010101016A
+:10662000010101010101010101010101010101015A
+:10663000010101010101010101010101010101014A
+:10664000010101010101010101010101010101013A
+:10665000010101010101010101010101010101012A
+:10666000010101010101010101010101010101011A
+:10667000010101010101010101010101010101010A
+:1066800001010101010101010101010101010101FA
+:1066900001010101010101010101010101010101EA
+:1066A00001010101010101010101010101010101DA
+:1066B00001010101010101010101010101010101CA
+:1066C00001010101010101010101010101010101BA
+:1066D00001010101010101010101010101010101AA
+:1066E000010101010101010101010101010101019A
+:1066F000010101010101010101010101010101018A
+:106700000101010101010101010101010101010179
+:106710000101010101010101010101010101010169
+:106720000101010101010101010101010101010159
+:106730000101010101010101010101010101010149
+:106740000101010101010101010101010101010139
+:106750000101010101010101010101010101010129
+:106760000101010101010101010101010101010119
+:106770000101010101010101010101010101010109
+:1067800001010101010101010101010101010101F9
+:1067900001010101010101010101010101010101E9
+:1067A00001010101010101010101010101010101D9
+:1067B00001010101010101010101010101010101C9
+:1067C00001010101010101010101010101010101B9
+:1067D00001010101010101010101010101010101A9
+:1067E0000101010101010101010101010101010199
+:1067F0000101010101010101010101010101010189
+:106800000101010101010101010101010101010178
+:106810000101010101010101010101010101010168
+:106820000101010101010101010101010101010158
+:106830000101010101010101010101010101010148
+:106840000101010101010101010101010101010138
+:106850000101010101010101010101010101010128
+:106860000101010101010101010101010101010118
+:106870000101010101010101010101010101010108
+:1068800001010101010101010101010101010101F8
+:1068900001010101010101010101010101010101E8
+:1068A00001010101010101010101010101010101D8
+:1068B00001010101010101010101010101010101C8
+:1068C00001010101010101010101010101010101B8
+:1068D00001010101010101010101010101010101A8
+:1068E0000101010101010101010101010101010198
+:1068F0000101010101010101010101010101010188
+:106900000101010101010101010101010101010177
+:106910000101010101010101010101010101010167
+:106920000101010101010101010101010101010157
+:106930000101010101010101010101010101010147
+:106940000101010101010101010101010101010137
+:106950000101010101010101010101010101010127
+:106960000101010101010101010101010101010117
+:106970000101010101010101010101010101010107
+:1069800001010101010101010101010101010101F7
+:1069900001010101010101010101010101010101E7
+:1069A00001010101010101010101010101010101D7
+:1069B00001010101010101010101010101010101C7
+:1069C00001010101010101010101010101010101B7
+:1069D00001010101010101010101010101010101A7
+:1069E0000101010101010101010101010101010197
+:1069F0000101010101010101010101010101010187
+:106A00000101010101010101010101010101010176
+:106A10000101010101010101010101010101010166
+:106A20000101010101010101010101010101010156
+:106A30000101010101010101010101010101010146
+:106A40000101010101010101010101010101010136
+:106A50000101010101010101010101010101010126
+:106A60000101010101010101010101010101010116
+:106A70000101010101010101010101010101010106
+:106A800001010101010101010101010101010101F6
+:106A900001010101010101010101010101010101E6
+:106AA00001010101010101010101010101010101D6
+:106AB00001010101010101010101010101010101C6
+:106AC00001010101010101010101010101010101B6
+:106AD00001010101010101010101010101010101A6
+:106AE0000101010101010101010101010101010196
+:106AF0000101010101010101010101010101010186
+:106B00000101010101010101010101010101010175
+:106B10000101010101010101010101010101010165
+:106B20000101010101010101010101010101010155
+:106B30000101010101010101010101010101010145
+:106B40000101010101010101010101010101010135
+:106B50000101010101010101010101010101010125
+:106B60000101010101010101010101010101010115
+:106B70000101010101010101010101010101010105
+:106B800001010101010101010101010101010101F5
+:106B900001010101010101010101010101010101E5
+:106BA00001010101010101010101010101010101D5
+:106BB00001010101010101010101010101010101C5
+:106BC00001010101010101010101010101010101B5
+:106BD00001010101010101010101010101010101A5
+:106BE0000101010101010101010101010101010195
+:106BF0000101010101010101010101010101010185
+:106C00000101010101010101010101010101010174
+:106C10000101010101010101010101010101010164
+:106C20000101010101010101010101010101010154
+:106C30000101010101010101010101010101010144
+:106C40000101010101010101010101010101010134
+:106C50000101010101010101010101010101010124
+:106C60000101010101010101010101010101010114
+:106C70000101010101010101010101010101010104
+:106C800001010101010101010101010101010101F4
+:106C900001010101010101010101010101010101E4
+:106CA00001010101010101010101010101010101D4
+:106CB00001010101010101010101010101010101C4
+:106CC00001010101010101010101010101010101B4
+:106CD00001010101010101010101010101010101A4
+:106CE0000101010101010101010101010101010194
+:106CF0000101010101010101010101010101010184
+:106D00000101010101010101010101010101010173
+:106D10000101010101010101010101010101010163
+:106D20000101010101010101010101010101010153
+:106D30000101010101010101010101010101010143
+:106D40000101010101010101010101010101010133
+:106D50000101010101010101010101010101010123
+:106D60000101010101010101010101010101010113
+:106D70000101010101010101010101010101010103
+:106D800001010101010101010101010101010101F3
+:106D900001010101010101010101010101010101E3
+:106DA00001010101010101010101010101010101D3
+:106DB00001010101010101010101010101010101C3
+:106DC00001010101010101010101010101010101B3
+:106DD00001010101010101010101010101010101A3
+:106DE0000101010101010101010101010101010193
+:106DF0000101010101010101010101010101010183
+:106E00000101010101010101010101010101010172
+:106E10000101010101010101010101010101010162
+:106E20000101010101010101010101010101010152
+:106E30000101010101010101010101010101010142
+:106E40000101010101010101010101010101010132
+:106E50000101010101010101010101010101010122
+:106E60000101010101010101010101010101010112
+:106E70000101010101010101010101010101010102
+:106E800001010101010101010101010101010101F2
+:106E900001010101010101010101010101010101E2
+:106EA00001010101010101010101010101010101D2
+:106EB00001010101010101010101010101010101C2
+:106EC00001010101010101010101010101010101B2
+:106ED00001010101010101010101010101010101A2
+:106EE0000101010101010101010101010101010192
+:106EF0000101010101010101010101010101010182
+:106F00000101010101010101010101010101010171
+:106F10000101010101010101010101010101010161
+:106F20000101010101010101010101010101010151
+:106F30000101010101010101010101010101010141
+:106F40000101010101010101010101010101010131
+:106F50000101010101010101010101010101010121
+:106F60000101010101010101010101010101010111
+:106F70000101010101010101010101010101010101
+:106F800001010101010101010101010101010101F1
+:106F900001010101010101010101010101010101E1
+:106FA00001010101010101010101010101010101D1
+:106FB00001010101010101010101010101010101C1
+:106FC00001010101010101010101010101010101B1
+:106FD00001010101010101010101010101010101A1
+:106FE0000101010101010101010101010101010191
+:106FF0000101010101010101010101010101010082
+:107000000000000000000000000000000000000080
+:107010000000000000000000000000000000000070
+:107020000000000000000000000000000000000060
+:107030000000000000000000000000000000000050
+:107040000000000000000000000000000000000040
+:107050000000000000000000000000000000000030
+:107060000000000000000000000000000000000020
+:107070000000000000000000000000000000000010
+:107080000000000000000000000000000000000000
+:1070900000000000000000000000000000000000F0
+:1070A00000000000000000000000000000000000E0
+:1070B00000000000000000000000000000000000D0
+:1070C00000000000000000000000000000000000C0
+:1070D00000000000000000000000000000000000B0
+:1070E00000000000000000000000000000000000A0
+:1070F0000000000000000000000000000000000090
+:10710000000000000000000000000000000000007F
+:10711000000000000000000000000000000000006F
+:10712000000000000000000000000000000000005F
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000003F
+:10715000000000000000000000000000000000002F
+:10716000000000000000000000000000000000001F
+:10717000000000000000000000000000000000000F
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000000EF
+:1071A00000000000000000000000000000000000DF
+:1071B00000000000000000000000000000000000CF
+:1071C00000000000000000000000000000000000BF
+:1071D00000000000000000000000000000000000AF
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000008F
+:10720000000000000000000000000000000000007E
+:10721000000000000000000000000000000000006E
+:10722000000000000000000000000000000000005E
+:10723000000000000000000000000000000000004E
+:10724000000000000000000000000000000000003E
+:10725000000000000000000000000000000000002E
+:10726000000000000000000000000000000000001E
+:10727000000000000000000000000000000000000E
+:1072800000000000000000000000000000000000FE
+:1072900000000000000000000000000000000000EE
+:1072A00000000000000000000000000000000000DE
+:1072B00000000000000000000000000000000000CE
+:1072C00000000000000000000000000000000000BE
+:1072D00000000000000000000000000000000000AE
+:1072E000000000000000000000000000000000009E
+:1072F000000000000000000000000000000000008E
+:10730000000000000000000000000000000000007D
+:10731000000000000000000000000000000000006D
+:10732000000000000000000000000000000000005D
+:10733000000000000000000000000000000000004D
+:10734000000000000000000000000000000000003D
+:10735000000000000000000000000000000000002D
+:10736000000000000000000000000000000000001D
+:10737000000000000000000000000000000000000D
+:1073800000000000000000000000000000000000FD
+:1073900000000000000000000000000000000000ED
+:1073A00000000000000000000000000000000000DD
+:1073B00000000000000000000000000000000000CD
+:1073C00000000000000000000000000000000000BD
+:1073D00000000000000000000000000000000000AD
+:1073E000000000000000000000000000000000009D
+:1073F000000000000000000000000000000000008D
+:10740000000000000000000000000000000000007C
+:10741000000000000000000000000000000000006C
+:10742000000000000000000000000000000000005C
+:10743000000000000000000000000000000000004C
+:10744000000000000000000000000000000000003C
+:10745000000000000000000000000000000000002C
+:10746000000000000000000000000000000000001C
+:10747000000000000000000000000000000000000C
+:1074800000000000000000000000000000000000FC
+:1074900000000000000000000000000000000000EC
+:1074A00000000000000000000000000000000000DC
+:1074B00000000000000000000000000000000000CC
+:1074C00000000000000000000000000000000000BC
+:1074D00000000000000000000000000000000000AC
+:1074E000000000000000000000000000000000009C
+:1074F000000000000000000000000000000000008C
+:10750000000000000000000000000000000000007B
+:10751000000000000000000000000000000000006B
+:10752000000000000000000000000000000000005B
+:10753000000000000000000000000000000000004B
+:10754000000000000000000000000000000000003B
+:10755000000000000000000000000000000000002B
+:10756000000000000000000000000000000000001B
+:10757000000000000000000000000000000000000B
+:1075800000000000000000000000000000000000FB
+:1075900000000000000000000000000000000000EB
+:1075A00000000000000000000000000000000000DB
+:1075B00000000000000000000000000000000000CB
+:1075C00000000000000000000000000000000000BB
+:1075D00000000000000000000000000000000000AB
+:1075E000000000000000000000000000000000009B
+:1075F0000000000000000000000000000000000289
+:10760000020202020202020202020202020202025A
+:10761000020202020202020202020202020202024A
+:10762000020202020202020202020202020202023A
+:10763000020202020202020202020202020202022A
+:10764000020202020202020202020202020202021A
+:10765000020202020202020202020202020202020A
+:1076600002020202020202020202020202020202FA
+:1076700002020202020202020202020202020202EA
+:1076800002020202020202020202020202020202DA
+:1076900002020202020202020202020202020202CA
+:1076A00002020202020202020202020202020202BA
+:1076B00002020202020202020202020202020202AA
+:1076C000020202020202020202020202020202029A
+:1076D000020202020202020202020202020202028A
+:1076E000020202020202020202020202020202027A
+:1076F000020202020202020202020202020202026A
+:107700000202020202020202020202020202020259
+:107710000202020202020202020202020202020249
+:107720000202020202020202020202020202020239
+:107730000202020202020202020202020202020229
+:107740000202020202020202020202020202020219
+:107750000202020202020202020202020202020209
+:1077600002020202020202020202020202020202F9
+:1077700002020202020202020202020202020202E9
+:1077800002020202020202020202020202020202D9
+:1077900002020202020202020202020202020202C9
+:1077A00002020202020202020202020202020202B9
+:1077B00002020202020202020202020202020202A9
+:1077C0000202020202020202020202020202020299
+:1077D0000202020202020202020202020202020289
+:1077E0000202020202020202020202020202020279
+:1077F0000202020202020202020202020202020269
+:107800000202020202020202020202020202020258
+:107810000202020202020202020202020202020248
+:107820000202020202020202020202020202020238
+:107830000202020202020202020202020202020228
+:107840000202020202020202020202020202020218
+:107850000202020202020202020202020202020208
+:1078600002020202020202020202020202020202F8
+:1078700002020202020202020202020202020202E8
+:1078800002020202020202020202020202020202D8
+:1078900002020202020202020202020202020202C8
+:1078A00002020202020202020202020202020202B8
+:1078B00002020202020202020202020202020202A8
+:1078C0000202020202020202020202020202020298
+:1078D0000202020202020202020202020202020288
+:1078E0000202020202020202020202020202020278
+:1078F0000202020202020202020202020202020268
+:107900000202020202020202020202020202020257
+:107910000202020202020202020202020202020247
+:107920000202020202020202020202020202020237
+:107930000202020202020202020202020202020227
+:107940000202020202020202020202020202020217
+:107950000202020202020202020202020202020207
+:1079600002020202020202020202020202020202F7
+:1079700002020202020202020202020202020202E7
+:1079800002020202020202020202020202020202D7
+:1079900002020202020202020202020202020202C7
+:1079A00002020202020202020202020202020202B7
+:1079B00002020202020202020202020202020202A7
+:1079C0000202020202020202020202020202020297
+:1079D0000202020202020202020202020202020287
+:1079E0000202020202020202020202020202020277
+:1079F0000202020202020202020202020202020267
+:107A00000202020202020202020202020202020256
+:107A10000202020202020202020202020202020246
+:107A20000202020202020202020202020202020236
+:107A30000202020202020202020202020202020226
+:107A40000202020202020202020202020202020216
+:107A50000202020202020202020202020202020206
+:107A600002020202020202020202020202020202F6
+:107A700002020202020202020202020202020202E6
+:107A800002020202020202020202020202020202D6
+:107A900002020202020202020202020202020202C6
+:107AA00002020202020202020202020202020202B6
+:107AB00002020202020202020202020202020202A6
+:107AC0000202020202020202020202020202020296
+:107AD0000202020202020202020202020202020286
+:107AE0000202020202020202020202020202020276
+:107AF0000202020202020202020202020202020266
+:107B00000202020202020202020202020202020255
+:107B10000202020202020202020202020202020245
+:107B20000202020202020202020202020202020235
+:107B30000202020202020202020202020202020225
+:107B40000202020202020202020202020202020215
+:107B50000202020202020202020202020202020205
+:107B600002020202020202020202020202020202F5
+:107B700002020202020202020202020202020202E5
+:107B800002020202020202020202020202020202D5
+:107B900002020202020202020202020202020202C5
+:107BA00002020202020202020202020202020202B5
+:107BB00002020202020202020202020202020202A5
+:107BC0000202020202020202020202020202020295
+:107BD0000202020202020202020202020202020285
+:107BE0000202020202020202020202020202020275
+:107BF0000202020202020202020202020202020265
+:107C00000202020202020202020202020202020254
+:107C10000202020202020202020202020202020244
+:107C20000202020202020202020202020202020234
+:107C30000202020202020202020202020202020224
+:107C40000202020202020202020202020202020214
+:107C50000202020202020202020202020202020204
+:107C600002020202020202020202020202020202F4
+:107C700002020202020202020202020202020202E4
+:107C800002020202020202020202020202020202D4
+:107C900002020202020202020202020202020202C4
+:107CA00002020202020202020202020202020202B4
+:107CB00002020202020202020202020202020202A4
+:107CC0000202020202020202020202020202020294
+:107CD0000202020202020202020202020202020284
+:107CE0000202020202020202020202020202020274
+:107CF0000202020202020202020202020202020264
+:107D00000202020202020202020202020202020253
+:107D10000202020202020202020202020202020243
+:107D20000202020202020202020202020202020233
+:107D30000202020202020202020202020202020223
+:107D40000202020202020202020202020202020213
+:107D50000202020202020202020202020202020203
+:107D600002020202020202020202020202020202F3
+:107D700002020202020202020202020202020202E3
+:107D800002020202020202020202020202020202D3
+:107D900002020202020202020202020202020202C3
+:107DA00002020202020202020202020202020202B3
+:107DB00002020202020202020202020202020202A3
+:107DC0000202020202020202020202020202020293
+:107DD0000202020202020202020202020202020283
+:107DE0000202020202020202020202020202020273
+:107DF0000202020202020202020202020202020263
+:107E00000202020202020202020202020202020252
+:107E10000202020202020202020202020202020242
+:107E20000202020202020202020202020202020232
+:107E30000202020202020202020202020202020222
+:107E40000202020202020202020202020202020212
+:107E50000202020202020202020202020202020202
+:107E600002020202020202020202020202020202F2
+:107E700002020202020202020202020202020202E2
+:107E800002020202020202020202020202020202D2
+:107E900002020202020202020202020202020202C2
+:107EA00002020202020202020202020202020202B2
+:107EB00002020202020202020202020202020202A2
+:107EC0000202020202020202020202020202020292
+:107ED0000202020202020202020202020202020282
+:107EE0000202020202020202020202020202020272
+:107EF0000202020202020202020202020202020262
+:107F00000202020202020202020202020202020251
+:107F10000202020202020202020202020202020241
+:107F20000202020202020202020202020202020231
+:107F30000202020202020202020202020202020221
+:107F40000202020202020202020202020202020211
+:107F50000202020202020202020202020202020201
+:107F600002020202020202020202020202020202F1
+:107F700002020202020202020202020202020202E1
+:107F800002020202020202020202020202020202D1
+:107F900002020202020202020202020202020202C1
+:107FA00002020202020202020202020202020202B1
+:107FB00002020202020202020202020202020202A1
+:107FC0000202020202020202020202020202020291
+:107FD0000202020202020202020202020202020281
+:107FE0000202020202020202020202020202020271
+:107FF0000202020202020202020202020202020261
+:108000000202020202020202020202020202020250
+:108010000202020202020202020202020202020240
+:108020000202020202020202020202020202020230
+:108030000202020202020202020202020202020220
+:108040000202020202020202020202020202020210
+:108050000202020202020202020202020202020200
+:1080600002020202020202020202020202020202F0
+:1080700002020202020202020202020202020202E0
+:1080800002020202020202020202020202020202D0
+:1080900002020202020202020202020202020202C0
+:1080A00002020202020202020202020202020202B0
+:1080B00002020202020202020202020202020202A0
+:1080C0000202020202020202020202020202020290
+:1080D0000202020202020202020202020202020280
+:1080E0000202020202020202020202020202020270
+:1080F0000202020202020202020202020202020260
+:10810000020202020202020202020202020202024F
+:10811000020202020202020202020202020202023F
+:10812000020202020202020202020202020202022F
+:10813000020202020202020202020202020202021F
+:10814000020202020202020202020202020202020F
+:1081500002020202020202020202020202020202FF
+:1081600002020202020202020202020202020202EF
+:1081700002020202020202020202020202020202DF
+:1081800002020202020202020202020202020202CF
+:1081900002020202020202020202020202020202BF
+:1081A00002020202020202020202020202020202AF
+:1081B000020202020202020202020202020202029F
+:1081C000020202020202020202020202020202028F
+:1081D000020202020202020202020202020202027F
+:1081E000020202020202020202020202020202026F
+:1081F000020202020202020202020202020202025F
+:10820000020202020202020202020202020202024E
+:10821000020202020202020202020202020202023E
+:10822000020202020202020202020202020202022E
+:10823000020202020202020202020202020202021E
+:10824000020202020202020202020202020202020E
+:1082500002020202020202020202020202020202FE
+:1082600002020202020202020202020202020202EE
+:1082700002020202020202020202020202020202DE
+:1082800002020202020202020202020202020202CE
+:1082900002020202020202020202020202020202BE
+:1082A00002020202020202020202020202020202AE
+:1082B000020202020202020202020202020202029E
+:1082C000020202020202020202020202020202028E
+:1082D000020202020202020202020202020202027E
+:1082E000020202020202020202020202020202026E
+:1082F000020202020202020202020202020202025E
+:10830000020202020202020202020202020202024D
+:10831000020202020202020202020202020202023D
+:10832000020202020202020202020202020202022D
+:10833000020202020202020202020202020202021D
+:10834000020202020202020202020202020202020D
+:1083500002020202020202020202020202020202FD
+:1083600002020202020202020202020202020202ED
+:1083700002020202020202020202020202020202DD
+:1083800002020202020202020202020202020202CD
+:1083900002020202020202020202020202020202BD
+:1083A00002020202020202020202020202020202AD
+:1083B000020202020202020202020202020202029D
+:1083C000020202020202020202020202020202028D
+:1083D000020202020202020202020202020202027D
+:1083E000020202020202020202020202020202026D
+:1083F000020202020202020202020202020202025D
+:10840000020202020202020202020202020202024C
+:10841000020202020202020202020202020202023C
+:10842000020202020202020202020202020202022C
+:10843000020202020202020202020202020202021C
+:10844000020202020202020202020202020202020C
+:1084500002020202020202020202020202020202FC
+:1084600002020202020202020202020202020202EC
+:1084700002020202020202020202020202020202DC
+:1084800002020202020202020202020202020202CC
+:1084900002020202020202020202020202020202BC
+:1084A00002020202020202020202020202020202AC
+:1084B000020202020202020202020202020202029C
+:1084C000020202020202020202020202020202028C
+:1084D000020202020202020202020202020202027C
+:1084E000020202020202020202020202020202026C
+:1084F000020202020202020202020202020202025C
+:10850000020202020202020202020202020202024B
+:10851000020202020202020202020202020202023B
+:10852000020202020202020202020202020202022B
+:10853000020202020202020202020202020202021B
+:10854000020202020202020202020202020202020B
+:1085500002020202020202020202020202020202FB
+:1085600002020202020202020202020202020202EB
+:1085700002020202020202020202020202020202DB
+:1085800002020202020202020202020202020202CB
+:1085900002020202020202020202020202020202BB
+:1085A00002020202020202020202020202020202AB
+:1085B000020202020202020202020202020202029B
+:1085C000020202020202020202020202020202028B
+:1085D000020202020202020202020202020202027B
+:1085E000020202020202020202020202020202026B
+:1085F000020202020202020202020202020202025B
+:10860000020202020202020202020202020202024A
+:10861000020202020202020202020202020202023A
+:10862000020202020202020202020202020202022A
+:10863000020202020202020202020202020202021A
+:10864000020202020202020202020202020202020A
+:1086500002020202020202020202020202020202FA
+:1086600002020202020202020202020202020202EA
+:1086700002020202020202020202020202020202DA
+:1086800002020202020202020202020202020202CA
+:1086900002020202020202020202020202020202BA
+:1086A00002020202020202020202020202020202AA
+:1086B000020202020202020202020202020202029A
+:1086C000020202020202020202020202020202028A
+:1086D000020202020202020202020202020202027A
+:1086E000020202020202020202020202020202026A
+:1086F000020202020202020202020202020202025A
+:108700000202020202020202020202020202020249
+:108710000202020202020202020202020202020239
+:108720000202020202020202020202020202020229
+:108730000202020202020202020202020202020219
+:108740000202020202020202020202020202020209
+:1087500002020202020202020202020202020202F9
+:1087600002020202020202020202020202020202E9
+:1087700002020202020202020202020202020202D9
+:1087800002020202020202020202020202020202C9
+:1087900002020202020202020202020202020202B9
+:1087A00002020202020202020202020202020202A9
+:1087B0000202020202020202020202020202020299
+:1087C0000202020202020202020202020202020289
+:1087D0000202020202020202020202020202020279
+:1087E0000202020202020202020202020202020269
+:1087F000020202020202020202020202020202005B
+:108800000000000000000000000000000000000068
+:108810000000000000000000000000000000000058
+:108820000000000000000000000000000000000048
+:108830000000000000000000000000000000000038
+:108840000000000000000000000000000000000028
+:108850000000000000000000000000000000000018
+:108860000000000000000000000000000000000008
+:1088700000000000000000000000000000000000F8
+:1088800000000000000000000000000000000000E8
+:1088900000000000000000000000000000000000D8
+:1088A00000000000000000000000000000000000C8
+:1088B00000000000000000000000000000000000B8
+:1088C00000000000000000000000000000000000A8
+:1088D0000000000000000000000000000000000098
+:1088E0000000000000000000000000000000000088
+:1088F0000000000000000000000000000000000078
+:108900000000000000000000000000000000000067
+:108910000000000000000000000000000000000057
+:108920000000000000000000000000000000000047
+:108930000000000000000000000000000000000037
+:108940000000000000000000000000000000000027
+:108950000000000000000000000000000000000017
+:108960000000000000000000000000000000000007
+:1089700000000000000000000000000000000000F7
+:1089800000000000000000000000000000000000E7
+:1089900000000000000000000000000000000000D7
+:1089A00000000000000000000000000000000000C7
+:1089B00000000000000000000000000000000000B7
+:1089C00000000000000000000000000000000000A7
+:1089D0000000000000000000000000000000000097
+:1089E0000000000000000000000000000000000087
+:1089F0000000000000000000000000000000000077
+:108A00000000000000000000000000000000000066
+:108A10000000000000000000000000000000000056
+:108A20000000000000000000000000000000000046
+:108A30000000000000000000000000000000000036
+:108A40000000000000000000000000000000000026
+:108A50000000000000000000000000000000000016
+:108A60000000000000000000000000000000000006
+:108A700000000000000000000000000000000000F6
+:108A800000000000000000000000000000000000E6
+:108A900000000000000000000000000000000000D6
+:108AA00000000000000000000000000000000000C6
+:108AB00000000000000000000000000000000000B6
+:108AC00000000000000000000000000000000000A6
+:108AD0000000000000000000000000000000000096
+:108AE0000000000000000000000000000000000086
+:108AF0000000000000000000000000000000000076
+:108B00000000000000000000000000000000000065
+:108B10000000000000000000000000000000000055
+:108B20000000000000000000000000000000000045
+:108B30000000000000000000000000000000000035
+:108B40000000000000000000000000000000000025
+:108B50000000000000000000000000000000000015
+:108B60000000000000000000000000000000000005
+:108B700000000000000000000000000000000000F5
+:108B800000000000000000000000000000000000E5
+:108B900000000000000000000000000000000000D5
+:108BA00000000000000000000000000000000000C5
+:108BB00000000000000000000000000000000000B5
+:108BC00000000000000000000000000000000000A5
+:108BD0000000000000000000000000000000000095
+:108BE0000000000000000000000000000000000085
+:108BF0000000000000000000000000000000000075
+:108C00000000000000000000000000000000000064
+:108C10000000000000000000000000000000000054
+:108C20000000000000000000000000000000000044
+:108C30000000000000000000000000000000000034
+:108C40000000000000000000000000000000000024
+:108C50000000000000000000000000000000000014
+:108C60000000000000000000000000000000000004
+:108C700000000000000000000000000000000000F4
+:108C800000000000000000000000000000000000E4
+:108C900000000000000000000000000000000000D4
+:108CA00000000000000000000000000000000000C4
+:108CB00000000000000000000000000000000000B4
+:108CC00000000000000000000000000000000000A4
+:108CD0000000000000000000000000000000000094
+:108CE0000000000000000000000000000000000084
+:108CF0000000000000000000000000000000000074
+:108D00000000000000000000000000000000000063
+:108D10000000000000000000000000000000000053
+:108D20000000000000000000000000000000000043
+:108D30000000000000000000000000000000000033
+:108D40000000000000000000000000000000000023
+:108D50000000000000000000000000000000000013
+:108D60000000000000000000000000000000000003
+:108D700000000000000000000000000000000000F3
+:108D800000000000000000000000000000000000E3
+:108D900000000000000000000000000000000000D3
+:108DA00000000000000000000000000000000000C3
+:108DB00000000000000000000000000000000000B3
+:108DC00000000000000000000000000000000000A3
+:108DD0000000000000000000000000000000000093
+:108DE0000000000000000000000000000000000083
+:108DF0000000000000000000000000000000000073
+:108E00000000000000000000000000000000000062
+:108E10000000000000000000000000000000000052
+:108E20000000000000000000000000000000000042
+:108E30000000000000000000000000000000000032
+:108E40000000000000000000000000000000000022
+:108E50000000000000000000000000000000000012
+:108E60000000000000000000000000000000000002
+:108E700000000000000000000000000000000000F2
+:108E800000000000000000000000000000000000E2
+:108E900000000000000000000000000000000000D2
+:108EA00000000000000000000000000000000000C2
+:108EB00000000000000000000000000000000000B2
+:108EC00000000000000000000000000000000000A2
+:108ED0000000000000000000000000000000000092
+:108EE0000000000000000000000000000000000082
+:108EF0000000000000000000000000000000000072
+:108F00000000000000000000000000000000000061
+:108F10000000000000000000000000000000000051
+:108F20000000000000000000000000000000000041
+:108F30000000000000000000000000000000000031
+:108F40000000000000000000000000000000000021
+:108F50000000000000000000000000000000000011
+:108F60000000000000000000000000000000000001
+:108F700000000000000000000000000000000000F1
+:108F800000000000000000000000000000000000E1
+:108F900000000000000000000000000000000000D1
+:108FA00000000000000000000000000000000000C1
+:108FB00000000000000000000000000000000000B1
+:108FC00000000000000000000000000000000000A1
+:108FD0000000000000000000000000000000000091
+:108FE0000000000000000000000000000000000081
+:108FF0000000000000000000000000000000000071
+:109000000000000000000000000000000000000060
+:109010000000000000000000000000000000000050
+:109020000000000000000000000000000000000040
+:109030000000000000000000000000000000000030
+:109040000000000000000000000000000000000020
+:109050000000000000000000000000000000000010
+:109060000000000000000000000000000000000000
+:1090700000000000000000000000000000000000F0
+:1090800000000000000000000000000000000000E0
+:1090900000000000000000000000000000000000D0
+:1090A00000000000000000000000000000000000C0
+:1090B00000000000000000000000000000000000B0
+:1090C00000000000000000000000000000000000A0
+:1090D0000000000000000000000000000000000090
+:1090E0000000000000000000000000000000000080
+:1090F000000000000000000000000000000000016F
+:10910000010101010101010101010101010101014F
+:10911000010101010101010101010101010101013F
+:10912000010101010101010101010101010101012F
+:10913000010101010101010101010101010101011F
+:10914000010101010101010101010101010101010F
+:1091500001010101010101010101010101010101FF
+:1091600001010101010101010101010101010101EF
+:1091700001010101010101010101010101010101DF
+:1091800001010101010101010101010101010101CF
+:1091900001010101010101010101010101010101BF
+:1091A00001010101010101010101010101010101AF
+:1091B000010101010101010101010101010101019F
+:1091C000010101010101010101010101010101018F
+:1091D000010101010101010101010101010101017F
+:1091E000010101010101010101010101010101016F
+:1091F000010101010101010101010101010101015F
+:10920000010101010101010101010101010101014E
+:10921000010101010101010101010101010101013E
+:10922000010101010101010101010101010101012E
+:10923000010101010101010101010101010101011E
+:10924000010101010101010101010101010101010E
+:1092500001010101010101010101010101010101FE
+:1092600001010101010101010101010101010101EE
+:1092700001010101010101010101010101010101DE
+:1092800001010101010101010101010101010101CE
+:1092900001010101010101010101010101010101BE
+:1092A00001010101010101010101010101010101AE
+:1092B000010101010101010101010101010101019E
+:1092C000010101010101010101010101010101018E
+:1092D000010101010101010101010101010101017E
+:1092E000010101010101010101010101010101016E
+:1092F000010101010101010101010101010101015E
+:10930000010101010101010101010101010101014D
+:10931000010101010101010101010101010101013D
+:10932000010101010101010101010101010101012D
+:10933000010101010101010101010101010101011D
+:10934000010101010101010101010101010101010D
+:1093500001010101010101010101010101010101FD
+:1093600001010101010101010101010101010101ED
+:1093700001010101010101010101010101010101DD
+:1093800001010101010101010101010101010101CD
+:1093900001010101010101010101010101010101BD
+:1093A00001010101010101010101010101010101AD
+:1093B000010101010101010101010101010101019D
+:1093C000010101010101010101010101010101018D
+:1093D000010101010101010101010101010101017D
+:1093E000010101010101010101010101010101016D
+:1093F000010101010101010101010101010101015D
+:10940000010101010101010101010101010101014C
+:10941000010101010101010101010101010101013C
+:10942000010101010101010101010101010101012C
+:10943000010101010101010101010101010101011C
+:10944000010101010101010101010101010101010C
+:1094500001010101010101010101010101010101FC
+:1094600001010101010101010101010101010101EC
+:1094700001010101010101010101010101010101DC
+:1094800001010101010101010101010101010101CC
+:1094900001010101010101010101010101010101BC
+:1094A00001010101010101010101010101010101AC
+:1094B000010101010101010101010101010101019C
+:1094C000010101010101010101010101010101018C
+:1094D000010101010101010101010101010101017C
+:1094E000010101010101010101010101010101016C
+:1094F000010101010101010101010101010101015C
+:10950000010101010101010101010101010101014B
+:10951000010101010101010101010101010101013B
+:10952000010101010101010101010101010101012B
+:10953000010101010101010101010101010101011B
+:10954000010101010101010101010101010101010B
+:1095500001010101010101010101010101010101FB
+:1095600001010101010101010101010101010101EB
+:1095700001010101010101010101010101010101DB
+:1095800001010101010101010101010101010101CB
+:1095900001010101010101010101010101010101BB
+:1095A00001010101010101010101010101010101AB
+:1095B000010101010101010101010101010101019B
+:1095C000010101010101010101010101010101018B
+:1095D000010101010101010101010101010101017B
+:1095E000010101010101010101010101010101016B
+:1095F000010101010101010101010101010101015B
+:10960000010101010101010101010101010101014A
+:10961000010101010101010101010101010101013A
+:10962000010101010101010101010101010101012A
+:10963000010101010101010101010101010101011A
+:10964000010101010101010101010101010101010A
+:1096500001010101010101010101010101010101FA
+:1096600001010101010101010101010101010101EA
+:1096700001010101010101010101010101010101DA
+:1096800001010101010101010101010101010101CA
+:1096900001010101010101010101010101010101BA
+:1096A00001010101010101010101010101010101AA
+:1096B000010101010101010101010101010101019A
+:1096C000010101010101010101010101010101018A
+:1096D000010101010101010101010101010101017A
+:1096E000010101010101010101010101010101016A
+:1096F000010101010101010101010101010101015A
+:109700000101010101010101010101010101010149
+:109710000101010101010101010101010101010139
+:109720000101010101010101010101010101010129
+:109730000101010101010101010101010101010119
+:109740000101010101010101010101010101010109
+:1097500001010101010101010101010101010101F9
+:1097600001010101010101010101010101010101E9
+:1097700001010101010101010101010101010101D9
+:1097800001010101010101010101010101010101C9
+:1097900001010101010101010101010101010101B9
+:1097A00001010101010101010101010101010101A9
+:1097B0000101010101010101010101010101010199
+:1097C0000101010101010101010101010101010189
+:1097D0000101010101010101010101010101010179
+:1097E0000101010101010101010101010101010169
+:1097F0000101010101010101010101010101010159
+:109800000101010101010101010101010101010148
+:109810000101010101010101010101010101010138
+:109820000101010101010101010101010101010128
+:109830000101010101010101010101010101010118
+:109840000101010101010101010101010101010108
+:1098500001010101010101010101010101010101F8
+:1098600001010101010101010101010101010101E8
+:1098700001010101010101010101010101010101D8
+:1098800001010101010101010101010101010101C8
+:1098900001010101010101010101010101010101B8
+:1098A00001010101010101010101010101010101A8
+:1098B0000101010101010101010101010101010198
+:1098C0000101010101010101010101010101010188
+:1098D0000101010101010101010101010101010178
+:1098E0000101010101010101010101010101010168
+:1098F0000101010101010101010101010101010158
+:109900000101010101010101010101010101010147
+:109910000101010101010101010101010101010137
+:109920000101010101010101010101010101010127
+:109930000101010101010101010101010101010117
+:109940000101010101010101010101010101010107
+:1099500001010101010101010101010101010101F7
+:1099600001010101010101010101010101010101E7
+:1099700001010101010101010101010101010101D7
+:1099800001010101010101010101010101010101C7
+:1099900001010101010101010101010101010101B7
+:1099A00001010101010101010101010101010101A7
+:1099B0000101010101010101010101010101010197
+:1099C0000101010101010101010101010101010187
+:1099D0000101010101010101010101010101010177
+:1099E0000101010101010101010101010101010167
+:1099F0000101010101010101010101010101010157
+:109A00000101010101010101010101010101010146
+:109A10000101010101010101010101010101010136
+:109A20000101010101010101010101010101010126
+:109A30000101010101010101010101010101010116
+:109A40000101010101010101010101010101010106
+:109A500001010101010101010101010101010101F6
+:109A600001010101010101010101010101010101E6
+:109A700001010101010101010101010101010101D6
+:109A800001010101010101010101010101010101C6
+:109A900001010101010101010101010101010101B6
+:109AA00001010101010101010101010101010101A6
+:109AB0000101010101010101010101010101010196
+:109AC0000101010101010101010101010101010186
+:109AD0000101010101010101010101010101010176
+:109AE0000101010101010101010101010101010166
+:109AF0000101010101010101010101010101010156
+:109B00000101010101010101010101010101010145
+:109B10000101010101010101010101010101010135
+:109B20000101010101010101010101010101010125
+:109B30000101010101010101010101010101010115
+:109B40000101010101010101010101010101010105
+:109B500001010101010101010101010101010101F5
+:109B600001010101010101010101010101010101E5
+:109B700001010101010101010101010101010101D5
+:109B800001010101010101010101010101010101C5
+:109B900001010101010101010101010101010101B5
+:109BA00001010101010101010101010101010101A5
+:109BB0000101010101010101010101010101010195
+:109BC0000101010101010101010101010101010185
+:109BD0000101010101010101010101010101010175
+:109BE0000101010101010101010101010101010165
+:109BF0000101010101010101010101010101010155
+:109C00000101010101010101010101010101010144
+:109C10000101010101010101010101010101010134
+:109C20000101010101010101010101010101010124
+:109C30000101010101010101010101010101010114
+:109C40000101010101010101010101010101010104
+:109C500001010101010101010101010101010101F4
+:109C600001010101010101010101010101010101E4
+:109C700001010101010101010101010101010101D4
+:109C800001010101010101010101010101010101C4
+:109C900001010101010101010101010101010101B4
+:109CA00001010101010101010101010101010101A4
+:109CB0000101010101010101010101010101010194
+:109CC0000101010101010101010101010101010184
+:109CD0000101010101010101010101010101010174
+:109CE0000101010101010101010101010101010164
+:109CF0000101010101010101010101010101010154
+:109D00000101010101010101010101010101010143
+:109D10000101010101010101010101010101010133
+:109D20000101010101010101010101010101010123
+:109D30000101010101010101010101010101010113
+:109D40000101010101010101010101010101010103
+:109D500001010101010101010101010101010101F3
+:109D600001010101010101010101010101010101E3
+:109D700001010101010101010101010101010101D3
+:109D800001010101010101010101010101010101C3
+:109D900001010101010101010101010101010101B3
+:109DA00001010101010101010101010101010101A3
+:109DB0000101010101010101010101010101010193
+:109DC0000101010101010101010101010101010183
+:109DD0000101010101010101010101010101010173
+:109DE0000101010101010101010101010101010163
+:109DF0000101010101010101010101010101010153
+:109E00000101010101010101010101010101010142
+:109E10000101010101010101010101010101010132
+:109E20000101010101010101010101010101010122
+:109E30000101010101010101010101010101010112
+:109E40000101010101010101010101010101010102
+:109E500001010101010101010101010101010101F2
+:109E600001010101010101010101010101010101E2
+:109E700001010101010101010101010101010101D2
+:109E800001010101010101010101010101010101C2
+:109E900001010101010101010101010101010101B2
+:109EA00001010101010101010101010101010101A2
+:109EB0000101010101010101010101010101010192
+:109EC0000101010101010101010101010101010182
+:109ED0000101010101010101010101010101010172
+:109EE0000101010101010101010101010101010162
+:109EF0000101010101010101010101010101010152
+:109F00000101010101010101010101010101010141
+:109F10000101010101010101010101010101010131
+:109F20000101010101010101010101010101010121
+:109F30000101010101010101010101010101010111
+:109F40000101010101010101010101010101010101
+:109F500001010101010101010101010101010101F1
+:109F600001010101010101010101010101010101E1
+:109F700001010101010101010101010101010101D1
+:109F800001010101010101010101010101010101C1
+:109F900001010101010101010101010101010101B1
+:109FA00001010101010101010101010101010101A1
+:109FB0000101010101010101010101010101010191
+:109FC0000101010101010101010101010101010181
+:109FD0000101010101010101010101010101010171
+:109FE0000101010101010101010101010101010161
+:109FF0000101010101010101010101010101010151
+:10A000000101010101010101010101010101010140
+:10A010000101010101010101010101010101010130
+:10A020000101010101010101010101010101010120
+:10A030000101010101010101010101010101010110
+:10A040000101010101010101010101010101010100
+:10A0500001010101010101010101010101010101F0
+:10A0600001010101010101010101010101010101E0
+:10A0700001010101010101010101010101010101D0
+:10A0800001010101010101010101010101010101C0
+:10A0900001010101010101010101010101010101B0
+:10A0A00001010101010101010101010101010101A0
+:10A0B0000101010101010101010101010101010190
+:10A0C0000101010101010101010101010101010180
+:10A0D0000101010101010101010101010101010170
+:10A0E0000101010101010101010101010101010160
+:10A0F0000101010101010101010101010101010150
+:10A10000010101010101010101010101010101013F
+:10A11000010101010101010101010101010101012F
+:10A12000010101010101010101010101010101011F
+:10A13000010101010101010101010101010101010F
+:10A1400001010101010101010101010101010101FF
+:10A1500001010101010101010101010101010101EF
+:10A1600001010101010101010101010101010101DF
+:10A1700001010101010101010101010101010101CF
+:10A1800001010101010101010101010101010101BF
+:10A1900001010101010101010101010101010101AF
+:10A1A000010101010101010101010101010101019F
+:10A1B000010101010101010101010101010101018F
+:10A1C000010101010101010101010101010101017F
+:10A1D000010101010101010101010101010101016F
+:10A1E000010101010101010101010101010101015F
+:10A1F000010101010101010101010101010101014F
+:10A20000010101010101010101010101010101013E
+:10A21000010101010101010101010101010101012E
+:10A22000010101010101010101010101010101011E
+:10A23000010101010101010101010101010101010E
+:10A2400001010101010101010101010101010101FE
+:10A2500001010101010101010101010101010101EE
+:10A2600001010101010101010101010101010101DE
+:10A2700001010101010101010101010101010101CE
+:10A2800001010101010101010101010101010101BE
+:10A2900001010101010101010101010101010101AE
+:10A2A000010101010101010101010101010101019E
+:10A2B000010101010101010101010101010101018E
+:10A2C000010101010101010101010101010101017E
+:10A2D000010101010101010101010101010101016E
+:10A2E000010101010101010101010101010101015E
+:10A2F000010101010101010101010101010101004F
+: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
+:10A8F0000000000000000000000000000000000256
+:10A900000202020202020202020202020202020227
+:10A910000202020202020202020202020202020217
+:10A920000202020202020202020202020202020207
+:10A9300002020202020202020202020202020202F7
+:10A9400002020202020202020202020202020202E7
+:10A9500002020202020202020202020202020202D7
+:10A9600002020202020202020202020202020202C7
+:10A9700002020202020202020202020202020202B7
+:10A9800002020202020202020202020202020202A7
+:10A990000202020202020202020202020202020297
+:10A9A0000202020202020202020202020202020287
+:10A9B0000202020202020202020202020202020277
+:10A9C0000202020202020202020202020202020267
+:10A9D0000202020202020202020202020202020257
+:10A9E0000202020202020202020202020202020247
+:10A9F0000202020202020202020202020202020237
+:10AA00000202020202020202020202020202020226
+:10AA10000202020202020202020202020202020216
+:10AA20000202020202020202020202020202020206
+:10AA300002020202020202020202020202020202F6
+:10AA400002020202020202020202020202020202E6
+:10AA500002020202020202020202020202020202D6
+:10AA600002020202020202020202020202020202C6
+:10AA700002020202020202020202020202020202B6
+:10AA800002020202020202020202020202020202A6
+:10AA90000202020202020202020202020202020296
+:10AAA0000202020202020202020202020202020286
+:10AAB0000202020202020202020202020202020276
+:10AAC0000202020202020202020202020202020266
+:10AAD0000202020202020202020202020202020256
+:10AAE0000202020202020202020202020202020246
+:10AAF0000202020202020202020202020202020236
+:10AB00000202020202020202020202020202020225
+:10AB10000202020202020202020202020202020215
+:10AB20000202020202020202020202020202020205
+:10AB300002020202020202020202020202020202F5
+:10AB400002020202020202020202020202020202E5
+:10AB500002020202020202020202020202020202D5
+:10AB600002020202020202020202020202020202C5
+:10AB700002020202020202020202020202020202B5
+:10AB800002020202020202020202020202020202A5
+:10AB90000202020202020202020202020202020295
+:10ABA0000202020202020202020202020202020285
+:10ABB0000202020202020202020202020202020275
+:10ABC0000202020202020202020202020202020265
+:10ABD0000202020202020202020202020202020255
+:10ABE0000202020202020202020202020202020245
+:10ABF0000202020202020202020202020202020235
+:10AC00000202020202020202020202020202020224
+:10AC10000202020202020202020202020202020214
+:10AC20000202020202020202020202020202020204
+:10AC300002020202020202020202020202020202F4
+:10AC400002020202020202020202020202020202E4
+:10AC500002020202020202020202020202020202D4
+:10AC600002020202020202020202020202020202C4
+:10AC700002020202020202020202020202020202B4
+:10AC800002020202020202020202020202020202A4
+:10AC90000202020202020202020202020202020294
+:10ACA0000202020202020202020202020202020284
+:10ACB0000202020202020202020202020202020274
+:10ACC0000202020202020202020202020202020264
+:10ACD0000202020202020202020202020202020254
+:10ACE0000202020202020202020202020202020244
+:10ACF0000202020202020202020202020202020234
+:10AD00000202020202020202020202020202020223
+:10AD10000202020202020202020202020202020213
+:10AD20000202020202020202020202020202020203
+:10AD300002020202020202020202020202020202F3
+:10AD400002020202020202020202020202020202E3
+:10AD500002020202020202020202020202020202D3
+:10AD600002020202020202020202020202020202C3
+:10AD700002020202020202020202020202020202B3
+:10AD800002020202020202020202020202020202A3
+:10AD90000202020202020202020202020202020293
+:10ADA0000202020202020202020202020202020283
+:10ADB0000202020202020202020202020202020273
+:10ADC0000202020202020202020202020202020263
+:10ADD0000202020202020202020202020202020253
+:10ADE0000202020202020202020202020202020243
+:10ADF0000202020202020202020202020202020233
+:10AE00000202020202020202020202020202020222
+:10AE10000202020202020202020202020202020212
+:10AE20000202020202020202020202020202020202
+:10AE300002020202020202020202020202020202F2
+:10AE400002020202020202020202020202020202E2
+:10AE500002020202020202020202020202020202D2
+:10AE600002020202020202020202020202020202C2
+:10AE700002020202020202020202020202020202B2
+:10AE800002020202020202020202020202020202A2
+:10AE90000202020202020202020202020202020292
+:10AEA0000202020202020202020202020202020282
+:10AEB0000202020202020202020202020202020272
+:10AEC0000202020202020202020202020202020262
+:10AED0000202020202020202020202020202020252
+:10AEE0000202020202020202020202020202020242
+:10AEF0000202020202020202020202020202020232
+:10AF00000202020202020202020202020202020221
+:10AF10000202020202020202020202020202020211
+:10AF20000202020202020202020202020202020201
+:10AF300002020202020202020202020202020202F1
+:10AF400002020202020202020202020202020202E1
+:10AF500002020202020202020202020202020202D1
+:10AF600002020202020202020202020202020202C1
+:10AF700002020202020202020202020202020202B1
+:10AF800002020202020202020202020202020202A1
+:10AF90000202020202020202020202020202020291
+:10AFA0000202020202020202020202020202020281
+:10AFB0000202020202020202020202020202020271
+:10AFC0000202020202020202020202020202020261
+:10AFD0000202020202020202020202020202020251
+:10AFE0000202020202020202020202020202020241
+:10AFF0000202020202020202020202020202020231
+:10B000000202020202020202020202020202020220
+:10B010000202020202020202020202020202020210
+:10B020000202020202020202020202020202020200
+:10B0300002020202020202020202020202020202F0
+:10B0400002020202020202020202020202020202E0
+:10B0500002020202020202020202020202020202D0
+:10B0600002020202020202020202020202020202C0
+:10B0700002020202020202020202020202020202B0
+:10B0800002020202020202020202020202020202A0
+:10B090000202020202020202020202020202020290
+:10B0A0000202020202020202020202020202020280
+:10B0B0000202020202020202020202020202020270
+:10B0C0000202020202020202020202020202020260
+:10B0D0000202020202020202020202020202020250
+:10B0E0000202020202020202020202020202020240
+:10B0F0000202020202020202020202020202020230
+:10B10000020202020202020202020202020202021F
+:10B11000020202020202020202020202020202020F
+:10B1200002020202020202020202020202020202FF
+:10B1300002020202020202020202020202020202EF
+:10B1400002020202020202020202020202020202DF
+:10B1500002020202020202020202020202020202CF
+:10B1600002020202020202020202020202020202BF
+:10B1700002020202020202020202020202020202AF
+:10B18000020202020202020202020202020202029F
+:10B19000020202020202020202020202020202028F
+:10B1A000020202020202020202020202020202027F
+:10B1B000020202020202020202020202020202026F
+:10B1C000020202020202020202020202020202025F
+:10B1D000020202020202020202020202020202024F
+:10B1E000020202020202020202020202020202023F
+:10B1F000020202020202020202020202020202022F
+:10B20000020202020202020202020202020202021E
+:10B21000020202020202020202020202020202020E
+:10B2200002020202020202020202020202020202FE
+:10B2300002020202020202020202020202020202EE
+:10B2400002020202020202020202020202020202DE
+:10B2500002020202020202020202020202020202CE
+:10B2600002020202020202020202020202020202BE
+:10B2700002020202020202020202020202020202AE
+:10B28000020202020202020202020202020202029E
+:10B29000020202020202020202020202020202028E
+:10B2A000020202020202020202020202020202027E
+:10B2B000020202020202020202020202020202026E
+:10B2C000020202020202020202020202020202025E
+:10B2D000020202020202020202020202020202024E
+:10B2E000020202020202020202020202020202023E
+:10B2F000020202020202020202020202020202022E
+:10B30000020202020202020202020202020202021D
+:10B31000020202020202020202020202020202020D
+:10B3200002020202020202020202020202020202FD
+:10B3300002020202020202020202020202020202ED
+:10B3400002020202020202020202020202020202DD
+:10B3500002020202020202020202020202020202CD
+:10B3600002020202020202020202020202020202BD
+:10B3700002020202020202020202020202020202AD
+:10B38000020202020202020202020202020202029D
+:10B39000020202020202020202020202020202028D
+:10B3A000020202020202020202020202020202027D
+:10B3B000020202020202020202020202020202026D
+:10B3C000020202020202020202020202020202025D
+:10B3D000020202020202020202020202020202024D
+:10B3E000020202020202020202020202020202023D
+:10B3F000020202020202020202020202020202022D
+:10B40000020202020202020202020202020202021C
+:10B41000020202020202020202020202020202020C
+:10B4200002020202020202020202020202020202FC
+:10B4300002020202020202020202020202020202EC
+:10B4400002020202020202020202020202020202DC
+:10B4500002020202020202020202020202020202CC
+:10B4600002020202020202020202020202020202BC
+:10B4700002020202020202020202020202020202AC
+:10B48000020202020202020202020202020202029C
+:10B49000020202020202020202020202020202028C
+:10B4A000020202020202020202020202020202027C
+:10B4B000020202020202020202020202020202026C
+:10B4C000020202020202020202020202020202025C
+:10B4D000020202020202020202020202020202024C
+:10B4E000020202020202020202020202020202023C
+:10B4F000020202020202020202020202020202022C
+:10B50000020202020202020202020202020202021B
+:10B51000020202020202020202020202020202020B
+:10B5200002020202020202020202020202020202FB
+:10B5300002020202020202020202020202020202EB
+:10B5400002020202020202020202020202020202DB
+:10B5500002020202020202020202020202020202CB
+:10B5600002020202020202020202020202020202BB
+:10B5700002020202020202020202020202020202AB
+:10B58000020202020202020202020202020202029B
+:10B59000020202020202020202020202020202028B
+:10B5A000020202020202020202020202020202027B
+:10B5B000020202020202020202020202020202026B
+:10B5C000020202020202020202020202020202025B
+:10B5D000020202020202020202020202020202024B
+:10B5E000020202020202020202020202020202023B
+:10B5F000020202020202020202020202020202022B
+:10B60000020202020202020202020202020202021A
+:10B61000020202020202020202020202020202020A
+:10B6200002020202020202020202020202020202FA
+:10B6300002020202020202020202020202020202EA
+:10B6400002020202020202020202020202020202DA
+:10B6500002020202020202020202020202020202CA
+:10B6600002020202020202020202020202020202BA
+:10B6700002020202020202020202020202020202AA
+:10B68000020202020202020202020202020202029A
+:10B69000020202020202020202020202020202028A
+:10B6A000020202020202020202020202020202027A
+:10B6B000020202020202020202020202020202026A
+:10B6C000020202020202020202020202020202025A
+:10B6D000020202020202020202020202020202024A
+:10B6E000020202020202020202020202020202023A
+:10B6F000020202020202020202020202020202022A
+:10B700000202020202020202020202020202020219
+:10B710000202020202020202020202020202020209
+:10B7200002020202020202020202020202020202F9
+:10B7300002020202020202020202020202020202E9
+:10B7400002020202020202020202020202020202D9
+:10B7500002020202020202020202020202020202C9
+:10B7600002020202020202020202020202020202B9
+:10B7700002020202020202020202020202020202A9
+:10B780000202020202020202020202020202020299
+:10B790000202020202020202020202020202020289
+:10B7A0000202020202020202020202020202020279
+:10B7B0000202020202020202020202020202020269
+:10B7C0000202020202020202020202020202020259
+:10B7D0000202020202020202020202020202020249
+:10B7E0000202020202020202020202020202020239
+:10B7F0000202020202020202020202020202020229
+:10B800000202020202020202020202020202020218
+:10B810000202020202020202020202020202020208
+:10B8200002020202020202020202020202020202F8
+:10B8300002020202020202020202020202020202E8
+:10B8400002020202020202020202020202020202D8
+:10B8500002020202020202020202020202020202C8
+:10B8600002020202020202020202020202020202B8
+:10B8700002020202020202020202020202020202A8
+:10B880000202020202020202020202020202020298
+:10B890000202020202020202020202020202020288
+:10B8A0000202020202020202020202020202020278
+:10B8B0000202020202020202020202020202020268
+:10B8C0000202020202020202020202020202020258
+:10B8D0000202020202020202020202020202020248
+:10B8E0000202020202020202020202020202020238
+:10B8F0000202020202020202020202020202020228
+:10B900000202020202020202020202020202020217
+:10B910000202020202020202020202020202020207
+:10B9200002020202020202020202020202020202F7
+:10B9300002020202020202020202020202020202E7
+:10B9400002020202020202020202020202020202D7
+:10B9500002020202020202020202020202020202C7
+:10B9600002020202020202020202020202020202B7
+:10B9700002020202020202020202020202020202A7
+:10B980000202020202020202020202020202020297
+:10B990000202020202020202020202020202020287
+:10B9A0000202020202020202020202020202020277
+:10B9B0000202020202020202020202020202020267
+:10B9C0000202020202020202020202020202020257
+:10B9D0000202020202020202020202020202020247
+:10B9E0000202020202020202020202020202020237
+:10B9F0000202020202020202020202020202020227
+:10BA00000202020202020202020202020202020216
+:10BA10000202020202020202020202020202020206
+:10BA200002020202020202020202020202020202F6
+:10BA300002020202020202020202020202020202E6
+:10BA400002020202020202020202020202020202D6
+:10BA500002020202020202020202020202020202C6
+:10BA600002020202020202020202020202020202B6
+:10BA700002020202020202020202020202020202A6
+:10BA80000202020202020202020202020202020296
+:10BA90000202020202020202020202020202020286
+:10BAA0000202020202020202020202020202020276
+:10BAB0000202020202020202020202020202020266
+:10BAC0000202020202020202020202020202020256
+:10BAD0000202020202020202020202020202020246
+:10BAE0000202020202020202020202020202020236
+:10BAF0000202020202020202020202020202020028
+: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
+:10C0F0000000000000000000000000000000005BE5
+:10C100000000000000000001010101010101010126
+:10C11000010101010101010101010101010101010F
+:10C1200001010101010101010101010101010101FF
+:10C1300001010101010101010101010101010101EF
+:10C1400001010101010101010101010101010101DF
+:10C1500001010101010101010101010101010101CF
+:10C1600001010101010101010101010101010101BF
+:10C1700001010101010101010101010101010101AF
+:10C18000010101010101010101010101010101019F
+:10C19000010101010101010101010101010101018F
+:10C1A000010101010101010101010101010101017F
+:10C1B000010101010101010101010101010101016F
+:10C1C000010101010101010101010101010101015F
+:10C1D000010101010101010101010101010101014F
+:10C1E000010101010101010101010101010101013F
+:10C1F000010101010101010101010101010101012F
+:10C20000010101010101010101010101010101011E
+:10C21000010101010101010101010101010101010E
+:10C2200001010101010101010101010101010101FE
+:10C2300001010101010101010101010101010101EE
+:10C2400001010101010101010101010101010101DE
+:10C2500001010101010101010101010101010101CE
+:10C2600001010101010101010101010101010101BE
+:10C2700001010101010101010101010101010101AE
+:10C28000010101010101010101010101010101019E
+:10C29000010101010101010101010101010101018E
+:10C2A000010101010101010101010101010101017E
+:10C2B000010101010101010101010101010101016E
+:10C2C000010101010101010101010101010101015E
+:10C2D000010101010101010101010101010101014E
+:10C2E000010101010101010101010101010101013E
+:10C2F000010101010101010101010101010101012E
+:10C30000010101010101010101010101010101011D
+:10C31000010101010101010101010101010101010D
+:10C3200001010101010101010101010101010101FD
+:10C3300001010101010101010101010101010101ED
+:10C3400001010101010101010101010101010101DD
+:10C3500001010101010101010101010101010101CD
+:10C3600001010101010101010101010101010101BD
+:10C3700001010101010101010101010101010101AD
+:10C38000010101010101010101010101010101019D
+:10C39000010101010101010101010101010101018D
+:10C3A000010101010101010101010101010101017D
+:10C3B000010101010101010101010101010101016D
+:10C3C000010101010101010101010101010101015D
+:10C3D000010101010101010101010101010101014D
+:10C3E000010101010101010101010101010101013D
+:10C3F000010101010101010101010101010101012D
+:10C40000010101010101010101010101010101011C
+:10C41000010101010101010101010101010101010C
+:10C4200001010101010101010101010101010101FC
+:10C4300001010101010101010101010101010101EC
+:10C4400001010101010101010101010101010101DC
+:10C4500001010101010101010101010101010101CC
+:10C4600001010101010101010101010101010101BC
+:10C4700001010101010101010101010101010101AC
+:10C48000010101010101010101010101010101019C
+:10C49000010101010101010101010101010101018C
+:10C4A000010101010101010101010101010101017C
+:10C4B000010101010101010101010101010101016C
+:10C4C000010101010101010101010101010101015C
+:10C4D000010101010101010101010101010101014C
+:10C4E000010101010101010101010101010101013C
+:10C4F000010101010101010101010101010101012C
+:10C50000010101010101010101010101010101011B
+:10C51000010101010101010101010101010101010B
+:10C5200001010101010101010101010101010101FB
+:10C5300001010101010101010101010101010101EB
+:10C5400001010101010101010101010101010101DB
+:10C5500001010101010101010101010101010101CB
+:10C5600001010101010101010101010101010101BB
+:10C5700001010101010101010101010101010101AB
+:10C58000010101010101010101010101010101019B
+:10C59000010101010101010101010101010101018B
+:10C5A000010101010101010101010101010101017B
+:10C5B000010101010101010101010101010101016B
+:10C5C000010101010101010101010101010101015B
+:10C5D000010101010101010101010101010101014B
+:10C5E000010101010101010101010101010101013B
+:10C5F000010101010101010101010101010101012B
+:10C60000010101010101010101010101010101011A
+:10C61000010101010101010101010101010101010A
+:10C6200001010101010101010101010101010101FA
+:10C6300001010101010101010101010101010101EA
+:10C6400001010101010101010101010101010101DA
+:10C6500001010101010101010101010101010101CA
+:10C6600001010101010101010101010101010101BA
+:10C6700001010101010101010101010101010101AA
+:10C68000010101010101010101010101010101019A
+:10C69000010101010101010101010101010101018A
+:10C6A000010101010101010101010101010101017A
+:10C6B000010101010101010101010101010101016A
+:10C6C000010101010101010101010101010101015A
+:10C6D000010101010101010101010101010101014A
+:10C6E000010101010101010101010101010101013A
+:10C6F000010101010101010101010101010101012A
+:10C700000101010101010101010101010101010119
+:10C710000101010101010101010101010101010109
+:10C7200001010101010101010101010101010101F9
+:10C7300001010101010101010101010101010101E9
+:10C7400001010101010101010101010101010101D9
+:10C7500001010101010101010101010101010101C9
+:10C7600001010101010101010101010101010101B9
+:10C7700001010101010101010101010101010101A9
+:10C780000101010101010101010101010101010199
+:10C790000101010101010101010101010101010189
+:10C7A0000101010101010101010101010101010179
+:10C7B0000101010101010101010101010101010169
+:10C7C0000101010101010101010101010101010159
+:10C7D0000101010101010101010101010101010149
+:10C7E0000101010101010101010101010101010139
+:10C7F0000101010101010101010101010101010129
+:10C800000101010101010101010101010101010118
+:10C810000101010101010101010101010101010108
+:10C8200001010101010101010101010101010101F8
+:10C8300001010101010101010101010101010101E8
+:10C8400001010101010101010101010101010101D8
+:10C8500001010101010101010101010101010101C8
+:10C8600001010101010101010101010101010101B8
+:10C8700001010101010101010101010101010101A8
+:10C880000101010101010101010101010101010198
+:10C890000101010101010101010101010101010188
+:10C8A0000101010101010101010101010101010178
+:10C8B0000101010101010101010101010101010168
+:10C8C0000101010101010101010101010101010158
+:10C8D0000101010101010101010101010101010148
+:10C8E0000101010101010101010101010101010138
+:10C8F0000101010101010101010101010101010128
+:10C900000101010101010101010101010101010117
+:10C910000101010101010101010101010101010107
+:10C9200001010101010101010101010101010101F7
+:10C9300001010101010101010101010101010101E7
+:10C9400001010101010101010101010101010101D7
+:10C9500001010101010101010101010101010101C7
+:10C9600001010101010101010101010101010101B7
+:10C9700001010101010101010101010101010101A7
+:10C980000101010101010101010101010101010197
+:10C990000101010101010101010101010101010187
+:10C9A0000101010101010101010101010101010177
+:10C9B0000101010101010101010101010101010167
+:10C9C0000101010101010101010101010101010157
+:10C9D0000101010101010101010101010101010147
+:10C9E0000101010101010101010101010101010137
+:10C9F0000101010101010101010101010101010127
+:10CA00000101010101010101010101010101010116
+:10CA10000101010101010101010101010101010106
+:10CA200001010101010101010101010101010101F6
+:10CA300001010101010101010101010101010101E6
+:10CA400001010101010101010101010101010101D6
+:10CA500001010101010101010101010101010101C6
+:10CA600001010101010101010101010101010101B6
+:10CA700001010101010101010101010101010101A6
+:10CA80000101010101010101010101010101010196
+:10CA90000101010101010101010101010101010186
+:10CAA0000101010101010101010101010101010176
+:10CAB0000101010101010101010101010101010166
+:10CAC0000101010101010101010101010101010156
+:10CAD0000101010101010101010101010101010146
+:10CAE0000101010101010101010101010101010136
+:10CAF0000101010101010101010101010101010126
+:10CB00000101010101010101010101010101010115
+:10CB10000101010101010101010101010101010105
+:10CB200001010101010101010101010101010101F5
+:10CB300001010101010101010101010101010101E5
+:10CB400001010101010101010101010101010101D5
+:10CB500001010101010101010101010101010101C5
+:10CB600001010101010101010101010101010101B5
+:10CB700001010101010101010101010101010101A5
+:10CB80000101010101010101010101010101010195
+:10CB90000101010101010101010101010101010185
+:10CBA0000101010101010101010101010101010175
+:10CBB0000101010101010101010101010101010165
+:10CBC0000101010101010101010101010101010155
+:10CBD0000101010101010101010101010101010145
+:10CBE0000101010101010101010101010101010135
+:10CBF0000101010101010101010101010101010125
+:10CC00000101010101010101010101010101010114
+:10CC10000101010101010101010101010101010104
+:10CC200001010101010101010101010101010101F4
+:10CC300001010101010101010101010101010101E4
+:10CC400001010101010101010101010101010101D4
+:10CC500001010101010101010101010101010101C4
+:10CC600001010101010101010101010101010101B4
+:10CC700001010101010101010101010101010101A4
+:10CC80000101010101010101010101010101010194
+:10CC90000101010101010101010101010101010184
+:10CCA0000101010101010101010101010101010174
+:10CCB0000101010101010101010101010101010164
+:10CCC0000101010101010101010101010101010154
+:10CCD0000101010101010101010101010101010144
+:10CCE0000101010101010101010101010101010134
+:10CCF0000101010101010101010101010101010124
+:10CD00000101010101010101010101010101010113
+:10CD10000101010101010101010101010101010103
+:10CD200001010101010101010101010101010101F3
+:10CD300001010101010101010101010101010101E3
+:10CD400001010101010101010101010101010101D3
+:10CD500001010101010101010101010101010101C3
+:10CD600001010101010101010101010101010101B3
+:10CD700001010101010101010101010101010101A3
+:10CD80000101010101010101010101010101010193
+:10CD90000101010101010101010101010101010183
+:10CDA0000101010101010101010101010101010173
+:10CDB0000101010101010101010101010101010163
+:10CDC0000101010101010101010101010101010153
+:10CDD0000101010101010101010101010101010143
+:10CDE0000101010101010101010101010101010133
+:10CDF0000101010101010101010101010101010123
+:10CE00000101010101010101010101010101010112
+:10CE10000101010101010101010101010101010102
+:10CE200001010101010101010101010101010101F2
+:10CE300001010101010101010101010101010101E2
+:10CE400001010101010101010101010101010101D2
+:10CE500001010101010101010101010101010101C2
+:10CE600001010101010101010101010101010101B2
+:10CE700001010101010101010101010101010101A2
+:10CE80000101010101010101010101010101010192
+:10CE90000101010101010101010101010101010182
+:10CEA0000101010101010101010101010101010172
+:10CEB0000101010101010101010101010101010162
+:10CEC0000101010101010101010101010101010152
+:10CED0000101010101010101010101010101010142
+:10CEE0000101010101010101010101010101010132
+:10CEF0000101010101010101010101010101010122
+:10CF00000101010101010101010101010101010111
+:10CF10000101010101010101010101010101010101
+:10CF200001010101010101010101010101010101F1
+:10CF300001010101010101010101010101010101E1
+:10CF400001010101010101010101010101010101D1
+:10CF500001010101010101010101010101010101C1
+:10CF600001010101010101010101010101010101B1
+:10CF700001010101010101010101010101010101A1
+:10CF80000101010101010101010101010101010191
+:10CF90000101010101010101010101010101010181
+:10CFA0000101010101010101010101010101010171
+:10CFB0000101010101010101010101010101010161
+:10CFC0000101010101010101010101010101010151
+:10CFD0000101010101010101010101010101010141
+:10CFE0000101010101010101010101010101010131
+:10CFF0000101010101010101010101010101010121
+:10D000000101010101010100000000000000000019
+: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
+:10D700000000000000000002020202020202020207
+:10D7100002020202020202020202020202020202E9
+:10D7200002020202020202020202020202020202D9
+:10D7300002020202020202020202020202020202C9
+:10D7400002020202020202020202020202020202B9
+:10D7500002020202020202020202020202020202A9
+:10D760000202020202020202020202020202020299
+:10D770000202020202020202020202020202020289
+:10D780000202020202020202020202020202020279
+:10D790000202020202020202020202020202020269
+:10D7A0000202020202020202020202020202020259
+:10D7B0000202020202020202020202020202020249
+:10D7C0000202020202020202020202020202020239
+:10D7D0000202020202020202020202020202020229
+:10D7E0000202020202020202020202020202020219
+:10D7F0000202020202020202020202020202020209
+:10D8000002020202020202020202020202020202F8
+:10D8100002020202020202020202020202020202E8
+:10D8200002020202020202020202020202020202D8
+:10D8300002020202020202020202020202020202C8
+:10D8400002020202020202020202020202020202B8
+:10D8500002020202020202020202020202020202A8
+:10D860000202020202020202020202020202020298
+:10D870000202020202020202020202020202020288
+:10D880000202020202020202020202020202020278
+:10D890000202020202020202020202020202020268
+:10D8A0000202020202020202020202020202020258
+:10D8B0000202020202020202020202020202020248
+:10D8C0000202020202020202020202020202020238
+:10D8D0000202020202020202020202020202020228
+:10D8E0000202020202020202020202020202020218
+:10D8F0000202020202020202020202020202020208
+:10D9000002020202020202020202020202020202F7
+:10D9100002020202020202020202020202020202E7
+:10D9200002020202020202020202020202020202D7
+:10D9300002020202020202020202020202020202C7
+:10D9400002020202020202020202020202020202B7
+:10D9500002020202020202020202020202020202A7
+:10D960000202020202020202020202020202020297
+:10D970000202020202020202020202020202020287
+:10D980000202020202020202020202020202020277
+:10D990000202020202020202020202020202020267
+:10D9A0000202020202020202020202020202020257
+:10D9B0000202020202020202020202020202020247
+:10D9C0000202020202020202020202020202020237
+:10D9D0000202020202020202020202020202020227
+:10D9E0000202020202020202020202020202020217
+:10D9F0000202020202020202020202020202020207
+:10DA000002020202020202020202020202020202F6
+:10DA100002020202020202020202020202020202E6
+:10DA200002020202020202020202020202020202D6
+:10DA300002020202020202020202020202020202C6
+:10DA400002020202020202020202020202020202B6
+:10DA500002020202020202020202020202020202A6
+:10DA60000202020202020202020202020202020296
+:10DA70000202020202020202020202020202020286
+:10DA80000202020202020202020202020202020276
+:10DA90000202020202020202020202020202020266
+:10DAA0000202020202020202020202020202020256
+:10DAB0000202020202020202020202020202020246
+:10DAC0000202020202020202020202020202020236
+:10DAD0000202020202020202020202020202020226
+:10DAE0000202020202020202020202020202020216
+:10DAF0000202020202020202020202020202020206
+:10DB000002020202020202020202020202020202F5
+:10DB100002020202020202020202020202020202E5
+:10DB200002020202020202020202020202020202D5
+:10DB300002020202020202020202020202020202C5
+:10DB400002020202020202020202020202020202B5
+:10DB500002020202020202020202020202020202A5
+:10DB60000202020202020202020202020202020295
+:10DB70000202020202020202020202020202020285
+:10DB80000202020202020202020202020202020275
+:10DB90000202020202020202020202020202020265
+:10DBA0000202020202020202020202020202020255
+:10DBB0000202020202020202020202020202020245
+:10DBC0000202020202020202020202020202020235
+:10DBD0000202020202020202020202020202020225
+:10DBE0000202020202020202020202020202020215
+:10DBF0000202020202020202020202020202020205
+:10DC000002020202020202020202020202020202F4
+:10DC100002020202020202020202020202020202E4
+:10DC200002020202020202020202020202020202D4
+:10DC300002020202020202020202020202020202C4
+:10DC400002020202020202020202020202020202B4
+:10DC500002020202020202020202020202020202A4
+:10DC60000202020202020202020202020202020294
+:10DC70000202020202020202020202020202020284
+:10DC80000202020202020202020202020202020274
+:10DC90000202020202020202020202020202020264
+:10DCA0000202020202020202020202020202020254
+:10DCB0000202020202020202020202020202020244
+:10DCC0000202020202020202020202020202020234
+:10DCD0000202020202020202020202020202020224
+:10DCE0000202020202020202020202020202020214
+:10DCF0000202020202020202020202020202020204
+:10DD000002020202020202020202020202020202F3
+:10DD100002020202020202020202020202020202E3
+:10DD200002020202020202020202020202020202D3
+:10DD300002020202020202020202020202020202C3
+:10DD400002020202020202020202020202020202B3
+:10DD500002020202020202020202020202020202A3
+:10DD60000202020202020202020202020202020293
+:10DD70000202020202020202020202020202020283
+:10DD80000202020202020202020202020202020273
+:10DD90000202020202020202020202020202020263
+:10DDA0000202020202020202020202020202020253
+:10DDB0000202020202020202020202020202020243
+:10DDC0000202020202020202020202020202020233
+:10DDD0000202020202020202020202020202020223
+:10DDE0000202020202020202020202020202020213
+:10DDF0000202020202020202020202020202020203
+:10DE000002020202020202020202020202020202F2
+:10DE100002020202020202020202020202020202E2
+:10DE200002020202020202020202020202020202D2
+:10DE300002020202020202020202020202020202C2
+:10DE400002020202020202020202020202020202B2
+:10DE500002020202020202020202020202020202A2
+:10DE60000202020202020202020202020202020292
+:10DE70000202020202020202020202020202020282
+:10DE80000202020202020202020202020202020272
+:10DE90000202020202020202020202020202020262
+:10DEA0000202020202020202020202020202020252
+:10DEB0000202020202020202020202020202020242
+:10DEC0000202020202020202020202020202020232
+:10DED0000202020202020202020202020202020222
+:10DEE0000202020202020202020202020202020212
+:10DEF0000202020202020202020202020202020202
+:10DF000002020202020202020202020202020202F1
+:10DF100002020202020202020202020202020202E1
+:10DF200002020202020202020202020202020202D1
+:10DF300002020202020202020202020202020202C1
+:10DF400002020202020202020202020202020202B1
+:10DF500002020202020202020202020202020202A1
+:10DF60000202020202020202020202020202020291
+:10DF70000202020202020202020202020202020281
+:10DF80000202020202020202020202020202020271
+:10DF90000202020202020202020202020202020261
+:10DFA0000202020202020202020202020202020251
+:10DFB0000202020202020202020202020202020241
+:10DFC0000202020202020202020202020202020231
+:10DFD0000202020202020202020202020202020221
+:10DFE0000202020202020202020202020202020211
+:10DFF0000202020202020202020202020202020201
+:10E0000002020202020202020202020202020202F0
+:10E0100002020202020202020202020202020202E0
+:10E0200002020202020202020202020202020202D0
+:10E0300002020202020202020202020202020202C0
+:10E0400002020202020202020202020202020202B0
+:10E0500002020202020202020202020202020202A0
+:10E060000202020202020202020202020202020290
+:10E070000202020202020202020202020202020280
+:10E080000202020202020202020202020202020270
+:10E090000202020202020202020202020202020260
+:10E0A0000202020202020202020202020202020250
+:10E0B0000202020202020202020202020202020240
+:10E0C0000202020202020202020202020202020230
+:10E0D0000202020202020202020202020202020220
+:10E0E0000202020202020202020202020202020210
+:10E0F0000202020202020202020202020202020200
+:10E1000002020202020202020202020202020202EF
+:10E1100002020202020202020202020202020202DF
+:10E1200002020202020202020202020202020202CF
+:10E1300002020202020202020202020202020202BF
+:10E1400002020202020202020202020202020202AF
+:10E15000020202020202020202020202020202029F
+:10E16000020202020202020202020202020202028F
+:10E17000020202020202020202020202020202027F
+:10E18000020202020202020202020202020202026F
+:10E19000020202020202020202020202020202025F
+:10E1A000020202020202020202020202020202024F
+:10E1B000020202020202020202020202020202023F
+:10E1C000020202020202020202020202020202022F
+:10E1D000020202020202020202020202020202021F
+:10E1E000020202020202020202020202020202020F
+:10E1F00002020202020202020202020202020202FF
+:10E2000002020202020202020202020202020202EE
+:10E2100002020202020202020202020202020202DE
+:10E2200002020202020202020202020202020202CE
+:10E2300002020202020202020202020202020202BE
+:10E2400002020202020202020202020202020202AE
+:10E25000020202020202020202020202020202029E
+:10E26000020202020202020202020202020202028E
+:10E27000020202020202020202020202020202027E
+:10E28000020202020202020202020202020202026E
+:10E29000020202020202020202020202020202025E
+:10E2A000020202020202020202020202020202024E
+:10E2B000020202020202020202020202020202023E
+:10E2C000020202020202020202020202020202022E
+:10E2D000020202020202020202020202020202021E
+:10E2E000020202020202020202020202020202020E
+:10E2F00002020202020202020202020202020202FE
+:10E3000002020202020202020202020202020202ED
+:10E3100002020202020202020202020202020202DD
+:10E3200002020202020202020202020202020202CD
+:10E3300002020202020202020202020202020202BD
+:10E3400002020202020202020202020202020202AD
+:10E35000020202020202020202020202020202029D
+:10E36000020202020202020202020202020202028D
+:10E37000020202020202020202020202020202027D
+:10E38000020202020202020202020202020202026D
+:10E39000020202020202020202020202020202025D
+:10E3A000020202020202020202020202020202024D
+:10E3B000020202020202020202020202020202023D
+:10E3C000020202020202020202020202020202022D
+:10E3D000020202020202020202020202020202021D
+:10E3E000020202020202020202020202020202020D
+:10E3F00002020202020202020202020202020202FD
+:10E4000002020202020202020202020202020202EC
+:10E4100002020202020202020202020202020202DC
+:10E4200002020202020202020202020202020202CC
+:10E4300002020202020202020202020202020202BC
+:10E4400002020202020202020202020202020202AC
+:10E45000020202020202020202020202020202029C
+:10E46000020202020202020202020202020202028C
+:10E47000020202020202020202020202020202027C
+:10E48000020202020202020202020202020202026C
+:10E49000020202020202020202020202020202025C
+:10E4A000020202020202020202020202020202024C
+:10E4B000020202020202020202020202020202023C
+:10E4C000020202020202020202020202020202022C
+:10E4D000020202020202020202020202020202021C
+:10E4E000020202020202020202020202020202020C
+:10E4F00002020202020202020202020202020202FC
+:10E5000002020202020202020202020202020202EB
+:10E5100002020202020202020202020202020202DB
+:10E5200002020202020202020202020202020202CB
+:10E5300002020202020202020202020202020202BB
+:10E5400002020202020202020202020202020202AB
+:10E55000020202020202020202020202020202029B
+:10E56000020202020202020202020202020202028B
+:10E57000020202020202020202020202020202027B
+:10E58000020202020202020202020202020202026B
+:10E59000020202020202020202020202020202025B
+:10E5A000020202020202020202020202020202024B
+:10E5B000020202020202020202020202020202023B
+:10E5C000020202020202020202020202020202022B
+:10E5D000020202020202020202020202020202021B
+:10E5E000020202020202020202020202020202020B
+:10E5F00002020202020202020202020202020202FB
+:10E6000002020202020202000000000000000000FC
+:10E6100000000000000000000000000000000000FA
+:10E6200000000000000000000000000000000000EA
+:10E6300000000000000000000000000000000000DA
+:10E6400000000000000000000000000000000000CA
+:10E6500000000000000000000000000000000000BA
+:10E6600000000000000000000000000000000000AA
+:10E67000000000000000000000000000000000009A
+:10E68000000000000000000000000000000000008A
+:10E69000000000000000000000000000000000007A
+:10E6A000000000000000000000000000000000006A
+:10E6B000000000000000000000000000000000005A
+:10E6C000000000000000000000000000000000004A
+:10E6D000000000000000000000000000000000003A
+:10E6E000000000000000000000000000000000002A
+:10E6F000000000000000000000000000000000001A
+:10E700000000000000000000000000000000000009
+:10E7100000000000000000000000000000000000F9
+:10E7200000000000000000000000000000000000E9
+:10E7300000000000000000000000000000000000D9
+:10E7400000000000000000000000000000000000C9
+:10E7500000000000000000000000000000000000B9
+:10E7600000000000000000000000000000000000A9
+:10E770000000000000000000000000000000000099
+:10E780000000000000000000000000000000000089
+:10E790000000000000000000000000000000000079
+:10E7A0000000000000000000000000000000000069
+:10E7B0000000000000000000000000000000000059
+:10E7C0000000000000000000000000000000000049
+:10E7D0000000000000000000000000000000000039
+:10E7E0000000000000000000000000000000000029
+:10E7F0000000000000000000000000000000000019
+:10E800000000000000000000000000000000000008
+:10E8100000000000000000000000000000000000F8
+:10E8200000000000000000000000000000000000E8
+:10E8300000000000000000000000000000000000D8
+:10E8400000000000000000000000000000000000C8
+:10E8500000000000000000000000000000000000B8
+:10E8600000000000000000000000000000000000A8
+:10E870000000000000000000000000000000000098
+:10E880000000000000000000000000000000000088
+:10E890000000000000000000000000000000000078
+:10E8A0000000000000000000000000000000000068
+:10E8B0000000000000000000000000000000000058
+:10E8C0000000000000000000000000000000000048
+:10E8D0000000000000000000000000000000000038
+:10E8E0000000000000000000000000000000000028
+:10E8F0000000000000000000000000000000000018
+:10E900000000000000000000000000000000000007
+:10E9100000000000000000000000000000000000F7
+:10E9200000000000000000000000000000000000E7
+:10E9300000000000000000000000000000000000D7
+:10E9400000000000000000000000000000000000C7
+:10E9500000000000000000000000000000000000B7
+:10E9600000000000000000000000000000000000A7
+:10E970000000000000000000000000000000000097
+:10E980000000000000000000000000000000000087
+:10E990000000000000000000000000000000000077
+:10E9A0000000000000000000000000000000000067
+:10E9B0000000000000000000000000000000000057
+:10E9C0000000000000000000000000000000000047
+:10E9D0000000000000000000000000000000000037
+:10E9E0000000000000000000000000000000000027
+:10E9F0000000000000000000000000000000000017
+:10EA00000000000000000000000000000000000006
+:10EA100000000000000000000000000000000000F6
+:10EA200000000000000000000000000000000000E6
+:10EA300000000000000000000000000000000000D6
+:10EA400000000000000000000000000000000000C6
+:10EA500000000000000000000000000000000000B6
+:10EA600000000000000000000000000000000000A6
+:10EA70000000000000000000000000000000000096
+:10EA80000000000000000000000000000000000086
+:10EA90000000000000000000000000000000000076
+:10EAA0000000000000000000000000000000000066
+:10EAB0000000000000000000000000000000000056
+:10EAC0000000000000000000000000000000000046
+:10EAD0000000000000000000000000000000000036
+:10EAE0000000000000000000000000000000000026
+:10EAF0000000000000000000000000000000000016
+:10EB00000000000000000000000000000000000005
+:10EB100000000000000000000000000000000000F5
+:10EB200000000000000000000000000000000000E5
+:10EB300000000000000000000000000000000000D5
+:10EB400000000000000000000000000000000000C5
+:10EB500000000000000000000000000000000000B5
+:10EB600000000000000000000000000000000000A5
+:10EB70000000000000000000000000000000000095
+:10EB80000000000000000000000000000000000085
+:10EB90000000000000000000000000000000000075
+:10EBA0000000000000000000000000000000000065
+:10EBB0000000000000000000000000000000000055
+:10EBC0000000000000000000000000000000000045
+:10EBD0000000000000000000000000000000000035
+:10EBE0000000000000000000000000000000000025
+:10EBF0000000000000000000000000000000000015
+:10EC00000000000000000000000000000000000004
+:10EC100000000000000000000000000000000000F4
+:10EC200000000000000000000000000000000000E4
+:10EC300000000000000000000000000000000000D4
+:10EC400000000000000000000000000000000000C4
+:10EC500000000000000000000000000000000000B4
+:10EC600000000000000000000000000000000000A4
+:10EC70000000000000000000000000000000000094
+:10EC80000000000000000000000000000000000084
+:10EC90000000000000000000000000000000000074
+:10ECA0000000000000000000000000000000000064
+:10ECB0000000000000000000000000000000000054
+:10ECC0000000000000000000000000000000000044
+:10ECD0000000000000000000000000000000000034
+:10ECE0000000000000000000000000000000000024
+:10ECF0000000000000000000000000000000000014
+:10ED00000000000000000000000000000000000003
+:10ED100000000000000000000000000000000000F3
+:10ED200000000000000000000000000000000000E3
+:10ED300000000000000000000000000000000000D3
+:10ED400000000000000000000000000000000000C3
+:10ED500000000000000000000000000000000000B3
+:10ED600000000000000000000000000000000000A3
+:10ED70000000000000000000000000000000000093
+:10ED80000000000000000000000000000000000083
+:10ED90000000000000000000000000000000000073
+:10EDA0000000000000000000000000000000000063
+:10EDB0000000000000000000000000000000000053
+:10EDC0000000000000000000000000000000000043
+:10EDD0000000000000000000000000000000000033
+:10EDE0000000000000000000000000000000000023
+:10EDF0000000000000000000000000000000000013
+:10EE00000000000000000000000000000000000002
+:10EE100000000000000000000000000000000000F2
+:10EE200000000000000000000000000000000000E2
+:10EE300000000000000000000000000000000000D2
+:10EE400000000000000000000000000000000000C2
+:10EE500000000000000000000000000000000000B2
+:10EE600000000000000000000000000000000000A2
+:10EE70000000000000000000000000000000000092
+:10EE80000000000000000000000000000000000082
+:10EE90000000000000000000000000000000000072
+:10EEA0000000000000000000000000000000000062
+:10EEB0000000000000000000000000000000000052
+:10EEC0000000000000000000000000000000000042
+:10EED0000000000000000000000000000000000032
+:10EEE0000000000000000000000000000000000022
+:10EEF0000000000000000000000000000000000012
+:10EF00000000000000000000000000000000000001
+:10EF100000000000000000000000000000000000F1
+:10EF200000000000000000000000000000000000E1
+:10EF300000000000000000000000000000000000D1
+:10EF400000000000000000000000000000000000C1
+:10EF500000000000000000000000000000000000B1
+:10EF600000000000000000000000000000000000A1
+:10EF70000000000000000000000000000000000091
+:10EF80000000000000000000000000000000000081
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB0000000000000000000000000000000000051
+:10EFC0000000000000000000000000000000000041
+:10EFD0000000000000000000000000000000000031
+:10EFE0000000000000000000000000000000000021
+:10EFF0000000000000000000000000000000000011
+:10F0000000000000000000010101010101010101F7
+:10F0100001010101010101010101010101010101E0
+:10F0200001010101010101010101010101010101D0
+:10F0300001010101010101010101010101010101C0
+:10F0400001010101010101010101010101010101B0
+:10F0500001010101010101010101010101010101A0
+:10F060000101010101010101010101010101010190
+:10F070000101010101010101010101010101010180
+:10F080000101010101010101010101010101010170
+:10F090000101010101010101010101010101010160
+:10F0A0000101010101010101010101010101010150
+:10F0B0000101010101010101010101010101010140
+:10F0C0000101010101010101010101010101010130
+:10F0D0000101010101010101010101010101010120
+:10F0E0000101010101010101010101010101010110
+:10F0F0000101010101010101010101010101010100
+:10F1000001010101010101010101010101010101EF
+:10F1100001010101010101010101010101010101DF
+:10F1200001010101010101010101010101010101CF
+:10F1300001010101010101010101010101010101BF
+:10F1400001010101010101010101010101010101AF
+:10F15000010101010101010101010101010101019F
+:10F16000010101010101010101010101010101018F
+:10F17000010101010101010101010101010101017F
+:10F18000010101010101010101010101010101016F
+:10F19000010101010101010101010101010101015F
+:10F1A000010101010101010101010101010101014F
+:10F1B000010101010101010101010101010101013F
+:10F1C000010101010101010101010101010101012F
+:10F1D000010101010101010101010101010101011F
+:10F1E000010101010101010101010101010101010F
+:10F1F00001010101010101010101010101010101FF
+:10F2000001010101010101010101010101010101EE
+:10F2100001010101010101010101010101010101DE
+:10F2200001010101010101010101010101010101CE
+:10F2300001010101010101010101010101010101BE
+:10F2400001010101010101010101010101010101AE
+:10F25000010101010101010101010101010101019E
+:10F26000010101010101010101010101010101018E
+:10F27000010101010101010101010101010101017E
+:10F28000010101010101010101010101010101016E
+:10F29000010101010101010101010101010101015E
+:10F2A000010101010101010101010101010101014E
+:10F2B000010101010101010101010101010101013E
+:10F2C000010101010101010101010101010101012E
+:10F2D000010101010101010101010101010101011E
+:10F2E000010101010101010101010101010101010E
+:10F2F00001010101010101010101010101010101FE
+:10F3000001010101010101010101010101010101ED
+:10F3100001010101010101010101010101010101DD
+:10F3200001010101010101010101010101010101CD
+:10F3300001010101010101010101010101010101BD
+:10F3400001010101010101010101010101010101AD
+:10F35000010101010101010101010101010101019D
+:10F36000010101010101010101010101010101018D
+:10F37000010101010101010101010101010101017D
+:10F38000010101010101010101010101010101016D
+:10F39000010101010101010101010101010101015D
+:10F3A000010101010101010101010101010101014D
+:10F3B000010101010101010101010101010101013D
+:10F3C000010101010101010101010101010101012D
+:10F3D000010101010101010101010101010101011D
+:10F3E000010101010101010101010101010101010D
+:10F3F00001010101010101010101010101010101FD
+:10F4000001010101010101010101010101010101EC
+:10F4100001010101010101010101010101010101DC
+:10F4200001010101010101010101010101010101CC
+:10F4300001010101010101010101010101010101BC
+:10F4400001010101010101010101010101010101AC
+:10F45000010101010101010101010101010101019C
+:10F46000010101010101010101010101010101018C
+:10F47000010101010101010101010101010101017C
+:10F48000010101010101010101010101010101016C
+:10F49000010101010101010101010101010101015C
+:10F4A000010101010101010101010101010101014C
+:10F4B000010101010101010101010101010101013C
+:10F4C000010101010101010101010101010101012C
+:10F4D000010101010101010101010101010101011C
+:10F4E000010101010101010101010101010101010C
+:10F4F00001010101010101010101010101010101FC
+:10F5000001010101010101010101010101010101EB
+:10F5100001010101010101010101010101010101DB
+:10F5200001010101010101010101010101010101CB
+:10F5300001010101010101010101010101010101BB
+:10F5400001010101010101010101010101010101AB
+:10F55000010101010101010101010101010101019B
+:10F56000010101010101010101010101010101018B
+:10F57000010101010101010101010101010101017B
+:10F58000010101010101010101010101010101016B
+:10F59000010101010101010101010101010101015B
+:10F5A000010101010101010101010101010101014B
+:10F5B000010101010101010101010101010101013B
+:10F5C000010101010101010101010101010101012B
+:10F5D000010101010101010101010101010101011B
+:10F5E000010101010101010101010101010101010B
+:10F5F00001010101010101010101010101010101FB
+:10F6000001010101010101010101010101010101EA
+:10F6100001010101010101010101010101010101DA
+:10F6200001010101010101010101010101010101CA
+:10F6300001010101010101010101010101010101BA
+:10F6400001010101010101010101010101010101AA
+:10F65000010101010101010101010101010101019A
+:10F66000010101010101010101010101010101018A
+:10F67000010101010101010101010101010101017A
+:10F68000010101010101010101010101010101016A
+:10F69000010101010101010101010101010101015A
+:10F6A000010101010101010101010101010101014A
+:10F6B000010101010101010101010101010101013A
+:10F6C000010101010101010101010101010101012A
+:10F6D000010101010101010101010101010101011A
+:10F6E000010101010101010101010101010101010A
+:10F6F00001010101010101010101010101010101FA
+:10F7000001010101010101010101010101010101E9
+:10F7100001010101010101010101010101010101D9
+:10F7200001010101010101010101010101010101C9
+:10F7300001010101010101010101010101010101B9
+:10F7400001010101010101010101010101010101A9
+:10F750000101010101010101010101010101010199
+:10F760000101010101010101010101010101010189
+:10F770000101010101010101010101010101010179
+:10F780000101010101010101010101010101010169
+:10F790000101010101010101010101010101010159
+:10F7A0000101010101010101010101010101010149
+:10F7B0000101010101010101010101010101010139
+:10F7C0000101010101010101010101010101010129
+:10F7D0000101010101010101010101010101010119
+:10F7E0000101010101010101010101010101010109
+:10F7F00001010101010101010101010101010101F9
+:10F8000001010101010101010101010101010101E8
+:10F8100001010101010101010101010101010101D8
+:10F8200001010101010101010101010101010101C8
+:10F8300001010101010101010101010101010101B8
+:10F8400001010101010101010101010101010101A8
+:10F850000101010101010101010101010101010198
+:10F860000101010101010101010101010101010188
+:10F870000101010101010101010101010101010178
+:10F880000101010101010101010101010101010168
+:10F890000101010101010101010101010101010158
+:10F8A0000101010101010101010101010101010148
+:10F8B0000101010101010101010101010101010138
+:10F8C0000101010101010101010101010101010128
+:10F8D0000101010101010101010101010101010118
+:10F8E0000101010101010101010101010101010108
+:10F8F00001010101010101010101010101010101F8
+:10F9000001010101010101010101010101010101E7
+:10F9100001010101010101010101010101010101D7
+:10F9200001010101010101010101010101010101C7
+:10F9300001010101010101010101010101010101B7
+:10F9400001010101010101010101010101010101A7
+:10F950000101010101010101010101010101010197
+:10F960000101010101010101010101010101010187
+:10F970000101010101010101010101010101010177
+:10F980000101010101010101010101010101010167
+:10F990000101010101010101010101010101010157
+:10F9A0000101010101010101010101010101010147
+:10F9B0000101010101010101010101010101010137
+:10F9C0000101010101010101010101010101010127
+:10F9D0000101010101010101010101010101010117
+:10F9E0000101010101010101010101010101010107
+:10F9F00001010101010101010101010101010101F7
+:10FA000001010101010101010101010101010101E6
+:10FA100001010101010101010101010101010101D6
+:10FA200001010101010101010101010101010101C6
+:10FA300001010101010101010101010101010101B6
+:10FA400001010101010101010101010101010101A6
+:10FA50000101010101010101010101010101010196
+:10FA60000101010101010101010101010101010186
+:10FA70000101010101010101010101010101010176
+:10FA80000101010101010101010101010101010166
+:10FA90000101010101010101010101010101010156
+:10FAA0000101010101010101010101010101010146
+:10FAB0000101010101010101010101010101010136
+:10FAC0000101010101010101010101010101010126
+:10FAD0000101010101010101010101010101010116
+:10FAE0000101010101010101010101010101010106
+:10FAF00001010101010101010101010101010101F6
+:10FB000001010101010101010101010101010101E5
+:10FB100001010101010101010101010101010101D5
+:10FB200001010101010101010101010101010101C5
+:10FB300001010101010101010101010101010101B5
+:10FB400001010101010101010101010101010101A5
+:10FB50000101010101010101010101010101010195
+:10FB60000101010101010101010101010101010185
+:10FB70000101010101010101010101010101010175
+:10FB80000101010101010101010101010101010165
+:10FB90000101010101010101010101010101010155
+:10FBA0000101010101010101010101010101010145
+:10FBB0000101010101010101010101010101010135
+:10FBC0000101010101010101010101010101010125
+:10FBD0000101010101010101010101010101010115
+:10FBE0000101010101010101010101010101010105
+:10FBF00001010101010101010101010101010101F5
+:10FC000001010101010101010101010101010101E4
+:10FC100001010101010101010101010101010101D4
+:10FC200001010101010101010101010101010101C4
+:10FC300001010101010101010101010101010101B4
+:10FC400001010101010101010101010101010101A4
+:10FC50000101010101010101010101010101010194
+:10FC60000101010101010101010101010101010184
+:10FC70000101010101010101010101010101010174
+:10FC80000101010101010101010101010101010164
+:10FC90000101010101010101010101010101010154
+:10FCA0000101010101010101010101010101010144
+:10FCB0000101010101010101010101010101010134
+:10FCC0000101010101010101010101010101010124
+:10FCD0000101010101010101010101010101010114
+:10FCE0000101010101010101010101010101010104
+:10FCF00001010101010101010101010101010101F4
+:10FD000001010101010101010101010101010101E3
+:10FD100001010101010101010101010101010101D3
+:10FD200001010101010101010101010101010101C3
+:10FD300001010101010101010101010101010101B3
+:10FD400001010101010101010101010101010101A3
+:10FD50000101010101010101010101010101010193
+:10FD60000101010101010101010101010101010183
+:10FD70000101010101010101010101010101010173
+:10FD80000101010101010101010101010101010163
+:10FD90000101010101010101010101010101010153
+:10FDA0000101010101010101010101010101010143
+:10FDB0000101010101010101010101010101010133
+:10FDC0000101010101010101010101010101010123
+:10FDD0000101010101010101010101010101010113
+:10FDE0000101010101010101010101010101010103
+:10FDF00001010101010101010101010101010101F3
+:10FE000001010101010101010101010101010101E2
+:10FE100001010101010101010101010101010101D2
+:10FE200001010101010101010101010101010101C2
+:10FE300001010101010101010101010101010101B2
+:10FE400001010101010101010101010101010101A2
+:10FE50000101010101010101010101010101010192
+:10FE60000101010101010101010101010101010182
+:10FE70000101010101010101010101010101010172
+:10FE80000101010101010101010101010101010162
+:10FE90000101010101010101010101010101010152
+:10FEA0000101010101010101010101010101010142
+:10FEB0000101010101010101010101010101010132
+:10FEC0000101010101010101010101010101010122
+:10FED0000101010101010101010101010101010112
+:10FEE0000101010101010101010101010101010102
+:10FEF00001010101010101010101010101010101F2
+:10FF000001010101010101000000000000000000EA
+:10FF100000000000000000000000000000000000E1
+:10FF200000000000000000000000000000000000D1
+:10FF300000000000000000000000000000000000C1
+:10FF400000000000000000000000000000000000B1
+:10FF500000000000000000000000000000000000A1
+:10FF60000000000000000000000000000000000091
+:10FF70000000000000000000000000000000000081
+:10FF80000000000000000000000000000000000071
+:10FF90000000000000000000000000000000000061
+:10FFA0000000000000000000000000000000000051
+:10FFB0000000000000000000000000000000000041
+:10FFC0000000000000000000000000000000000031
+:10FFD0000000000000000000000000000000000021
+:10FFE0000000000000000000000000000000000011
+:10FFF0000000000000000000000000000000000001
+:020000023000CC
+:1000000000000000000000000000000000000000F0
+:1000100000000000000000000000000000000000E0
+:1000200000000000000000000000000000000000D0
+:1000300000000000000000000000000000000000C0
+:1000400000000000000000000000000000000000B0
+:1000500000000000000000000000000000000000A0
+:100060000000000000000000000000000000000090
+:100070000000000000000000000000000000000080
+:100080000000000000000000000000000000000070
+:100090000000000000000000000000000000000060
+:1000A0000000000000000000000000000000000050
+:1000B0000000000000000000000000000000000040
+:1000C0000000000000000000000000000000000030
+:1000D0000000000000000000000000000000000020
+:1000E0000000000000000000000000000000000010
+:1000F0000000000000000000000000000000000000
+:1001000000000000000000000000000000000000EF
+:1001100000000000000000000000000000000000DF
+:1001200000000000000000000000000000000000CF
+:1001300000000000000000000000000000000000BF
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000000000000000000000000000008F
+:10017000000000000000000000000000000000007F
+:10018000000000000000000000000000000000006F
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C000000000000000000000000000000000002F
+:1001D000000000000000000000000000000000001F
+:1001E000000000000000000000000000000000000F
+:1001F00000000000000000000000000000000000FF
+:1002000000000000000000000000000000000000EE
+:1002100000000000000000000000000000000000DE
+:1002200000000000000000000000000000000000CE
+:1002300000000000000000000000000000000000BE
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:10028000000000000000000000000000000000006E
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E000000000000000000000000000000000000E
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000000000000000000000BD
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:10038000000000000000000000000000000000006D
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E000000000000000000000000000000000000D
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000000007C
+:10048000000000000000000000000000000000006C
+:10049000000000000000000000000000000000005C
+:1004A000000000000000000000000000000000004C
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000000000000000000002C
+:1004D000000000000000000000000000000000001C
+:1004E000000000000000000000000000000000000C
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000020202020202020202D8
+:1006100002020202020202020202020202020202BA
+:1006200002020202020202020202020202020202AA
+:10063000020202020202020202020202020202029A
+:10064000020202020202020202020202020202028A
+:10065000020202020202020202020202020202027A
+:10066000020202020202020202020202020202026A
+:10067000020202020202020202020202020202025A
+:10068000020202020202020202020202020202024A
+:10069000020202020202020202020202020202023A
+:1006A000020202020202020202020202020202022A
+:1006B000020202020202020202020202020202021A
+:1006C000020202020202020202020202020202020A
+:1006D00002020202020202020202020202020202FA
+:1006E00002020202020202020202020202020202EA
+:1006F00002020202020202020202020202020202DA
+:1007000002020202020202020202020202020202C9
+:1007100002020202020202020202020202020202B9
+:1007200002020202020202020202020202020202A9
+:100730000202020202020202020202020202020299
+:100740000202020202020202020202020202020289
+:100750000202020202020202020202020202020279
+:100760000202020202020202020202020202020269
+:100770000202020202020202020202020202020259
+:100780000202020202020202020202020202020249
+:100790000202020202020202020202020202020239
+:1007A0000202020202020202020202020202020229
+:1007B0000202020202020202020202020202020219
+:1007C0000202020202020202020202020202020209
+:1007D00002020202020202020202020202020202F9
+:1007E00002020202020202020202020202020202E9
+:1007F00002020202020202020202020202020202D9
+:1008000002020202020202020202020202020202C8
+:1008100002020202020202020202020202020202B8
+:1008200002020202020202020202020202020202A8
+:100830000202020202020202020202020202020298
+:100840000202020202020202020202020202020288
+:100850000202020202020202020202020202020278
+:100860000202020202020202020202020202020268
+:100870000202020202020202020202020202020258
+:100880000202020202020202020202020202020248
+:100890000202020202020202020202020202020238
+:1008A0000202020202020202020202020202020228
+:1008B0000202020202020202020202020202020218
+:1008C0000202020202020202020202020202020208
+:1008D00002020202020202020202020202020202F8
+:1008E00002020202020202020202020202020202E8
+:1008F00002020202020202020202020202020202D8
+:1009000002020202020202020202020202020202C7
+:1009100002020202020202020202020202020202B7
+:1009200002020202020202020202020202020202A7
+:100930000202020202020202020202020202020297
+:100940000202020202020202020202020202020287
+:100950000202020202020202020202020202020277
+:100960000202020202020202020202020202020267
+:100970000202020202020202020202020202020257
+:100980000202020202020202020202020202020247
+:100990000202020202020202020202020202020237
+:1009A0000202020202020202020202020202020227
+:1009B0000202020202020202020202020202020217
+:1009C0000202020202020202020202020202020207
+:1009D00002020202020202020202020202020202F7
+:1009E00002020202020202020202020202020202E7
+:1009F00002020202020202020202020202020202D7
+:100A000002020202020202020202020202020202C6
+:100A100002020202020202020202020202020202B6
+:100A200002020202020202020202020202020202A6
+:100A30000202020202020202020202020202020296
+:100A40000202020202020202020202020202020286
+:100A50000202020202020202020202020202020276
+:100A60000202020202020202020202020202020266
+:100A70000202020202020202020202020202020256
+:100A80000202020202020202020202020202020246
+:100A90000202020202020202020202020202020236
+:100AA0000202020202020202020202020202020226
+:100AB0000202020202020202020202020202020216
+:100AC0000202020202020202020202020202020206
+:100AD00002020202020202020202020202020202F6
+:100AE00002020202020202020202020202020202E6
+:100AF00002020202020202020202020202020202D6
+:100B000002020202020202020202020202020202C5
+:100B100002020202020202020202020202020202B5
+:100B200002020202020202020202020202020202A5
+:100B30000202020202020202020202020202020295
+:100B40000202020202020202020202020202020285
+:100B50000202020202020202020202020202020275
+:100B60000202020202020202020202020202020265
+:100B70000202020202020202020202020202020255
+:100B80000202020202020202020202020202020245
+:100B90000202020202020202020202020202020235
+:100BA0000202020202020202020202020202020225
+:100BB0000202020202020202020202020202020215
+:100BC0000202020202020202020202020202020205
+:100BD00002020202020202020202020202020202F5
+:100BE00002020202020202020202020202020202E5
+:100BF00002020202020202020202020202020202D5
+:100C000002020202020202020202020202020202C4
+:100C100002020202020202020202020202020202B4
+:100C200002020202020202020202020202020202A4
+:100C30000202020202020202020202020202020294
+:100C40000202020202020202020202020202020284
+:100C50000202020202020202020202020202020274
+:100C60000202020202020202020202020202020264
+:100C70000202020202020202020202020202020254
+:100C80000202020202020202020202020202020244
+:100C90000202020202020202020202020202020234
+:100CA0000202020202020202020202020202020224
+:100CB0000202020202020202020202020202020214
+:100CC0000202020202020202020202020202020204
+:100CD00002020202020202020202020202020202F4
+:100CE00002020202020202020202020202020202E4
+:100CF00002020202020202020202020202020202D4
+:100D000002020202020202020202020202020202C3
+:100D100002020202020202020202020202020202B3
+:100D200002020202020202020202020202020202A3
+:100D30000202020202020202020202020202020293
+:100D40000202020202020202020202020202020283
+:100D50000202020202020202020202020202020273
+:100D60000202020202020202020202020202020263
+:100D70000202020202020202020202020202020253
+:100D80000202020202020202020202020202020243
+:100D90000202020202020202020202020202020233
+:100DA0000202020202020202020202020202020223
+:100DB0000202020202020202020202020202020213
+:100DC0000202020202020202020202020202020203
+:100DD00002020202020202020202020202020202F3
+:100DE00002020202020202020202020202020202E3
+:100DF00002020202020202020202020202020202D3
+:100E000002020202020202020202020202020202C2
+:100E100002020202020202020202020202020202B2
+:100E200002020202020202020202020202020202A2
+:100E30000202020202020202020202020202020292
+:100E40000202020202020202020202020202020282
+:100E50000202020202020202020202020202020272
+:100E60000202020202020202020202020202020262
+:100E70000202020202020202020202020202020252
+:100E80000202020202020202020202020202020242
+:100E90000202020202020202020202020202020232
+:100EA0000202020202020202020202020202020222
+:100EB0000202020202020202020202020202020212
+:100EC0000202020202020202020202020202020202
+:100ED00002020202020202020202020202020202F2
+:100EE00002020202020202020202020202020202E2
+:100EF00002020202020202020202020202020202D2
+:100F000002020202020202020202020202020202C1
+:100F100002020202020202020202020202020202B1
+:100F200002020202020202020202020202020202A1
+:100F30000202020202020202020202020202020291
+:100F40000202020202020202020202020202020281
+:100F50000202020202020202020202020202020271
+:100F60000202020202020202020202020202020261
+:100F70000202020202020202020202020202020251
+:100F80000202020202020202020202020202020241
+:100F90000202020202020202020202020202020231
+:100FA0000202020202020202020202020202020221
+:100FB0000202020202020202020202020202020211
+:100FC0000202020202020202020202020202020201
+:100FD00002020202020202020202020202020202F1
+:100FE00002020202020202020202020202020202E1
+:100FF00002020202020202020202020202020202D1
+:1010000002020202020202020202020202020202C0
+:1010100002020202020202020202020202020202B0
+:1010200002020202020202020202020202020202A0
+:101030000202020202020202020202020202020290
+:101040000202020202020202020202020202020280
+:101050000202020202020202020202020202020270
+:101060000202020202020202020202020202020260
+:101070000202020202020202020202020202020250
+:101080000202020202020202020202020202020240
+:101090000202020202020202020202020202020230
+:1010A0000202020202020202020202020202020220
+:1010B0000202020202020202020202020202020210
+:1010C0000202020202020202020202020202020200
+:1010D00002020202020202020202020202020202F0
+:1010E00002020202020202020202020202020202E0
+:1010F00002020202020202020202020202020202D0
+:1011000002020202020202020202020202020202BF
+:1011100002020202020202020202020202020202AF
+:10112000020202020202020202020202020202029F
+:10113000020202020202020202020202020202028F
+:10114000020202020202020202020202020202027F
+:10115000020202020202020202020202020202026F
+:10116000020202020202020202020202020202025F
+:10117000020202020202020202020202020202024F
+:10118000020202020202020202020202020202023F
+:10119000020202020202020202020202020202022F
+:1011A000020202020202020202020202020202021F
+:1011B000020202020202020202020202020202020F
+:1011C00002020202020202020202020202020202FF
+:1011D00002020202020202020202020202020202EF
+:1011E00002020202020202020202020202020202DF
+:1011F00002020202020202020202020202020202CF
+:1012000002020202020202020202020202020202BE
+:1012100002020202020202020202020202020202AE
+:10122000020202020202020202020202020202029E
+:10123000020202020202020202020202020202028E
+:10124000020202020202020202020202020202027E
+:10125000020202020202020202020202020202026E
+:10126000020202020202020202020202020202025E
+:10127000020202020202020202020202020202024E
+:10128000020202020202020202020202020202023E
+:10129000020202020202020202020202020202022E
+:1012A000020202020202020202020202020202021E
+:1012B000020202020202020202020202020202020E
+:1012C00002020202020202020202020202020202FE
+:1012D00002020202020202020202020202020202EE
+:1012E00002020202020202020202020202020202DE
+:1012F00002020202020202020202020202020202CE
+:1013000002020202020202020202020202020202BD
+:1013100002020202020202020202020202020202AD
+:10132000020202020202020202020202020202029D
+:10133000020202020202020202020202020202028D
+:10134000020202020202020202020202020202027D
+:10135000020202020202020202020202020202026D
+:10136000020202020202020202020202020202025D
+:10137000020202020202020202020202020202024D
+:10138000020202020202020202020202020202023D
+:10139000020202020202020202020202020202022D
+:1013A000020202020202020202020202020202021D
+:1013B000020202020202020202020202020202020D
+:1013C00002020202020202020202020202020202FD
+:1013D00002020202020202020202020202020202ED
+:1013E00002020202020202020202020202020202DD
+:1013F00002020202020202020202020202020202CD
+:1014000002020202020202020202020202020202BC
+:1014100002020202020202020202020202020202AC
+:10142000020202020202020202020202020202029C
+:10143000020202020202020202020202020202028C
+:10144000020202020202020202020202020202027C
+:10145000020202020202020202020202020202026C
+:10146000020202020202020202020202020202025C
+:10147000020202020202020202020202020202024C
+:10148000020202020202020202020202020202023C
+:10149000020202020202020202020202020202022C
+:1014A000020202020202020202020202020202021C
+:1014B000020202020202020202020202020202020C
+:1014C00002020202020202020202020202020202FC
+:1014D00002020202020202020202020202020202EC
+:1014E00002020202020202020202020202020202DC
+:1014F00002020202020202020202020202020202CC
+:1015000002020202020202000000000000000000CD
+:1015100000000000000000000000000000000000CB
+:1015200000000000000000000000000000000000BB
+:1015300000000000000000000000000000000000AB
+:10154000000000000000000000000000000000009B
+:10155000000000000000000000000000000000008B
+:10156000000000000000000000000000000000007B
+:10157000000000000000000000000000000000006B
+:10158000000000000000000000000000000000005B
+:10159000000000000000000000000000000000004B
+:1015A000000000000000000000000000000000003B
+:1015B000000000000000000000000000000000002B
+:1015C000000000000000000000000000000000001B
+:1015D000000000000000000000000000000000000B
+:1015E00000000000000000000000000000000000FB
+:1015F00000000000000000000000000000000000EB
+:1016000000000000000000000000000000000000DA
+:1016100000000000000000000000000000000000CA
+:1016200000000000000000000000000000000000BA
+:1016300000000000000000000000000000000000AA
+:10164000000000000000000000000000000000009A
+:10165000000000000000000000000000000000008A
+:10166000000000000000000000000000000000007A
+:10167000000000000000000000000000000000006A
+:10168000000000000000000000000000000000005A
+:10169000000000000000000000000000000000004A
+:1016A000000000000000000000000000000000003A
+:1016B000000000000000000000000000000000002A
+:1016C000000000000000000000000000000000001A
+:1016D000000000000000000000000000000000000A
+:1016E00000000000000000000000000000000000FA
+:1016F00000000000000000000000000000000000EA
+:1017000000000000000000000000000000000000D9
+:1017100000000000000000000000000000000000C9
+:1017200000000000000000000000000000000000B9
+:1017300000000000000000000000000000000000A9
+:101740000000000000000000000000000000000099
+:101750000000000000000000000000000000000089
+:101760000000000000000000000000000000000079
+:101770000000000000000000000000000000000069
+:101780000000000000000000000000000000000059
+:101790000000000000000000000000000000000049
+:1017A0000000000000000000000000000000000039
+:1017B0000000000000000000000000000000000029
+:1017C0000000000000000000000000000000000019
+:1017D0000000000000000000000000000000000009
+:1017E00000000000000000000000000000000000F9
+:1017F00000000000000000000000000000000000E9
+:1018000000000000000000000000000000000000D8
+:1018100000000000000000000000000000000000C8
+:1018200000000000000000000000000000000000B8
+:1018300000000000000000000000000000000000A8
+:101840000000000000000000000000000000000098
+:101850000000000000000000000000000000000088
+:101860000000000000000000000000000000000078
+:101870000000000000000000000000000000000068
+:101880000000000000000000000000000000000058
+:101890000000000000000000000000000000000048
+:1018A0000000000000000000000000000000000038
+:1018B0000000000000000000000000000000000028
+:1018C0000000000000000000000000000000000018
+:1018D0000000000000000000000000000000000008
+:1018E00000000000000000000000000000000000F8
+:1018F00000000000000000000000000000000000E8
+:1019000000000000000000000000000000000000D7
+:1019100000000000000000000000000000000000C7
+:1019200000000000000000000000000000000000B7
+:1019300000000000000000000000000000000000A7
+:101940000000000000000000000000000000000097
+:101950000000000000000000000000000000000087
+:101960000000000000000000000000000000000077
+:101970000000000000000000000000000000000067
+:101980000000000000000000000000000000000057
+:101990000000000000000000000000000000000047
+:1019A0000000000000000000000000000000000037
+:1019B0000000000000000000000000000000000027
+:1019C0000000000000000000000000000000000017
+:1019D0000000000000000000000000000000000007
+:1019E00000000000000000000000000000000000F7
+:1019F00000000000000000000000000000000000E7
+:101A000000000000000000000000000000000000D6
+:101A100000000000000000000000000000000000C6
+:101A200000000000000000000000000000000000B6
+:101A300000000000000000000000000000000000A6
+:101A40000000000000000000000000000000000096
+:101A50000000000000000000000000000000000086
+:101A60000000000000000000000000000000000076
+:101A70000000000000000000000000000000000066
+:101A80000000000000000000000000000000000056
+:101A90000000000000000000000000000000000046
+:101AA0000000000000000000000000000000000036
+:101AB0000000000000000000000000000000000026
+:101AC0000000000000000000000000000000000016
+:101AD0000000000000000000000000000000000006
+:101AE00000000000000000000000000000000000F6
+:101AF00000000000000000000000000000000000E6
+:101B000000000000000000000000000000000000D5
+:101B100000000000000000000000000000000000C5
+:101B200000000000000000000000000000000000B5
+:101B300000000000000000000000000000000000A5
+:101B40000000000000000000000000000000000095
+:101B50000000000000000000000000000000000085
+:101B60000000000000000000000000000000000075
+:101B70000000000000000000000000000000000065
+:101B80000000000000000000000000000000000055
+:101B90000000000000000000000000000000000045
+:101BA0000000000000000000000000000000000035
+:101BB0000000000000000000000000000000000025
+:101BC0000000000000000000000000000000000015
+:101BD0000000000000000000000000000000000005
+:101BE00000000000000000000000000000000000F5
+:101BF00000000000000000000000000000000000E5
+:101C0000000000000000005900000000000000017A
+:101C100001010101010101010101010101010101B4
+:101C200001010101010101010101010101010101A4
+:101C30000101010101010101010101010101010194
+:101C40000101010101010101010101010101010184
+:101C50000101010101010101010101010101010174
+:101C60000101010101010101010101010101010164
+:101C70000101010101010101010101010101010154
+:101C80000101010101010101010101010101010144
+:101C90000101010101010101010101010101010134
+:101CA0000101010101010101010101010101010124
+:101CB0000101010101010101010101010101010114
+:101CC0000101010101010101010101010101010104
+:101CD00001010101010101010101010101010101F4
+:101CE00001010101010101010101010101010101E4
+:101CF00001010101010101010101010101010101D4
+:101D000001010101010101010101010101010101C3
+:101D100001010101010101010101010101010101B3
+:101D200001010101010101010101010101010101A3
+:101D30000101010101010101010101010101010193
+:101D40000101010101010101010101010101010183
+:101D50000101010101010101010101010101010173
+:101D60000101010101010101010101010101010163
+:101D70000101010101010101010101010101010153
+:101D80000101010101010101010101010101010143
+:101D90000101010101010101010101010101010133
+:101DA0000101010101010101010101010101010123
+:101DB0000101010101010101010101010101010113
+:101DC0000101010101010101010101010101010103
+:101DD00001010101010101010101010101010101F3
+:101DE00001010101010101010101010101010101E3
+:101DF00001010101010101010101010101010101D3
+:101E000001010101010101010101010101010101C2
+:101E100001010101010101010101010101010101B2
+:101E200001010101010101010101010101010101A2
+:101E30000101010101010101010101010101010192
+:101E40000101010101010101010101010101010182
+:101E50000101010101010101010101010101010172
+:101E60000101010101010101010101010101010162
+:101E70000101010101010101010101010101010152
+:101E80000101010101010101010101010101010142
+:101E90000101010101010101010101010101010132
+:101EA0000101010101010101010101010101010122
+:101EB0000101010101010101010101010101010112
+:101EC0000101010101010101010101010101010102
+:101ED00001010101010101010101010101010101F2
+:101EE00001010101010101010101010101010101E2
+:101EF00001010101010101010101010101010101D2
+:101F000001010101010101010101010101010101C1
+:101F100001010101010101010101010101010101B1
+:101F200001010101010101010101010101010101A1
+:101F30000101010101010101010101010101010191
+:101F40000101010101010101010101010101010181
+:101F50000101010101010101010101010101010171
+:101F60000101010101010101010101010101010161
+:101F70000101010101010101010101010101010151
+:101F80000101010101010101010101010101010141
+:101F90000101010101010101010101010101010131
+:101FA0000101010101010101010101010101010121
+:101FB0000101010101010101010101010101010111
+:101FC0000101010101010101010101010101010101
+:101FD00001010101010101010101010101010101F1
+:101FE00001010101010101010101010101010101E1
+:101FF00001010101010101010101010101010101D1
+:1020000001010101010101010101010101010101C0
+:1020100001010101010101010101010101010101B0
+:1020200001010101010101010101010101010101A0
+:102030000101010101010101010101010101010190
+:102040000101010101010101010101010101010180
+:102050000101010101010101010101010101010170
+:102060000101010101010101010101010101010160
+:102070000101010101010101010101010101010150
+:102080000101010101010101010101010101010140
+:102090000101010101010101010101010101010130
+:1020A0000101010101010101010101010101010120
+:1020B0000101010101010101010101010101010110
+:1020C0000101010101010101010101010101010100
+:1020D00001010101010101010101010101010101F0
+:1020E00001010101010101010101010101010101E0
+:1020F00001010101010101010101010101010101D0
+:1021000001010101010101010101010101010101BF
+:1021100001010101010101010101010101010101AF
+:10212000010101010101010101010101010101019F
+:10213000010101010101010101010101010101018F
+:10214000010101010101010101010101010101017F
+:10215000010101010101010101010101010101016F
+:10216000010101010101010101010101010101015F
+:10217000010101010101010101010101010101014F
+:10218000010101010101010101010101010101013F
+:10219000010101010101010101010101010101012F
+:1021A000010101010101010101010101010101011F
+:1021B000010101010101010101010101010101010F
+:1021C00001010101010101010101010101010101FF
+:1021D00001010101010101010101010101010101EF
+:1021E00001010101010101010101010101010101DF
+:1021F00001010101010101010101010101010101CF
+:1022000001010101010101010101010101010101BE
+:1022100001010101010101010101010101010101AE
+:10222000010101010101010101010101010101019E
+:10223000010101010101010101010101010101018E
+:10224000010101010101010101010101010101017E
+:10225000010101010101010101010101010101016E
+:10226000010101010101010101010101010101015E
+:10227000010101010101010101010101010101014E
+:10228000010101010101010101010101010101013E
+:10229000010101010101010101010101010101012E
+:1022A000010101010101010101010101010101011E
+:1022B000010101010101010101010101010101010E
+:1022C00001010101010101010101010101010101FE
+:1022D00001010101010101010101010101010101EE
+:1022E00001010101010101010101010101010101DE
+:1022F00001010101010101010101010101010101CE
+:1023000001010101010101010101010101010101BD
+:1023100001010101010101010101010101010101AD
+:10232000010101010101010101010101010101019D
+:10233000010101010101010101010101010101018D
+:10234000010101010101010101010101010101017D
+:10235000010101010101010101010101010101016D
+:10236000010101010101010101010101010101015D
+:10237000010101010101010101010101010101014D
+:10238000010101010101010101010101010101013D
+:10239000010101010101010101010101010101012D
+:1023A000010101010101010101010101010101011D
+:1023B000010101010101010101010101010101010D
+:1023C00001010101010101010101010101010101FD
+:1023D00001010101010101010101010101010101ED
+:1023E00001010101010101010101010101010101DD
+:1023F00001010101010101010101010101010101CD
+:1024000001010101010101010101010101010101BC
+:1024100001010101010101010101010101010101AC
+:10242000010101010101010101010101010101019C
+:10243000010101010101010101010101010101018C
+:10244000010101010101010101010101010101017C
+:10245000010101010101010101010101010101016C
+:10246000010101010101010101010101010101015C
+:10247000010101010101010101010101010101014C
+:10248000010101010101010101010101010101013C
+:10249000010101010101010101010101010101012C
+:1024A000010101010101010101010101010101011C
+:1024B000010101010101010101010101010101010C
+:1024C00001010101010101010101010101010101FC
+:1024D00001010101010101010101010101010101EC
+:1024E00001010101010101010101010101010101DC
+:1024F00001010101010101010101010101010101CC
+:1025000001010101010101010101010101010101BB
+:1025100001010101010101010101010101010101AB
+:10252000010101010101010101010101010101019B
+:10253000010101010101010101010101010101018B
+:10254000010101010101010101010101010101017B
+:10255000010101010101010101010101010101016B
+:10256000010101010101010101010101010101015B
+:10257000010101010101010101010101010101014B
+:10258000010101010101010101010101010101013B
+:10259000010101010101010101010101010101012B
+:1025A000010101010101010101010101010101011B
+:1025B000010101010101010101010101010101010B
+:1025C00001010101010101010101010101010101FB
+:1025D00001010101010101010101010101010101EB
+:1025E00001010101010101010101010101010101DB
+:1025F00001010101010101010101010101010101CB
+:1026000001010101010101010101010101010101BA
+:1026100001010101010101010101010101010101AA
+:10262000010101010101010101010101010101019A
+:10263000010101010101010101010101010101018A
+:10264000010101010101010101010101010101017A
+:10265000010101010101010101010101010101016A
+:10266000010101010101010101010101010101015A
+:10267000010101010101010101010101010101014A
+:10268000010101010101010101010101010101013A
+:10269000010101010101010101010101010101012A
+:1026A000010101010101010101010101010101011A
+:1026B000010101010101010101010101010101010A
+:1026C00001010101010101010101010101010101FA
+:1026D00001010101010101010101010101010101EA
+:1026E00001010101010101010101010101010101DA
+:1026F00001010101010101010101010101010101CA
+:1027000001010101010101010101010101010101B9
+:1027100001010101010101010101010101010101A9
+:102720000101010101010101010101010101010199
+:102730000101010101010101010101010101010189
+:102740000101010101010101010101010101010179
+:102750000101010101010101010101010101010169
+:102760000101010101010101010101010101010159
+:102770000101010101010101010101010101010149
+:102780000101010101010101010101010101010139
+:102790000101010101010101010101010101010129
+:1027A0000101010101010101010101010101010119
+:1027B0000101010101010101010101010101010109
+:1027C00001010101010101010101010101010101F9
+:1027D00001010101010101010101010101010101E9
+:1027E00001010101010101010101010101010101D9
+:1027F00001010101010101010101010101010101C9
+:1028000001010101010101010101010101010101B8
+:1028100001010101010101010101010101010101A8
+:102820000101010101010101010101010101010198
+:102830000101010101010101010101010101010188
+:102840000101010101010101010101010101010178
+:102850000101010101010101010101010101010168
+:102860000101010101010101010101010101010158
+:102870000101010101010101010101010101010148
+:102880000101010101010101010101010101010138
+:102890000101010101010101010101010101010128
+:1028A0000101010101010101010101010101010118
+:1028B0000101010101010101010101010101010108
+:1028C00001010101010101010101010101010101F8
+:1028D00001010101010101010101010101010101E8
+:1028E00001010101010101010101010101010101D8
+:1028F00001010101010101010101010101010101C8
+:1029000001010101010101010101010101010101B7
+:1029100001010101010101010101010101010101A7
+:102920000101010101010101010101010101010197
+:102930000101010101010101010101010101010187
+:102940000101010101010101010101010101010177
+:102950000101010101010101010101010101010167
+:102960000101010101010101010101010101010157
+:102970000101010101010101010101010101010147
+:102980000101010101010101010101010101010137
+:102990000101010101010101010101010101010127
+:1029A0000101010101010101010101010101010117
+:1029B0000101010101010101010101010101010107
+:1029C00001010101010101010101010101010101F7
+:1029D00001010101010101010101010101010101E7
+:1029E00001010101010101010101010101010101D7
+:1029F00001010101010101010101010101010101C7
+:102A000001010101010101010101010101010101B6
+:102A100001010101010101010101010101010101A6
+:102A20000101010101010101010101010101010196
+:102A30000101010101010101010101010101010186
+:102A40000101010101010101010101010101010176
+:102A50000101010101010101010101010101010166
+:102A60000101010101010101010101010101010156
+:102A70000101010101010101010101010101010146
+:102A80000101010101010101010101010101010136
+:102A90000101010101010101010101010101010126
+:102AA0000101010101010101010101010101010116
+:102AB0000101010101010101010101010101010106
+:102AC00001010101010101010101010101010101F6
+:102AD00001010101010101010101010101010101E6
+:102AE00001010101010101010101010101010101D6
+:102AF00001010101010101010101010101010101C6
+:102B000001010101010101010101010101010100B6
+:102B100000000000000000000000000000000000B5
+:102B200000000000000000000000000000000000A5
+:102B30000000000000000000000000000000000095
+:102B40000000000000000000000000000000000085
+:102B50000000000000000000000000000000000075
+:102B60000000000000000000000000000000000065
+:102B70000000000000000000000000000000000055
+:102B80000000000000000000000000000000000045
+:102B90000000000000000000000000000000000035
+:102BA0000000000000000000000000000000000025
+:102BB0000000000000000000000000000000000015
+:102BC0000000000000000000000000000000000005
+:102BD00000000000000000000000000000000000F5
+:102BE00000000000000000000000000000000000E5
+:102BF00000000000000000000000000000000000D5
+:102C000000000000000000000000000000000000C4
+:102C100000000000000000000000000000000000B4
+:102C200000000000000000000000000000000000A4
+:102C30000000000000000000000000000000000094
+:102C40000000000000000000000000000000000084
+:102C50000000000000000000000000000000000074
+:102C60000000000000000000000000000000000064
+:102C70000000000000000000000000000000000054
+:102C80000000000000000000000000000000000044
+:102C90000000000000000000000000000000000034
+:102CA0000000000000000000000000000000000024
+:102CB0000000000000000000000000000000000014
+:102CC0000000000000000000000000000000000004
+:102CD00000000000000000000000000000000000F4
+:102CE00000000000000000000000000000000000E4
+:102CF00000000000000000000000000000000000D4
+:102D000000000000000000000000000000000000C3
+:102D100000000000000000000000000000000000B3
+:102D200000000000000000000000000000000000A3
+:102D30000000000000000000000000000000000093
+:102D40000000000000000000000000000000000083
+:102D50000000000000000000000000000000000073
+:102D60000000000000000000000000000000000063
+:102D70000000000000000000000000000000000053
+:102D80000000000000000000000000000000000043
+:102D90000000000000000000000000000000000033
+:102DA0000000000000000000000000000000000023
+:102DB0000000000000000000000000000000000013
+:102DC0000000000000000000000000000000000003
+:102DD00000000000000000000000000000000000F3
+:102DE00000000000000000000000000000000000E3
+:102DF00000000000000000000000000000000000D3
+:102E000000000000000000000000000000000000C2
+:102E100000000000000000000000000000000000B2
+:102E200000000000000000000000000000000000A2
+:102E30000000000000000000000000000000000092
+:102E40000000000000000000000000000000000082
+:102E50000000000000000000000000000000000072
+:102E60000000000000000000000000000000000062
+:102E70000000000000000000000000000000000052
+:102E80000000000000000000000000000000000042
+:102E90000000000000000000000000000000000032
+:102EA0000000000000000000000000000000000022
+:102EB0000000000000000000000000000000000012
+:102EC0000000000000000000000000000000000002
+:102ED00000000000000000000000000000000000F2
+:102EE00000000000000000000000000000000000E2
+:102EF00000000000000000000000000000000000D2
+:102F000000000000000000000000000000000000C1
+:102F100000000000000000000000000000000000B1
+:102F200000000000000000000000000000000000A1
+:102F30000000000000000000000000000000000091
+:102F40000000000000000000000000000000000081
+:102F50000000000000000000000000000000000071
+:102F60000000000000000000000000000000000061
+:102F70000000000000000000000000000000000051
+:102F80000000000000000000000000000000000041
+:102F90000000000000000000000000000000000031
+:102FA0000000000000000000000000000000000021
+:102FB0000000000000000000000000000000000011
+:102FC0000000000000000000000000000000000001
+:102FD00000000000000000000000000000000000F1
+:102FE00000000000000000000000000000000000E1
+:102FF00000000000000000000000000000000000D1
+:1030000000000000000000000000000000000000C0
+:1030100000000000000000000000000000000000B0
+:1030200000000000000000000000000000000000A0
+:103030000000000000000000000000000000000090
+:103040000000000000000000000000000000000080
+:103050000000000000000000000000000000000070
+:103060000000000000000000000000000000000060
+:103070000000000000000000000000000000000050
+:103080000000000000000000000000000000000040
+:103090000000000000000000000000000000000030
+:1030A0000000000000000000000000000000000020
+:1030B0000000000000000000000000000000000010
+:1030C0000000000000000000000000000000000000
+:1030D00000000000000000000000000000000000F0
+:1030E00000000000000000000000000000000000E0
+:1030F00000000000000000000000000000000000D0
+:1031000000000000000000000000000000000000BF
+:1031100000000000000000000000000000000000AF
+:10312000000000000000000000000000000000009F
+:10313000000000000000000000000000000000008F
+:10314000000000000000000000000000000000007F
+:10315000000000000000000000000000000000006F
+:10316000000000000000000000000000000000005F
+:10317000000000000000000000000000000000004F
+:10318000000000000000000000000000000000003F
+:10319000000000000000000000000000000000002F
+:1031A000000000000000000000000000000000001F
+:1031B000000000000000000000000000000000000F
+:1031C00000000000000000000000000000000000FF
+:1031D00000000000000000000000000000000000EF
+:1031E00000000000000000000000000000000000DF
+:1031F00000000000000000000000000000000000CF
+:1032000000000000000000000000000000000002BC
+:10321000020202020202020202020202020202028E
+:10322000020202020202020202020202020202027E
+:10323000020202020202020202020202020202026E
+:10324000020202020202020202020202020202025E
+:10325000020202020202020202020202020202024E
+:10326000020202020202020202020202020202023E
+:10327000020202020202020202020202020202022E
+:10328000020202020202020202020202020202021E
+:10329000020202020202020202020202020202020E
+:1032A00002020202020202020202020202020202FE
+:1032B00002020202020202020202020202020202EE
+:1032C00002020202020202020202020202020202DE
+:1032D00002020202020202020202020202020202CE
+:1032E00002020202020202020202020202020202BE
+:1032F00002020202020202020202020202020202AE
+:10330000020202020202020202020202020202029D
+:10331000020202020202020202020202020202028D
+:10332000020202020202020202020202020202027D
+:10333000020202020202020202020202020202026D
+:10334000020202020202020202020202020202025D
+:10335000020202020202020202020202020202024D
+:10336000020202020202020202020202020202023D
+:10337000020202020202020202020202020202022D
+:10338000020202020202020202020202020202021D
+:10339000020202020202020202020202020202020D
+:1033A00002020202020202020202020202020202FD
+:1033B00002020202020202020202020202020202ED
+:1033C00002020202020202020202020202020202DD
+:1033D00002020202020202020202020202020202CD
+:1033E00002020202020202020202020202020202BD
+:1033F00002020202020202020202020202020202AD
+:10340000020202020202020202020202020202029C
+:10341000020202020202020202020202020202028C
+:10342000020202020202020202020202020202027C
+:10343000020202020202020202020202020202026C
+:10344000020202020202020202020202020202025C
+:10345000020202020202020202020202020202024C
+:10346000020202020202020202020202020202023C
+:10347000020202020202020202020202020202022C
+:10348000020202020202020202020202020202021C
+:10349000020202020202020202020202020202020C
+:1034A00002020202020202020202020202020202FC
+:1034B00002020202020202020202020202020202EC
+:1034C00002020202020202020202020202020202DC
+:1034D00002020202020202020202020202020202CC
+:1034E00002020202020202020202020202020202BC
+:1034F00002020202020202020202020202020202AC
+:10350000020202020202020202020202020202029B
+:10351000020202020202020202020202020202028B
+:10352000020202020202020202020202020202027B
+:10353000020202020202020202020202020202026B
+:10354000020202020202020202020202020202025B
+:10355000020202020202020202020202020202024B
+:10356000020202020202020202020202020202023B
+:10357000020202020202020202020202020202022B
+:10358000020202020202020202020202020202021B
+:10359000020202020202020202020202020202020B
+:1035A00002020202020202020202020202020202FB
+:1035B00002020202020202020202020202020202EB
+:1035C00002020202020202020202020202020202DB
+:1035D00002020202020202020202020202020202CB
+:1035E00002020202020202020202020202020202BB
+:1035F00002020202020202020202020202020202AB
+:10360000020202020202020202020202020202029A
+:10361000020202020202020202020202020202028A
+:10362000020202020202020202020202020202027A
+:10363000020202020202020202020202020202026A
+:10364000020202020202020202020202020202025A
+:10365000020202020202020202020202020202024A
+:10366000020202020202020202020202020202023A
+:10367000020202020202020202020202020202022A
+:10368000020202020202020202020202020202021A
+:10369000020202020202020202020202020202020A
+:1036A00002020202020202020202020202020202FA
+:1036B00002020202020202020202020202020202EA
+:1036C00002020202020202020202020202020202DA
+:1036D00002020202020202020202020202020202CA
+:1036E00002020202020202020202020202020202BA
+:1036F00002020202020202020202020202020202AA
+:103700000202020202020202020202020202020299
+:103710000202020202020202020202020202020289
+:103720000202020202020202020202020202020279
+:103730000202020202020202020202020202020269
+:103740000202020202020202020202020202020259
+:103750000202020202020202020202020202020249
+:103760000202020202020202020202020202020239
+:103770000202020202020202020202020202020229
+:103780000202020202020202020202020202020219
+:103790000202020202020202020202020202020209
+:1037A00002020202020202020202020202020202F9
+:1037B00002020202020202020202020202020202E9
+:1037C00002020202020202020202020202020202D9
+:1037D00002020202020202020202020202020202C9
+:1037E00002020202020202020202020202020202B9
+:1037F00002020202020202020202020202020202A9
+:103800000202020202020202020202020202020298
+:103810000202020202020202020202020202020288
+:103820000202020202020202020202020202020278
+:103830000202020202020202020202020202020268
+:103840000202020202020202020202020202020258
+:103850000202020202020202020202020202020248
+:103860000202020202020202020202020202020238
+:103870000202020202020202020202020202020228
+:103880000202020202020202020202020202020218
+:103890000202020202020202020202020202020208
+:1038A00002020202020202020202020202020202F8
+:1038B00002020202020202020202020202020202E8
+:1038C00002020202020202020202020202020202D8
+:1038D00002020202020202020202020202020202C8
+:1038E00002020202020202020202020202020202B8
+:1038F00002020202020202020202020202020202A8
+:103900000202020202020202020202020202020297
+:103910000202020202020202020202020202020287
+:103920000202020202020202020202020202020277
+:103930000202020202020202020202020202020267
+:103940000202020202020202020202020202020257
+:103950000202020202020202020202020202020247
+:103960000202020202020202020202020202020237
+:103970000202020202020202020202020202020227
+:103980000202020202020202020202020202020217
+:103990000202020202020202020202020202020207
+:1039A00002020202020202020202020202020202F7
+:1039B00002020202020202020202020202020202E7
+:1039C00002020202020202020202020202020202D7
+:1039D00002020202020202020202020202020202C7
+:1039E00002020202020202020202020202020202B7
+:1039F00002020202020202020202020202020202A7
+:103A00000202020202020202020202020202020296
+:103A10000202020202020202020202020202020286
+:103A20000202020202020202020202020202020276
+:103A30000202020202020202020202020202020266
+:103A40000202020202020202020202020202020256
+:103A50000202020202020202020202020202020246
+:103A60000202020202020202020202020202020236
+:103A70000202020202020202020202020202020226
+:103A80000202020202020202020202020202020216
+:103A90000202020202020202020202020202020206
+:103AA00002020202020202020202020202020202F6
+:103AB00002020202020202020202020202020202E6
+:103AC00002020202020202020202020202020202D6
+:103AD00002020202020202020202020202020202C6
+:103AE00002020202020202020202020202020202B6
+:103AF00002020202020202020202020202020202A6
+:103B00000202020202020202020202020202020295
+:103B10000202020202020202020202020202020285
+:103B20000202020202020202020202020202020275
+:103B30000202020202020202020202020202020265
+:103B40000202020202020202020202020202020255
+:103B50000202020202020202020202020202020245
+:103B60000202020202020202020202020202020235
+:103B70000202020202020202020202020202020225
+:103B80000202020202020202020202020202020215
+:103B90000202020202020202020202020202020205
+:103BA00002020202020202020202020202020202F5
+:103BB00002020202020202020202020202020202E5
+:103BC00002020202020202020202020202020202D5
+:103BD00002020202020202020202020202020202C5
+:103BE00002020202020202020202020202020202B5
+:103BF00002020202020202020202020202020202A5
+:103C00000202020202020202020202020202020294
+:103C10000202020202020202020202020202020284
+:103C20000202020202020202020202020202020274
+:103C30000202020202020202020202020202020264
+:103C40000202020202020202020202020202020254
+:103C50000202020202020202020202020202020244
+:103C60000202020202020202020202020202020234
+:103C70000202020202020202020202020202020224
+:103C80000202020202020202020202020202020214
+:103C90000202020202020202020202020202020204
+:103CA00002020202020202020202020202020202F4
+:103CB00002020202020202020202020202020202E4
+:103CC00002020202020202020202020202020202D4
+:103CD00002020202020202020202020202020202C4
+:103CE00002020202020202020202020202020202B4
+:103CF00002020202020202020202020202020202A4
+:103D00000202020202020202020202020202020293
+:103D10000202020202020202020202020202020283
+:103D20000202020202020202020202020202020273
+:103D30000202020202020202020202020202020263
+:103D40000202020202020202020202020202020253
+:103D50000202020202020202020202020202020243
+:103D60000202020202020202020202020202020233
+:103D70000202020202020202020202020202020223
+:103D80000202020202020202020202020202020213
+:103D90000202020202020202020202020202020203
+:103DA00002020202020202020202020202020202F3
+:103DB00002020202020202020202020202020202E3
+:103DC00002020202020202020202020202020202D3
+:103DD00002020202020202020202020202020202C3
+:103DE00002020202020202020202020202020202B3
+:103DF00002020202020202020202020202020202A3
+:103E00000202020202020202020202020202020292
+:103E10000202020202020202020202020202020282
+:103E20000202020202020202020202020202020272
+:103E30000202020202020202020202020202020262
+:103E40000202020202020202020202020202020252
+:103E50000202020202020202020202020202020242
+:103E60000202020202020202020202020202020232
+:103E70000202020202020202020202020202020222
+:103E80000202020202020202020202020202020212
+:103E90000202020202020202020202020202020202
+:103EA00002020202020202020202020202020202F2
+:103EB00002020202020202020202020202020202E2
+:103EC00002020202020202020202020202020202D2
+:103ED00002020202020202020202020202020202C2
+:103EE00002020202020202020202020202020202B2
+:103EF00002020202020202020202020202020202A2
+:103F00000202020202020202020202020202020291
+:103F10000202020202020202020202020202020281
+:103F20000202020202020202020202020202020271
+:103F30000202020202020202020202020202020261
+:103F40000202020202020202020202020202020251
+:103F50000202020202020202020202020202020241
+:103F60000202020202020202020202020202020231
+:103F70000202020202020202020202020202020221
+:103F80000202020202020202020202020202020211
+:103F90000202020202020202020202020202020201
+:103FA00002020202020202020202020202020202F1
+:103FB00002020202020202020202020202020202E1
+:103FC00002020202020202020202020202020202D1
+:103FD00002020202020202020202020202020202C1
+:103FE00002020202020202020202020202020202B1
+:103FF00002020202020202020202020202020202A1
+:104000000202020202020202020202020202020290
+:104010000202020202020202020202020202020280
+:104020000202020202020202020202020202020270
+:104030000202020202020202020202020202020260
+:104040000202020202020202020202020202020250
+:104050000202020202020202020202020202020240
+:104060000202020202020202020202020202020230
+:104070000202020202020202020202020202020220
+:104080000202020202020202020202020202020210
+:104090000202020202020202020202020202020200
+:1040A00002020202020202020202020202020202F0
+:1040B00002020202020202020202020202020202E0
+:1040C00002020202020202020202020202020202D0
+:1040D00002020202020202020202020202020202C0
+:1040E00002020202020202020202020202020202B0
+:1040F00002020202020202020202020202020202A0
+:104100000202020202020202020202020202020091
+:10411000000000000000000000000000000000009F
+:10412000000000000000000000000000000000008F
+:10413000000000000000000000000000000000007F
+:10414000000000000000000000000000000000006F
+:10415000000000000000000000000000000000005F
+:10416000000000000000000000000000000000004F
+:10417000000000000000000000000000000000003F
+:10418000000000000000000000000000000000002F
+:10419000000000000000000000000000000000001F
+:1041A000000000000000000000000000000000000F
+:1041B00000000000000000000000000000000000FF
+:1041C00000000000000000000000000000000000EF
+:1041D00000000000000000000000000000000000DF
+:1041E00000000000000000000000000000000000CF
+:1041F00000000000000000000000000000000000BF
+:1042000000000000000000000000000000000000AE
+:10421000000000000000000000000000000000009E
+:10422000000000000000000000000000000000008E
+:10423000000000000000000000000000000000007E
+:10424000000000000000000000000000000000006E
+:10425000000000000000000000000000000000005E
+:10426000000000000000000000000000000000004E
+:10427000000000000000000000000000000000003E
+:10428000000000000000000000000000000000002E
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000000000E
+:1042B00000000000000000000000000000000000FE
+:1042C00000000000000000000000000000000000EE
+:1042D00000000000000000000000000000000000DE
+:1042E00000000000000000000000000000000000CE
+:1042F00000000000000000000000000000000000BE
+:1043000000000000000000000000000000000000AD
+:10431000000000000000000000000000000000009D
+:10432000000000000000000000000000000000008D
+:10433000000000000000000000000000000000007D
+:10434000000000000000000000000000000000006D
+:10435000000000000000000000000000000000005D
+:10436000000000000000000000000000000000004D
+:10437000000000000000000000000000000000003D
+:10438000000000000000000000000000000000002D
+:10439000000000000000000000000000000000001D
+:1043A000000000000000000000000000000000000D
+:1043B00000000000000000000000000000000000FD
+:1043C00000000000000000000000000000000000ED
+:1043D00000000000000000000000000000000000DD
+:1043E00000000000000000000000000000000000CD
+:1043F00000000000000000000000000000000000BD
+:1044000000000000000000000000000000000000AC
+:10441000000000000000000000000000000000009C
+:10442000000000000000000000000000000000008C
+:10443000000000000000000000000000000000007C
+:10444000000000000000000000000000000000006C
+:10445000000000000000000000000000000000005C
+:10446000000000000000000000000000000000004C
+:10447000000000000000000000000000000000003C
+:10448000000000000000000000000000000000002C
+:10449000000000000000000000000000000000001C
+:1044A000000000000000000000000000000000000C
+:1044B00000000000000000000000000000000000FC
+:1044C00000000000000000000000000000000000EC
+:1044D00000000000000000000000000000000000DC
+:1044E00000000000000000000000000000000000CC
+:1044F00000000000000000000000000000000000BC
+:1045000000000000000000000000000000000000AB
+:10451000000000000000000000000000000000009B
+:10452000000000000000000000000000000000008B
+:10453000000000000000000000000000000000007B
+:10454000000000000000000000000000000000006B
+:10455000000000000000000000000000000000005B
+:10456000000000000000000000000000000000004B
+:10457000000000000000000000000000000000003B
+:10458000000000000000000000000000000000002B
+:10459000000000000000000000000000000000001B
+:1045A000000000000000000000000000000000000B
+:1045B00000000000000000000000000000000000FB
+:1045C00000000000000000000000000000000000EB
+:1045D00000000000000000000000000000000000DB
+:1045E00000000000000000000000000000000000CB
+:1045F00000000000000000000000000000000000BB
+:1046000000000000000000000000000000000000AA
+:10461000000000000000000000000000000000009A
+:10462000000000000000000000000000000000008A
+:10463000000000000000000000000000000000007A
+:10464000000000000000000000000000000000006A
+:10465000000000000000000000000000000000005A
+:10466000000000000000000000000000000000004A
+:10467000000000000000000000000000000000003A
+:10468000000000000000000000000000000000002A
+:10469000000000000000000000000000000000001A
+:1046A000000000000000000000000000000000000A
+:1046B00000000000000000000000000000000000FA
+:1046C00000000000000000000000000000000000EA
+:1046D00000000000000000000000000000000000DA
+:1046E00000000000000000000000000000000000CA
+:1046F00000000000000000000000000000000000BA
+:1047000000000000000000000000000000000000A9
+:104710000000000000000000000000000000000099
+:104720000000000000000000000000000000000089
+:104730000000000000000000000000000000000079
+:104740000000000000000000000000000000000069
+:104750000000000000000000000000000000000059
+:104760000000000000000000000000000000000049
+:104770000000000000000000000000000000000039
+:104780000000000000000000000000000000000029
+:104790000000000000000000000000000000000019
+:1047A0000000000000000000000000000000000009
+:1047B00000000000000000000000000000000000F9
+:1047C00000000000000000000000000000000000E9
+:1047D00000000000000000000000000000000000D9
+:1047E00000000000000000000000000000000000C9
+:1047F00000000000000000000000000000000000B9
+:1048000000000000000000000000000000000000A8
+:104810000000000000000000000000000000000098
+:104820000000000000000000000000000000000088
+:104830000000000000000000000000000000000078
+:104840000000000000000000000000000000000068
+:104850000000000000000000000000000000000058
+:104860000000000000000000000000000000000048
+:104870000000000000000000000000000000000038
+:104880000000000000000000000000000000000028
+:104890000000000000000000000000000000000018
+:1048A0000000000000000000000000000000000008
+:1048B00000000000000000000000000000000000F8
+:1048C00000000000000000000000000000000000E8
+:1048D00000000000000000000000000000000000D8
+:1048E00000000000000000000000000000000000C8
+:1048F00000000000000000000000000000000000B8
+:1049000000000000000000000000000000000000A7
+:104910000000000000000000000000000000000097
+:104920000000000000000000000000000000000087
+:104930000000000000000000000000000000000077
+:104940000000000000000000000000000000000067
+:104950000000000000000000000000000000000057
+:104960000000000000000000000000000000000047
+:104970000000000000000000000000000000000037
+:104980000000000000000000000000000000000027
+:104990000000000000000000000000000000000017
+:1049A0000000000000000000000000000000000007
+:1049B00000000000000000000000000000000000F7
+:1049C00000000000000000000000000000000000E7
+:1049D00000000000000000000000000000000000D7
+:1049E00000000000000000000000000000000000C7
+:1049F00000000000000000000000000000000000B7
+:104A000000000000000000000000000000000001A5
+:104A10000101010101010101010101010101010186
+:104A20000101010101010101010101010101010176
+:104A30000101010101010101010101010101010166
+:104A40000101010101010101010101010101010156
+:104A50000101010101010101010101010101010146
+:104A60000101010101010101010101010101010136
+:104A70000101010101010101010101010101010126
+:104A80000101010101010101010101010101010116
+:104A90000101010101010101010101010101010106
+:104AA00001010101010101010101010101010101F6
+:104AB00001010101010101010101010101010101E6
+:104AC00001010101010101010101010101010101D6
+:104AD00001010101010101010101010101010101C6
+:104AE00001010101010101010101010101010101B6
+:104AF00001010101010101010101010101010101A6
+:104B00000101010101010101010101010101010195
+:104B10000101010101010101010101010101010185
+:104B20000101010101010101010101010101010175
+:104B30000101010101010101010101010101010165
+:104B40000101010101010101010101010101010155
+:104B50000101010101010101010101010101010145
+:104B60000101010101010101010101010101010135
+:104B70000101010101010101010101010101010125
+:104B80000101010101010101010101010101010115
+:104B90000101010101010101010101010101010105
+:104BA00001010101010101010101010101010101F5
+:104BB00001010101010101010101010101010101E5
+:104BC00001010101010101010101010101010101D5
+:104BD00001010101010101010101010101010101C5
+:104BE00001010101010101010101010101010101B5
+:104BF00001010101010101010101010101010101A5
+:104C00000101010101010101010101010101010194
+:104C10000101010101010101010101010101010184
+:104C20000101010101010101010101010101010174
+:104C30000101010101010101010101010101010164
+:104C40000101010101010101010101010101010154
+:104C50000101010101010101010101010101010144
+:104C60000101010101010101010101010101010134
+:104C70000101010101010101010101010101010124
+:104C80000101010101010101010101010101010114
+:104C90000101010101010101010101010101010104
+:104CA00001010101010101010101010101010101F4
+:104CB00001010101010101010101010101010101E4
+:104CC00001010101010101010101010101010101D4
+:104CD00001010101010101010101010101010101C4
+:104CE00001010101010101010101010101010101B4
+:104CF00001010101010101010101010101010101A4
+:104D00000101010101010101010101010101010193
+:104D10000101010101010101010101010101010183
+:104D20000101010101010101010101010101010173
+:104D30000101010101010101010101010101010163
+:104D40000101010101010101010101010101010153
+:104D50000101010101010101010101010101010143
+:104D60000101010101010101010101010101010133
+:104D70000101010101010101010101010101010123
+:104D80000101010101010101010101010101010113
+:104D90000101010101010101010101010101010103
+:104DA00001010101010101010101010101010101F3
+:104DB00001010101010101010101010101010101E3
+:104DC00001010101010101010101010101010101D3
+:104DD00001010101010101010101010101010101C3
+:104DE00001010101010101010101010101010101B3
+:104DF00001010101010101010101010101010101A3
+:104E00000101010101010101010101010101010192
+:104E10000101010101010101010101010101010182
+:104E20000101010101010101010101010101010172
+:104E30000101010101010101010101010101010162
+:104E40000101010101010101010101010101010152
+:104E50000101010101010101010101010101010142
+:104E60000101010101010101010101010101010132
+:104E70000101010101010101010101010101010122
+:104E80000101010101010101010101010101010112
+:104E90000101010101010101010101010101010102
+:104EA00001010101010101010101010101010101F2
+:104EB00001010101010101010101010101010101E2
+:104EC00001010101010101010101010101010101D2
+:104ED00001010101010101010101010101010101C2
+:104EE00001010101010101010101010101010101B2
+:104EF00001010101010101010101010101010101A2
+:104F00000101010101010101010101010101010191
+:104F10000101010101010101010101010101010181
+:104F20000101010101010101010101010101010171
+:104F30000101010101010101010101010101010161
+:104F40000101010101010101010101010101010151
+:104F50000101010101010101010101010101010141
+:104F60000101010101010101010101010101010131
+:104F70000101010101010101010101010101010121
+:104F80000101010101010101010101010101010111
+:104F90000101010101010101010101010101010101
+:104FA00001010101010101010101010101010101F1
+:104FB00001010101010101010101010101010101E1
+:104FC00001010101010101010101010101010101D1
+:104FD00001010101010101010101010101010101C1
+:104FE00001010101010101010101010101010101B1
+:104FF00001010101010101010101010101010101A1
+:105000000101010101010101010101010101010190
+:105010000101010101010101010101010101010180
+:105020000101010101010101010101010101010170
+:105030000101010101010101010101010101010160
+:105040000101010101010101010101010101010150
+:105050000101010101010101010101010101010140
+:105060000101010101010101010101010101010130
+:105070000101010101010101010101010101010120
+:105080000101010101010101010101010101010110
+:105090000101010101010101010101010101010100
+:1050A00001010101010101010101010101010101F0
+:1050B00001010101010101010101010101010101E0
+:1050C00001010101010101010101010101010101D0
+:1050D00001010101010101010101010101010101C0
+:1050E00001010101010101010101010101010101B0
+:1050F00001010101010101010101010101010101A0
+:10510000010101010101010101010101010101018F
+:10511000010101010101010101010101010101017F
+:10512000010101010101010101010101010101016F
+:10513000010101010101010101010101010101015F
+:10514000010101010101010101010101010101014F
+:10515000010101010101010101010101010101013F
+:10516000010101010101010101010101010101012F
+:10517000010101010101010101010101010101011F
+:10518000010101010101010101010101010101010F
+:1051900001010101010101010101010101010101FF
+:1051A00001010101010101010101010101010101EF
+:1051B00001010101010101010101010101010101DF
+:1051C00001010101010101010101010101010101CF
+:1051D00001010101010101010101010101010101BF
+:1051E00001010101010101010101010101010101AF
+:1051F000010101010101010101010101010101019F
+:10520000010101010101010101010101010101018E
+:10521000010101010101010101010101010101017E
+:10522000010101010101010101010101010101016E
+:10523000010101010101010101010101010101015E
+:10524000010101010101010101010101010101014E
+:10525000010101010101010101010101010101013E
+:10526000010101010101010101010101010101012E
+:10527000010101010101010101010101010101011E
+:10528000010101010101010101010101010101010E
+:1052900001010101010101010101010101010101FE
+:1052A00001010101010101010101010101010101EE
+:1052B00001010101010101010101010101010101DE
+:1052C00001010101010101010101010101010101CE
+:1052D00001010101010101010101010101010101BE
+:1052E00001010101010101010101010101010101AE
+:1052F000010101010101010101010101010101019E
+:10530000010101010101010101010101010101018D
+:10531000010101010101010101010101010101017D
+:10532000010101010101010101010101010101016D
+:10533000010101010101010101010101010101015D
+:10534000010101010101010101010101010101014D
+:10535000010101010101010101010101010101013D
+:10536000010101010101010101010101010101012D
+:10537000010101010101010101010101010101011D
+:10538000010101010101010101010101010101010D
+:1053900001010101010101010101010101010101FD
+:1053A00001010101010101010101010101010101ED
+:1053B00001010101010101010101010101010101DD
+:1053C00001010101010101010101010101010101CD
+:1053D00001010101010101010101010101010101BD
+:1053E00001010101010101010101010101010101AD
+:1053F000010101010101010101010101010101019D
+:10540000010101010101010101010101010101018C
+:10541000010101010101010101010101010101017C
+:10542000010101010101010101010101010101016C
+:10543000010101010101010101010101010101015C
+:10544000010101010101010101010101010101014C
+:10545000010101010101010101010101010101013C
+:10546000010101010101010101010101010101012C
+:10547000010101010101010101010101010101011C
+:10548000010101010101010101010101010101010C
+:1054900001010101010101010101010101010101FC
+:1054A00001010101010101010101010101010101EC
+:1054B00001010101010101010101010101010101DC
+:1054C00001010101010101010101010101010101CC
+:1054D00001010101010101010101010101010101BC
+:1054E00001010101010101010101010101010101AC
+:1054F000010101010101010101010101010101019C
+:10550000010101010101010101010101010101018B
+:10551000010101010101010101010101010101017B
+:10552000010101010101010101010101010101016B
+:10553000010101010101010101010101010101015B
+:10554000010101010101010101010101010101014B
+:10555000010101010101010101010101010101013B
+:10556000010101010101010101010101010101012B
+:10557000010101010101010101010101010101011B
+:10558000010101010101010101010101010101010B
+:1055900001010101010101010101010101010101FB
+:1055A00001010101010101010101010101010101EB
+:1055B00001010101010101010101010101010101DB
+:1055C00001010101010101010101010101010101CB
+:1055D00001010101010101010101010101010101BB
+:1055E00001010101010101010101010101010101AB
+:1055F000010101010101010101010101010101019B
+:10560000010101010101010101010101010101018A
+:10561000010101010101010101010101010101017A
+:10562000010101010101010101010101010101016A
+:10563000010101010101010101010101010101015A
+:10564000010101010101010101010101010101014A
+:10565000010101010101010101010101010101013A
+:10566000010101010101010101010101010101012A
+:10567000010101010101010101010101010101011A
+:10568000010101010101010101010101010101010A
+:1056900001010101010101010101010101010101FA
+:1056A00001010101010101010101010101010101EA
+:1056B00001010101010101010101010101010101DA
+:1056C00001010101010101010101010101010101CA
+:1056D00001010101010101010101010101010101BA
+:1056E00001010101010101010101010101010101AA
+:1056F000010101010101010101010101010101019A
+:105700000101010101010101010101010101010189
+:105710000101010101010101010101010101010179
+:105720000101010101010101010101010101010169
+:105730000101010101010101010101010101010159
+:105740000101010101010101010101010101010149
+:105750000101010101010101010101010101010139
+:105760000101010101010101010101010101010129
+:105770000101010101010101010101010101010119
+:105780000101010101010101010101010101010109
+:1057900001010101010101010101010101010101F9
+:1057A00001010101010101010101010101010101E9
+:1057B00001010101010101010101010101010101D9
+:1057C00001010101010101010101010101010101C9
+:1057D00001010101010101010101010101010101B9
+:1057E00001010101010101010101010101010101A9
+:1057F0000101010101010101010101010101010199
+:105800000101010101010101010101010101010188
+:105810000101010101010101010101010101010178
+:105820000101010101010101010101010101010168
+:105830000101010101010101010101010101010158
+:105840000101010101010101010101010101010148
+:105850000101010101010101010101010101010138
+:105860000101010101010101010101010101010128
+:105870000101010101010101010101010101010118
+:105880000101010101010101010101010101010108
+:1058900001010101010101010101010101010101F8
+:1058A00001010101010101010101010101010101E8
+:1058B00001010101010101010101010101010101D8
+:1058C00001010101010101010101010101010101C8
+:1058D00001010101010101010101010101010101B8
+:1058E00001010101010101010101010101010101A8
+:1058F0000101010101010101010101010101010198
+:105900000101010101010101010101010101010088
+:105910000000000000000000000000000000000087
+:105920000000000000000000000000000000000077
+:105930000000000000000000000000000000000067
+:105940000000000000000000000000000000000057
+:105950000000000000000000000000000000000047
+:105960000000000000000000000000000000000037
+:105970000000000000000000000000000000000027
+:105980000000000000000000000000000000000017
+:105990000000000000000000000000000000000007
+:1059A00000000000000000000000000000000000F7
+:1059B00000000000000000000000000000000000E7
+:1059C00000000000000000000000000000000000D7
+:1059D00000000000000000000000000000000000C7
+:1059E00000000000000000000000000000000000B7
+:1059F00000000000000000000000000000000000A7
+:105A00000000000000000000000000000000000096
+:105A10000000000000000000000000000000000086
+:105A20000000000000000000000000000000000076
+:105A30000000000000000000000000000000000066
+:105A40000000000000000000000000000000000056
+:105A50000000000000000000000000000000000046
+:105A60000000000000000000000000000000000036
+:105A70000000000000000000000000000000000026
+:105A80000000000000000000000000000000000016
+:105A90000000000000000000000000000000000006
+:105AA00000000000000000000000000000000000F6
+:105AB00000000000000000000000000000000000E6
+:105AC00000000000000000000000000000000000D6
+:105AD00000000000000000000000000000000000C6
+:105AE00000000000000000000000000000000000B6
+:105AF00000000000000000000000000000000000A6
+:105B00000000000000000000000000000000000095
+:105B10000000000000000000000000000000000085
+:105B20000000000000000000000000000000000075
+:105B30000000000000000000000000000000000065
+:105B40000000000000000000000000000000000055
+:105B50000000000000000000000000000000000045
+:105B60000000000000000000000000000000000035
+:105B70000000000000000000000000000000000025
+:105B80000000000000000000000000000000000015
+:105B90000000000000000000000000000000000005
+:105BA00000000000000000000000000000000000F5
+:105BB00000000000000000000000000000000000E5
+:105BC00000000000000000000000000000000000D5
+:105BD00000000000000000000000000000000000C5
+:105BE00000000000000000000000000000000000B5
+:105BF00000000000000000000000000000000000A5
+:105C00000000000000000000000000000000000094
+:105C10000000000000000000000000000000000084
+:105C20000000000000000000000000000000000074
+:105C30000000000000000000000000000000000064
+:105C40000000000000000000000000000000000054
+:105C50000000000000000000000000000000000044
+:105C60000000000000000000000000000000000034
+:105C70000000000000000000000000000000000024
+:105C80000000000000000000000000000000000014
+:105C90000000000000000000000000000000000004
+:105CA00000000000000000000000000000000000F4
+:105CB00000000000000000000000000000000000E4
+:105CC00000000000000000000000000000000000D4
+:105CD00000000000000000000000000000000000C4
+:105CE00000000000000000000000000000000000B4
+:105CF00000000000000000000000000000000000A4
+:105D00000000000000000000000000000000000093
+:105D10000000000000000000000000000000000083
+:105D20000000000000000000000000000000000073
+:105D30000000000000000000000000000000000063
+:105D40000000000000000000000000000000000053
+:105D50000000000000000000000000000000000043
+:105D60000000000000000000000000000000000033
+:105D70000000000000000000000000000000000023
+:105D80000000000000000000000000000000000013
+:105D90000000000000000000000000000000000003
+:105DA00000000000000000000000000000000000F3
+:105DB00000000000000000000000000000000000E3
+:105DC00000000000000000000000000000000000D3
+:105DD00000000000000000000000000000000000C3
+:105DE00000000000000000000000000000000000B3
+:105DF00000000000000000000000000000000000A3
+:105E00000000000000000000000000000000000092
+:105E10000000000000000000000000000000000082
+:105E20000000000000000000000000000000000072
+:105E30000000000000000000000000000000000062
+:105E40000000000000000000000000000000000052
+:105E50000000000000000000000000000000000042
+:105E60000000000000000000000000000000000032
+:105E70000000000000000000000000000000000022
+:105E80000000000000000000000000000000000012
+:105E90000000000000000000000000000000000002
+:105EA00000000000000000000000000000000000F2
+:105EB00000000000000000000000000000000000E2
+:105EC00000000000000000000000000000000000D2
+:105ED00000000000000000000000000000000000C2
+:105EE00000000000000000000000000000000000B2
+:105EF00000000000000000000000000000000000A2
+:105F00000000000000000000000000000000000091
+:105F10000000000000000000000000000000000081
+:105F20000000000000000000000000000000000071
+:105F30000000000000000000000000000000000061
+:105F40000000000000000000000000000000000051
+:105F50000000000000000000000000000000000041
+:105F60000000000000000000000000000000000031
+:105F70000000000000000000000000000000000021
+:105F80000000000000000000000000000000000011
+:105F90000000000000000000000000000000000001
+:105FA00000000000000000000000000000000000F1
+:105FB00000000000000000000000000000000000E1
+:105FC00000000000000000000000000000000000D1
+:105FD00000000000000000000000000000000000C1
+:105FE00000000000000000000000000000000000B1
+:105FF00000000000000000000000000000000000A1
+:10600000000000000000000000000000000000028E
+:106010000202020202020202020202020202020260
+:106020000202020202020202020202020202020250
+:106030000202020202020202020202020202020240
+:106040000202020202020202020202020202020230
+:106050000202020202020202020202020202020220
+:106060000202020202020202020202020202020210
+:106070000202020202020202020202020202020200
+:1060800002020202020202020202020202020202F0
+:1060900002020202020202020202020202020202E0
+:1060A00002020202020202020202020202020202D0
+:1060B00002020202020202020202020202020202C0
+:1060C00002020202020202020202020202020202B0
+:1060D00002020202020202020202020202020202A0
+:1060E0000202020202020202020202020202020290
+:1060F0000202020202020202020202020202020280
+:10610000020202020202020202020202020202026F
+:10611000020202020202020202020202020202025F
+:10612000020202020202020202020202020202024F
+:10613000020202020202020202020202020202023F
+:10614000020202020202020202020202020202022F
+:10615000020202020202020202020202020202021F
+:10616000020202020202020202020202020202020F
+:1061700002020202020202020202020202020202FF
+:1061800002020202020202020202020202020202EF
+:1061900002020202020202020202020202020202DF
+:1061A00002020202020202020202020202020202CF
+:1061B00002020202020202020202020202020202BF
+:1061C00002020202020202020202020202020202AF
+:1061D000020202020202020202020202020202029F
+:1061E000020202020202020202020202020202028F
+:1061F000020202020202020202020202020202027F
+:10620000020202020202020202020202020202026E
+:10621000020202020202020202020202020202025E
+:10622000020202020202020202020202020202024E
+:10623000020202020202020202020202020202023E
+:10624000020202020202020202020202020202022E
+:10625000020202020202020202020202020202021E
+:10626000020202020202020202020202020202020E
+:1062700002020202020202020202020202020202FE
+:1062800002020202020202020202020202020202EE
+:1062900002020202020202020202020202020202DE
+:1062A00002020202020202020202020202020202CE
+:1062B00002020202020202020202020202020202BE
+:1062C00002020202020202020202020202020202AE
+:1062D000020202020202020202020202020202029E
+:1062E000020202020202020202020202020202028E
+:1062F000020202020202020202020202020202027E
+:10630000020202020202020202020202020202026D
+:10631000020202020202020202020202020202025D
+:10632000020202020202020202020202020202024D
+:10633000020202020202020202020202020202023D
+:10634000020202020202020202020202020202022D
+:10635000020202020202020202020202020202021D
+:10636000020202020202020202020202020202020D
+:1063700002020202020202020202020202020202FD
+:1063800002020202020202020202020202020202ED
+:1063900002020202020202020202020202020202DD
+:1063A00002020202020202020202020202020202CD
+:1063B00002020202020202020202020202020202BD
+:1063C00002020202020202020202020202020202AD
+:1063D000020202020202020202020202020202029D
+:1063E000020202020202020202020202020202028D
+:1063F000020202020202020202020202020202027D
+:10640000020202020202020202020202020202026C
+:10641000020202020202020202020202020202025C
+:10642000020202020202020202020202020202024C
+:10643000020202020202020202020202020202023C
+:10644000020202020202020202020202020202022C
+:10645000020202020202020202020202020202021C
+:10646000020202020202020202020202020202020C
+:1064700002020202020202020202020202020202FC
+:1064800002020202020202020202020202020202EC
+:1064900002020202020202020202020202020202DC
+:1064A00002020202020202020202020202020202CC
+:1064B00002020202020202020202020202020202BC
+:1064C00002020202020202020202020202020202AC
+:1064D000020202020202020202020202020202029C
+:1064E000020202020202020202020202020202028C
+:1064F000020202020202020202020202020202027C
+:10650000020202020202020202020202020202026B
+:10651000020202020202020202020202020202025B
+:10652000020202020202020202020202020202024B
+:10653000020202020202020202020202020202023B
+:10654000020202020202020202020202020202022B
+:10655000020202020202020202020202020202021B
+:10656000020202020202020202020202020202020B
+:1065700002020202020202020202020202020202FB
+:1065800002020202020202020202020202020202EB
+:1065900002020202020202020202020202020202DB
+:1065A00002020202020202020202020202020202CB
+:1065B00002020202020202020202020202020202BB
+:1065C00002020202020202020202020202020202AB
+:1065D000020202020202020202020202020202029B
+:1065E000020202020202020202020202020202028B
+:1065F000020202020202020202020202020202027B
+:10660000020202020202020202020202020202026A
+:10661000020202020202020202020202020202025A
+:10662000020202020202020202020202020202024A
+:10663000020202020202020202020202020202023A
+:10664000020202020202020202020202020202022A
+:10665000020202020202020202020202020202021A
+:10666000020202020202020202020202020202020A
+:1066700002020202020202020202020202020202FA
+:1066800002020202020202020202020202020202EA
+:1066900002020202020202020202020202020202DA
+:1066A00002020202020202020202020202020202CA
+:1066B00002020202020202020202020202020202BA
+:1066C00002020202020202020202020202020202AA
+:1066D000020202020202020202020202020202029A
+:1066E000020202020202020202020202020202028A
+:1066F000020202020202020202020202020202027A
+:106700000202020202020202020202020202020269
+:106710000202020202020202020202020202020259
+:106720000202020202020202020202020202020249
+:106730000202020202020202020202020202020239
+:106740000202020202020202020202020202020229
+:106750000202020202020202020202020202020219
+:106760000202020202020202020202020202020209
+:1067700002020202020202020202020202020202F9
+:1067800002020202020202020202020202020202E9
+:1067900002020202020202020202020202020202D9
+:1067A00002020202020202020202020202020202C9
+:1067B00002020202020202020202020202020202B9
+:1067C00002020202020202020202020202020202A9
+:1067D0000202020202020202020202020202020299
+:1067E0000202020202020202020202020202020289
+:1067F0000202020202020202020202020202020279
+:106800000202020202020202020202020202020268
+:106810000202020202020202020202020202020258
+:106820000202020202020202020202020202020248
+:106830000202020202020202020202020202020238
+:106840000202020202020202020202020202020228
+:106850000202020202020202020202020202020218
+:106860000202020202020202020202020202020208
+:1068700002020202020202020202020202020202F8
+:1068800002020202020202020202020202020202E8
+:1068900002020202020202020202020202020202D8
+:1068A00002020202020202020202020202020202C8
+:1068B00002020202020202020202020202020202B8
+:1068C00002020202020202020202020202020202A8
+:1068D0000202020202020202020202020202020298
+:1068E0000202020202020202020202020202020288
+:1068F0000202020202020202020202020202020278
+:106900000202020202020202020202020202020267
+:106910000202020202020202020202020202020257
+:106920000202020202020202020202020202020247
+:106930000202020202020202020202020202020237
+:106940000202020202020202020202020202020227
+:106950000202020202020202020202020202020217
+:106960000202020202020202020202020202020207
+:1069700002020202020202020202020202020202F7
+:1069800002020202020202020202020202020202E7
+:1069900002020202020202020202020202020202D7
+:1069A00002020202020202020202020202020202C7
+:1069B00002020202020202020202020202020202B7
+:1069C00002020202020202020202020202020202A7
+:1069D0000202020202020202020202020202020297
+:1069E0000202020202020202020202020202020287
+:1069F0000202020202020202020202020202020277
+:106A00000202020202020202020202020202020266
+:106A10000202020202020202020202020202020256
+:106A20000202020202020202020202020202020246
+:106A30000202020202020202020202020202020236
+:106A40000202020202020202020202020202020226
+:106A50000202020202020202020202020202020216
+:106A60000202020202020202020202020202020206
+:106A700002020202020202020202020202020202F6
+:106A800002020202020202020202020202020202E6
+:106A900002020202020202020202020202020202D6
+:106AA00002020202020202020202020202020202C6
+:106AB00002020202020202020202020202020202B6
+:106AC00002020202020202020202020202020202A6
+:106AD0000202020202020202020202020202020296
+:106AE0000202020202020202020202020202020286
+:106AF0000202020202020202020202020202020276
+:106B00000202020202020202020202020202020265
+:106B10000202020202020202020202020202020255
+:106B20000202020202020202020202020202020245
+:106B30000202020202020202020202020202020235
+:106B40000202020202020202020202020202020225
+:106B50000202020202020202020202020202020215
+:106B60000202020202020202020202020202020205
+:106B700002020202020202020202020202020202F5
+:106B800002020202020202020202020202020202E5
+:106B900002020202020202020202020202020202D5
+:106BA00002020202020202020202020202020202C5
+:106BB00002020202020202020202020202020202B5
+:106BC00002020202020202020202020202020202A5
+:106BD0000202020202020202020202020202020295
+:106BE0000202020202020202020202020202020285
+:106BF0000202020202020202020202020202020275
+:106C00000202020202020202020202020202020264
+:106C10000202020202020202020202020202020254
+:106C20000202020202020202020202020202020244
+:106C30000202020202020202020202020202020234
+:106C40000202020202020202020202020202020224
+:106C50000202020202020202020202020202020214
+:106C60000202020202020202020202020202020204
+:106C700002020202020202020202020202020202F4
+:106C800002020202020202020202020202020202E4
+:106C900002020202020202020202020202020202D4
+:106CA00002020202020202020202020202020202C4
+:106CB00002020202020202020202020202020202B4
+:106CC00002020202020202020202020202020202A4
+:106CD0000202020202020202020202020202020294
+:106CE0000202020202020202020202020202020284
+:106CF0000202020202020202020202020202020274
+:106D00000202020202020202020202020202020263
+:106D10000202020202020202020202020202020253
+:106D20000202020202020202020202020202020243
+:106D30000202020202020202020202020202020233
+:106D40000202020202020202020202020202020223
+:106D50000202020202020202020202020202020213
+:106D60000202020202020202020202020202020203
+:106D700002020202020202020202020202020202F3
+:106D800002020202020202020202020202020202E3
+:106D900002020202020202020202020202020202D3
+:106DA00002020202020202020202020202020202C3
+:106DB00002020202020202020202020202020202B3
+:106DC00002020202020202020202020202020202A3
+:106DD0000202020202020202020202020202020293
+:106DE0000202020202020202020202020202020283
+:106DF0000202020202020202020202020202020273
+:106E00000202020202020202020202020202020262
+:106E10000202020202020202020202020202020252
+:106E20000202020202020202020202020202020242
+:106E30000202020202020202020202020202020232
+:106E40000202020202020202020202020202020222
+:106E50000202020202020202020202020202020212
+:106E60000202020202020202020202020202020202
+:106E700002020202020202020202020202020202F2
+:106E800002020202020202020202020202020202E2
+:106E900002020202020202020202020202020202D2
+:106EA00002020202020202020202020202020202C2
+:106EB00002020202020202020202020202020202B2
+:106EC00002020202020202020202020202020202A2
+:106ED0000202020202020202020202020202020292
+:106EE0000202020202020202020202020202020282
+:106EF0000202020202020202020202020202020272
+:106F00000202020202020202020202020202020063
+:106F10000000000000000000000000000000000071
+:106F20000000000000000000000000000000000061
+:106F30000000000000000000000000000000000051
+:106F40000000000000000000000000000000000041
+:106F50000000000000000000000000000000000031
+:106F60000000000000000000000000000000000021
+:106F70000000000000000000000000000000000011
+:106F80000000000000000000000000000000000001
+:106F900000000000000000000000000000000000F1
+:106FA00000000000000000000000000000000000E1
+:106FB00000000000000000000000000000000000D1
+:106FC00000000000000000000000000000000000C1
+:106FD00000000000000000000000000000000000B1
+:106FE00000000000000000000000000000000000A1
+:106FF0000000000000000000000000000000000091
+:107000000000000000000000000000000000000080
+:107010000000000000000000000000000000000070
+:107020000000000000000000000000000000000060
+:107030000000000000000000000000000000000050
+:107040000000000000000000000000000000000040
+:107050000000000000000000000000000000000030
+:107060000000000000000000000000000000000020
+:107070000000000000000000000000000000000010
+:107080000000000000000000000000000000000000
+:1070900000000000000000000000000000000000F0
+:1070A00000000000000000000000000000000000E0
+:1070B00000000000000000000000000000000000D0
+:1070C00000000000000000000000000000000000C0
+:1070D00000000000000000000000000000000000B0
+:1070E00000000000000000000000000000000000A0
+:1070F0000000000000000000000000000000000090
+:10710000000000000000000000000000000000007F
+:10711000000000000000000000000000000000006F
+:10712000000000000000000000000000000000005F
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000003F
+:10715000000000000000000000000000000000002F
+:10716000000000000000000000000000000000001F
+:10717000000000000000000000000000000000000F
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000000EF
+:1071A00000000000000000000000000000000000DF
+:1071B00000000000000000000000000000000000CF
+:1071C00000000000000000000000000000000000BF
+:1071D00000000000000000000000000000000000AF
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000008F
+:10720000000000000000000000000000000000007E
+:10721000000000000000000000000000000000006E
+:10722000000000000000000000000000000000005E
+:10723000000000000000000000000000000000004E
+:10724000000000000000000000000000000000003E
+:10725000000000000000000000000000000000002E
+:10726000000000000000000000000000000000001E
+:10727000000000000000000000000000000000000E
+:1072800000000000000000000000000000000000FE
+:1072900000000000000000000000000000000000EE
+:1072A00000000000000000000000000000000000DE
+:1072B00000000000000000000000000000000000CE
+:1072C00000000000000000000000000000000000BE
+:1072D00000000000000000000000000000000000AE
+:1072E000000000000000000000000000000000009E
+:1072F000000000000000000000000000000000008E
+:10730000000000000000000000000000000000007D
+:10731000000000000000000000000000000000006D
+:10732000000000000000000000000000000000005D
+:10733000000000000000000000000000000000004D
+:10734000000000000000000000000000000000003D
+:10735000000000000000000000000000000000002D
+:10736000000000000000000000000000000000001D
+:10737000000000000000000000000000000000000D
+:1073800000000000000000000000000000000000FD
+:1073900000000000000000000000000000000000ED
+:1073A00000000000000000000000000000000000DD
+:1073B00000000000000000000000000000000000CD
+:1073C00000000000000000000000000000000000BD
+:1073D00000000000000000000000000000000000AD
+:1073E000000000000000000000000000000000009D
+:1073F000000000000000000000000000000000008D
+:10740000000000000000000000000000000000007C
+:10741000000000000000000000000000000000006C
+:10742000000000000000000000000000000000005C
+:10743000000000000000000000000000000000004C
+:10744000000000000000000000000000000000003C
+:10745000000000000000000000000000000000002C
+:10746000000000000000000000000000000000001C
+:10747000000000000000000000000000000000000C
+:1074800000000000000000000000000000000000FC
+:1074900000000000000000000000000000000000EC
+:1074A00000000000000000000000000000000000DC
+:1074B00000000000000000000000000000000000CC
+:1074C00000000000000000000000000000000000BC
+:1074D00000000000000000000000000000000000AC
+:1074E000000000000000000000000000000000009C
+:1074F000000000000000000000000000000000008C
+:107500000000000000000000000000000000005526
+:107510000000000000000001010101010101010162
+:10752000010101010101010101010101010101014B
+:10753000010101010101010101010101010101013B
+:10754000010101010101010101010101010101012B
+:10755000010101010101010101010101010101011B
+:10756000010101010101010101010101010101010B
+:1075700001010101010101010101010101010101FB
+:1075800001010101010101010101010101010101EB
+:1075900001010101010101010101010101010101DB
+:1075A00001010101010101010101010101010101CB
+:1075B00001010101010101010101010101010101BB
+:1075C00001010101010101010101010101010101AB
+:1075D000010101010101010101010101010101019B
+:1075E000010101010101010101010101010101018B
+:1075F000010101010101010101010101010101017B
+:10760000010101010101010101010101010101016A
+:10761000010101010101010101010101010101015A
+:10762000010101010101010101010101010101014A
+:10763000010101010101010101010101010101013A
+:10764000010101010101010101010101010101012A
+:10765000010101010101010101010101010101011A
+:10766000010101010101010101010101010101010A
+:1076700001010101010101010101010101010101FA
+:1076800001010101010101010101010101010101EA
+:1076900001010101010101010101010101010101DA
+:1076A00001010101010101010101010101010101CA
+:1076B00001010101010101010101010101010101BA
+:1076C00001010101010101010101010101010101AA
+:1076D000010101010101010101010101010101019A
+:1076E000010101010101010101010101010101018A
+:1076F000010101010101010101010101010101017A
+:107700000101010101010101010101010101010169
+:107710000101010101010101010101010101010159
+:107720000101010101010101010101010101010149
+:107730000101010101010101010101010101010139
+:107740000101010101010101010101010101010129
+:107750000101010101010101010101010101010119
+:107760000101010101010101010101010101010109
+:1077700001010101010101010101010101010101F9
+:1077800001010101010101010101010101010101E9
+:1077900001010101010101010101010101010101D9
+:1077A00001010101010101010101010101010101C9
+:1077B00001010101010101010101010101010101B9
+:1077C00001010101010101010101010101010101A9
+:1077D0000101010101010101010101010101010199
+:1077E0000101010101010101010101010101010189
+:1077F0000101010101010101010101010101010179
+:107800000101010101010101010101010101010168
+:107810000101010101010101010101010101010158
+:107820000101010101010101010101010101010148
+:107830000101010101010101010101010101010138
+:107840000101010101010101010101010101010128
+:107850000101010101010101010101010101010118
+:107860000101010101010101010101010101010108
+:1078700001010101010101010101010101010101F8
+:1078800001010101010101010101010101010101E8
+:1078900001010101010101010101010101010101D8
+:1078A00001010101010101010101010101010101C8
+:1078B00001010101010101010101010101010101B8
+:1078C00001010101010101010101010101010101A8
+:1078D0000101010101010101010101010101010198
+:1078E0000101010101010101010101010101010188
+:1078F0000101010101010101010101010101010178
+:107900000101010101010101010101010101010167
+:107910000101010101010101010101010101010157
+:107920000101010101010101010101010101010147
+:107930000101010101010101010101010101010137
+:107940000101010101010101010101010101010127
+:107950000101010101010101010101010101010117
+:107960000101010101010101010101010101010107
+:1079700001010101010101010101010101010101F7
+:1079800001010101010101010101010101010101E7
+:1079900001010101010101010101010101010101D7
+:1079A00001010101010101010101010101010101C7
+:1079B00001010101010101010101010101010101B7
+:1079C00001010101010101010101010101010101A7
+:1079D0000101010101010101010101010101010197
+:1079E0000101010101010101010101010101010187
+:1079F0000101010101010101010101010101010177
+:107A00000101010101010101010101010101010166
+:107A10000101010101010101010101010101010156
+:107A20000101010101010101010101010101010146
+:107A30000101010101010101010101010101010136
+:107A40000101010101010101010101010101010126
+:107A50000101010101010101010101010101010116
+:107A60000101010101010101010101010101010106
+:107A700001010101010101010101010101010101F6
+:107A800001010101010101010101010101010101E6
+:107A900001010101010101010101010101010101D6
+:107AA00001010101010101010101010101010101C6
+:107AB00001010101010101010101010101010101B6
+:107AC00001010101010101010101010101010101A6
+:107AD0000101010101010101010101010101010196
+:107AE0000101010101010101010101010101010186
+:107AF0000101010101010101010101010101010176
+:107B00000101010101010101010101010101010165
+:107B10000101010101010101010101010101010155
+:107B20000101010101010101010101010101010145
+:107B30000101010101010101010101010101010135
+:107B40000101010101010101010101010101010125
+:107B50000101010101010101010101010101010115
+:107B60000101010101010101010101010101010105
+:107B700001010101010101010101010101010101F5
+:107B800001010101010101010101010101010101E5
+:107B900001010101010101010101010101010101D5
+:107BA00001010101010101010101010101010101C5
+:107BB00001010101010101010101010101010101B5
+:107BC00001010101010101010101010101010101A5
+:107BD0000101010101010101010101010101010195
+:107BE0000101010101010101010101010101010185
+:107BF0000101010101010101010101010101010175
+:107C00000101010101010101010101010101010164
+:107C10000101010101010101010101010101010154
+:107C20000101010101010101010101010101010144
+:107C30000101010101010101010101010101010134
+:107C40000101010101010101010101010101010124
+:107C50000101010101010101010101010101010114
+:107C60000101010101010101010101010101010104
+:107C700001010101010101010101010101010101F4
+:107C800001010101010101010101010101010101E4
+:107C900001010101010101010101010101010101D4
+:107CA00001010101010101010101010101010101C4
+:107CB00001010101010101010101010101010101B4
+:107CC00001010101010101010101010101010101A4
+:107CD0000101010101010101010101010101010194
+:107CE0000101010101010101010101010101010184
+:107CF0000101010101010101010101010101010174
+:107D00000101010101010101010101010101010163
+:107D10000101010101010101010101010101010153
+:107D20000101010101010101010101010101010143
+:107D30000101010101010101010101010101010133
+:107D40000101010101010101010101010101010123
+:107D50000101010101010101010101010101010113
+:107D60000101010101010101010101010101010103
+:107D700001010101010101010101010101010101F3
+:107D800001010101010101010101010101010101E3
+:107D900001010101010101010101010101010101D3
+:107DA00001010101010101010101010101010101C3
+:107DB00001010101010101010101010101010101B3
+:107DC00001010101010101010101010101010101A3
+:107DD0000101010101010101010101010101010193
+:107DE0000101010101010101010101010101010183
+:107DF0000101010101010101010101010101010173
+:107E00000101010101010101010101010101010162
+:107E10000101010101010101010101010101010152
+:107E20000101010101010101010101010101010142
+:107E30000101010101010101010101010101010132
+:107E40000101010101010101010101010101010122
+:107E50000101010101010101010101010101010112
+:107E60000101010101010101010101010101010102
+:107E700001010101010101010101010101010101F2
+:107E800001010101010101010101010101010101E2
+:107E900001010101010101010101010101010101D2
+:107EA00001010101010101010101010101010101C2
+:107EB00001010101010101010101010101010101B2
+:107EC00001010101010101010101010101010101A2
+:107ED0000101010101010101010101010101010192
+:107EE0000101010101010101010101010101010182
+:107EF0000101010101010101010101010101010172
+:107F00000101010101010101010101010101010161
+:107F10000101010101010101010101010101010151
+:107F20000101010101010101010101010101010141
+:107F30000101010101010101010101010101010131
+:107F40000101010101010101010101010101010121
+:107F50000101010101010101010101010101010111
+:107F60000101010101010101010101010101010101
+:107F700001010101010101010101010101010101F1
+:107F800001010101010101010101010101010101E1
+:107F900001010101010101010101010101010101D1
+:107FA00001010101010101010101010101010101C1
+:107FB00001010101010101010101010101010101B1
+:107FC00001010101010101010101010101010101A1
+:107FD0000101010101010101010101010101010191
+:107FE0000101010101010101010101010101010181
+:107FF0000101010101010101010101010101010171
+:108000000101010101010101010101010101010160
+:108010000101010101010101010101010101010150
+:108020000101010101010101010101010101010140
+:108030000101010101010101010101010101010130
+:108040000101010101010101010101010101010120
+:108050000101010101010101010101010101010110
+:108060000101010101010101010101010101010100
+:1080700001010101010101010101010101010101F0
+:1080800001010101010101010101010101010101E0
+:1080900001010101010101010101010101010101D0
+:1080A00001010101010101010101010101010101C0
+:1080B00001010101010101010101010101010101B0
+:1080C00001010101010101010101010101010101A0
+:1080D0000101010101010101010101010101010190
+:1080E0000101010101010101010101010101010180
+:1080F0000101010101010101010101010101010170
+:10810000010101010101010101010101010101015F
+:10811000010101010101010101010101010101014F
+:10812000010101010101010101010101010101013F
+:10813000010101010101010101010101010101012F
+:10814000010101010101010101010101010101011F
+:10815000010101010101010101010101010101010F
+:1081600001010101010101010101010101010101FF
+:1081700001010101010101010101010101010101EF
+:1081800001010101010101010101010101010101DF
+:1081900001010101010101010101010101010101CF
+:1081A00001010101010101010101010101010101BF
+:1081B00001010101010101010101010101010101AF
+:1081C000010101010101010101010101010101019F
+:1081D000010101010101010101010101010101018F
+:1081E000010101010101010101010101010101017F
+:1081F000010101010101010101010101010101016F
+:10820000010101010101010101010101010101015E
+:10821000010101010101010101010101010101014E
+:10822000010101010101010101010101010101013E
+:10823000010101010101010101010101010101012E
+:10824000010101010101010101010101010101011E
+:10825000010101010101010101010101010101010E
+:1082600001010101010101010101010101010101FE
+:1082700001010101010101010101010101010101EE
+:1082800001010101010101010101010101010101DE
+:1082900001010101010101010101010101010101CE
+:1082A00001010101010101010101010101010101BE
+:1082B00001010101010101010101010101010101AE
+:1082C000010101010101010101010101010101019E
+:1082D000010101010101010101010101010101018E
+:1082E000010101010101010101010101010101017E
+:1082F000010101010101010101010101010101016E
+:10830000010101010101010101010101010101015D
+:10831000010101010101010101010101010101014D
+:10832000010101010101010101010101010101013D
+:10833000010101010101010101010101010101012D
+:10834000010101010101010101010101010101011D
+:10835000010101010101010101010101010101010D
+:1083600001010101010101010101010101010101FD
+:1083700001010101010101010101010101010101ED
+:1083800001010101010101010101010101010101DD
+:1083900001010101010101010101010101010101CD
+:1083A00001010101010101010101010101010101BD
+:1083B00001010101010101010101010101010101AD
+:1083C000010101010101010101010101010101019D
+:1083D000010101010101010101010101010101018D
+:1083E000010101010101010101010101010101017D
+:1083F000010101010101010101010101010101016D
+:10840000010101010101010101010101010101015C
+:108410000101010101010100000000000000000055
+:10842000000000000000000000000000000000004C
+:10843000000000000000000000000000000000003C
+:10844000000000000000000000000000000000002C
+:10845000000000000000000000000000000000001C
+:10846000000000000000000000000000000000000C
+:1084700000000000000000000000000000000000FC
+:1084800000000000000000000000000000000000EC
+:1084900000000000000000000000000000000000DC
+:1084A00000000000000000000000000000000000CC
+:1084B00000000000000000000000000000000000BC
+:1084C00000000000000000000000000000000000AC
+:1084D000000000000000000000000000000000009C
+:1084E000000000000000000000000000000000008C
+:1084F000000000000000000000000000000000007C
+:10850000000000000000000000000000000000006B
+:10851000000000000000000000000000000000005B
+:10852000000000000000000000000000000000004B
+:10853000000000000000000000000000000000003B
+:10854000000000000000000000000000000000002B
+:10855000000000000000000000000000000000001B
+:10856000000000000000000000000000000000000B
+:1085700000000000000000000000000000000000FB
+:1085800000000000000000000000000000000000EB
+:1085900000000000000000000000000000000000DB
+:1085A00000000000000000000000000000000000CB
+:1085B00000000000000000000000000000000000BB
+:1085C00000000000000000000000000000000000AB
+:1085D000000000000000000000000000000000009B
+:1085E000000000000000000000000000000000008B
+:1085F000000000000000000000000000000000007B
+:10860000000000000000000000000000000000006A
+:10861000000000000000000000000000000000005A
+:10862000000000000000000000000000000000004A
+:10863000000000000000000000000000000000003A
+:10864000000000000000000000000000000000002A
+:10865000000000000000000000000000000000001A
+:10866000000000000000000000000000000000000A
+:1086700000000000000000000000000000000000FA
+:1086800000000000000000000000000000000000EA
+:1086900000000000000000000000000000000000DA
+:1086A00000000000000000000000000000000000CA
+:1086B00000000000000000000000000000000000BA
+:1086C00000000000000000000000000000000000AA
+:1086D000000000000000000000000000000000009A
+:1086E000000000000000000000000000000000008A
+:1086F000000000000000000000000000000000007A
+:108700000000000000000000000000000000000069
+:108710000000000000000000000000000000000059
+:108720000000000000000000000000000000000049
+:108730000000000000000000000000000000000039
+:108740000000000000000000000000000000000029
+:108750000000000000000000000000000000000019
+:108760000000000000000000000000000000000009
+:1087700000000000000000000000000000000000F9
+:1087800000000000000000000000000000000000E9
+:1087900000000000000000000000000000000000D9
+:1087A00000000000000000000000000000000000C9
+:1087B00000000000000000000000000000000000B9
+:1087C00000000000000000000000000000000000A9
+:1087D0000000000000000000000000000000000099
+:1087E0000000000000000000000000000000000089
+:1087F0000000000000000000000000000000000079
+:108800000000000000000000000000000000000068
+:108810000000000000000000000000000000000058
+:108820000000000000000000000000000000000048
+:108830000000000000000000000000000000000038
+:108840000000000000000000000000000000000028
+:108850000000000000000000000000000000000018
+:108860000000000000000000000000000000000008
+:1088700000000000000000000000000000000000F8
+:1088800000000000000000000000000000000000E8
+:1088900000000000000000000000000000000000D8
+:1088A00000000000000000000000000000000000C8
+:1088B00000000000000000000000000000000000B8
+:1088C00000000000000000000000000000000000A8
+:1088D0000000000000000000000000000000000098
+:1088E0000000000000000000000000000000000088
+:1088F0000000000000000000000000000000000078
+:108900000000000000000000000000000000000067
+:108910000000000000000000000000000000000057
+:108920000000000000000000000000000000000047
+:108930000000000000000000000000000000000037
+:108940000000000000000000000000000000000027
+:108950000000000000000000000000000000000017
+:108960000000000000000000000000000000000007
+:1089700000000000000000000000000000000000F7
+:1089800000000000000000000000000000000000E7
+:1089900000000000000000000000000000000000D7
+:1089A00000000000000000000000000000000000C7
+:1089B00000000000000000000000000000000000B7
+:1089C00000000000000000000000000000000000A7
+:1089D0000000000000000000000000000000000097
+:1089E0000000000000000000000000000000000087
+:1089F0000000000000000000000000000000000077
+:108A00000000000000000000000000000000000066
+:108A10000000000000000000000000000000000056
+:108A20000000000000000000000000000000000046
+:108A30000000000000000000000000000000000036
+:108A40000000000000000000000000000000000026
+:108A50000000000000000000000000000000000016
+:108A60000000000000000000000000000000000006
+:108A700000000000000000000000000000000000F6
+:108A800000000000000000000000000000000000E6
+:108A900000000000000000000000000000000000D6
+:108AA00000000000000000000000000000000000C6
+:108AB00000000000000000000000000000000000B6
+:108AC00000000000000000000000000000000000A6
+:108AD0000000000000000000000000000000000096
+:108AE0000000000000000000000000000000000086
+:108AF0000000000000000000000000000000000076
+:108B00000000000000000000000000000000000065
+:108B10000000000000000002020202020202020243
+:108B20000202020202020202020202020202020225
+:108B30000202020202020202020202020202020215
+:108B40000202020202020202020202020202020205
+:108B500002020202020202020202020202020202F5
+:108B600002020202020202020202020202020202E5
+:108B700002020202020202020202020202020202D5
+:108B800002020202020202020202020202020202C5
+:108B900002020202020202020202020202020202B5
+:108BA00002020202020202020202020202020202A5
+:108BB0000202020202020202020202020202020295
+:108BC0000202020202020202020202020202020285
+:108BD0000202020202020202020202020202020275
+:108BE0000202020202020202020202020202020265
+:108BF0000202020202020202020202020202020255
+:108C00000202020202020202020202020202020244
+:108C10000202020202020202020202020202020234
+:108C20000202020202020202020202020202020224
+:108C30000202020202020202020202020202020214
+:108C40000202020202020202020202020202020204
+:108C500002020202020202020202020202020202F4
+:108C600002020202020202020202020202020202E4
+:108C700002020202020202020202020202020202D4
+:108C800002020202020202020202020202020202C4
+:108C900002020202020202020202020202020202B4
+:108CA00002020202020202020202020202020202A4
+:108CB0000202020202020202020202020202020294
+:108CC0000202020202020202020202020202020284
+:108CD0000202020202020202020202020202020274
+:108CE0000202020202020202020202020202020264
+:108CF0000202020202020202020202020202020254
+:108D00000202020202020202020202020202020243
+:108D10000202020202020202020202020202020233
+:108D20000202020202020202020202020202020223
+:108D30000202020202020202020202020202020213
+:108D40000202020202020202020202020202020203
+:108D500002020202020202020202020202020202F3
+:108D600002020202020202020202020202020202E3
+:108D700002020202020202020202020202020202D3
+:108D800002020202020202020202020202020202C3
+:108D900002020202020202020202020202020202B3
+:108DA00002020202020202020202020202020202A3
+:108DB0000202020202020202020202020202020293
+:108DC0000202020202020202020202020202020283
+:108DD0000202020202020202020202020202020273
+:108DE0000202020202020202020202020202020263
+:108DF0000202020202020202020202020202020253
+:108E00000202020202020202020202020202020242
+:108E10000202020202020202020202020202020232
+:108E20000202020202020202020202020202020222
+:108E30000202020202020202020202020202020212
+:108E40000202020202020202020202020202020202
+:108E500002020202020202020202020202020202F2
+:108E600002020202020202020202020202020202E2
+:108E700002020202020202020202020202020202D2
+:108E800002020202020202020202020202020202C2
+:108E900002020202020202020202020202020202B2
+:108EA00002020202020202020202020202020202A2
+:108EB0000202020202020202020202020202020292
+:108EC0000202020202020202020202020202020282
+:108ED0000202020202020202020202020202020272
+:108EE0000202020202020202020202020202020262
+:108EF0000202020202020202020202020202020252
+:108F00000202020202020202020202020202020241
+:108F10000202020202020202020202020202020231
+:108F20000202020202020202020202020202020221
+:108F30000202020202020202020202020202020211
+:108F40000202020202020202020202020202020201
+:108F500002020202020202020202020202020202F1
+:108F600002020202020202020202020202020202E1
+:108F700002020202020202020202020202020202D1
+:108F800002020202020202020202020202020202C1
+:108F900002020202020202020202020202020202B1
+:108FA00002020202020202020202020202020202A1
+:108FB0000202020202020202020202020202020291
+:108FC0000202020202020202020202020202020281
+:108FD0000202020202020202020202020202020271
+:108FE0000202020202020202020202020202020261
+:108FF0000202020202020202020202020202020251
+:109000000202020202020202020202020202020240
+:109010000202020202020202020202020202020230
+:109020000202020202020202020202020202020220
+:109030000202020202020202020202020202020210
+:109040000202020202020202020202020202020200
+:1090500002020202020202020202020202020202F0
+:1090600002020202020202020202020202020202E0
+:1090700002020202020202020202020202020202D0
+:1090800002020202020202020202020202020202C0
+:1090900002020202020202020202020202020202B0
+:1090A00002020202020202020202020202020202A0
+:1090B0000202020202020202020202020202020290
+:1090C0000202020202020202020202020202020280
+:1090D0000202020202020202020202020202020270
+:1090E0000202020202020202020202020202020260
+:1090F0000202020202020202020202020202020250
+:10910000020202020202020202020202020202023F
+:10911000020202020202020202020202020202022F
+:10912000020202020202020202020202020202021F
+:10913000020202020202020202020202020202020F
+:1091400002020202020202020202020202020202FF
+:1091500002020202020202020202020202020202EF
+:1091600002020202020202020202020202020202DF
+:1091700002020202020202020202020202020202CF
+:1091800002020202020202020202020202020202BF
+:1091900002020202020202020202020202020202AF
+:1091A000020202020202020202020202020202029F
+:1091B000020202020202020202020202020202028F
+:1091C000020202020202020202020202020202027F
+:1091D000020202020202020202020202020202026F
+:1091E000020202020202020202020202020202025F
+:1091F000020202020202020202020202020202024F
+:10920000020202020202020202020202020202023E
+:10921000020202020202020202020202020202022E
+:10922000020202020202020202020202020202021E
+:10923000020202020202020202020202020202020E
+:1092400002020202020202020202020202020202FE
+:1092500002020202020202020202020202020202EE
+:1092600002020202020202020202020202020202DE
+:1092700002020202020202020202020202020202CE
+:1092800002020202020202020202020202020202BE
+:1092900002020202020202020202020202020202AE
+:1092A000020202020202020202020202020202029E
+:1092B000020202020202020202020202020202028E
+:1092C000020202020202020202020202020202027E
+:1092D000020202020202020202020202020202026E
+:1092E000020202020202020202020202020202025E
+:1092F000020202020202020202020202020202024E
+:10930000020202020202020202020202020202023D
+:10931000020202020202020202020202020202022D
+:10932000020202020202020202020202020202021D
+:10933000020202020202020202020202020202020D
+:1093400002020202020202020202020202020202FD
+:1093500002020202020202020202020202020202ED
+:1093600002020202020202020202020202020202DD
+:1093700002020202020202020202020202020202CD
+:1093800002020202020202020202020202020202BD
+:1093900002020202020202020202020202020202AD
+:1093A000020202020202020202020202020202029D
+:1093B000020202020202020202020202020202028D
+:1093C000020202020202020202020202020202027D
+:1093D000020202020202020202020202020202026D
+:1093E000020202020202020202020202020202025D
+:1093F000020202020202020202020202020202024D
+:10940000020202020202020202020202020202023C
+:10941000020202020202020202020202020202022C
+:10942000020202020202020202020202020202021C
+:10943000020202020202020202020202020202020C
+:1094400002020202020202020202020202020202FC
+:1094500002020202020202020202020202020202EC
+:1094600002020202020202020202020202020202DC
+:1094700002020202020202020202020202020202CC
+:1094800002020202020202020202020202020202BC
+:1094900002020202020202020202020202020202AC
+:1094A000020202020202020202020202020202029C
+:1094B000020202020202020202020202020202028C
+:1094C000020202020202020202020202020202027C
+:1094D000020202020202020202020202020202026C
+:1094E000020202020202020202020202020202025C
+:1094F000020202020202020202020202020202024C
+:10950000020202020202020202020202020202023B
+:10951000020202020202020202020202020202022B
+:10952000020202020202020202020202020202021B
+:10953000020202020202020202020202020202020B
+:1095400002020202020202020202020202020202FB
+:1095500002020202020202020202020202020202EB
+:1095600002020202020202020202020202020202DB
+:1095700002020202020202020202020202020202CB
+:1095800002020202020202020202020202020202BB
+:1095900002020202020202020202020202020202AB
+:1095A000020202020202020202020202020202029B
+:1095B000020202020202020202020202020202028B
+:1095C000020202020202020202020202020202027B
+:1095D000020202020202020202020202020202026B
+:1095E000020202020202020202020202020202025B
+:1095F000020202020202020202020202020202024B
+:10960000020202020202020202020202020202023A
+:10961000020202020202020202020202020202022A
+:10962000020202020202020202020202020202021A
+:10963000020202020202020202020202020202020A
+:1096400002020202020202020202020202020202FA
+:1096500002020202020202020202020202020202EA
+:1096600002020202020202020202020202020202DA
+:1096700002020202020202020202020202020202CA
+:1096800002020202020202020202020202020202BA
+:1096900002020202020202020202020202020202AA
+:1096A000020202020202020202020202020202029A
+:1096B000020202020202020202020202020202028A
+:1096C000020202020202020202020202020202027A
+:1096D000020202020202020202020202020202026A
+:1096E000020202020202020202020202020202025A
+:1096F000020202020202020202020202020202024A
+:109700000202020202020202020202020202020239
+:109710000202020202020202020202020202020229
+:109720000202020202020202020202020202020219
+:109730000202020202020202020202020202020209
+:1097400002020202020202020202020202020202F9
+:1097500002020202020202020202020202020202E9
+:1097600002020202020202020202020202020202D9
+:1097700002020202020202020202020202020202C9
+:1097800002020202020202020202020202020202B9
+:1097900002020202020202020202020202020202A9
+:1097A0000202020202020202020202020202020299
+:1097B0000202020202020202020202020202020289
+:1097C0000202020202020202020202020202020279
+:1097D0000202020202020202020202020202020269
+:1097E0000202020202020202020202020202020259
+:1097F0000202020202020202020202020202020249
+:109800000202020202020202020202020202020238
+:109810000202020202020202020202020202020228
+:109820000202020202020202020202020202020218
+:109830000202020202020202020202020202020208
+:1098400002020202020202020202020202020202F8
+:1098500002020202020202020202020202020202E8
+:1098600002020202020202020202020202020202D8
+:1098700002020202020202020202020202020202C8
+:1098800002020202020202020202020202020202B8
+:1098900002020202020202020202020202020202A8
+:1098A0000202020202020202020202020202020298
+:1098B0000202020202020202020202020202020288
+:1098C0000202020202020202020202020202020278
+:1098D0000202020202020202020202020202020268
+:1098E0000202020202020202020202020202020258
+:1098F0000202020202020202020202020202020248
+:109900000202020202020202020202020202020237
+:109910000202020202020202020202020202020227
+:109920000202020202020202020202020202020217
+:109930000202020202020202020202020202020207
+:1099400002020202020202020202020202020202F7
+:1099500002020202020202020202020202020202E7
+:1099600002020202020202020202020202020202D7
+:1099700002020202020202020202020202020202C7
+:1099800002020202020202020202020202020202B7
+:1099900002020202020202020202020202020202A7
+:1099A0000202020202020202020202020202020297
+:1099B0000202020202020202020202020202020287
+:1099C0000202020202020202020202020202020277
+:1099D0000202020202020202020202020202020267
+:1099E0000202020202020202020202020202020257
+:1099F0000202020202020202020202020202020247
+:109A00000202020202020202020202020202020236
+:109A10000202020202020200000000000000000038
+:109A20000000000000000000000000000000000036
+:109A30000000000000000000000000000000000026
+:109A40000000000000000000000000000000000016
+:109A50000000000000000000000000000000000006
+:109A600000000000000000000000000000000000F6
+:109A700000000000000000000000000000000000E6
+:109A800000000000000000000000000000000000D6
+:109A900000000000000000000000000000000000C6
+:109AA00000000000000000000000000000000000B6
+:109AB00000000000000000000000000000000000A6
+:109AC0000000000000000000000000000000000096
+:109AD0000000000000000000000000000000000086
+:109AE0000000000000000000000000000000000076
+:109AF0000000000000000000000000000000000066
+:109B00000000000000000000000000000000000055
+:109B10000000000000000000000000000000000045
+:109B20000000000000000000000000000000000035
+:109B30000000000000000000000000000000000025
+:109B40000000000000000000000000000000000015
+:109B50000000000000000000000000000000000005
+:109B600000000000000000000000000000000000F5
+:109B700000000000000000000000000000000000E5
+:109B800000000000000000000000000000000000D5
+:109B900000000000000000000000000000000000C5
+:109BA00000000000000000000000000000000000B5
+:109BB00000000000000000000000000000000000A5
+:109BC0000000000000000000000000000000000095
+:109BD0000000000000000000000000000000000085
+:109BE0000000000000000000000000000000000075
+:109BF0000000000000000000000000000000000065
+:109C00000000000000000000000000000000000054
+:109C10000000000000000000000000000000000044
+:109C20000000000000000000000000000000000034
+:109C30000000000000000000000000000000000024
+:109C40000000000000000000000000000000000014
+:109C50000000000000000000000000000000000004
+:109C600000000000000000000000000000000000F4
+:109C700000000000000000000000000000000000E4
+:109C800000000000000000000000000000000000D4
+:109C900000000000000000000000000000000000C4
+:109CA00000000000000000000000000000000000B4
+:109CB00000000000000000000000000000000000A4
+:109CC0000000000000000000000000000000000094
+:109CD0000000000000000000000000000000000084
+:109CE0000000000000000000000000000000000074
+:109CF0000000000000000000000000000000000064
+:109D00000000000000000000000000000000000053
+:109D10000000000000000000000000000000000043
+:109D20000000000000000000000000000000000033
+:109D30000000000000000000000000000000000023
+:109D40000000000000000000000000000000000013
+:109D50000000000000000000000000000000000003
+:109D600000000000000000000000000000000000F3
+:109D700000000000000000000000000000000000E3
+:109D800000000000000000000000000000000000D3
+:109D900000000000000000000000000000000000C3
+:109DA00000000000000000000000000000000000B3
+:109DB00000000000000000000000000000000000A3
+:109DC0000000000000000000000000000000000093
+:109DD0000000000000000000000000000000000083
+:109DE0000000000000000000000000000000000073
+:109DF0000000000000000000000000000000000063
+:109E00000000000000000000000000000000000052
+:109E10000000000000000000000000000000000042
+:109E20000000000000000000000000000000000032
+:109E30000000000000000000000000000000000022
+:109E40000000000000000000000000000000000012
+:109E50000000000000000000000000000000000002
+:109E600000000000000000000000000000000000F2
+:109E700000000000000000000000000000000000E2
+:109E800000000000000000000000000000000000D2
+:109E900000000000000000000000000000000000C2
+:109EA00000000000000000000000000000000000B2
+:109EB00000000000000000000000000000000000A2
+:109EC0000000000000000000000000000000000092
+:109ED0000000000000000000000000000000000082
+:109EE0000000000000000000000000000000000072
+:109EF0000000000000000000000000000000000062
+:109F00000000000000000000000000000000000051
+:109F10000000000000000000000000000000000041
+:109F20000000000000000000000000000000000031
+:109F30000000000000000000000000000000000021
+:109F40000000000000000000000000000000000011
+:109F50000000000000000000000000000000000001
+:109F600000000000000000000000000000000000F1
+:109F700000000000000000000000000000000000E1
+:109F800000000000000000000000000000000000D1
+:109F900000000000000000000000000000000000C1
+:109FA00000000000000000000000000000000000B1
+:109FB00000000000000000000000000000000000A1
+:109FC0000000000000000000000000000000000091
+:109FD0000000000000000000000000000000000081
+:109FE0000000000000000000000000000000000071
+:109FF0000000000000000000000000000000000061
+:10A000000000000000000000000000000000000050
+:10A010000000000000000000000000000000000040
+:10A020000000000000000000000000000000000030
+:10A030000000000000000000000000000000000020
+:10A040000000000000000000000000000000000010
+:10A050000000000000000000000000000000000000
+:10A0600000000000000000000000000000000000F0
+:10A0700000000000000000000000000000000000E0
+:10A0800000000000000000000000000000000000D0
+:10A0900000000000000000000000000000000000C0
+:10A0A00000000000000000000000000000000000B0
+:10A0B00000000000000000000000000000000000A0
+:10A0C0000000000000000000000000000000000090
+:10A0D0000000000000000000000000000000000080
+:10A0E0000000000000000000000000000000000070
+:10A0F0000000000000000000000000000000000060
+:10A10000000000000000000000000000000000004F
+:10A110000000000000000001010101010101010136
+:10A12000010101010101010101010101010101011F
+:10A13000010101010101010101010101010101010F
+:10A1400001010101010101010101010101010101FF
+:10A1500001010101010101010101010101010101EF
+:10A1600001010101010101010101010101010101DF
+:10A1700001010101010101010101010101010101CF
+:10A1800001010101010101010101010101010101BF
+:10A1900001010101010101010101010101010101AF
+:10A1A000010101010101010101010101010101019F
+:10A1B000010101010101010101010101010101018F
+:10A1C000010101010101010101010101010101017F
+:10A1D000010101010101010101010101010101016F
+:10A1E000010101010101010101010101010101015F
+:10A1F000010101010101010101010101010101014F
+:10A20000010101010101010101010101010101013E
+:10A21000010101010101010101010101010101012E
+:10A22000010101010101010101010101010101011E
+:10A23000010101010101010101010101010101010E
+:10A2400001010101010101010101010101010101FE
+:10A2500001010101010101010101010101010101EE
+:10A2600001010101010101010101010101010101DE
+:10A2700001010101010101010101010101010101CE
+:10A2800001010101010101010101010101010101BE
+:10A2900001010101010101010101010101010101AE
+:10A2A000010101010101010101010101010101019E
+:10A2B000010101010101010101010101010101018E
+:10A2C000010101010101010101010101010101017E
+:10A2D000010101010101010101010101010101016E
+:10A2E000010101010101010101010101010101015E
+:10A2F000010101010101010101010101010101014E
+:10A30000010101010101010101010101010101013D
+:10A31000010101010101010101010101010101012D
+:10A32000010101010101010101010101010101011D
+:10A33000010101010101010101010101010101010D
+:10A3400001010101010101010101010101010101FD
+:10A3500001010101010101010101010101010101ED
+:10A3600001010101010101010101010101010101DD
+:10A3700001010101010101010101010101010101CD
+:10A3800001010101010101010101010101010101BD
+:10A3900001010101010101010101010101010101AD
+:10A3A000010101010101010101010101010101019D
+:10A3B000010101010101010101010101010101018D
+:10A3C000010101010101010101010101010101017D
+:10A3D000010101010101010101010101010101016D
+:10A3E000010101010101010101010101010101015D
+:10A3F000010101010101010101010101010101014D
+:10A40000010101010101010101010101010101013C
+:10A41000010101010101010101010101010101012C
+:10A42000010101010101010101010101010101011C
+:10A43000010101010101010101010101010101010C
+:10A4400001010101010101010101010101010101FC
+:10A4500001010101010101010101010101010101EC
+:10A4600001010101010101010101010101010101DC
+:10A4700001010101010101010101010101010101CC
+:10A4800001010101010101010101010101010101BC
+:10A4900001010101010101010101010101010101AC
+:10A4A000010101010101010101010101010101019C
+:10A4B000010101010101010101010101010101018C
+:10A4C000010101010101010101010101010101017C
+:10A4D000010101010101010101010101010101016C
+:10A4E000010101010101010101010101010101015C
+:10A4F000010101010101010101010101010101014C
+:10A50000010101010101010101010101010101013B
+:10A51000010101010101010101010101010101012B
+:10A52000010101010101010101010101010101011B
+:10A53000010101010101010101010101010101010B
+:10A5400001010101010101010101010101010101FB
+:10A5500001010101010101010101010101010101EB
+:10A5600001010101010101010101010101010101DB
+:10A5700001010101010101010101010101010101CB
+:10A5800001010101010101010101010101010101BB
+:10A5900001010101010101010101010101010101AB
+:10A5A000010101010101010101010101010101019B
+:10A5B000010101010101010101010101010101018B
+:10A5C000010101010101010101010101010101017B
+:10A5D000010101010101010101010101010101016B
+:10A5E000010101010101010101010101010101015B
+:10A5F000010101010101010101010101010101014B
+:10A60000010101010101010101010101010101013A
+:10A61000010101010101010101010101010101012A
+:10A62000010101010101010101010101010101011A
+:10A63000010101010101010101010101010101010A
+:10A6400001010101010101010101010101010101FA
+:10A6500001010101010101010101010101010101EA
+:10A6600001010101010101010101010101010101DA
+:10A6700001010101010101010101010101010101CA
+:10A6800001010101010101010101010101010101BA
+:10A6900001010101010101010101010101010101AA
+:10A6A000010101010101010101010101010101019A
+:10A6B000010101010101010101010101010101018A
+:10A6C000010101010101010101010101010101017A
+:10A6D000010101010101010101010101010101016A
+:10A6E000010101010101010101010101010101015A
+:10A6F000010101010101010101010101010101014A
+:10A700000101010101010101010101010101010139
+:10A710000101010101010101010101010101010129
+:10A720000101010101010101010101010101010119
+:10A730000101010101010101010101010101010109
+:10A7400001010101010101010101010101010101F9
+:10A7500001010101010101010101010101010101E9
+:10A7600001010101010101010101010101010101D9
+:10A7700001010101010101010101010101010101C9
+:10A7800001010101010101010101010101010101B9
+:10A7900001010101010101010101010101010101A9
+:10A7A0000101010101010101010101010101010199
+:10A7B0000101010101010101010101010101010189
+:10A7C0000101010101010101010101010101010179
+:10A7D0000101010101010101010101010101010169
+:10A7E0000101010101010101010101010101010159
+:10A7F0000101010101010101010101010101010149
+:10A800000101010101010101010101010101010138
+:10A810000101010101010101010101010101010128
+:10A820000101010101010101010101010101010118
+:10A830000101010101010101010101010101010108
+:10A8400001010101010101010101010101010101F8
+:10A8500001010101010101010101010101010101E8
+:10A8600001010101010101010101010101010101D8
+:10A8700001010101010101010101010101010101C8
+:10A8800001010101010101010101010101010101B8
+:10A8900001010101010101010101010101010101A8
+:10A8A0000101010101010101010101010101010198
+:10A8B0000101010101010101010101010101010188
+:10A8C0000101010101010101010101010101010178
+:10A8D0000101010101010101010101010101010168
+:10A8E0000101010101010101010101010101010158
+:10A8F0000101010101010101010101010101010148
+:10A900000101010101010101010101010101010137
+:10A910000101010101010101010101010101010127
+:10A920000101010101010101010101010101010117
+:10A930000101010101010101010101010101010107
+:10A9400001010101010101010101010101010101F7
+:10A9500001010101010101010101010101010101E7
+:10A9600001010101010101010101010101010101D7
+:10A9700001010101010101010101010101010101C7
+:10A9800001010101010101010101010101010101B7
+:10A9900001010101010101010101010101010101A7
+:10A9A0000101010101010101010101010101010197
+:10A9B0000101010101010101010101010101010187
+:10A9C0000101010101010101010101010101010177
+:10A9D0000101010101010101010101010101010167
+:10A9E0000101010101010101010101010101010157
+:10A9F0000101010101010101010101010101010147
+:10AA00000101010101010101010101010101010136
+:10AA10000101010101010101010101010101010126
+:10AA20000101010101010101010101010101010116
+:10AA30000101010101010101010101010101010106
+:10AA400001010101010101010101010101010101F6
+:10AA500001010101010101010101010101010101E6
+:10AA600001010101010101010101010101010101D6
+:10AA700001010101010101010101010101010101C6
+:10AA800001010101010101010101010101010101B6
+:10AA900001010101010101010101010101010101A6
+:10AAA0000101010101010101010101010101010196
+:10AAB0000101010101010101010101010101010186
+:10AAC0000101010101010101010101010101010176
+:10AAD0000101010101010101010101010101010166
+:10AAE0000101010101010101010101010101010156
+:10AAF0000101010101010101010101010101010146
+:10AB00000101010101010101010101010101010135
+:10AB10000101010101010101010101010101010125
+:10AB20000101010101010101010101010101010115
+:10AB30000101010101010101010101010101010105
+:10AB400001010101010101010101010101010101F5
+:10AB500001010101010101010101010101010101E5
+:10AB600001010101010101010101010101010101D5
+:10AB700001010101010101010101010101010101C5
+:10AB800001010101010101010101010101010101B5
+:10AB900001010101010101010101010101010101A5
+:10ABA0000101010101010101010101010101010195
+:10ABB0000101010101010101010101010101010185
+:10ABC0000101010101010101010101010101010175
+:10ABD0000101010101010101010101010101010165
+:10ABE0000101010101010101010101010101010155
+:10ABF0000101010101010101010101010101010145
+:10AC00000101010101010101010101010101010134
+:10AC10000101010101010101010101010101010124
+:10AC20000101010101010101010101010101010114
+:10AC30000101010101010101010101010101010104
+:10AC400001010101010101010101010101010101F4
+:10AC500001010101010101010101010101010101E4
+:10AC600001010101010101010101010101010101D4
+:10AC700001010101010101010101010101010101C4
+:10AC800001010101010101010101010101010101B4
+:10AC900001010101010101010101010101010101A4
+:10ACA0000101010101010101010101010101010194
+:10ACB0000101010101010101010101010101010184
+:10ACC0000101010101010101010101010101010174
+:10ACD0000101010101010101010101010101010164
+:10ACE0000101010101010101010101010101010154
+:10ACF0000101010101010101010101010101010144
+:10AD00000101010101010101010101010101010133
+:10AD10000101010101010101010101010101010123
+:10AD20000101010101010101010101010101010113
+:10AD30000101010101010101010101010101010103
+:10AD400001010101010101010101010101010101F3
+:10AD500001010101010101010101010101010101E3
+:10AD600001010101010101010101010101010101D3
+:10AD700001010101010101010101010101010101C3
+:10AD800001010101010101010101010101010101B3
+:10AD900001010101010101010101010101010101A3
+:10ADA0000101010101010101010101010101010193
+:10ADB0000101010101010101010101010101010183
+:10ADC0000101010101010101010101010101010173
+:10ADD0000101010101010101010101010101010163
+:10ADE0000101010101010101010101010101010153
+:10ADF0000101010101010101010101010101010143
+:10AE00000101010101010101010101010101010132
+:10AE10000101010101010101010101010101010122
+:10AE20000101010101010101010101010101010112
+:10AE30000101010101010101010101010101010102
+:10AE400001010101010101010101010101010101F2
+:10AE500001010101010101010101010101010101E2
+:10AE600001010101010101010101010101010101D2
+:10AE700001010101010101010101010101010101C2
+:10AE800001010101010101010101010101010101B2
+:10AE900001010101010101010101010101010101A2
+:10AEA0000101010101010101010101010101010192
+:10AEB0000101010101010101010101010101010182
+:10AEC0000101010101010101010101010101010172
+:10AED0000101010101010101010101010101010162
+:10AEE0000101010101010101010101010101010152
+:10AEF0000101010101010101010101010101010142
+:10AF00000101010101010101010101010101010131
+:10AF10000101010101010101010101010101010121
+:10AF20000101010101010101010101010101010111
+:10AF30000101010101010101010101010101010101
+:10AF400001010101010101010101010101010101F1
+:10AF500001010101010101010101010101010101E1
+:10AF600001010101010101010101010101010101D1
+:10AF700001010101010101010101010101010101C1
+:10AF800001010101010101010101010101010101B1
+:10AF900001010101010101010101010101010101A1
+:10AFA0000101010101010101010101010101010191
+:10AFB0000101010101010101010101010101010181
+:10AFC0000101010101010101010101010101010171
+:10AFD0000101010101010101010101010101010161
+:10AFE0000101010101010101010101010101010151
+:10AFF0000101010101010101010101010101010141
+:10B000000101010101010101010101010101010130
+:10B010000101010101010100000000000000000029
+: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
+:10B710000000000000000002020202020202020217
+:10B7200002020202020202020202020202020202F9
+:10B7300002020202020202020202020202020202E9
+:10B7400002020202020202020202020202020202D9
+:10B7500002020202020202020202020202020202C9
+:10B7600002020202020202020202020202020202B9
+:10B7700002020202020202020202020202020202A9
+:10B780000202020202020202020202020202020299
+:10B790000202020202020202020202020202020289
+:10B7A0000202020202020202020202020202020279
+:10B7B0000202020202020202020202020202020269
+:10B7C0000202020202020202020202020202020259
+:10B7D0000202020202020202020202020202020249
+:10B7E0000202020202020202020202020202020239
+:10B7F0000202020202020202020202020202020229
+:10B800000202020202020202020202020202020218
+:10B810000202020202020202020202020202020208
+:10B8200002020202020202020202020202020202F8
+:10B8300002020202020202020202020202020202E8
+:10B8400002020202020202020202020202020202D8
+:10B8500002020202020202020202020202020202C8
+:10B8600002020202020202020202020202020202B8
+:10B8700002020202020202020202020202020202A8
+:10B880000202020202020202020202020202020298
+:10B890000202020202020202020202020202020288
+:10B8A0000202020202020202020202020202020278
+:10B8B0000202020202020202020202020202020268
+:10B8C0000202020202020202020202020202020258
+:10B8D0000202020202020202020202020202020248
+:10B8E0000202020202020202020202020202020238
+:10B8F0000202020202020202020202020202020228
+:10B900000202020202020202020202020202020217
+:10B910000202020202020202020202020202020207
+:10B9200002020202020202020202020202020202F7
+:10B9300002020202020202020202020202020202E7
+:10B9400002020202020202020202020202020202D7
+:10B9500002020202020202020202020202020202C7
+:10B9600002020202020202020202020202020202B7
+:10B9700002020202020202020202020202020202A7
+:10B980000202020202020202020202020202020297
+:10B990000202020202020202020202020202020287
+:10B9A0000202020202020202020202020202020277
+:10B9B0000202020202020202020202020202020267
+:10B9C0000202020202020202020202020202020257
+:10B9D0000202020202020202020202020202020247
+:10B9E0000202020202020202020202020202020237
+:10B9F0000202020202020202020202020202020227
+:10BA00000202020202020202020202020202020216
+:10BA10000202020202020202020202020202020206
+:10BA200002020202020202020202020202020202F6
+:10BA300002020202020202020202020202020202E6
+:10BA400002020202020202020202020202020202D6
+:10BA500002020202020202020202020202020202C6
+:10BA600002020202020202020202020202020202B6
+:10BA700002020202020202020202020202020202A6
+:10BA80000202020202020202020202020202020296
+:10BA90000202020202020202020202020202020286
+:10BAA0000202020202020202020202020202020276
+:10BAB0000202020202020202020202020202020266
+:10BAC0000202020202020202020202020202020256
+:10BAD0000202020202020202020202020202020246
+:10BAE0000202020202020202020202020202020236
+:10BAF0000202020202020202020202020202020226
+:10BB00000202020202020202020202020202020215
+:10BB10000202020202020202020202020202020205
+:10BB200002020202020202020202020202020202F5
+:10BB300002020202020202020202020202020202E5
+:10BB400002020202020202020202020202020202D5
+:10BB500002020202020202020202020202020202C5
+:10BB600002020202020202020202020202020202B5
+:10BB700002020202020202020202020202020202A5
+:10BB80000202020202020202020202020202020295
+:10BB90000202020202020202020202020202020285
+:10BBA0000202020202020202020202020202020275
+:10BBB0000202020202020202020202020202020265
+:10BBC0000202020202020202020202020202020255
+:10BBD0000202020202020202020202020202020245
+:10BBE0000202020202020202020202020202020235
+:10BBF0000202020202020202020202020202020225
+:10BC00000202020202020202020202020202020214
+:10BC10000202020202020202020202020202020204
+:10BC200002020202020202020202020202020202F4
+:10BC300002020202020202020202020202020202E4
+:10BC400002020202020202020202020202020202D4
+:10BC500002020202020202020202020202020202C4
+:10BC600002020202020202020202020202020202B4
+:10BC700002020202020202020202020202020202A4
+:10BC80000202020202020202020202020202020294
+:10BC90000202020202020202020202020202020284
+:10BCA0000202020202020202020202020202020274
+:10BCB0000202020202020202020202020202020264
+:10BCC0000202020202020202020202020202020254
+:10BCD0000202020202020202020202020202020244
+:10BCE0000202020202020202020202020202020234
+:10BCF0000202020202020202020202020202020224
+:10BD00000202020202020202020202020202020213
+:10BD10000202020202020202020202020202020203
+:10BD200002020202020202020202020202020202F3
+:10BD300002020202020202020202020202020202E3
+:10BD400002020202020202020202020202020202D3
+:10BD500002020202020202020202020202020202C3
+:10BD600002020202020202020202020202020202B3
+:10BD700002020202020202020202020202020202A3
+:10BD80000202020202020202020202020202020293
+:10BD90000202020202020202020202020202020283
+:10BDA0000202020202020202020202020202020273
+:10BDB0000202020202020202020202020202020263
+:10BDC0000202020202020202020202020202020253
+:10BDD0000202020202020202020202020202020243
+:10BDE0000202020202020202020202020202020233
+:10BDF0000202020202020202020202020202020223
+:10BE00000202020202020202020202020202020212
+:10BE10000202020202020202020202020202020202
+:10BE200002020202020202020202020202020202F2
+:10BE300002020202020202020202020202020202E2
+:10BE400002020202020202020202020202020202D2
+:10BE500002020202020202020202020202020202C2
+:10BE600002020202020202020202020202020202B2
+:10BE700002020202020202020202020202020202A2
+:10BE80000202020202020202020202020202020292
+:10BE90000202020202020202020202020202020282
+:10BEA0000202020202020202020202020202020272
+:10BEB0000202020202020202020202020202020262
+:10BEC0000202020202020202020202020202020252
+:10BED0000202020202020202020202020202020242
+:10BEE0000202020202020202020202020202020232
+:10BEF0000202020202020202020202020202020222
+:10BF00000202020202020202020202020202020211
+:10BF10000202020202020202020202020202020201
+:10BF200002020202020202020202020202020202F1
+:10BF300002020202020202020202020202020202E1
+:10BF400002020202020202020202020202020202D1
+:10BF500002020202020202020202020202020202C1
+:10BF600002020202020202020202020202020202B1
+:10BF700002020202020202020202020202020202A1
+:10BF80000202020202020202020202020202020291
+:10BF90000202020202020202020202020202020281
+:10BFA0000202020202020202020202020202020271
+:10BFB0000202020202020202020202020202020261
+:10BFC0000202020202020202020202020202020251
+:10BFD0000202020202020202020202020202020241
+:10BFE0000202020202020202020202020202020231
+:10BFF0000202020202020202020202020202020221
+:10C000000202020202020202020202020202020210
+:10C010000202020202020202020202020202020200
+:10C0200002020202020202020202020202020202F0
+:10C0300002020202020202020202020202020202E0
+:10C0400002020202020202020202020202020202D0
+:10C0500002020202020202020202020202020202C0
+:10C0600002020202020202020202020202020202B0
+:10C0700002020202020202020202020202020202A0
+:10C080000202020202020202020202020202020290
+:10C090000202020202020202020202020202020280
+:10C0A0000202020202020202020202020202020270
+:10C0B0000202020202020202020202020202020260
+:10C0C0000202020202020202020202020202020250
+:10C0D0000202020202020202020202020202020240
+:10C0E0000202020202020202020202020202020230
+:10C0F0000202020202020202020202020202020220
+:10C10000020202020202020202020202020202020F
+:10C1100002020202020202020202020202020202FF
+:10C1200002020202020202020202020202020202EF
+:10C1300002020202020202020202020202020202DF
+:10C1400002020202020202020202020202020202CF
+:10C1500002020202020202020202020202020202BF
+:10C1600002020202020202020202020202020202AF
+:10C17000020202020202020202020202020202029F
+:10C18000020202020202020202020202020202028F
+:10C19000020202020202020202020202020202027F
+:10C1A000020202020202020202020202020202026F
+:10C1B000020202020202020202020202020202025F
+:10C1C000020202020202020202020202020202024F
+:10C1D000020202020202020202020202020202023F
+:10C1E000020202020202020202020202020202022F
+:10C1F000020202020202020202020202020202021F
+:10C20000020202020202020202020202020202020E
+:10C2100002020202020202020202020202020202FE
+:10C2200002020202020202020202020202020202EE
+:10C2300002020202020202020202020202020202DE
+:10C2400002020202020202020202020202020202CE
+:10C2500002020202020202020202020202020202BE
+:10C2600002020202020202020202020202020202AE
+:10C27000020202020202020202020202020202029E
+:10C28000020202020202020202020202020202028E
+:10C29000020202020202020202020202020202027E
+:10C2A000020202020202020202020202020202026E
+:10C2B000020202020202020202020202020202025E
+:10C2C000020202020202020202020202020202024E
+:10C2D000020202020202020202020202020202023E
+:10C2E000020202020202020202020202020202022E
+:10C2F000020202020202020202020202020202021E
+:10C30000020202020202020202020202020202020D
+:10C3100002020202020202020202020202020202FD
+:10C3200002020202020202020202020202020202ED
+:10C3300002020202020202020202020202020202DD
+:10C3400002020202020202020202020202020202CD
+:10C3500002020202020202020202020202020202BD
+:10C3600002020202020202020202020202020202AD
+:10C37000020202020202020202020202020202029D
+:10C38000020202020202020202020202020202028D
+:10C39000020202020202020202020202020202027D
+:10C3A000020202020202020202020202020202026D
+:10C3B000020202020202020202020202020202025D
+:10C3C000020202020202020202020202020202024D
+:10C3D000020202020202020202020202020202023D
+:10C3E000020202020202020202020202020202022D
+:10C3F000020202020202020202020202020202021D
+:10C40000020202020202020202020202020202020C
+:10C4100002020202020202020202020202020202FC
+:10C4200002020202020202020202020202020202EC
+:10C4300002020202020202020202020202020202DC
+:10C4400002020202020202020202020202020202CC
+:10C4500002020202020202020202020202020202BC
+:10C4600002020202020202020202020202020202AC
+:10C47000020202020202020202020202020202029C
+:10C48000020202020202020202020202020202028C
+:10C49000020202020202020202020202020202027C
+:10C4A000020202020202020202020202020202026C
+:10C4B000020202020202020202020202020202025C
+:10C4C000020202020202020202020202020202024C
+:10C4D000020202020202020202020202020202023C
+:10C4E000020202020202020202020202020202022C
+:10C4F000020202020202020202020202020202021C
+:10C50000020202020202020202020202020202020B
+:10C5100002020202020202020202020202020202FB
+:10C5200002020202020202020202020202020202EB
+:10C5300002020202020202020202020202020202DB
+:10C5400002020202020202020202020202020202CB
+:10C5500002020202020202020202020202020202BB
+:10C5600002020202020202020202020202020202AB
+:10C57000020202020202020202020202020202029B
+:10C58000020202020202020202020202020202028B
+:10C59000020202020202020202020202020202027B
+:10C5A000020202020202020202020202020202026B
+:10C5B000020202020202020202020202020202025B
+:10C5C000020202020202020202020202020202024B
+:10C5D000020202020202020202020202020202023B
+:10C5E000020202020202020202020202020202022B
+:10C5F000020202020202020202020202020202021B
+:10C60000020202020202020202020202020202020A
+:10C61000020202020202020000000000000000000C
+: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
+:10CA100000000000000000550000000000000001C0
+:10CA200001010101010101010101010101010101F6
+:10CA300001010101010101010101010101010101E6
+:10CA400001010101010101010101010101010101D6
+:10CA500001010101010101010101010101010101C6
+:10CA600001010101010101010101010101010101B6
+:10CA700001010101010101010101010101010101A6
+:10CA80000101010101010101010101010101010196
+:10CA90000101010101010101010101010101010186
+:10CAA0000101010101010101010101010101010176
+:10CAB0000101010101010101010101010101010166
+:10CAC0000101010101010101010101010101010156
+:10CAD0000101010101010101010101010101010146
+:10CAE0000101010101010101010101010101010136
+:10CAF0000101010101010101010101010101010126
+:10CB00000101010101010101010101010101010115
+:10CB10000101010101010101010101010101010105
+:10CB200001010101010101010101010101010101F5
+:10CB300001010101010101010101010101010101E5
+:10CB400001010101010101010101010101010101D5
+:10CB500001010101010101010101010101010101C5
+:10CB600001010101010101010101010101010101B5
+:10CB700001010101010101010101010101010101A5
+:10CB80000101010101010101010101010101010195
+:10CB90000101010101010101010101010101010185
+:10CBA0000101010101010101010101010101010175
+:10CBB0000101010101010101010101010101010165
+:10CBC0000101010101010101010101010101010155
+:10CBD0000101010101010101010101010101010145
+:10CBE0000101010101010101010101010101010135
+:10CBF0000101010101010101010101010101010125
+:10CC00000101010101010101010101010101010114
+:10CC10000101010101010101010101010101010104
+:10CC200001010101010101010101010101010101F4
+:10CC300001010101010101010101010101010101E4
+:10CC400001010101010101010101010101010101D4
+:10CC500001010101010101010101010101010101C4
+:10CC600001010101010101010101010101010101B4
+:10CC700001010101010101010101010101010101A4
+:10CC80000101010101010101010101010101010194
+:10CC90000101010101010101010101010101010184
+:10CCA0000101010101010101010101010101010174
+:10CCB0000101010101010101010101010101010164
+:10CCC0000101010101010101010101010101010154
+:10CCD0000101010101010101010101010101010144
+:10CCE0000101010101010101010101010101010134
+:10CCF0000101010101010101010101010101010124
+:10CD00000101010101010101010101010101010113
+:10CD10000101010101010101010101010101010103
+:10CD200001010101010101010101010101010101F3
+:10CD300001010101010101010101010101010101E3
+:10CD400001010101010101010101010101010101D3
+:10CD500001010101010101010101010101010101C3
+:10CD600001010101010101010101010101010101B3
+:10CD700001010101010101010101010101010101A3
+:10CD80000101010101010101010101010101010193
+:10CD90000101010101010101010101010101010183
+:10CDA0000101010101010101010101010101010173
+:10CDB0000101010101010101010101010101010163
+:10CDC0000101010101010101010101010101010153
+:10CDD0000101010101010101010101010101010143
+:10CDE0000101010101010101010101010101010133
+:10CDF0000101010101010101010101010101010123
+:10CE00000101010101010101010101010101010112
+:10CE10000101010101010101010101010101010102
+:10CE200001010101010101010101010101010101F2
+:10CE300001010101010101010101010101010101E2
+:10CE400001010101010101010101010101010101D2
+:10CE500001010101010101010101010101010101C2
+:10CE600001010101010101010101010101010101B2
+:10CE700001010101010101010101010101010101A2
+:10CE80000101010101010101010101010101010192
+:10CE90000101010101010101010101010101010182
+:10CEA0000101010101010101010101010101010172
+:10CEB0000101010101010101010101010101010162
+:10CEC0000101010101010101010101010101010152
+:10CED0000101010101010101010101010101010142
+:10CEE0000101010101010101010101010101010132
+:10CEF0000101010101010101010101010101010122
+:10CF00000101010101010101010101010101010111
+:10CF10000101010101010101010101010101010101
+:10CF200001010101010101010101010101010101F1
+:10CF300001010101010101010101010101010101E1
+:10CF400001010101010101010101010101010101D1
+:10CF500001010101010101010101010101010101C1
+:10CF600001010101010101010101010101010101B1
+:10CF700001010101010101010101010101010101A1
+:10CF80000101010101010101010101010101010191
+:10CF90000101010101010101010101010101010181
+:10CFA0000101010101010101010101010101010171
+:10CFB0000101010101010101010101010101010161
+:10CFC0000101010101010101010101010101010151
+:10CFD0000101010101010101010101010101010141
+:10CFE0000101010101010101010101010101010131
+:10CFF0000101010101010101010101010101010121
+:10D000000101010101010101010101010101010110
+:10D010000101010101010101010101010101010100
+:10D0200001010101010101010101010101010101F0
+:10D0300001010101010101010101010101010101E0
+:10D0400001010101010101010101010101010101D0
+:10D0500001010101010101010101010101010101C0
+:10D0600001010101010101010101010101010101B0
+:10D0700001010101010101010101010101010101A0
+:10D080000101010101010101010101010101010190
+:10D090000101010101010101010101010101010180
+:10D0A0000101010101010101010101010101010170
+:10D0B0000101010101010101010101010101010160
+:10D0C0000101010101010101010101010101010150
+:10D0D0000101010101010101010101010101010140
+:10D0E0000101010101010101010101010101010130
+:10D0F0000101010101010101010101010101010120
+:10D10000010101010101010101010101010101010F
+:10D1100001010101010101010101010101010101FF
+:10D1200001010101010101010101010101010101EF
+:10D1300001010101010101010101010101010101DF
+:10D1400001010101010101010101010101010101CF
+:10D1500001010101010101010101010101010101BF
+:10D1600001010101010101010101010101010101AF
+:10D17000010101010101010101010101010101019F
+:10D18000010101010101010101010101010101018F
+:10D19000010101010101010101010101010101017F
+:10D1A000010101010101010101010101010101016F
+:10D1B000010101010101010101010101010101015F
+:10D1C000010101010101010101010101010101014F
+:10D1D000010101010101010101010101010101013F
+:10D1E000010101010101010101010101010101012F
+:10D1F000010101010101010101010101010101011F
+:10D20000010101010101010101010101010101010E
+:10D2100001010101010101010101010101010101FE
+:10D2200001010101010101010101010101010101EE
+:10D2300001010101010101010101010101010101DE
+:10D2400001010101010101010101010101010101CE
+:10D2500001010101010101010101010101010101BE
+:10D2600001010101010101010101010101010101AE
+:10D27000010101010101010101010101010101019E
+:10D28000010101010101010101010101010101018E
+:10D29000010101010101010101010101010101017E
+:10D2A000010101010101010101010101010101016E
+:10D2B000010101010101010101010101010101015E
+:10D2C000010101010101010101010101010101014E
+:10D2D000010101010101010101010101010101013E
+:10D2E000010101010101010101010101010101012E
+:10D2F000010101010101010101010101010101011E
+:10D30000010101010101010101010101010101010D
+:10D3100001010101010101010101010101010101FD
+:10D3200001010101010101010101010101010101ED
+:10D3300001010101010101010101010101010101DD
+:10D3400001010101010101010101010101010101CD
+:10D3500001010101010101010101010101010101BD
+:10D3600001010101010101010101010101010101AD
+:10D37000010101010101010101010101010101019D
+:10D38000010101010101010101010101010101018D
+:10D39000010101010101010101010101010101017D
+:10D3A000010101010101010101010101010101016D
+:10D3B000010101010101010101010101010101015D
+:10D3C000010101010101010101010101010101014D
+:10D3D000010101010101010101010101010101013D
+:10D3E000010101010101010101010101010101012D
+:10D3F000010101010101010101010101010101011D
+:10D40000010101010101010101010101010101010C
+:10D4100001010101010101010101010101010101FC
+:10D4200001010101010101010101010101010101EC
+:10D4300001010101010101010101010101010101DC
+:10D4400001010101010101010101010101010101CC
+:10D4500001010101010101010101010101010101BC
+:10D4600001010101010101010101010101010101AC
+:10D47000010101010101010101010101010101019C
+:10D48000010101010101010101010101010101018C
+:10D49000010101010101010101010101010101017C
+:10D4A000010101010101010101010101010101016C
+:10D4B000010101010101010101010101010101015C
+:10D4C000010101010101010101010101010101014C
+:10D4D000010101010101010101010101010101013C
+:10D4E000010101010101010101010101010101012C
+:10D4F000010101010101010101010101010101011C
+:10D50000010101010101010101010101010101010B
+:10D5100001010101010101010101010101010101FB
+:10D5200001010101010101010101010101010101EB
+:10D5300001010101010101010101010101010101DB
+:10D5400001010101010101010101010101010101CB
+:10D5500001010101010101010101010101010101BB
+:10D5600001010101010101010101010101010101AB
+:10D57000010101010101010101010101010101019B
+:10D58000010101010101010101010101010101018B
+:10D59000010101010101010101010101010101017B
+:10D5A000010101010101010101010101010101016B
+:10D5B000010101010101010101010101010101015B
+:10D5C000010101010101010101010101010101014B
+:10D5D000010101010101010101010101010101013B
+:10D5E000010101010101010101010101010101012B
+:10D5F000010101010101010101010101010101011B
+:10D60000010101010101010101010101010101010A
+:10D6100001010101010101010101010101010101FA
+:10D6200001010101010101010101010101010101EA
+:10D6300001010101010101010101010101010101DA
+:10D6400001010101010101010101010101010101CA
+:10D6500001010101010101010101010101010101BA
+:10D6600001010101010101010101010101010101AA
+:10D67000010101010101010101010101010101019A
+:10D68000010101010101010101010101010101018A
+:10D69000010101010101010101010101010101017A
+:10D6A000010101010101010101010101010101016A
+:10D6B000010101010101010101010101010101015A
+:10D6C000010101010101010101010101010101014A
+:10D6D000010101010101010101010101010101013A
+:10D6E000010101010101010101010101010101012A
+:10D6F000010101010101010101010101010101011A
+:10D700000101010101010101010101010101010109
+:10D7100001010101010101010101010101010101F9
+:10D7200001010101010101010101010101010101E9
+:10D7300001010101010101010101010101010101D9
+:10D7400001010101010101010101010101010101C9
+:10D7500001010101010101010101010101010101B9
+:10D7600001010101010101010101010101010101A9
+:10D770000101010101010101010101010101010199
+:10D780000101010101010101010101010101010189
+:10D790000101010101010101010101010101010179
+:10D7A0000101010101010101010101010101010169
+:10D7B0000101010101010101010101010101010159
+:10D7C0000101010101010101010101010101010149
+:10D7D0000101010101010101010101010101010139
+:10D7E0000101010101010101010101010101010129
+:10D7F0000101010101010101010101010101010119
+:10D800000101010101010101010101010101010108
+:10D8100001010101010101010101010101010100F9
+:10D8200000000000000000000000000000000000F8
+:10D8300000000000000000000000000000000000E8
+:10D8400000000000000000000000000000000000D8
+:10D8500000000000000000000000000000000000C8
+:10D8600000000000000000000000000000000000B8
+:10D8700000000000000000000000000000000000A8
+:10D880000000000000000000000000000000000098
+:10D890000000000000000000000000000000000088
+:10D8A0000000000000000000000000000000000078
+:10D8B0000000000000000000000000000000000068
+:10D8C0000000000000000000000000000000000058
+:10D8D0000000000000000000000000000000000048
+:10D8E0000000000000000000000000000000000038
+:10D8F0000000000000000000000000000000000028
+:10D900000000000000000000000000000000000017
+:10D910000000000000000000000000000000000007
+:10D9200000000000000000000000000000000000F7
+:10D9300000000000000000000000000000000000E7
+:10D9400000000000000000000000000000000000D7
+:10D9500000000000000000000000000000000000C7
+:10D9600000000000000000000000000000000000B7
+:10D9700000000000000000000000000000000000A7
+:10D980000000000000000000000000000000000097
+:10D990000000000000000000000000000000000087
+:10D9A0000000000000000000000000000000000077
+:10D9B0000000000000000000000000000000000067
+:10D9C0000000000000000000000000000000000057
+:10D9D0000000000000000000000000000000000047
+:10D9E0000000000000000000000000000000000037
+:10D9F0000000000000000000000000000000000027
+:10DA00000000000000000000000000000000000016
+:10DA10000000000000000000000000000000000006
+:10DA200000000000000000000000000000000000F6
+:10DA300000000000000000000000000000000000E6
+:10DA400000000000000000000000000000000000D6
+:10DA500000000000000000000000000000000000C6
+:10DA600000000000000000000000000000000000B6
+:10DA700000000000000000000000000000000000A6
+:10DA80000000000000000000000000000000000096
+:10DA90000000000000000000000000000000000086
+:10DAA0000000000000000000000000000000000076
+:10DAB0000000000000000000000000000000000066
+:10DAC0000000000000000000000000000000000056
+:10DAD0000000000000000000000000000000000046
+:10DAE0000000000000000000000000000000000036
+:10DAF0000000000000000000000000000000000026
+:10DB00000000000000000000000000000000000015
+:10DB10000000000000000000000000000000000005
+:10DB200000000000000000000000000000000000F5
+:10DB300000000000000000000000000000000000E5
+:10DB400000000000000000000000000000000000D5
+:10DB500000000000000000000000000000000000C5
+:10DB600000000000000000000000000000000000B5
+:10DB700000000000000000000000000000000000A5
+:10DB80000000000000000000000000000000000095
+:10DB90000000000000000000000000000000000085
+:10DBA0000000000000000000000000000000000075
+:10DBB0000000000000000000000000000000000065
+:10DBC0000000000000000000000000000000000055
+:10DBD0000000000000000000000000000000000045
+:10DBE0000000000000000000000000000000000035
+:10DBF0000000000000000000000000000000000025
+:10DC00000000000000000000000000000000000014
+:10DC10000000000000000000000000000000000004
+:10DC200000000000000000000000000000000000F4
+:10DC300000000000000000000000000000000000E4
+:10DC400000000000000000000000000000000000D4
+:10DC500000000000000000000000000000000000C4
+:10DC600000000000000000000000000000000000B4
+:10DC700000000000000000000000000000000000A4
+:10DC80000000000000000000000000000000000094
+:10DC90000000000000000000000000000000000084
+:10DCA0000000000000000000000000000000000074
+:10DCB0000000000000000000000000000000000064
+:10DCC0000000000000000000000000000000000054
+:10DCD0000000000000000000000000000000000044
+:10DCE0000000000000000000000000000000000034
+:10DCF0000000000000000000000000000000000024
+:10DD00000000000000000000000000000000000013
+:10DD10000000000000000000000000000000000003
+:10DD200000000000000000000000000000000000F3
+:10DD300000000000000000000000000000000000E3
+:10DD400000000000000000000000000000000000D3
+:10DD500000000000000000000000000000000000C3
+:10DD600000000000000000000000000000000000B3
+:10DD700000000000000000000000000000000000A3
+:10DD80000000000000000000000000000000000093
+:10DD90000000000000000000000000000000000083
+:10DDA0000000000000000000000000000000000073
+:10DDB0000000000000000000000000000000000063
+:10DDC0000000000000000000000000000000000053
+:10DDD0000000000000000000000000000000000043
+:10DDE0000000000000000000000000000000000033
+:10DDF0000000000000000000000000000000000023
+:10DE00000000000000000000000000000000000012
+:10DE10000000000000000000000000000000000002
+:10DE200000000000000000000000000000000000F2
+:10DE300000000000000000000000000000000000E2
+:10DE400000000000000000000000000000000000D2
+:10DE500000000000000000000000000000000000C2
+:10DE600000000000000000000000000000000000B2
+:10DE700000000000000000000000000000000000A2
+:10DE80000000000000000000000000000000000092
+:10DE90000000000000000000000000000000000082
+:10DEA0000000000000000000000000000000000072
+:10DEB0000000000000000000000000000000000062
+:10DEC0000000000000000000000000000000000052
+:10DED0000000000000000000000000000000000042
+:10DEE0000000000000000000000000000000000032
+:10DEF0000000000000000000000000000000000022
+:10DF00000000000000000000000000000000000011
+:10DF100000000000000000000000000000000002FF
+:10DF200002020202020202020202020202020202D1
+:10DF300002020202020202020202020202020202C1
+:10DF400002020202020202020202020202020202B1
+:10DF500002020202020202020202020202020202A1
+:10DF60000202020202020202020202020202020291
+:10DF70000202020202020202020202020202020281
+:10DF80000202020202020202020202020202020271
+:10DF90000202020202020202020202020202020261
+:10DFA0000202020202020202020202020202020251
+:10DFB0000202020202020202020202020202020241
+:10DFC0000202020202020202020202020202020231
+:10DFD0000202020202020202020202020202020221
+:10DFE0000202020202020202020202020202020211
+:10DFF0000202020202020202020202020202020201
+:10E0000002020202020202020202020202020202F0
+:10E0100002020202020202020202020202020202E0
+:10E0200002020202020202020202020202020202D0
+:10E0300002020202020202020202020202020202C0
+:10E0400002020202020202020202020202020202B0
+:10E0500002020202020202020202020202020202A0
+:10E060000202020202020202020202020202020290
+:10E070000202020202020202020202020202020280
+:10E080000202020202020202020202020202020270
+:10E090000202020202020202020202020202020260
+:10E0A0000202020202020202020202020202020250
+:10E0B0000202020202020202020202020202020240
+:10E0C0000202020202020202020202020202020230
+:10E0D0000202020202020202020202020202020220
+:10E0E0000202020202020202020202020202020210
+:10E0F0000202020202020202020202020202020200
+:10E1000002020202020202020202020202020202EF
+:10E1100002020202020202020202020202020202DF
+:10E1200002020202020202020202020202020202CF
+:10E1300002020202020202020202020202020202BF
+:10E1400002020202020202020202020202020202AF
+:10E15000020202020202020202020202020202029F
+:10E16000020202020202020202020202020202028F
+:10E17000020202020202020202020202020202027F
+:10E18000020202020202020202020202020202026F
+:10E19000020202020202020202020202020202025F
+:10E1A000020202020202020202020202020202024F
+:10E1B000020202020202020202020202020202023F
+:10E1C000020202020202020202020202020202022F
+:10E1D000020202020202020202020202020202021F
+:10E1E000020202020202020202020202020202020F
+:10E1F00002020202020202020202020202020202FF
+:10E2000002020202020202020202020202020202EE
+:10E2100002020202020202020202020202020202DE
+:10E2200002020202020202020202020202020202CE
+:10E2300002020202020202020202020202020202BE
+:10E2400002020202020202020202020202020202AE
+:10E25000020202020202020202020202020202029E
+:10E26000020202020202020202020202020202028E
+:10E27000020202020202020202020202020202027E
+:10E28000020202020202020202020202020202026E
+:10E29000020202020202020202020202020202025E
+:10E2A000020202020202020202020202020202024E
+:10E2B000020202020202020202020202020202023E
+:10E2C000020202020202020202020202020202022E
+:10E2D000020202020202020202020202020202021E
+:10E2E000020202020202020202020202020202020E
+:10E2F00002020202020202020202020202020202FE
+:10E3000002020202020202020202020202020202ED
+:10E3100002020202020202020202020202020202DD
+:10E3200002020202020202020202020202020202CD
+:10E3300002020202020202020202020202020202BD
+:10E3400002020202020202020202020202020202AD
+:10E35000020202020202020202020202020202029D
+:10E36000020202020202020202020202020202028D
+:10E37000020202020202020202020202020202027D
+:10E38000020202020202020202020202020202026D
+:10E39000020202020202020202020202020202025D
+:10E3A000020202020202020202020202020202024D
+:10E3B000020202020202020202020202020202023D
+:10E3C000020202020202020202020202020202022D
+:10E3D000020202020202020202020202020202021D
+:10E3E000020202020202020202020202020202020D
+:10E3F00002020202020202020202020202020202FD
+:10E4000002020202020202020202020202020202EC
+:10E4100002020202020202020202020202020202DC
+:10E4200002020202020202020202020202020202CC
+:10E4300002020202020202020202020202020202BC
+:10E4400002020202020202020202020202020202AC
+:10E45000020202020202020202020202020202029C
+:10E46000020202020202020202020202020202028C
+:10E47000020202020202020202020202020202027C
+:10E48000020202020202020202020202020202026C
+:10E49000020202020202020202020202020202025C
+:10E4A000020202020202020202020202020202024C
+:10E4B000020202020202020202020202020202023C
+:10E4C000020202020202020202020202020202022C
+:10E4D000020202020202020202020202020202021C
+:10E4E000020202020202020202020202020202020C
+:10E4F00002020202020202020202020202020202FC
+:10E5000002020202020202020202020202020202EB
+:10E5100002020202020202020202020202020202DB
+:10E5200002020202020202020202020202020202CB
+:10E5300002020202020202020202020202020202BB
+:10E5400002020202020202020202020202020202AB
+:10E55000020202020202020202020202020202029B
+:10E56000020202020202020202020202020202028B
+:10E57000020202020202020202020202020202027B
+:10E58000020202020202020202020202020202026B
+:10E59000020202020202020202020202020202025B
+:10E5A000020202020202020202020202020202024B
+:10E5B000020202020202020202020202020202023B
+:10E5C000020202020202020202020202020202022B
+:10E5D000020202020202020202020202020202021B
+:10E5E000020202020202020202020202020202020B
+:10E5F00002020202020202020202020202020202FB
+:10E6000002020202020202020202020202020202EA
+:10E6100002020202020202020202020202020202DA
+:10E6200002020202020202020202020202020202CA
+:10E6300002020202020202020202020202020202BA
+:10E6400002020202020202020202020202020202AA
+:10E65000020202020202020202020202020202029A
+:10E66000020202020202020202020202020202028A
+:10E67000020202020202020202020202020202027A
+:10E68000020202020202020202020202020202026A
+:10E69000020202020202020202020202020202025A
+:10E6A000020202020202020202020202020202024A
+:10E6B000020202020202020202020202020202023A
+:10E6C000020202020202020202020202020202022A
+:10E6D000020202020202020202020202020202021A
+:10E6E000020202020202020202020202020202020A
+:10E6F00002020202020202020202020202020202FA
+:10E7000002020202020202020202020202020202E9
+:10E7100002020202020202020202020202020202D9
+:10E7200002020202020202020202020202020202C9
+:10E7300002020202020202020202020202020202B9
+:10E7400002020202020202020202020202020202A9
+:10E750000202020202020202020202020202020299
+:10E760000202020202020202020202020202020289
+:10E770000202020202020202020202020202020279
+:10E780000202020202020202020202020202020269
+:10E790000202020202020202020202020202020259
+:10E7A0000202020202020202020202020202020249
+:10E7B0000202020202020202020202020202020239
+:10E7C0000202020202020202020202020202020229
+:10E7D0000202020202020202020202020202020219
+:10E7E0000202020202020202020202020202020209
+:10E7F00002020202020202020202020202020202F9
+:10E8000002020202020202020202020202020202E8
+:10E8100002020202020202020202020202020202D8
+:10E8200002020202020202020202020202020202C8
+:10E8300002020202020202020202020202020202B8
+:10E8400002020202020202020202020202020202A8
+:10E850000202020202020202020202020202020298
+:10E860000202020202020202020202020202020288
+:10E870000202020202020202020202020202020278
+:10E880000202020202020202020202020202020268
+:10E890000202020202020202020202020202020258
+:10E8A0000202020202020202020202020202020248
+:10E8B0000202020202020202020202020202020238
+:10E8C0000202020202020202020202020202020228
+:10E8D0000202020202020202020202020202020218
+:10E8E0000202020202020202020202020202020208
+:10E8F00002020202020202020202020202020202F8
+:10E9000002020202020202020202020202020202E7
+:10E9100002020202020202020202020202020202D7
+:10E9200002020202020202020202020202020202C7
+:10E9300002020202020202020202020202020202B7
+:10E9400002020202020202020202020202020202A7
+:10E950000202020202020202020202020202020297
+:10E960000202020202020202020202020202020287
+:10E970000202020202020202020202020202020277
+:10E980000202020202020202020202020202020267
+:10E990000202020202020202020202020202020257
+:10E9A0000202020202020202020202020202020247
+:10E9B0000202020202020202020202020202020237
+:10E9C0000202020202020202020202020202020227
+:10E9D0000202020202020202020202020202020217
+:10E9E0000202020202020202020202020202020207
+:10E9F00002020202020202020202020202020202F7
+:10EA000002020202020202020202020202020202E6
+:10EA100002020202020202020202020202020202D6
+:10EA200002020202020202020202020202020202C6
+:10EA300002020202020202020202020202020202B6
+:10EA400002020202020202020202020202020202A6
+:10EA50000202020202020202020202020202020296
+:10EA60000202020202020202020202020202020286
+:10EA70000202020202020202020202020202020276
+:10EA80000202020202020202020202020202020266
+:10EA90000202020202020202020202020202020256
+:10EAA0000202020202020202020202020202020246
+:10EAB0000202020202020202020202020202020236
+:10EAC0000202020202020202020202020202020226
+:10EAD0000202020202020202020202020202020216
+:10EAE0000202020202020202020202020202020206
+:10EAF00002020202020202020202020202020202F6
+:10EB000002020202020202020202020202020202E5
+:10EB100002020202020202020202020202020202D5
+:10EB200002020202020202020202020202020202C5
+:10EB300002020202020202020202020202020202B5
+:10EB400002020202020202020202020202020202A5
+:10EB50000202020202020202020202020202020295
+:10EB60000202020202020202020202020202020285
+:10EB70000202020202020202020202020202020275
+:10EB80000202020202020202020202020202020265
+:10EB90000202020202020202020202020202020255
+:10EBA0000202020202020202020202020202020245
+:10EBB0000202020202020202020202020202020235
+:10EBC0000202020202020202020202020202020225
+:10EBD0000202020202020202020202020202020215
+:10EBE0000202020202020202020202020202020205
+:10EBF00002020202020202020202020202020202F5
+:10EC000002020202020202020202020202020202E4
+:10EC100002020202020202020202020202020202D4
+:10EC200002020202020202020202020202020202C4
+:10EC300002020202020202020202020202020202B4
+:10EC400002020202020202020202020202020202A4
+:10EC50000202020202020202020202020202020294
+:10EC60000202020202020202020202020202020284
+:10EC70000202020202020202020202020202020274
+:10EC80000202020202020202020202020202020264
+:10EC90000202020202020202020202020202020254
+:10ECA0000202020202020202020202020202020244
+:10ECB0000202020202020202020202020202020234
+:10ECC0000202020202020202020202020202020224
+:10ECD0000202020202020202020202020202020214
+:10ECE0000202020202020202020202020202020204
+:10ECF00002020202020202020202020202020202F4
+:10ED000002020202020202020202020202020202E3
+:10ED100002020202020202020202020202020200D5
+:10ED200000000000000000000000000000000000E3
+:10ED300000000000000000000000000000000000D3
+:10ED400000000000000000000000000000000000C3
+:10ED500000000000000000000000000000000000B3
+:10ED600000000000000000000000000000000000A3
+:10ED70000000000000000000000000000000000093
+:10ED80000000000000000000000000000000000083
+:10ED90000000000000000000000000000000000073
+:10EDA0000000000000000000000000000000000063
+:10EDB0000000000000000000000000000000000053
+:10EDC0000000000000000000000000000000000043
+:10EDD0000000000000000000000000000000000033
+:10EDE0000000000000000000000000000000000023
+:10EDF0000000000000000000000000000000000013
+:10EE00000000000000000000000000000000000002
+:10EE100000000000000000000000000000000000F2
+:10EE200000000000000000000000000000000000E2
+:10EE300000000000000000000000000000000000D2
+:10EE400000000000000000000000000000000000C2
+:10EE500000000000000000000000000000000000B2
+:10EE600000000000000000000000000000000000A2
+:10EE70000000000000000000000000000000000092
+:10EE80000000000000000000000000000000000082
+:10EE90000000000000000000000000000000000072
+:10EEA0000000000000000000000000000000000062
+:10EEB0000000000000000000000000000000000052
+:10EEC0000000000000000000000000000000000042
+:10EED0000000000000000000000000000000000032
+:10EEE0000000000000000000000000000000000022
+:10EEF0000000000000000000000000000000000012
+:10EF00000000000000000000000000000000000001
+:10EF100000000000000000000000000000000000F1
+:10EF200000000000000000000000000000000000E1
+:10EF300000000000000000000000000000000000D1
+:10EF400000000000000000000000000000000000C1
+:10EF500000000000000000000000000000000000B1
+:10EF600000000000000000000000000000000000A1
+:10EF70000000000000000000000000000000000091
+:10EF80000000000000000000000000000000000081
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB0000000000000000000000000000000000051
+:10EFC0000000000000000000000000000000000041
+:10EFD0000000000000000000000000000000000031
+:10EFE0000000000000000000000000000000000021
+:10EFF0000000000000000000000000000000000011
+:10F000000000000000000000000000000000000000
+:10F0100000000000000000000000000000000000F0
+:10F0200000000000000000000000000000000000E0
+:10F0300000000000000000000000000000000000D0
+:10F0400000000000000000000000000000000000C0
+:10F0500000000000000000000000000000000000B0
+:10F0600000000000000000000000000000000000A0
+:10F070000000000000000000000000000000000090
+:10F080000000000000000000000000000000000080
+:10F090000000000000000000000000000000000070
+:10F0A0000000000000000000000000000000000060
+:10F0B0000000000000000000000000000000000050
+:10F0C0000000000000000000000000000000000040
+:10F0D0000000000000000000000000000000000030
+:10F0E0000000000000000000000000000000000020
+:10F0F0000000000000000000000000000000000010
+:10F1000000000000000000000000000000000000FF
+:10F1100000000000000000000000000000000000EF
+:10F1200000000000000000000000000000000000DF
+:10F1300000000000000000000000000000000000CF
+:10F1400000000000000000000000000000000000BF
+:10F1500000000000000000000000000000000000AF
+:10F16000000000000000000000000000000000009F
+:10F17000000000000000000000000000000000008F
+:10F18000000000000000000000000000000000007F
+:10F19000000000000000000000000000000000006F
+:10F1A000000000000000000000000000000000005F
+:10F1B000000000000000000000000000000000004F
+:10F1C000000000000000000000000000000000003F
+:10F1D000000000000000000000000000000000002F
+:10F1E000000000000000000000000000000000001F
+:10F1F000000000000000000000000000000000000F
+:10F2000000000000000000000000000000000000FE
+:10F2100000000000000000000000000000000000EE
+:10F2200000000000000000000000000000000000DE
+:10F2300000000000000000000000000000000000CE
+:10F2400000000000000000000000000000000000BE
+:10F2500000000000000000000000000000000000AE
+:10F26000000000000000000000000000000000009E
+:10F27000000000000000000000000000000000008E
+:10F28000000000000000000000000000000000007E
+:10F29000000000000000000000000000000000006E
+:10F2A000000000000000000000000000000000005E
+:10F2B000000000000000000000000000000000004E
+:10F2C000000000000000000000000000000000003E
+:10F2D000000000000000000000000000000000002E
+:10F2E000000000000000000000000000000000001E
+:10F2F000000000000000000000000000000000000E
+:10F3000000000000000000000000000000000000FD
+:10F3100000000000000000000000000000000000ED
+:10F3200000000000000000000000000000000000DD
+:10F3300000000000000000000000000000000000CD
+:10F3400000000000000000000000000000000000BD
+:10F3500000000000000000000000000000000000AD
+:10F36000000000000000000000000000000000009D
+:10F37000000000000000000000000000000000008D
+:10F38000000000000000000000000000000000007D
+:10F39000000000000000000000000000000000006D
+:10F3A000000000000000000000000000000000005D
+:10F3B000000000000000000000000000000000004D
+:10F3C000000000000000000000000000000000003D
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000000000000000000000000000000CC
+:10F4400000000000000000000000000000000000BC
+:10F4500000000000000000000000000000000000AC
+:10F46000000000000000000000000000000000009C
+:10F47000000000000000000000000000000000008C
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000004C
+:10F4C000000000000000000000000000000000003C
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000009B
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B000000000000000000000000000000000004B
+:10F5C000000000000000000000000000000000003B
+:10F5D000000000000000000000000000000000002B
+:10F5E000000000000000000000000000000000001B
+:10F5F000000000000000000000000000000000000B
+:10F6000000000000000000000000000000000000FA
+:10F6100000000000000000000000000000000001E9
+:10F6200001010101010101010101010101010101CA
+:10F6300001010101010101010101010101010101BA
+:10F6400001010101010101010101010101010101AA
+:10F65000010101010101010101010101010101019A
+:10F66000010101010101010101010101010101018A
+:10F67000010101010101010101010101010101017A
+:10F68000010101010101010101010101010101016A
+:10F69000010101010101010101010101010101015A
+:10F6A000010101010101010101010101010101014A
+:10F6B000010101010101010101010101010101013A
+:10F6C000010101010101010101010101010101012A
+:10F6D000010101010101010101010101010101011A
+:10F6E000010101010101010101010101010101010A
+:10F6F00001010101010101010101010101010101FA
+:10F7000001010101010101010101010101010101E9
+:10F7100001010101010101010101010101010101D9
+:10F7200001010101010101010101010101010101C9
+:10F7300001010101010101010101010101010101B9
+:10F7400001010101010101010101010101010101A9
+:10F750000101010101010101010101010101010199
+:10F760000101010101010101010101010101010189
+:10F770000101010101010101010101010101010179
+:10F780000101010101010101010101010101010169
+:10F790000101010101010101010101010101010159
+:10F7A0000101010101010101010101010101010149
+:10F7B0000101010101010101010101010101010139
+:10F7C0000101010101010101010101010101010129
+:10F7D0000101010101010101010101010101010119
+:10F7E0000101010101010101010101010101010109
+:10F7F00001010101010101010101010101010101F9
+:10F8000001010101010101010101010101010101E8
+:10F8100001010101010101010101010101010101D8
+:10F8200001010101010101010101010101010101C8
+:10F8300001010101010101010101010101010101B8
+:10F8400001010101010101010101010101010101A8
+:10F850000101010101010101010101010101010198
+:10F860000101010101010101010101010101010188
+:10F870000101010101010101010101010101010178
+:10F880000101010101010101010101010101010168
+:10F890000101010101010101010101010101010158
+:10F8A0000101010101010101010101010101010148
+:10F8B0000101010101010101010101010101010138
+:10F8C0000101010101010101010101010101010128
+:10F8D0000101010101010101010101010101010118
+:10F8E0000101010101010101010101010101010108
+:10F8F00001010101010101010101010101010101F8
+:10F9000001010101010101010101010101010101E7
+:10F9100001010101010101010101010101010101D7
+:10F9200001010101010101010101010101010101C7
+:10F9300001010101010101010101010101010101B7
+:10F9400001010101010101010101010101010101A7
+:10F950000101010101010101010101010101010197
+:10F960000101010101010101010101010101010187
+:10F970000101010101010101010101010101010177
+:10F980000101010101010101010101010101010167
+:10F990000101010101010101010101010101010157
+:10F9A0000101010101010101010101010101010147
+:10F9B0000101010101010101010101010101010137
+:10F9C0000101010101010101010101010101010127
+:10F9D0000101010101010101010101010101010117
+:10F9E0000101010101010101010101010101010107
+:10F9F00001010101010101010101010101010101F7
+:10FA000001010101010101010101010101010101E6
+:10FA100001010101010101010101010101010101D6
+:10FA200001010101010101010101010101010101C6
+:10FA300001010101010101010101010101010101B6
+:10FA400001010101010101010101010101010101A6
+:10FA50000101010101010101010101010101010196
+:10FA60000101010101010101010101010101010186
+:10FA70000101010101010101010101010101010176
+:10FA80000101010101010101010101010101010166
+:10FA90000101010101010101010101010101010156
+:10FAA0000101010101010101010101010101010146
+:10FAB0000101010101010101010101010101010136
+:10FAC0000101010101010101010101010101010126
+:10FAD0000101010101010101010101010101010116
+:10FAE0000101010101010101010101010101010106
+:10FAF00001010101010101010101010101010101F6
+:10FB000001010101010101010101010101010101E5
+:10FB100001010101010101010101010101010101D5
+:10FB200001010101010101010101010101010101C5
+:10FB300001010101010101010101010101010101B5
+:10FB400001010101010101010101010101010101A5
+:10FB50000101010101010101010101010101010195
+:10FB60000101010101010101010101010101010185
+:10FB70000101010101010101010101010101010175
+:10FB80000101010101010101010101010101010165
+:10FB90000101010101010101010101010101010155
+:10FBA0000101010101010101010101010101010145
+:10FBB0000101010101010101010101010101010135
+:10FBC0000101010101010101010101010101010125
+:10FBD0000101010101010101010101010101010115
+:10FBE0000101010101010101010101010101010105
+:10FBF00001010101010101010101010101010101F5
+:10FC000001010101010101010101010101010101E4
+:10FC100001010101010101010101010101010101D4
+:10FC200001010101010101010101010101010101C4
+:10FC300001010101010101010101010101010101B4
+:10FC400001010101010101010101010101010101A4
+:10FC50000101010101010101010101010101010194
+:10FC60000101010101010101010101010101010184
+:10FC70000101010101010101010101010101010174
+:10FC80000101010101010101010101010101010164
+:10FC90000101010101010101010101010101010154
+:10FCA0000101010101010101010101010101010144
+:10FCB0000101010101010101010101010101010134
+:10FCC0000101010101010101010101010101010124
+:10FCD0000101010101010101010101010101010114
+:10FCE0000101010101010101010101010101010104
+:10FCF00001010101010101010101010101010101F4
+:10FD000001010101010101010101010101010101E3
+:10FD100001010101010101010101010101010101D3
+:10FD200001010101010101010101010101010101C3
+:10FD300001010101010101010101010101010101B3
+:10FD400001010101010101010101010101010101A3
+:10FD50000101010101010101010101010101010193
+:10FD60000101010101010101010101010101010183
+:10FD70000101010101010101010101010101010173
+:10FD80000101010101010101010101010101010163
+:10FD90000101010101010101010101010101010153
+:10FDA0000101010101010101010101010101010143
+:10FDB0000101010101010101010101010101010133
+:10FDC0000101010101010101010101010101010123
+:10FDD0000101010101010101010101010101010113
+:10FDE0000101010101010101010101010101010103
+:10FDF00001010101010101010101010101010101F3
+:10FE000001010101010101010101010101010101E2
+:10FE100001010101010101010101010101010101D2
+:10FE200001010101010101010101010101010101C2
+:10FE300001010101010101010101010101010101B2
+:10FE400001010101010101010101010101010101A2
+:10FE50000101010101010101010101010101010192
+:10FE60000101010101010101010101010101010182
+:10FE70000101010101010101010101010101010172
+:10FE80000101010101010101010101010101010162
+:10FE90000101010101010101010101010101010152
+:10FEA0000101010101010101010101010101010142
+:10FEB0000101010101010101010101010101010132
+:10FEC0000101010101010101010101010101010122
+:10FED0000101010101010101010101010101010112
+:10FEE0000101010101010101010101010101010102
+:10FEF00001010101010101010101010101010101F2
+:10FF000001010101010101010101010101010101E1
+:10FF100001010101010101010101010101010101D1
+:10FF200001010101010101010101010101010101C1
+:10FF300001010101010101010101010101010101B1
+:10FF400001010101010101010101010101010101A1
+:10FF50000101010101010101010101010101010191
+:10FF60000101010101010101010101010101010181
+:10FF70000101010101010101010101010101010171
+:10FF80000101010101010101010101010101010161
+:10FF90000101010101010101010101010101010151
+:10FFA0000101010101010101010101010101010141
+:10FFB0000101010101010101010101010101010131
+:10FFC0000101010101010101010101010101010121
+:10FFD0000101010101010101010101010101010111
+:10FFE0000101010101010101010101010101010101
+:10FFF00001010101010101010101010101010101F1
+:020000024000BC
+:1000000001010101010101010101010101010101E0
+:1000100001010101010101010101010101010101D0
+:1000200001010101010101010101010101010101C0
+:1000300001010101010101010101010101010101B0
+:1000400001010101010101010101010101010101A0
+:100050000101010101010101010101010101010190
+:100060000101010101010101010101010101010180
+:100070000101010101010101010101010101010170
+:100080000101010101010101010101010101010160
+:100090000101010101010101010101010101010150
+:1000A0000101010101010101010101010101010140
+:1000B0000101010101010101010101010101010130
+:1000C0000101010101010101010101010101010120
+:1000D0000101010101010101010101010101010110
+:1000E0000101010101010101010101010101010100
+:1000F00001010101010101010101010101010101F0
+:1001000001010101010101010101010101010101DF
+:1001100001010101010101010101010101010101CF
+:1001200001010101010101010101010101010101BF
+:1001300001010101010101010101010101010101AF
+:10014000010101010101010101010101010101019F
+:10015000010101010101010101010101010101018F
+:10016000010101010101010101010101010101017F
+:10017000010101010101010101010101010101016F
+:10018000010101010101010101010101010101015F
+:10019000010101010101010101010101010101014F
+:1001A000010101010101010101010101010101013F
+:1001B000010101010101010101010101010101012F
+:1001C000010101010101010101010101010101011F
+:1001D000010101010101010101010101010101010F
+:1001E00001010101010101010101010101010101FF
+:1001F00001010101010101010101010101010101EF
+:1002000001010101010101010101010101010101DE
+:1002100001010101010101010101010101010101CE
+:1002200001010101010101010101010101010101BE
+:1002300001010101010101010101010101010101AE
+:10024000010101010101010101010101010101019E
+:10025000010101010101010101010101010101018E
+:10026000010101010101010101010101010101017E
+:10027000010101010101010101010101010101016E
+:10028000010101010101010101010101010101015E
+:10029000010101010101010101010101010101014E
+:1002A000010101010101010101010101010101013E
+:1002B000010101010101010101010101010101012E
+:1002C000010101010101010101010101010101011E
+:1002D000010101010101010101010101010101010E
+:1002E00001010101010101010101010101010101FE
+:1002F00001010101010101010101010101010101EE
+:1003000001010101010101010101010101010101DD
+:1003100001010101010101010101010101010101CD
+:1003200001010101010101010101010101010101BD
+:1003300001010101010101010101010101010101AD
+:10034000010101010101010101010101010101019D
+:10035000010101010101010101010101010101018D
+:10036000010101010101010101010101010101017D
+:10037000010101010101010101010101010101016D
+:10038000010101010101010101010101010101015D
+:10039000010101010101010101010101010101014D
+:1003A000010101010101010101010101010101013D
+:1003B000010101010101010101010101010101012D
+:1003C000010101010101010101010101010101011D
+:1003D000010101010101010101010101010101010D
+:1003E00001010101010101010101010101010101FD
+:1003F00001010101010101010101010101010101ED
+:1004000001010101010101010101010101010101DC
+:1004100001010101010101010101010101010100CD
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000000007C
+:10048000000000000000000000000000000000006C
+:10049000000000000000000000000000000000005C
+:1004A000000000000000000000000000000000004C
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000000000000000000002C
+:1004D000000000000000000000000000000000001C
+:1004E000000000000000000000000000000000000C
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000000000000000000000CA
+:1006300000000000000000000000000000000000BA
+:1006400000000000000000000000000000000000AA
+:10065000000000000000000000000000000000009A
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:10068000000000000000000000000000000000006A
+:10069000000000000000000000000000000000005A
+:1006A000000000000000000000000000000000004A
+:1006B000000000000000000000000000000000003A
+:1006C000000000000000000000000000000000002A
+:1006D000000000000000000000000000000000001A
+:1006E000000000000000000000000000000000000A
+:1006F00000000000000000000000000000000000FA
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000000000000000000000C9
+:1007300000000000000000000000000000000000B9
+:1007400000000000000000000000000000000000A9
+:100750000000000000000000000000000000000099
+:100760000000000000000000000000000000000089
+:100770000000000000000000000000000000000079
+:100780000000000000000000000000000000000069
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000000029
+:1007D0000000000000000000000000000000000019
+:1007E0000000000000000000000000000000000009
+:1007F00000000000000000000000000000000000F9
+:1008000000000000000000000000000000000000E8
+:1008100000000000000000000000000000000000D8
+:1008200000000000000000000000000000000000C8
+:1008300000000000000000000000000000000000B8
+:1008400000000000000000000000000000000000A8
+:100850000000000000000000000000000000000098
+:100860000000000000000000000000000000000088
+:100870000000000000000000000000000000000078
+:100880000000000000000000000000000000000068
+:100890000000000000000000000000000000000058
+:1008A0000000000000000000000000000000000048
+:1008B0000000000000000000000000000000000038
+:1008C0000000000000000000000000000000000028
+:1008D0000000000000000000000000000000000018
+:1008E0000000000000000000000000000000000008
+:1008F00000000000000000000000000000000000F8
+:1009000000000000000000000000000000000000E7
+:1009100000000000000000000000000000000000D7
+:1009200000000000000000000000000000000000C7
+:1009300000000000000000000000000000000000B7
+:1009400000000000000000000000000000000000A7
+:100950000000000000000000000000000000000097
+:100960000000000000000000000000000000000087
+:100970000000000000000000000000000000000077
+:100980000000000000000000000000000000000067
+:100990000000000000000000000000000000000057
+:1009A0000000000000000000000000000000000047
+:1009B0000000000000000000000000000000000037
+:1009C0000000000000000000000000000000000027
+:1009D0000000000000000000000000000000000017
+:1009E0000000000000000000000000000000000007
+:1009F00000000000000000000000000000000000F7
+:100A000000000000000000000000000000000000E6
+:100A100000000000000000000000000000000000D6
+:100A200000000000000000000000000000000000C6
+:100A300000000000000000000000000000000000B6
+:100A400000000000000000000000000000000000A6
+:100A50000000000000000000000000000000000096
+:100A60000000000000000000000000000000000086
+:100A70000000000000000000000000000000000076
+:100A80000000000000000000000000000000000066
+:100A90000000000000000000000000000000000056
+:100AA0000000000000000000000000000000000046
+:100AB0000000000000000000000000000000000036
+:100AC0000000000000000000000000000000000026
+:100AD0000000000000000000000000000000000016
+:100AE0000000000000000000000000000000000006
+:100AF00000000000000000000000000000000000F6
+:100B000000000000000000000000000000000000E5
+:100B100000000000000000000000000000000002D3
+:100B200002020202020202020202020202020202A5
+:100B30000202020202020202020202020202020295
+:100B40000202020202020202020202020202020285
+:100B50000202020202020202020202020202020275
+:100B60000202020202020202020202020202020265
+:100B70000202020202020202020202020202020255
+:100B80000202020202020202020202020202020245
+:100B90000202020202020202020202020202020235
+:100BA0000202020202020202020202020202020225
+:100BB0000202020202020202020202020202020215
+:100BC0000202020202020202020202020202020205
+:100BD00002020202020202020202020202020202F5
+:100BE00002020202020202020202020202020202E5
+:100BF00002020202020202020202020202020202D5
+:100C000002020202020202020202020202020202C4
+:100C100002020202020202020202020202020202B4
+:100C200002020202020202020202020202020202A4
+:100C30000202020202020202020202020202020294
+:100C40000202020202020202020202020202020284
+:100C50000202020202020202020202020202020274
+:100C60000202020202020202020202020202020264
+:100C70000202020202020202020202020202020254
+:100C80000202020202020202020202020202020244
+:100C90000202020202020202020202020202020234
+:100CA0000202020202020202020202020202020224
+:100CB0000202020202020202020202020202020214
+:100CC0000202020202020202020202020202020204
+:100CD00002020202020202020202020202020202F4
+:100CE00002020202020202020202020202020202E4
+:100CF00002020202020202020202020202020202D4
+:100D000002020202020202020202020202020202C3
+:100D100002020202020202020202020202020202B3
+:100D200002020202020202020202020202020202A3
+:100D30000202020202020202020202020202020293
+:100D40000202020202020202020202020202020283
+:100D50000202020202020202020202020202020273
+:100D60000202020202020202020202020202020263
+:100D70000202020202020202020202020202020253
+:100D80000202020202020202020202020202020243
+:100D90000202020202020202020202020202020233
+:100DA0000202020202020202020202020202020223
+:100DB0000202020202020202020202020202020213
+:100DC0000202020202020202020202020202020203
+:100DD00002020202020202020202020202020202F3
+:100DE00002020202020202020202020202020202E3
+:100DF00002020202020202020202020202020202D3
+:100E000002020202020202020202020202020202C2
+:100E100002020202020202020202020202020202B2
+:100E200002020202020202020202020202020202A2
+:100E30000202020202020202020202020202020292
+:100E40000202020202020202020202020202020282
+:100E50000202020202020202020202020202020272
+:100E60000202020202020202020202020202020262
+:100E70000202020202020202020202020202020252
+:100E80000202020202020202020202020202020242
+:100E90000202020202020202020202020202020232
+:100EA0000202020202020202020202020202020222
+:100EB0000202020202020202020202020202020212
+:100EC0000202020202020202020202020202020202
+:100ED00002020202020202020202020202020202F2
+:100EE00002020202020202020202020202020202E2
+:100EF00002020202020202020202020202020202D2
+:100F000002020202020202020202020202020202C1
+:100F100002020202020202020202020202020202B1
+:100F200002020202020202020202020202020202A1
+:100F30000202020202020202020202020202020291
+:100F40000202020202020202020202020202020281
+:100F50000202020202020202020202020202020271
+:100F60000202020202020202020202020202020261
+:100F70000202020202020202020202020202020251
+:100F80000202020202020202020202020202020241
+:100F90000202020202020202020202020202020231
+:100FA0000202020202020202020202020202020221
+:100FB0000202020202020202020202020202020211
+:100FC0000202020202020202020202020202020201
+:100FD00002020202020202020202020202020202F1
+:100FE00002020202020202020202020202020202E1
+:100FF00002020202020202020202020202020202D1
+:1010000002020202020202020202020202020202C0
+:1010100002020202020202020202020202020202B0
+:1010200002020202020202020202020202020202A0
+:101030000202020202020202020202020202020290
+:101040000202020202020202020202020202020280
+:101050000202020202020202020202020202020270
+:101060000202020202020202020202020202020260
+:101070000202020202020202020202020202020250
+:101080000202020202020202020202020202020240
+:101090000202020202020202020202020202020230
+:1010A0000202020202020202020202020202020220
+:1010B0000202020202020202020202020202020210
+:1010C0000202020202020202020202020202020200
+:1010D00002020202020202020202020202020202F0
+:1010E00002020202020202020202020202020202E0
+:1010F00002020202020202020202020202020202D0
+:1011000002020202020202020202020202020202BF
+:1011100002020202020202020202020202020202AF
+:10112000020202020202020202020202020202029F
+:10113000020202020202020202020202020202028F
+:10114000020202020202020202020202020202027F
+:10115000020202020202020202020202020202026F
+:10116000020202020202020202020202020202025F
+:10117000020202020202020202020202020202024F
+:10118000020202020202020202020202020202023F
+:10119000020202020202020202020202020202022F
+:1011A000020202020202020202020202020202021F
+:1011B000020202020202020202020202020202020F
+:1011C00002020202020202020202020202020202FF
+:1011D00002020202020202020202020202020202EF
+:1011E00002020202020202020202020202020202DF
+:1011F00002020202020202020202020202020202CF
+:1012000002020202020202020202020202020202BE
+:1012100002020202020202020202020202020202AE
+:10122000020202020202020202020202020202029E
+:10123000020202020202020202020202020202028E
+:10124000020202020202020202020202020202027E
+:10125000020202020202020202020202020202026E
+:10126000020202020202020202020202020202025E
+:10127000020202020202020202020202020202024E
+:10128000020202020202020202020202020202023E
+:10129000020202020202020202020202020202022E
+:1012A000020202020202020202020202020202021E
+:1012B000020202020202020202020202020202020E
+:1012C00002020202020202020202020202020202FE
+:1012D00002020202020202020202020202020202EE
+:1012E00002020202020202020202020202020202DE
+:1012F00002020202020202020202020202020202CE
+:1013000002020202020202020202020202020202BD
+:1013100002020202020202020202020202020202AD
+:10132000020202020202020202020202020202029D
+:10133000020202020202020202020202020202028D
+:10134000020202020202020202020202020202027D
+:10135000020202020202020202020202020202026D
+:10136000020202020202020202020202020202025D
+:10137000020202020202020202020202020202024D
+:10138000020202020202020202020202020202023D
+:10139000020202020202020202020202020202022D
+:1013A000020202020202020202020202020202021D
+:1013B000020202020202020202020202020202020D
+:1013C00002020202020202020202020202020202FD
+:1013D00002020202020202020202020202020202ED
+:1013E00002020202020202020202020202020202DD
+:1013F00002020202020202020202020202020202CD
+:1014000002020202020202020202020202020202BC
+:1014100002020202020202020202020202020202AC
+:10142000020202020202020202020202020202029C
+:10143000020202020202020202020202020202028C
+:10144000020202020202020202020202020202027C
+:10145000020202020202020202020202020202026C
+:10146000020202020202020202020202020202025C
+:10147000020202020202020202020202020202024C
+:10148000020202020202020202020202020202023C
+:10149000020202020202020202020202020202022C
+:1014A000020202020202020202020202020202021C
+:1014B000020202020202020202020202020202020C
+:1014C00002020202020202020202020202020202FC
+:1014D00002020202020202020202020202020202EC
+:1014E00002020202020202020202020202020202DC
+:1014F00002020202020202020202020202020202CC
+:1015000002020202020202020202020202020202BB
+:1015100002020202020202020202020202020202AB
+:10152000020202020202020202020202020202029B
+:10153000020202020202020202020202020202028B
+:10154000020202020202020202020202020202027B
+:10155000020202020202020202020202020202026B
+:10156000020202020202020202020202020202025B
+:10157000020202020202020202020202020202024B
+:10158000020202020202020202020202020202023B
+:10159000020202020202020202020202020202022B
+:1015A000020202020202020202020202020202021B
+:1015B000020202020202020202020202020202020B
+:1015C00002020202020202020202020202020202FB
+:1015D00002020202020202020202020202020202EB
+:1015E00002020202020202020202020202020202DB
+:1015F00002020202020202020202020202020202CB
+:1016000002020202020202020202020202020202BA
+:1016100002020202020202020202020202020202AA
+:10162000020202020202020202020202020202029A
+:10163000020202020202020202020202020202028A
+:10164000020202020202020202020202020202027A
+:10165000020202020202020202020202020202026A
+:10166000020202020202020202020202020202025A
+:10167000020202020202020202020202020202024A
+:10168000020202020202020202020202020202023A
+:10169000020202020202020202020202020202022A
+:1016A000020202020202020202020202020202021A
+:1016B000020202020202020202020202020202020A
+:1016C00002020202020202020202020202020202FA
+:1016D00002020202020202020202020202020202EA
+:1016E00002020202020202020202020202020202DA
+:1016F00002020202020202020202020202020202CA
+:1017000002020202020202020202020202020202B9
+:1017100002020202020202020202020202020202A9
+:101720000202020202020202020202020202020299
+:101730000202020202020202020202020202020289
+:101740000202020202020202020202020202020279
+:101750000202020202020202020202020202020269
+:101760000202020202020202020202020202020259
+:101770000202020202020202020202020202020249
+:101780000202020202020202020202020202020239
+:101790000202020202020202020202020202020229
+:1017A0000202020202020202020202020202020219
+:1017B0000202020202020202020202020202020209
+:1017C00002020202020202020202020202020202F9
+:1017D00002020202020202020202020202020202E9
+:1017E00002020202020202020202020202020202D9
+:1017F00002020202020202020202020202020202C9
+:1018000002020202020202020202020202020202B8
+:1018100002020202020202020202020202020202A8
+:101820000202020202020202020202020202020298
+:101830000202020202020202020202020202020288
+:101840000202020202020202020202020202020278
+:101850000202020202020202020202020202020268
+:101860000202020202020202020202020202020258
+:101870000202020202020202020202020202020248
+:101880000202020202020202020202020202020238
+:101890000202020202020202020202020202020228
+:1018A0000202020202020202020202020202020218
+:1018B0000202020202020202020202020202020208
+:1018C00002020202020202020202020202020202F8
+:1018D00002020202020202020202020202020202E8
+:1018E00002020202020202020202020202020202D8
+:1018F00002020202020202020202020202020202C8
+:1019000002020202020202020202020202020202B7
+:1019100002020202020202020202020202020200A9
+:1019200000000000000000000000000000000000B7
+:1019300000000000000000000000000000000000A7
+:101940000000000000000000000000000000000097
+:101950000000000000000000000000000000000087
+:101960000000000000000000000000000000000077
+:101970000000000000000000000000000000000067
+:101980000000000000000000000000000000000057
+:101990000000000000000000000000000000000047
+:1019A0000000000000000000000000000000000037
+:1019B0000000000000000000000000000000000027
+:1019C0000000000000000000000000000000000017
+:1019D0000000000000000000000000000000000007
+:1019E00000000000000000000000000000000000F7
+:1019F00000000000000000000000000000000000E7
+:101A000000000000000000000000000000000000D6
+:101A100000000000000000000000000000000000C6
+:101A200000000000000000000000000000000000B6
+:101A300000000000000000000000000000000000A6
+:101A40000000000000000000000000000000000096
+:101A50000000000000000000000000000000000086
+:101A60000000000000000000000000000000000076
+:101A70000000000000000000000000000000000066
+:101A80000000000000000000000000000000000056
+:101A90000000000000000000000000000000000046
+:101AA0000000000000000000000000000000000036
+:101AB0000000000000000000000000000000000026
+:101AC0000000000000000000000000000000000016
+:101AD0000000000000000000000000000000000006
+:101AE00000000000000000000000000000000000F6
+:101AF00000000000000000000000000000000000E6
+:101B000000000000000000000000000000000000D5
+:101B100000000000000000000000000000000000C5
+:101B200000000000000000000000000000000000B5
+:101B300000000000000000000000000000000000A5
+:101B40000000000000000000000000000000000095
+:101B50000000000000000000000000000000000085
+:101B60000000000000000000000000000000000075
+:101B70000000000000000000000000000000000065
+:101B80000000000000000000000000000000000055
+:101B90000000000000000000000000000000000045
+:101BA0000000000000000000000000000000000035
+:101BB0000000000000000000000000000000000025
+:101BC0000000000000000000000000000000000015
+:101BD0000000000000000000000000000000000005
+:101BE00000000000000000000000000000000000F5
+:101BF00000000000000000000000000000000000E5
+:101C000000000000000000000000000000000000D4
+:101C100000000000000000000000000000000000C4
+:101C200000000000000000000000000000000000B4
+:101C300000000000000000000000000000000000A4
+:101C40000000000000000000000000000000000094
+:101C50000000000000000000000000000000000084
+:101C60000000000000000000000000000000000074
+:101C70000000000000000000000000000000000064
+:101C80000000000000000000000000000000000054
+:101C90000000000000000000000000000000000044
+:101CA0000000000000000000000000000000000034
+:101CB0000000000000000000000000000000000024
+:101CC0000000000000000000000000000000000014
+:101CD0000000000000000000000000000000000004
+:101CE00000000000000000000000000000000000F4
+:101CF00000000000000000000000000000000000E4
+:101D000000000000000000000000000000000000D3
+:101D100000000000000000000000000000000000C3
+:101D200000000000000000000000000000000000B3
+:101D300000000000000000000000000000000000A3
+:101D40000000000000000000000000000000000093
+:101D50000000000000000000000000000000000083
+:101D60000000000000000000000000000000000073
+:101D70000000000000000000000000000000000063
+:101D80000000000000000000000000000000000053
+:101D90000000000000000000000000000000000043
+:101DA0000000000000000000000000000000000033
+:101DB0000000000000000000000000000000000023
+:101DC0000000000000000000000000000000000013
+:101DD0000000000000000000000000000000000003
+:101DE00000000000000000000000000000000000F3
+:101DF00000000000000000000000000000000000E3
+:101E000000000000000000000000000000000000D2
+:101E100000000000000000000000000000000000C2
+:101E200000000000000000000000000000000000B2
+:101E300000000000000000000000000000000000A2
+:101E40000000000000000000000000000000000092
+:101E50000000000000000000000000000000000082
+:101E60000000000000000000000000000000000072
+:101E70000000000000000000000000000000000062
+:101E80000000000000000000000000000000000052
+:101E90000000000000000000000000000000000042
+:101EA0000000000000000000000000000000000032
+:101EB0000000000000000000000000000000000022
+:101EC0000000000000000000000000000000000012
+:101ED0000000000000000000000000000000000002
+:101EE00000000000000000000000000000000000F2
+:101EF00000000000000000000000000000000000E2
+:101F000000000000000000000000000000000000D1
+:101F1000000000000000000000000000000000457C
+:101F200000000000000000010101010101010101A8
+:101F30000101010101010101010101010101010191
+:101F40000101010101010101010101010101010181
+:101F50000101010101010101010101010101010171
+:101F60000101010101010101010101010101010161
+:101F70000101010101010101010101010101010151
+:101F80000101010101010101010101010101010141
+:101F90000101010101010101010101010101010131
+:101FA0000101010101010101010101010101010121
+:101FB0000101010101010101010101010101010111
+:101FC0000101010101010101010101010101010101
+:101FD00001010101010101010101010101010101F1
+:101FE00001010101010101010101010101010101E1
+:101FF00001010101010101010101010101010101D1
+:1020000001010101010101010101010101010101C0
+:1020100001010101010101010101010101010101B0
+:1020200001010101010101010101010101010101A0
+:102030000101010101010101010101010101010190
+:102040000101010101010101010101010101010180
+:102050000101010101010101010101010101010170
+:102060000101010101010101010101010101010160
+:102070000101010101010101010101010101010150
+:102080000101010101010101010101010101010140
+:102090000101010101010101010101010101010130
+:1020A0000101010101010101010101010101010120
+:1020B0000101010101010101010101010101010110
+:1020C0000101010101010101010101010101010100
+:1020D00001010101010101010101010101010101F0
+:1020E00001010101010101010101010101010101E0
+:1020F00001010101010101010101010101010101D0
+:1021000001010101010101010101010101010101BF
+:1021100001010101010101010101010101010101AF
+:10212000010101010101010101010101010101019F
+:10213000010101010101010101010101010101018F
+:10214000010101010101010101010101010101017F
+:10215000010101010101010101010101010101016F
+:10216000010101010101010101010101010101015F
+:10217000010101010101010101010101010101014F
+:10218000010101010101010101010101010101013F
+:10219000010101010101010101010101010101012F
+:1021A000010101010101010101010101010101011F
+:1021B000010101010101010101010101010101010F
+:1021C00001010101010101010101010101010101FF
+:1021D00001010101010101010101010101010101EF
+:1021E00001010101010101010101010101010101DF
+:1021F00001010101010101010101010101010101CF
+:1022000001010101010101010101010101010101BE
+:1022100001010101010101010101010101010101AE
+:10222000010101010101010101010101010101019E
+:10223000010101010101010101010101010101018E
+:10224000010101010101010101010101010101017E
+:10225000010101010101010101010101010101016E
+:10226000010101010101010101010101010101015E
+:10227000010101010101010101010101010101014E
+:10228000010101010101010101010101010101013E
+:10229000010101010101010101010101010101012E
+:1022A000010101010101010101010101010101011E
+:1022B000010101010101010101010101010101010E
+:1022C00001010101010101010101010101010101FE
+:1022D00001010101010101010101010101010101EE
+:1022E00001010101010101010101010101010101DE
+:1022F00001010101010101010101010101010101CE
+:1023000001010101010101010101010101010101BD
+:1023100001010101010101010101010101010101AD
+:10232000010101010101010101010101010101019D
+:10233000010101010101010101010101010101018D
+:10234000010101010101010101010101010101017D
+:10235000010101010101010101010101010101016D
+:10236000010101010101010101010101010101015D
+:10237000010101010101010101010101010101014D
+:10238000010101010101010101010101010101013D
+:10239000010101010101010101010101010101012D
+:1023A000010101010101010101010101010101011D
+:1023B000010101010101010101010101010101010D
+:1023C00001010101010101010101010101010101FD
+:1023D00001010101010101010101010101010101ED
+:1023E00001010101010101010101010101010101DD
+:1023F00001010101010101010101010101010101CD
+:1024000001010101010101010101010101010101BC
+:1024100001010101010101010101010101010101AC
+:10242000010101010101010101010101010101019C
+:10243000010101010101010101010101010101018C
+:10244000010101010101010101010101010101017C
+:10245000010101010101010101010101010101016C
+:10246000010101010101010101010101010101015C
+:10247000010101010101010101010101010101014C
+:10248000010101010101010101010101010101013C
+:10249000010101010101010101010101010101012C
+:1024A000010101010101010101010101010101011C
+:1024B000010101010101010101010101010101010C
+:1024C00001010101010101010101010101010101FC
+:1024D00001010101010101010101010101010101EC
+:1024E00001010101010101010101010101010101DC
+:1024F00001010101010101010101010101010101CC
+:1025000001010101010101010101010101010101BB
+:1025100001010101010101010101010101010101AB
+:10252000010101010101010101010101010101019B
+:10253000010101010101010101010101010101018B
+:10254000010101010101010101010101010101017B
+:10255000010101010101010101010101010101016B
+:10256000010101010101010101010101010101015B
+:10257000010101010101010101010101010101014B
+:10258000010101010101010101010101010101013B
+:10259000010101010101010101010101010101012B
+:1025A000010101010101010101010101010101011B
+:1025B000010101010101010101010101010101010B
+:1025C00001010101010101010101010101010101FB
+:1025D00001010101010101010101010101010101EB
+:1025E00001010101010101010101010101010101DB
+:1025F00001010101010101010101010101010101CB
+:1026000001010101010101010101010101010101BA
+:1026100001010101010101010101010101010101AA
+:10262000010101010101010101010101010101019A
+:10263000010101010101010101010101010101018A
+:10264000010101010101010101010101010101017A
+:10265000010101010101010101010101010101016A
+:10266000010101010101010101010101010101015A
+:10267000010101010101010101010101010101014A
+:10268000010101010101010101010101010101013A
+:10269000010101010101010101010101010101012A
+:1026A000010101010101010101010101010101011A
+:1026B000010101010101010101010101010101010A
+:1026C00001010101010101010101010101010101FA
+:1026D00001010101010101010101010101010101EA
+:1026E00001010101010101010101010101010101DA
+:1026F00001010101010101010101010101010101CA
+:1027000001010101010101010101010101010101B9
+:1027100001010101010101010101010101010101A9
+:102720000101010101010101010101010101010199
+:102730000101010101010101010101010101010189
+:102740000101010101010101010101010101010179
+:102750000101010101010101010101010101010169
+:102760000101010101010101010101010101010159
+:102770000101010101010101010101010101010149
+:102780000101010101010101010101010101010139
+:102790000101010101010101010101010101010129
+:1027A0000101010101010101010101010101010119
+:1027B0000101010101010101010101010101010109
+:1027C00001010101010101010101010101010101F9
+:1027D00001010101010101010101010101010101E9
+:1027E00001010101010101010101010101010101D9
+:1027F00001010101010101010101010101010101C9
+:1028000001010101010101010101010101010101B8
+:1028100001010101010101010101010101010101A8
+:102820000101010101010101010101010101010198
+:102830000101010101010101010101010101010188
+:102840000101010101010101010101010101010178
+:102850000101010101010101010101010101010168
+:102860000101010101010101010101010101010158
+:102870000101010101010101010101010101010148
+:102880000101010101010101010101010101010138
+:102890000101010101010101010101010101010128
+:1028A0000101010101010101010101010101010118
+:1028B0000101010101010101010101010101010108
+:1028C00001010101010101010101010101010101F8
+:1028D00001010101010101010101010101010101E8
+:1028E00001010101010101010101010101010101D8
+:1028F00001010101010101010101010101010101C8
+:1029000001010101010101010101010101010101B7
+:1029100001010101010101010101010101010101A7
+:1029200001010101010101000000000000000000A0
+:102930000000000000000000000000000000000097
+:102940000000000000000000000000000000000087
+:102950000000000000000000000000000000000077
+:102960000000000000000000000000000000000067
+:102970000000000000000000000000000000000057
+:102980000000000000000000000000000000000047
+:102990000000000000000000000000000000000037
+:1029A0000000000000000000000000000000000027
+:1029B0000000000000000000000000000000000017
+:1029C0000000000000000000000000000000000007
+:1029D00000000000000000000000000000000000F7
+:1029E00000000000000000000000000000000000E7
+:1029F00000000000000000000000000000000000D7
+:102A000000000000000000000000000000000000C6
+:102A100000000000000000000000000000000000B6
+:102A200000000000000000000000000000000000A6
+:102A30000000000000000000000000000000000096
+:102A40000000000000000000000000000000000086
+:102A50000000000000000000000000000000000076
+:102A60000000000000000000000000000000000066
+:102A70000000000000000000000000000000000056
+:102A80000000000000000000000000000000000046
+:102A90000000000000000000000000000000000036
+:102AA0000000000000000000000000000000000026
+:102AB0000000000000000000000000000000000016
+:102AC0000000000000000000000000000000000006
+:102AD00000000000000000000000000000000000F6
+:102AE00000000000000000000000000000000000E6
+:102AF00000000000000000000000000000000000D6
+:102B000000000000000000000000000000000000C5
+:102B100000000000000000000000000000000000B5
+:102B200000000000000000000000000000000000A5
+:102B30000000000000000000000000000000000095
+:102B40000000000000000000000000000000000085
+:102B50000000000000000000000000000000000075
+:102B60000000000000000000000000000000000065
+:102B70000000000000000000000000000000000055
+:102B80000000000000000000000000000000000045
+:102B90000000000000000000000000000000000035
+:102BA0000000000000000000000000000000000025
+:102BB0000000000000000000000000000000000015
+:102BC0000000000000000000000000000000000005
+:102BD00000000000000000000000000000000000F5
+:102BE00000000000000000000000000000000000E5
+:102BF00000000000000000000000000000000000D5
+:102C000000000000000000000000000000000000C4
+:102C100000000000000000000000000000000000B4
+:102C200000000000000000000000000000000000A4
+:102C30000000000000000000000000000000000094
+:102C40000000000000000000000000000000000084
+:102C50000000000000000000000000000000000074
+:102C60000000000000000000000000000000000064
+:102C70000000000000000000000000000000000054
+:102C80000000000000000000000000000000000044
+:102C90000000000000000000000000000000000034
+:102CA0000000000000000000000000000000000024
+:102CB0000000000000000000000000000000000014
+:102CC0000000000000000000000000000000000004
+:102CD00000000000000000000000000000000000F4
+:102CE00000000000000000000000000000000000E4
+:102CF00000000000000000000000000000000000D4
+:102D000000000000000000000000000000000000C3
+:102D100000000000000000000000000000000000B3
+:102D200000000000000000000000000000000000A3
+:102D30000000000000000000000000000000000093
+:102D40000000000000000000000000000000000083
+:102D50000000000000000000000000000000000073
+:102D60000000000000000000000000000000000063
+:102D70000000000000000000000000000000000053
+:102D80000000000000000000000000000000000043
+:102D90000000000000000000000000000000000033
+:102DA0000000000000000000000000000000000023
+:102DB0000000000000000000000000000000000013
+:102DC0000000000000000000000000000000000003
+:102DD00000000000000000000000000000000000F3
+:102DE00000000000000000000000000000000000E3
+:102DF00000000000000000000000000000000000D3
+:102E000000000000000000000000000000000000C2
+:102E100000000000000000000000000000000000B2
+:102E200000000000000000000000000000000000A2
+:102E30000000000000000000000000000000000092
+:102E40000000000000000000000000000000000082
+:102E50000000000000000000000000000000000072
+:102E60000000000000000000000000000000000062
+:102E70000000000000000000000000000000000052
+:102E80000000000000000000000000000000000042
+:102E90000000000000000000000000000000000032
+:102EA0000000000000000000000000000000000022
+:102EB0000000000000000000000000000000000012
+:102EC0000000000000000000000000000000000002
+:102ED00000000000000000000000000000000000F2
+:102EE00000000000000000000000000000000000E2
+:102EF00000000000000000000000000000000000D2
+:102F000000000000000000000000000000000000C1
+:102F100000000000000000000000000000000000B1
+:102F200000000000000000000000000000000000A1
+:102F30000000000000000000000000000000000091
+:102F40000000000000000000000000000000000081
+:102F50000000000000000000000000000000000071
+:102F60000000000000000000000000000000000061
+:102F70000000000000000000000000000000000051
+:102F80000000000000000000000000000000000041
+:102F90000000000000000000000000000000000031
+:102FA0000000000000000000000000000000000021
+:102FB0000000000000000000000000000000000011
+:102FC0000000000000000000000000000000000001
+:102FD00000000000000000000000000000000000F1
+:102FE00000000000000000000000000000000000E1
+:102FF00000000000000000000000000000000000D1
+:1030000000000000000000000000000000000000C0
+:1030100000000000000000000000000000000000B0
+:10302000000000000000000202020202020202028E
+:103030000202020202020202020202020202020270
+:103040000202020202020202020202020202020260
+:103050000202020202020202020202020202020250
+:103060000202020202020202020202020202020240
+:103070000202020202020202020202020202020230
+:103080000202020202020202020202020202020220
+:103090000202020202020202020202020202020210
+:1030A0000202020202020202020202020202020200
+:1030B00002020202020202020202020202020202F0
+:1030C00002020202020202020202020202020202E0
+:1030D00002020202020202020202020202020202D0
+:1030E00002020202020202020202020202020202C0
+:1030F00002020202020202020202020202020202B0
+:10310000020202020202020202020202020202029F
+:10311000020202020202020202020202020202028F
+:10312000020202020202020202020202020202027F
+:10313000020202020202020202020202020202026F
+:10314000020202020202020202020202020202025F
+:10315000020202020202020202020202020202024F
+:10316000020202020202020202020202020202023F
+:10317000020202020202020202020202020202022F
+:10318000020202020202020202020202020202021F
+:10319000020202020202020202020202020202020F
+:1031A00002020202020202020202020202020202FF
+:1031B00002020202020202020202020202020202EF
+:1031C00002020202020202020202020202020202DF
+:1031D00002020202020202020202020202020202CF
+:1031E00002020202020202020202020202020202BF
+:1031F00002020202020202020202020202020202AF
+:10320000020202020202020202020202020202029E
+:10321000020202020202020202020202020202028E
+:10322000020202020202020202020202020202027E
+:10323000020202020202020202020202020202026E
+:10324000020202020202020202020202020202025E
+:10325000020202020202020202020202020202024E
+:10326000020202020202020202020202020202023E
+:10327000020202020202020202020202020202022E
+:10328000020202020202020202020202020202021E
+:10329000020202020202020202020202020202020E
+:1032A00002020202020202020202020202020202FE
+:1032B00002020202020202020202020202020202EE
+:1032C00002020202020202020202020202020202DE
+:1032D00002020202020202020202020202020202CE
+:1032E00002020202020202020202020202020202BE
+:1032F00002020202020202020202020202020202AE
+:10330000020202020202020202020202020202029D
+:10331000020202020202020202020202020202028D
+:10332000020202020202020202020202020202027D
+:10333000020202020202020202020202020202026D
+:10334000020202020202020202020202020202025D
+:10335000020202020202020202020202020202024D
+:10336000020202020202020202020202020202023D
+:10337000020202020202020202020202020202022D
+:10338000020202020202020202020202020202021D
+:10339000020202020202020202020202020202020D
+:1033A00002020202020202020202020202020202FD
+:1033B00002020202020202020202020202020202ED
+:1033C00002020202020202020202020202020202DD
+:1033D00002020202020202020202020202020202CD
+:1033E00002020202020202020202020202020202BD
+:1033F00002020202020202020202020202020202AD
+:10340000020202020202020202020202020202029C
+:10341000020202020202020202020202020202028C
+:10342000020202020202020202020202020202027C
+:10343000020202020202020202020202020202026C
+:10344000020202020202020202020202020202025C
+:10345000020202020202020202020202020202024C
+:10346000020202020202020202020202020202023C
+:10347000020202020202020202020202020202022C
+:10348000020202020202020202020202020202021C
+:10349000020202020202020202020202020202020C
+:1034A00002020202020202020202020202020202FC
+:1034B00002020202020202020202020202020202EC
+:1034C00002020202020202020202020202020202DC
+:1034D00002020202020202020202020202020202CC
+:1034E00002020202020202020202020202020202BC
+:1034F00002020202020202020202020202020202AC
+:10350000020202020202020202020202020202029B
+:10351000020202020202020202020202020202028B
+:10352000020202020202020202020202020202027B
+:10353000020202020202020202020202020202026B
+:10354000020202020202020202020202020202025B
+:10355000020202020202020202020202020202024B
+:10356000020202020202020202020202020202023B
+:10357000020202020202020202020202020202022B
+:10358000020202020202020202020202020202021B
+:10359000020202020202020202020202020202020B
+:1035A00002020202020202020202020202020202FB
+:1035B00002020202020202020202020202020202EB
+:1035C00002020202020202020202020202020202DB
+:1035D00002020202020202020202020202020202CB
+:1035E00002020202020202020202020202020202BB
+:1035F00002020202020202020202020202020202AB
+:10360000020202020202020202020202020202029A
+:10361000020202020202020202020202020202028A
+:10362000020202020202020202020202020202027A
+:10363000020202020202020202020202020202026A
+:10364000020202020202020202020202020202025A
+:10365000020202020202020202020202020202024A
+:10366000020202020202020202020202020202023A
+:10367000020202020202020202020202020202022A
+:10368000020202020202020202020202020202021A
+:10369000020202020202020202020202020202020A
+:1036A00002020202020202020202020202020202FA
+:1036B00002020202020202020202020202020202EA
+:1036C00002020202020202020202020202020202DA
+:1036D00002020202020202020202020202020202CA
+:1036E00002020202020202020202020202020202BA
+:1036F00002020202020202020202020202020202AA
+:103700000202020202020202020202020202020299
+:103710000202020202020202020202020202020289
+:103720000202020202020202020202020202020279
+:103730000202020202020202020202020202020269
+:103740000202020202020202020202020202020259
+:103750000202020202020202020202020202020249
+:103760000202020202020202020202020202020239
+:103770000202020202020202020202020202020229
+:103780000202020202020202020202020202020219
+:103790000202020202020202020202020202020209
+:1037A00002020202020202020202020202020202F9
+:1037B00002020202020202020202020202020202E9
+:1037C00002020202020202020202020202020202D9
+:1037D00002020202020202020202020202020202C9
+:1037E00002020202020202020202020202020202B9
+:1037F00002020202020202020202020202020202A9
+:103800000202020202020202020202020202020298
+:103810000202020202020202020202020202020288
+:103820000202020202020202020202020202020278
+:103830000202020202020202020202020202020268
+:103840000202020202020202020202020202020258
+:103850000202020202020202020202020202020248
+:103860000202020202020202020202020202020238
+:103870000202020202020202020202020202020228
+:103880000202020202020202020202020202020218
+:103890000202020202020202020202020202020208
+:1038A00002020202020202020202020202020202F8
+:1038B00002020202020202020202020202020202E8
+:1038C00002020202020202020202020202020202D8
+:1038D00002020202020202020202020202020202C8
+:1038E00002020202020202020202020202020202B8
+:1038F00002020202020202020202020202020202A8
+:103900000202020202020202020202020202020297
+:103910000202020202020202020202020202020287
+:103920000202020202020202020202020202020277
+:103930000202020202020202020202020202020267
+:103940000202020202020202020202020202020257
+:103950000202020202020202020202020202020247
+:103960000202020202020202020202020202020237
+:103970000202020202020202020202020202020227
+:103980000202020202020202020202020202020217
+:103990000202020202020202020202020202020207
+:1039A00002020202020202020202020202020202F7
+:1039B00002020202020202020202020202020202E7
+:1039C00002020202020202020202020202020202D7
+:1039D00002020202020202020202020202020202C7
+:1039E00002020202020202020202020202020202B7
+:1039F00002020202020202020202020202020202A7
+:103A00000202020202020202020202020202020296
+:103A10000202020202020202020202020202020286
+:103A20000202020202020200000000000000000088
+:103A30000000000000000000000000000000000086
+:103A40000000000000000000000000000000000076
+:103A50000000000000000000000000000000000066
+:103A60000000000000000000000000000000000056
+:103A70000000000000000000000000000000000046
+:103A80000000000000000000000000000000000036
+:103A90000000000000000000000000000000000026
+:103AA0000000000000000000000000000000000016
+:103AB0000000000000000000000000000000000006
+:103AC00000000000000000000000000000000000F6
+:103AD00000000000000000000000000000000000E6
+:103AE00000000000000000000000000000000000D6
+:103AF00000000000000000000000000000000000C6
+:103B000000000000000000000000000000000000B5
+:103B100000000000000000000000000000000000A5
+:103B20000000000000000000000000000000000095
+:103B30000000000000000000000000000000000085
+:103B40000000000000000000000000000000000075
+:103B50000000000000000000000000000000000065
+:103B60000000000000000000000000000000000055
+:103B70000000000000000000000000000000000045
+:103B80000000000000000000000000000000000035
+:103B90000000000000000000000000000000000025
+:103BA0000000000000000000000000000000000015
+:103BB0000000000000000000000000000000000005
+:103BC00000000000000000000000000000000000F5
+:103BD00000000000000000000000000000000000E5
+:103BE00000000000000000000000000000000000D5
+:103BF00000000000000000000000000000000000C5
+:103C000000000000000000000000000000000000B4
+:103C100000000000000000000000000000000000A4
+:103C20000000000000000000000000000000000094
+:103C30000000000000000000000000000000000084
+:103C40000000000000000000000000000000000074
+:103C50000000000000000000000000000000000064
+:103C60000000000000000000000000000000000054
+:103C70000000000000000000000000000000000044
+:103C80000000000000000000000000000000000034
+:103C90000000000000000000000000000000000024
+:103CA0000000000000000000000000000000000014
+:103CB0000000000000000000000000000000000004
+:103CC00000000000000000000000000000000000F4
+:103CD00000000000000000000000000000000000E4
+:103CE00000000000000000000000000000000000D4
+:103CF00000000000000000000000000000000000C4
+:103D000000000000000000000000000000000000B3
+:103D100000000000000000000000000000000000A3
+:103D20000000000000000000000000000000000093
+:103D30000000000000000000000000000000000083
+:103D40000000000000000000000000000000000073
+:103D50000000000000000000000000000000000063
+:103D60000000000000000000000000000000000053
+:103D70000000000000000000000000000000000043
+:103D80000000000000000000000000000000000033
+:103D90000000000000000000000000000000000023
+:103DA0000000000000000000000000000000000013
+:103DB0000000000000000000000000000000000003
+:103DC00000000000000000000000000000000000F3
+:103DD00000000000000000000000000000000000E3
+:103DE00000000000000000000000000000000000D3
+:103DF00000000000000000000000000000000000C3
+:103E000000000000000000000000000000000000B2
+:103E100000000000000000000000000000000000A2
+:103E20000000000000000000000000000000000092
+:103E30000000000000000000000000000000000082
+:103E40000000000000000000000000000000000072
+:103E50000000000000000000000000000000000062
+:103E60000000000000000000000000000000000052
+:103E70000000000000000000000000000000000042
+:103E80000000000000000000000000000000000032
+:103E90000000000000000000000000000000000022
+:103EA0000000000000000000000000000000000012
+:103EB0000000000000000000000000000000000002
+:103EC00000000000000000000000000000000000F2
+:103ED00000000000000000000000000000000000E2
+:103EE00000000000000000000000000000000000D2
+:103EF00000000000000000000000000000000000C2
+:103F000000000000000000000000000000000000B1
+:103F100000000000000000000000000000000000A1
+:103F20000000000000000000000000000000000091
+:103F30000000000000000000000000000000000081
+:103F40000000000000000000000000000000000071
+:103F50000000000000000000000000000000000061
+:103F60000000000000000000000000000000000051
+:103F70000000000000000000000000000000000041
+:103F80000000000000000000000000000000000031
+:103F90000000000000000000000000000000000021
+:103FA0000000000000000000000000000000000011
+:103FB0000000000000000000000000000000000001
+:103FC00000000000000000000000000000000000F1
+:103FD00000000000000000000000000000000000E1
+:103FE00000000000000000000000000000000000D1
+:103FF00000000000000000000000000000000000C1
+:1040000000000000000000000000000000000000B0
+:1040100000000000000000000000000000000000A0
+:104020000000000000000000000000000000000090
+:104030000000000000000000000000000000000080
+:104040000000000000000000000000000000000070
+:104050000000000000000000000000000000000060
+:104060000000000000000000000000000000000050
+:104070000000000000000000000000000000000040
+:104080000000000000000000000000000000000030
+:104090000000000000000000000000000000000020
+:1040A0000000000000000000000000000000000010
+:1040B0000000000000000000000000000000000000
+:1040C00000000000000000000000000000000000F0
+:1040D00000000000000000000000000000000000E0
+:1040E00000000000000000000000000000000000D0
+:1040F00000000000000000000000000000000000C0
+:1041000000000000000000000000000000000000AF
+:10411000000000000000000000000000000000009F
+:10412000000000000000000000000000000000008F
+:10413000000000000000000000000000000000007F
+:10414000000000000000000000000000000000006F
+:10415000000000000000000000000000000000005F
+:10416000000000000000000000000000000000004F
+:10417000000000000000000000000000000000003F
+:10418000000000000000000000000000000000002F
+:10419000000000000000000000000000000000001F
+:1041A000000000000000000000000000000000000F
+:1041B00000000000000000000000000000000000FF
+:1041C00000000000000000000000000000000000EF
+:1041D00000000000000000000000000000000000DF
+:1041E00000000000000000000000000000000000CF
+:1041F00000000000000000000000000000000000BF
+:1042000000000000000000000000000000000000AE
+:10421000000000000000000000000000000000009E
+:10422000000000000000000000000000000000008E
+:10423000000000000000000000000000000000007E
+:10424000000000000000000000000000000000006E
+:10425000000000000000000000000000000000005E
+:10426000000000000000000000000000000000004E
+:10427000000000000000000000000000000000003E
+:10428000000000000000000000000000000000002E
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000000000E
+:1042B00000000000000000000000000000000000FE
+:1042C00000000000000000000000000000000000EE
+:1042D00000000000000000000000000000000000DE
+:1042E00000000000000000000000000000000000CE
+:1042F00000000000000000000000000000000000BE
+:1043000000000000000000000000000000000000AD
+:10431000000000000000000000000000000000009D
+:104320000000000000000001010101010101010184
+:10433000010101010101010101010101010101016D
+:10434000010101010101010101010101010101015D
+:10435000010101010101010101010101010101014D
+:10436000010101010101010101010101010101013D
+:10437000010101010101010101010101010101012D
+:10438000010101010101010101010101010101011D
+:10439000010101010101010101010101010101010D
+:1043A00001010101010101010101010101010101FD
+:1043B00001010101010101010101010101010101ED
+:1043C00001010101010101010101010101010101DD
+:1043D00001010101010101010101010101010101CD
+:1043E00001010101010101010101010101010101BD
+:1043F00001010101010101010101010101010101AD
+:10440000010101010101010101010101010101019C
+:10441000010101010101010101010101010101018C
+:10442000010101010101010101010101010101017C
+:10443000010101010101010101010101010101016C
+:10444000010101010101010101010101010101015C
+:10445000010101010101010101010101010101014C
+:10446000010101010101010101010101010101013C
+:10447000010101010101010101010101010101012C
+:10448000010101010101010101010101010101011C
+:10449000010101010101010101010101010101010C
+:1044A00001010101010101010101010101010101FC
+:1044B00001010101010101010101010101010101EC
+:1044C00001010101010101010101010101010101DC
+:1044D00001010101010101010101010101010101CC
+:1044E00001010101010101010101010101010101BC
+:1044F00001010101010101010101010101010101AC
+:10450000010101010101010101010101010101019B
+:10451000010101010101010101010101010101018B
+:10452000010101010101010101010101010101017B
+:10453000010101010101010101010101010101016B
+:10454000010101010101010101010101010101015B
+:10455000010101010101010101010101010101014B
+:10456000010101010101010101010101010101013B
+:10457000010101010101010101010101010101012B
+:10458000010101010101010101010101010101011B
+:10459000010101010101010101010101010101010B
+:1045A00001010101010101010101010101010101FB
+:1045B00001010101010101010101010101010101EB
+:1045C00001010101010101010101010101010101DB
+:1045D00001010101010101010101010101010101CB
+:1045E00001010101010101010101010101010101BB
+:1045F00001010101010101010101010101010101AB
+:10460000010101010101010101010101010101019A
+:10461000010101010101010101010101010101018A
+:10462000010101010101010101010101010101017A
+:10463000010101010101010101010101010101016A
+:10464000010101010101010101010101010101015A
+:10465000010101010101010101010101010101014A
+:10466000010101010101010101010101010101013A
+:10467000010101010101010101010101010101012A
+:10468000010101010101010101010101010101011A
+:10469000010101010101010101010101010101010A
+:1046A00001010101010101010101010101010101FA
+:1046B00001010101010101010101010101010101EA
+:1046C00001010101010101010101010101010101DA
+:1046D00001010101010101010101010101010101CA
+:1046E00001010101010101010101010101010101BA
+:1046F00001010101010101010101010101010101AA
+:104700000101010101010101010101010101010199
+:104710000101010101010101010101010101010189
+:104720000101010101010101010101010101010179
+:104730000101010101010101010101010101010169
+:104740000101010101010101010101010101010159
+:104750000101010101010101010101010101010149
+:104760000101010101010101010101010101010139
+:104770000101010101010101010101010101010129
+:104780000101010101010101010101010101010119
+:104790000101010101010101010101010101010109
+:1047A00001010101010101010101010101010101F9
+:1047B00001010101010101010101010101010101E9
+:1047C00001010101010101010101010101010101D9
+:1047D00001010101010101010101010101010101C9
+:1047E00001010101010101010101010101010101B9
+:1047F00001010101010101010101010101010101A9
+:104800000101010101010101010101010101010198
+:104810000101010101010101010101010101010188
+:104820000101010101010101010101010101010178
+:104830000101010101010101010101010101010168
+:104840000101010101010101010101010101010158
+:104850000101010101010101010101010101010148
+:104860000101010101010101010101010101010138
+:104870000101010101010101010101010101010128
+:104880000101010101010101010101010101010118
+:104890000101010101010101010101010101010108
+:1048A00001010101010101010101010101010101F8
+:1048B00001010101010101010101010101010101E8
+:1048C00001010101010101010101010101010101D8
+:1048D00001010101010101010101010101010101C8
+:1048E00001010101010101010101010101010101B8
+:1048F00001010101010101010101010101010101A8
+:104900000101010101010101010101010101010197
+:104910000101010101010101010101010101010187
+:104920000101010101010101010101010101010177
+:104930000101010101010101010101010101010167
+:104940000101010101010101010101010101010157
+:104950000101010101010101010101010101010147
+:104960000101010101010101010101010101010137
+:104970000101010101010101010101010101010127
+:104980000101010101010101010101010101010117
+:104990000101010101010101010101010101010107
+:1049A00001010101010101010101010101010101F7
+:1049B00001010101010101010101010101010101E7
+:1049C00001010101010101010101010101010101D7
+:1049D00001010101010101010101010101010101C7
+:1049E00001010101010101010101010101010101B7
+:1049F00001010101010101010101010101010101A7
+:104A00000101010101010101010101010101010196
+:104A10000101010101010101010101010101010186
+:104A20000101010101010101010101010101010176
+:104A30000101010101010101010101010101010166
+:104A40000101010101010101010101010101010156
+:104A50000101010101010101010101010101010146
+:104A60000101010101010101010101010101010136
+:104A70000101010101010101010101010101010126
+:104A80000101010101010101010101010101010116
+:104A90000101010101010101010101010101010106
+:104AA00001010101010101010101010101010101F6
+:104AB00001010101010101010101010101010101E6
+:104AC00001010101010101010101010101010101D6
+:104AD00001010101010101010101010101010101C6
+:104AE00001010101010101010101010101010101B6
+:104AF00001010101010101010101010101010101A6
+:104B00000101010101010101010101010101010195
+:104B10000101010101010101010101010101010185
+:104B20000101010101010101010101010101010175
+:104B30000101010101010101010101010101010165
+:104B40000101010101010101010101010101010155
+:104B50000101010101010101010101010101010145
+:104B60000101010101010101010101010101010135
+:104B70000101010101010101010101010101010125
+:104B80000101010101010101010101010101010115
+:104B90000101010101010101010101010101010105
+:104BA00001010101010101010101010101010101F5
+:104BB00001010101010101010101010101010101E5
+:104BC00001010101010101010101010101010101D5
+:104BD00001010101010101010101010101010101C5
+:104BE00001010101010101010101010101010101B5
+:104BF00001010101010101010101010101010101A5
+:104C00000101010101010101010101010101010194
+:104C10000101010101010101010101010101010184
+:104C20000101010101010101010101010101010174
+:104C30000101010101010101010101010101010164
+:104C40000101010101010101010101010101010154
+:104C50000101010101010101010101010101010144
+:104C60000101010101010101010101010101010134
+:104C70000101010101010101010101010101010124
+:104C80000101010101010101010101010101010114
+:104C90000101010101010101010101010101010104
+:104CA00001010101010101010101010101010101F4
+:104CB00001010101010101010101010101010101E4
+:104CC00001010101010101010101010101010101D4
+:104CD00001010101010101010101010101010101C4
+:104CE00001010101010101010101010101010101B4
+:104CF00001010101010101010101010101010101A4
+:104D00000101010101010101010101010101010193
+:104D10000101010101010101010101010101010183
+:104D2000010101010101010000000000000000007C
+:104D30000000000000000000000000000000000073
+:104D40000000000000000000000000000000000063
+:104D50000000000000000000000000000000000053
+:104D60000000000000000000000000000000000043
+:104D70000000000000000000000000000000000033
+:104D80000000000000000000000000000000000023
+:104D90000000000000000000000000000000000013
+:104DA0000000000000000000000000000000000003
+:104DB00000000000000000000000000000000000F3
+:104DC00000000000000000000000000000000000E3
+:104DD00000000000000000000000000000000000D3
+:104DE00000000000000000000000000000000000C3
+:104DF00000000000000000000000000000000000B3
+:104E000000000000000000000000000000000000A2
+:104E10000000000000000000000000000000000092
+:104E20000000000000000000000000000000000082
+:104E30000000000000000000000000000000000072
+:104E40000000000000000000000000000000000062
+:104E50000000000000000000000000000000000052
+:104E60000000000000000000000000000000000042
+:104E70000000000000000000000000000000000032
+:104E80000000000000000000000000000000000022
+:104E90000000000000000000000000000000000012
+:104EA0000000000000000000000000000000000002
+:104EB00000000000000000000000000000000000F2
+:104EC00000000000000000000000000000000000E2
+:104ED00000000000000000000000000000000000D2
+:104EE00000000000000000000000000000000000C2
+:104EF00000000000000000000000000000000000B2
+:104F000000000000000000000000000000000000A1
+:104F10000000000000000000000000000000000091
+:104F20000000000000000000000000000000000081
+:104F30000000000000000000000000000000000071
+:104F40000000000000000000000000000000000061
+:104F50000000000000000000000000000000000051
+:104F60000000000000000000000000000000000041
+:104F70000000000000000000000000000000000031
+:104F80000000000000000000000000000000000021
+:104F90000000000000000000000000000000000011
+:104FA0000000000000000000000000000000000001
+:104FB00000000000000000000000000000000000F1
+:104FC00000000000000000000000000000000000E1
+:104FD00000000000000000000000000000000000D1
+:104FE00000000000000000000000000000000000C1
+:104FF00000000000000000000000000000000000B1
+:1050000000000000000000000000000000000000A0
+:105010000000000000000000000000000000000090
+:105020000000000000000000000000000000000080
+:105030000000000000000000000000000000000070
+:105040000000000000000000000000000000000060
+:105050000000000000000000000000000000000050
+:105060000000000000000000000000000000000040
+:105070000000000000000000000000000000000030
+:105080000000000000000000000000000000000020
+:105090000000000000000000000000000000000010
+:1050A0000000000000000000000000000000000000
+:1050B00000000000000000000000000000000000F0
+:1050C00000000000000000000000000000000000E0
+:1050D00000000000000000000000000000000000D0
+:1050E00000000000000000000000000000000000C0
+:1050F00000000000000000000000000000000000B0
+:10510000000000000000000000000000000000009F
+:10511000000000000000000000000000000000008F
+:10512000000000000000000000000000000000007F
+:10513000000000000000000000000000000000006F
+:10514000000000000000000000000000000000005F
+:10515000000000000000000000000000000000004F
+:10516000000000000000000000000000000000003F
+:10517000000000000000000000000000000000002F
+:10518000000000000000000000000000000000001F
+:10519000000000000000000000000000000000000F
+:1051A00000000000000000000000000000000000FF
+:1051B00000000000000000000000000000000000EF
+:1051C00000000000000000000000000000000000DF
+:1051D00000000000000000000000000000000000CF
+:1051E00000000000000000000000000000000000BF
+:1051F00000000000000000000000000000000000AF
+:10520000000000000000000000000000000000009E
+:10521000000000000000000000000000000000008E
+:10522000000000000000000000000000000000007E
+:10523000000000000000000000000000000000006E
+:10524000000000000000000000000000000000005E
+:10525000000000000000000000000000000000004E
+:10526000000000000000000000000000000000003E
+:10527000000000000000000000000000000000002E
+:10528000000000000000000000000000000000001E
+:10529000000000000000000000000000000000000E
+:1052A00000000000000000000000000000000000FE
+:1052B00000000000000000000000000000000000EE
+:1052C00000000000000000000000000000000000DE
+:1052D00000000000000000000000000000000000CE
+:1052E00000000000000000000000000000000000BE
+:1052F00000000000000000000000000000000000AE
+:10530000000000000000000000000000000000009D
+:10531000000000000000000000000000000000008D
+:10532000000000000000000000000000000000007D
+:10533000000000000000000000000000000000006D
+:10534000000000000000000000000000000000005D
+:10535000000000000000000000000000000000004D
+:10536000000000000000000000000000000000003D
+:10537000000000000000000000000000000000002D
+:10538000000000000000000000000000000000001D
+:10539000000000000000000000000000000000000D
+:1053A00000000000000000000000000000000000FD
+:1053B00000000000000000000000000000000000ED
+:1053C00000000000000000000000000000000000DD
+:1053D00000000000000000000000000000000000CD
+:1053E00000000000000000000000000000000000BD
+:1053F00000000000000000000000000000000000AD
+:10540000000000000000000000000000000000009C
+:10541000000000000000000000000000000000008C
+:10542000000000000000000202020202020202026A
+:10543000020202020202020202020202020202024C
+:10544000020202020202020202020202020202023C
+:10545000020202020202020202020202020202022C
+:10546000020202020202020202020202020202021C
+:10547000020202020202020202020202020202020C
+:1054800002020202020202020202020202020202FC
+:1054900002020202020202020202020202020202EC
+:1054A00002020202020202020202020202020202DC
+:1054B00002020202020202020202020202020202CC
+:1054C00002020202020202020202020202020202BC
+:1054D00002020202020202020202020202020202AC
+:1054E000020202020202020202020202020202029C
+:1054F000020202020202020202020202020202028C
+:10550000020202020202020202020202020202027B
+:10551000020202020202020202020202020202026B
+:10552000020202020202020202020202020202025B
+:10553000020202020202020202020202020202024B
+:10554000020202020202020202020202020202023B
+:10555000020202020202020202020202020202022B
+:10556000020202020202020202020202020202021B
+:10557000020202020202020202020202020202020B
+:1055800002020202020202020202020202020202FB
+:1055900002020202020202020202020202020202EB
+:1055A00002020202020202020202020202020202DB
+:1055B00002020202020202020202020202020202CB
+:1055C00002020202020202020202020202020202BB
+:1055D00002020202020202020202020202020202AB
+:1055E000020202020202020202020202020202029B
+:1055F000020202020202020202020202020202028B
+:10560000020202020202020202020202020202027A
+:10561000020202020202020202020202020202026A
+:10562000020202020202020202020202020202025A
+:10563000020202020202020202020202020202024A
+:10564000020202020202020202020202020202023A
+:10565000020202020202020202020202020202022A
+:10566000020202020202020202020202020202021A
+:10567000020202020202020202020202020202020A
+:1056800002020202020202020202020202020202FA
+:1056900002020202020202020202020202020202EA
+:1056A00002020202020202020202020202020202DA
+:1056B00002020202020202020202020202020202CA
+:1056C00002020202020202020202020202020202BA
+:1056D00002020202020202020202020202020202AA
+:1056E000020202020202020202020202020202029A
+:1056F000020202020202020202020202020202028A
+:105700000202020202020202020202020202020279
+:105710000202020202020202020202020202020269
+:105720000202020202020202020202020202020259
+:105730000202020202020202020202020202020249
+:105740000202020202020202020202020202020239
+:105750000202020202020202020202020202020229
+:105760000202020202020202020202020202020219
+:105770000202020202020202020202020202020209
+:1057800002020202020202020202020202020202F9
+:1057900002020202020202020202020202020202E9
+:1057A00002020202020202020202020202020202D9
+:1057B00002020202020202020202020202020202C9
+:1057C00002020202020202020202020202020202B9
+:1057D00002020202020202020202020202020202A9
+:1057E0000202020202020202020202020202020299
+:1057F0000202020202020202020202020202020289
+:105800000202020202020202020202020202020278
+:105810000202020202020202020202020202020268
+:105820000202020202020202020202020202020258
+:105830000202020202020202020202020202020248
+:105840000202020202020202020202020202020238
+:105850000202020202020202020202020202020228
+:105860000202020202020202020202020202020218
+:105870000202020202020202020202020202020208
+:1058800002020202020202020202020202020202F8
+:1058900002020202020202020202020202020202E8
+:1058A00002020202020202020202020202020202D8
+:1058B00002020202020202020202020202020202C8
+:1058C00002020202020202020202020202020202B8
+:1058D00002020202020202020202020202020202A8
+:1058E0000202020202020202020202020202020298
+:1058F0000202020202020202020202020202020288
+:105900000202020202020202020202020202020277
+:105910000202020202020202020202020202020267
+:105920000202020202020202020202020202020257
+:105930000202020202020202020202020202020247
+:105940000202020202020202020202020202020237
+:105950000202020202020202020202020202020227
+:105960000202020202020202020202020202020217
+:105970000202020202020202020202020202020207
+:1059800002020202020202020202020202020202F7
+:1059900002020202020202020202020202020202E7
+:1059A00002020202020202020202020202020202D7
+:1059B00002020202020202020202020202020202C7
+:1059C00002020202020202020202020202020202B7
+:1059D00002020202020202020202020202020202A7
+:1059E0000202020202020202020202020202020297
+:1059F0000202020202020202020202020202020287
+:105A00000202020202020202020202020202020276
+:105A10000202020202020202020202020202020266
+:105A20000202020202020202020202020202020256
+:105A30000202020202020202020202020202020246
+:105A40000202020202020202020202020202020236
+:105A50000202020202020202020202020202020226
+:105A60000202020202020202020202020202020216
+:105A70000202020202020202020202020202020206
+:105A800002020202020202020202020202020202F6
+:105A900002020202020202020202020202020202E6
+:105AA00002020202020202020202020202020202D6
+:105AB00002020202020202020202020202020202C6
+:105AC00002020202020202020202020202020202B6
+:105AD00002020202020202020202020202020202A6
+:105AE0000202020202020202020202020202020296
+:105AF0000202020202020202020202020202020286
+:105B00000202020202020202020202020202020275
+:105B10000202020202020202020202020202020265
+:105B20000202020202020202020202020202020255
+:105B30000202020202020202020202020202020245
+:105B40000202020202020202020202020202020235
+:105B50000202020202020202020202020202020225
+:105B60000202020202020202020202020202020215
+:105B70000202020202020202020202020202020205
+:105B800002020202020202020202020202020202F5
+:105B900002020202020202020202020202020202E5
+:105BA00002020202020202020202020202020202D5
+:105BB00002020202020202020202020202020202C5
+:105BC00002020202020202020202020202020202B5
+:105BD00002020202020202020202020202020202A5
+:105BE0000202020202020202020202020202020295
+:105BF0000202020202020202020202020202020285
+:105C00000202020202020202020202020202020274
+:105C10000202020202020202020202020202020264
+:105C20000202020202020202020202020202020254
+:105C30000202020202020202020202020202020244
+:105C40000202020202020202020202020202020234
+:105C50000202020202020202020202020202020224
+:105C60000202020202020202020202020202020214
+:105C70000202020202020202020202020202020204
+:105C800002020202020202020202020202020202F4
+:105C900002020202020202020202020202020202E4
+:105CA00002020202020202020202020202020202D4
+:105CB00002020202020202020202020202020202C4
+:105CC00002020202020202020202020202020202B4
+:105CD00002020202020202020202020202020202A4
+:105CE0000202020202020202020202020202020294
+:105CF0000202020202020202020202020202020284
+:105D00000202020202020202020202020202020273
+:105D10000202020202020202020202020202020263
+:105D20000202020202020202020202020202020253
+:105D30000202020202020202020202020202020243
+:105D40000202020202020202020202020202020233
+:105D50000202020202020202020202020202020223
+:105D60000202020202020202020202020202020213
+:105D70000202020202020202020202020202020203
+:105D800002020202020202020202020202020202F3
+:105D900002020202020202020202020202020202E3
+:105DA00002020202020202020202020202020202D3
+:105DB00002020202020202020202020202020202C3
+:105DC00002020202020202020202020202020202B3
+:105DD00002020202020202020202020202020202A3
+:105DE0000202020202020202020202020202020293
+:105DF0000202020202020202020202020202020283
+:105E00000202020202020202020202020202020272
+:105E10000202020202020202020202020202020262
+:105E20000202020202020200000000000000000064
+:105E30000000000000000000000000000000000062
+:105E40000000000000000000000000000000000052
+:105E50000000000000000000000000000000000042
+:105E60000000000000000000000000000000000032
+:105E70000000000000000000000000000000000022
+:105E80000000000000000000000000000000000012
+:105E90000000000000000000000000000000000002
+:105EA00000000000000000000000000000000000F2
+:105EB00000000000000000000000000000000000E2
+:105EC00000000000000000000000000000000000D2
+:105ED00000000000000000000000000000000000C2
+:105EE00000000000000000000000000000000000B2
+:105EF00000000000000000000000000000000000A2
+:105F00000000000000000000000000000000000091
+:105F10000000000000000000000000000000000081
+:105F20000000000000000000000000000000000071
+:105F30000000000000000000000000000000000061
+:105F40000000000000000000000000000000000051
+:105F50000000000000000000000000000000000041
+:105F60000000000000000000000000000000000031
+:105F70000000000000000000000000000000000021
+:105F80000000000000000000000000000000000011
+:105F90000000000000000000000000000000000001
+:105FA00000000000000000000000000000000000F1
+:105FB00000000000000000000000000000000000E1
+:105FC00000000000000000000000000000000000D1
+:105FD00000000000000000000000000000000000C1
+:105FE00000000000000000000000000000000000B1
+:105FF00000000000000000000000000000000000A1
+:106000000000000000000000000000000000000090
+:106010000000000000000000000000000000000080
+:106020000000000000000000000000000000000070
+:106030000000000000000000000000000000000060
+:106040000000000000000000000000000000000050
+:106050000000000000000000000000000000000040
+:106060000000000000000000000000000000000030
+:106070000000000000000000000000000000000020
+:106080000000000000000000000000000000000010
+:106090000000000000000000000000000000000000
+:1060A00000000000000000000000000000000000F0
+:1060B00000000000000000000000000000000000E0
+:1060C00000000000000000000000000000000000D0
+:1060D00000000000000000000000000000000000C0
+:1060E00000000000000000000000000000000000B0
+:1060F00000000000000000000000000000000000A0
+:10610000000000000000000000000000000000008F
+:10611000000000000000000000000000000000007F
+:10612000000000000000000000000000000000006F
+:10613000000000000000000000000000000000005F
+:10614000000000000000000000000000000000004F
+:10615000000000000000000000000000000000003F
+:10616000000000000000000000000000000000002F
+:10617000000000000000000000000000000000001F
+:10618000000000000000000000000000000000000F
+:1061900000000000000000000000000000000000FF
+:1061A00000000000000000000000000000000000EF
+:1061B00000000000000000000000000000000000DF
+:1061C00000000000000000000000000000000000CF
+:1061D00000000000000000000000000000000000BF
+:1061E00000000000000000000000000000000000AF
+:1061F000000000000000000000000000000000009F
+:10620000000000000000000000000000000000008E
+:10621000000000000000000000000000000000007E
+:10622000000000000000000000000000000000006E
+:10623000000000000000000000000000000000005E
+:10624000000000000000000000000000000000004E
+:10625000000000000000000000000000000000003E
+:10626000000000000000000000000000000000002E
+:10627000000000000000000000000000000000001E
+:10628000000000000000000000000000000000000E
+:1062900000000000000000000000000000000000FE
+:1062A00000000000000000000000000000000000EE
+:1062B00000000000000000000000000000000000DE
+:1062C00000000000000000000000000000000000CE
+:1062D00000000000000000000000000000000000BE
+:1062E00000000000000000000000000000000000AE
+:1062F000000000000000000000000000000000009E
+:10630000000000000000000000000000000000008D
+:10631000000000000000000000000000000000007D
+:10632000000000000000000000000000000000006D
+:10633000000000000000000000000000000000005D
+:10634000000000000000000000000000000000004D
+:10635000000000000000000000000000000000003D
+:10636000000000000000000000000000000000002D
+:10637000000000000000000000000000000000001D
+:10638000000000000000000000000000000000000D
+:1063900000000000000000000000000000000000FD
+:1063A00000000000000000000000000000000000ED
+:1063B00000000000000000000000000000000000DD
+:1063C00000000000000000000000000000000000CD
+:1063D00000000000000000000000000000000000BD
+:1063E00000000000000000000000000000000000AD
+:1063F000000000000000000000000000000000009D
+:10640000000000000000000000000000000000008C
+:10641000000000000000000000000000000000007C
+:10642000000000000000003B000000000000000130
+:10643000010101010101010101010101010101014C
+:10644000010101010101010101010101010101013C
+:10645000010101010101010101010101010101012C
+:10646000010101010101010101010101010101011C
+:10647000010101010101010101010101010101010C
+:1064800001010101010101010101010101010101FC
+:1064900001010101010101010101010101010101EC
+:1064A00001010101010101010101010101010101DC
+:1064B00001010101010101010101010101010101CC
+:1064C00001010101010101010101010101010101BC
+:1064D00001010101010101010101010101010101AC
+:1064E000010101010101010101010101010101019C
+:1064F000010101010101010101010101010101018C
+:10650000010101010101010101010101010101017B
+:10651000010101010101010101010101010101016B
+:10652000010101010101010101010101010101015B
+:10653000010101010101010101010101010101014B
+:10654000010101010101010101010101010101013B
+:10655000010101010101010101010101010101012B
+:10656000010101010101010101010101010101011B
+:10657000010101010101010101010101010101010B
+:1065800001010101010101010101010101010101FB
+:1065900001010101010101010101010101010101EB
+:1065A00001010101010101010101010101010101DB
+:1065B00001010101010101010101010101010101CB
+:1065C00001010101010101010101010101010101BB
+:1065D00001010101010101010101010101010101AB
+:1065E000010101010101010101010101010101019B
+:1065F000010101010101010101010101010101018B
+:10660000010101010101010101010101010101017A
+:10661000010101010101010101010101010101016A
+:10662000010101010101010101010101010101015A
+:10663000010101010101010101010101010101014A
+:10664000010101010101010101010101010101013A
+:10665000010101010101010101010101010101012A
+:10666000010101010101010101010101010101011A
+:10667000010101010101010101010101010101010A
+:1066800001010101010101010101010101010101FA
+:1066900001010101010101010101010101010101EA
+:1066A00001010101010101010101010101010101DA
+:1066B00001010101010101010101010101010101CA
+:1066C00001010101010101010101010101010101BA
+:1066D00001010101010101010101010101010101AA
+:1066E000010101010101010101010101010101019A
+:1066F000010101010101010101010101010101018A
+:106700000101010101010101010101010101010179
+:106710000101010101010101010101010101010169
+:106720000101010101010101010101010101010159
+:106730000101010101010101010101010101010149
+:106740000101010101010101010101010101010139
+:106750000101010101010101010101010101010129
+:106760000101010101010101010101010101010119
+:106770000101010101010101010101010101010109
+:1067800001010101010101010101010101010101F9
+:1067900001010101010101010101010101010101E9
+:1067A00001010101010101010101010101010101D9
+:1067B00001010101010101010101010101010101C9
+:1067C00001010101010101010101010101010101B9
+:1067D00001010101010101010101010101010101A9
+:1067E0000101010101010101010101010101010199
+:1067F0000101010101010101010101010101010189
+:106800000101010101010101010101010101010178
+:106810000101010101010101010101010101010168
+:106820000101010101010101010101010101010158
+:106830000101010101010101010101010101010148
+:106840000101010101010101010101010101010138
+:106850000101010101010101010101010101010128
+:106860000101010101010101010101010101010118
+:106870000101010101010101010101010101010108
+:1068800001010101010101010101010101010101F8
+:1068900001010101010101010101010101010101E8
+:1068A00001010101010101010101010101010101D8
+:1068B00001010101010101010101010101010101C8
+:1068C00001010101010101010101010101010101B8
+:1068D00001010101010101010101010101010101A8
+:1068E0000101010101010101010101010101010198
+:1068F0000101010101010101010101010101010188
+:106900000101010101010101010101010101010177
+:106910000101010101010101010101010101010167
+:106920000101010101010101010101010101010157
+:106930000101010101010101010101010101010147
+:106940000101010101010101010101010101010137
+:106950000101010101010101010101010101010127
+:106960000101010101010101010101010101010117
+:106970000101010101010101010101010101010107
+:1069800001010101010101010101010101010101F7
+:1069900001010101010101010101010101010101E7
+:1069A00001010101010101010101010101010101D7
+:1069B00001010101010101010101010101010101C7
+:1069C00001010101010101010101010101010101B7
+:1069D00001010101010101010101010101010101A7
+:1069E0000101010101010101010101010101010197
+:1069F0000101010101010101010101010101010187
+:106A00000101010101010101010101010101010176
+:106A10000101010101010101010101010101010166
+:106A20000101010101010101010101010101010156
+:106A30000101010101010101010101010101010146
+:106A40000101010101010101010101010101010136
+:106A50000101010101010101010101010101010126
+:106A60000101010101010101010101010101010116
+:106A70000101010101010101010101010101010106
+:106A800001010101010101010101010101010101F6
+:106A900001010101010101010101010101010101E6
+:106AA00001010101010101010101010101010101D6
+:106AB00001010101010101010101010101010101C6
+:106AC00001010101010101010101010101010101B6
+:106AD00001010101010101010101010101010101A6
+:106AE0000101010101010101010101010101010196
+:106AF0000101010101010101010101010101010186
+:106B00000101010101010101010101010101010175
+:106B10000101010101010101010101010101010165
+:106B20000101010101010101010101010101010155
+:106B30000101010101010101010101010101010145
+:106B40000101010101010101010101010101010135
+:106B50000101010101010101010101010101010125
+:106B60000101010101010101010101010101010115
+:106B70000101010101010101010101010101010105
+:106B800001010101010101010101010101010101F5
+:106B900001010101010101010101010101010101E5
+:106BA00001010101010101010101010101010101D5
+:106BB00001010101010101010101010101010101C5
+:106BC00001010101010101010101010101010101B5
+:106BD00001010101010101010101010101010101A5
+:106BE0000101010101010101010101010101010195
+:106BF0000101010101010101010101010101010185
+:106C00000101010101010101010101010101010174
+:106C10000101010101010101010101010101010164
+:106C20000101010101010101010101010101010055
+:106C30000000000000000000000000000000000054
+:106C40000000000000000000000000000000000044
+:106C50000000000000000000000000000000000034
+:106C60000000000000000000000000000000000024
+:106C70000000000000000000000000000000000014
+:106C80000000000000000000000000000000000004
+:106C900000000000000000000000000000000000F4
+:106CA00000000000000000000000000000000000E4
+:106CB00000000000000000000000000000000000D4
+:106CC00000000000000000000000000000000000C4
+:106CD00000000000000000000000000000000000B4
+:106CE00000000000000000000000000000000000A4
+:106CF0000000000000000000000000000000000094
+:106D00000000000000000000000000000000000083
+:106D10000000000000000000000000000000000073
+:106D20000000000000000000000000000000000063
+:106D30000000000000000000000000000000000053
+:106D40000000000000000000000000000000000043
+:106D50000000000000000000000000000000000033
+:106D60000000000000000000000000000000000023
+:106D70000000000000000000000000000000000013
+:106D80000000000000000000000000000000000003
+:106D900000000000000000000000000000000000F3
+:106DA00000000000000000000000000000000000E3
+:106DB00000000000000000000000000000000000D3
+:106DC00000000000000000000000000000000000C3
+:106DD00000000000000000000000000000000000B3
+:106DE00000000000000000000000000000000000A3
+:106DF0000000000000000000000000000000000093
+:106E00000000000000000000000000000000000082
+:106E10000000000000000000000000000000000072
+:106E20000000000000000000000000000000000062
+:106E30000000000000000000000000000000000052
+:106E40000000000000000000000000000000000042
+:106E50000000000000000000000000000000000032
+:106E60000000000000000000000000000000000022
+:106E70000000000000000000000000000000000012
+:106E80000000000000000000000000000000000002
+:106E900000000000000000000000000000000000F2
+:106EA00000000000000000000000000000000000E2
+:106EB00000000000000000000000000000000000D2
+:106EC00000000000000000000000000000000000C2
+:106ED00000000000000000000000000000000000B2
+:106EE00000000000000000000000000000000000A2
+:106EF0000000000000000000000000000000000092
+:106F00000000000000000000000000000000000081
+:106F10000000000000000000000000000000000071
+:106F20000000000000000000000000000000000061
+:106F30000000000000000000000000000000000051
+:106F40000000000000000000000000000000000041
+:106F50000000000000000000000000000000000031
+:106F60000000000000000000000000000000000021
+:106F70000000000000000000000000000000000011
+:106F80000000000000000000000000000000000001
+:106F900000000000000000000000000000000000F1
+:106FA00000000000000000000000000000000000E1
+:106FB00000000000000000000000000000000000D1
+:106FC00000000000000000000000000000000000C1
+:106FD00000000000000000000000000000000000B1
+:106FE00000000000000000000000000000000000A1
+:106FF0000000000000000000000000000000000091
+:107000000000000000000000000000000000000080
+:107010000000000000000000000000000000000070
+:107020000000000000000000000000000000000060
+:107030000000000000000000000000000000000050
+:107040000000000000000000000000000000000040
+:107050000000000000000000000000000000000030
+:107060000000000000000000000000000000000020
+:107070000000000000000000000000000000000010
+:107080000000000000000000000000000000000000
+:1070900000000000000000000000000000000000F0
+:1070A00000000000000000000000000000000000E0
+:1070B00000000000000000000000000000000000D0
+:1070C00000000000000000000000000000000000C0
+:1070D00000000000000000000000000000000000B0
+:1070E00000000000000000000000000000000000A0
+:1070F0000000000000000000000000000000000090
+:10710000000000000000000000000000000000007F
+:10711000000000000000000000000000000000006F
+:10712000000000000000000000000000000000005F
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000003F
+:10715000000000000000000000000000000000002F
+:10716000000000000000000000000000000000001F
+:10717000000000000000000000000000000000000F
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000000EF
+:1071A00000000000000000000000000000000000DF
+:1071B00000000000000000000000000000000000CF
+:1071C00000000000000000000000000000000000BF
+:1071D00000000000000000000000000000000000AF
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000008F
+:10720000000000000000000000000000000000007E
+:10721000000000000000000000000000000000006E
+:10722000000000000000000000000000000000025C
+:10723000020202020202020202020202020202022E
+:10724000020202020202020202020202020202021E
+:10725000020202020202020202020202020202020E
+:1072600002020202020202020202020202020202FE
+:1072700002020202020202020202020202020202EE
+:1072800002020202020202020202020202020202DE
+:1072900002020202020202020202020202020202CE
+:1072A00002020202020202020202020202020202BE
+:1072B00002020202020202020202020202020202AE
+:1072C000020202020202020202020202020202029E
+:1072D000020202020202020202020202020202028E
+:1072E000020202020202020202020202020202027E
+:1072F000020202020202020202020202020202026E
+:10730000020202020202020202020202020202025D
+:10731000020202020202020202020202020202024D
+:10732000020202020202020202020202020202023D
+:10733000020202020202020202020202020202022D
+:10734000020202020202020202020202020202021D
+:10735000020202020202020202020202020202020D
+:1073600002020202020202020202020202020202FD
+:1073700002020202020202020202020202020202ED
+:1073800002020202020202020202020202020202DD
+:1073900002020202020202020202020202020202CD
+:1073A00002020202020202020202020202020202BD
+:1073B00002020202020202020202020202020202AD
+:1073C000020202020202020202020202020202029D
+:1073D000020202020202020202020202020202028D
+:1073E000020202020202020202020202020202027D
+:1073F000020202020202020202020202020202026D
+:10740000020202020202020202020202020202025C
+:10741000020202020202020202020202020202024C
+:10742000020202020202020202020202020202023C
+:10743000020202020202020202020202020202022C
+:10744000020202020202020202020202020202021C
+:10745000020202020202020202020202020202020C
+:1074600002020202020202020202020202020202FC
+:1074700002020202020202020202020202020202EC
+:1074800002020202020202020202020202020202DC
+:1074900002020202020202020202020202020202CC
+:1074A00002020202020202020202020202020202BC
+:1074B00002020202020202020202020202020202AC
+:1074C000020202020202020202020202020202029C
+:1074D000020202020202020202020202020202028C
+:1074E000020202020202020202020202020202027C
+:1074F000020202020202020202020202020202026C
+:10750000020202020202020202020202020202025B
+:10751000020202020202020202020202020202024B
+:10752000020202020202020202020202020202023B
+:10753000020202020202020202020202020202022B
+:10754000020202020202020202020202020202021B
+:10755000020202020202020202020202020202020B
+:1075600002020202020202020202020202020202FB
+:1075700002020202020202020202020202020202EB
+:1075800002020202020202020202020202020202DB
+:1075900002020202020202020202020202020202CB
+:1075A00002020202020202020202020202020202BB
+:1075B00002020202020202020202020202020202AB
+:1075C000020202020202020202020202020202029B
+:1075D000020202020202020202020202020202028B
+:1075E000020202020202020202020202020202027B
+:1075F000020202020202020202020202020202026B
+:10760000020202020202020202020202020202025A
+:10761000020202020202020202020202020202024A
+:10762000020202020202020202020202020202023A
+:10763000020202020202020202020202020202022A
+:10764000020202020202020202020202020202021A
+:10765000020202020202020202020202020202020A
+:1076600002020202020202020202020202020202FA
+:1076700002020202020202020202020202020202EA
+:1076800002020202020202020202020202020202DA
+:1076900002020202020202020202020202020202CA
+:1076A00002020202020202020202020202020202BA
+:1076B00002020202020202020202020202020202AA
+:1076C000020202020202020202020202020202029A
+:1076D000020202020202020202020202020202028A
+:1076E000020202020202020202020202020202027A
+:1076F000020202020202020202020202020202026A
+:107700000202020202020202020202020202020259
+:107710000202020202020202020202020202020249
+:107720000202020202020202020202020202020239
+:107730000202020202020202020202020202020229
+:107740000202020202020202020202020202020219
+:107750000202020202020202020202020202020209
+:1077600002020202020202020202020202020202F9
+:1077700002020202020202020202020202020202E9
+:1077800002020202020202020202020202020202D9
+:1077900002020202020202020202020202020202C9
+:1077A00002020202020202020202020202020202B9
+:1077B00002020202020202020202020202020202A9
+:1077C0000202020202020202020202020202020299
+:1077D0000202020202020202020202020202020289
+:1077E0000202020202020202020202020202020279
+:1077F0000202020202020202020202020202020269
+:107800000202020202020202020202020202020258
+:107810000202020202020202020202020202020248
+:107820000202020202020202020202020202020238
+:107830000202020202020202020202020202020228
+:107840000202020202020202020202020202020218
+:107850000202020202020202020202020202020208
+:1078600002020202020202020202020202020202F8
+:1078700002020202020202020202020202020202E8
+:1078800002020202020202020202020202020202D8
+:1078900002020202020202020202020202020202C8
+:1078A00002020202020202020202020202020202B8
+:1078B00002020202020202020202020202020202A8
+:1078C0000202020202020202020202020202020298
+:1078D0000202020202020202020202020202020288
+:1078E0000202020202020202020202020202020278
+:1078F0000202020202020202020202020202020268
+:107900000202020202020202020202020202020257
+:107910000202020202020202020202020202020247
+:107920000202020202020202020202020202020237
+:107930000202020202020202020202020202020227
+:107940000202020202020202020202020202020217
+:107950000202020202020202020202020202020207
+:1079600002020202020202020202020202020202F7
+:1079700002020202020202020202020202020202E7
+:1079800002020202020202020202020202020202D7
+:1079900002020202020202020202020202020202C7
+:1079A00002020202020202020202020202020202B7
+:1079B00002020202020202020202020202020202A7
+:1079C0000202020202020202020202020202020297
+:1079D0000202020202020202020202020202020287
+:1079E0000202020202020202020202020202020277
+:1079F0000202020202020202020202020202020267
+:107A00000202020202020202020202020202020256
+:107A10000202020202020202020202020202020246
+:107A20000202020202020202020202020202020038
+:107A30000000000000000000000000000000000046
+:107A40000000000000000000000000000000000036
+:107A50000000000000000000000000000000000026
+:107A60000000000000000000000000000000000016
+:107A70000000000000000000000000000000000006
+:107A800000000000000000000000000000000000F6
+:107A900000000000000000000000000000000000E6
+:107AA00000000000000000000000000000000000D6
+:107AB00000000000000000000000000000000000C6
+:107AC00000000000000000000000000000000000B6
+:107AD00000000000000000000000000000000000A6
+:107AE0000000000000000000000000000000000096
+:107AF0000000000000000000000000000000000086
+:107B00000000000000000000000000000000000075
+:107B10000000000000000000000000000000000065
+:107B20000000000000000000000000000000000055
+:107B30000000000000000000000000000000000045
+:107B40000000000000000000000000000000000035
+:107B50000000000000000000000000000000000025
+:107B60000000000000000000000000000000000015
+:107B70000000000000000000000000000000000005
+:107B800000000000000000000000000000000000F5
+:107B900000000000000000000000000000000000E5
+:107BA00000000000000000000000000000000000D5
+:107BB00000000000000000000000000000000000C5
+:107BC00000000000000000000000000000000000B5
+:107BD00000000000000000000000000000000000A5
+:107BE0000000000000000000000000000000000095
+:107BF0000000000000000000000000000000000085
+:107C00000000000000000000000000000000000074
+:107C10000000000000000000000000000000000064
+:107C20000000000000000000000000000000000054
+:107C30000000000000000000000000000000000044
+:107C40000000000000000000000000000000000034
+:107C50000000000000000000000000000000000024
+:107C60000000000000000000000000000000000014
+:107C70000000000000000000000000000000000004
+:107C800000000000000000000000000000000000F4
+:107C900000000000000000000000000000000000E4
+:107CA00000000000000000000000000000000000D4
+:107CB00000000000000000000000000000000000C4
+:107CC00000000000000000000000000000000000B4
+:107CD00000000000000000000000000000000000A4
+:107CE0000000000000000000000000000000000094
+:107CF0000000000000000000000000000000000084
+:107D00000000000000000000000000000000000073
+:107D10000000000000000000000000000000000063
+:107D20000000000000000000000000000000000053
+:107D30000000000000000000000000000000000043
+:107D40000000000000000000000000000000000033
+:107D50000000000000000000000000000000000023
+:107D60000000000000000000000000000000000013
+:107D70000000000000000000000000000000000003
+:107D800000000000000000000000000000000000F3
+:107D900000000000000000000000000000000000E3
+:107DA00000000000000000000000000000000000D3
+:107DB00000000000000000000000000000000000C3
+:107DC00000000000000000000000000000000000B3
+:107DD00000000000000000000000000000000000A3
+:107DE0000000000000000000000000000000000093
+:107DF0000000000000000000000000000000000083
+:107E00000000000000000000000000000000000072
+:107E10000000000000000000000000000000000062
+:107E20000000000000000000000000000000000052
+:107E30000000000000000000000000000000000042
+:107E40000000000000000000000000000000000032
+:107E50000000000000000000000000000000000022
+:107E60000000000000000000000000000000000012
+:107E70000000000000000000000000000000000002
+:107E800000000000000000000000000000000000F2
+:107E900000000000000000000000000000000000E2
+:107EA00000000000000000000000000000000000D2
+:107EB00000000000000000000000000000000000C2
+:107EC00000000000000000000000000000000000B2
+:107ED00000000000000000000000000000000000A2
+:107EE0000000000000000000000000000000000092
+:107EF0000000000000000000000000000000000082
+:107F00000000000000000000000000000000000071
+:107F10000000000000000000000000000000000061
+:107F20000000000000000000000000000000000051
+:107F30000000000000000000000000000000000041
+:107F40000000000000000000000000000000000031
+:107F50000000000000000000000000000000000021
+:107F60000000000000000000000000000000000011
+:107F70000000000000000000000000000000000001
+:107F800000000000000000000000000000000000F1
+:107F900000000000000000000000000000000000E1
+:107FA00000000000000000000000000000000000D1
+:107FB00000000000000000000000000000000000C1
+:107FC00000000000000000000000000000000000B1
+:107FD00000000000000000000000000000000000A1
+:107FE0000000000000000000000000000000000091
+:107FF0000000000000000000000000000000000081
+:108000000000000000000000000000000000000070
+:108010000000000000000000000000000000000060
+:108020000000000000000000000000000000000050
+:108030000000000000000000000000000000000040
+:108040000000000000000000000000000000000030
+:108050000000000000000000000000000000000020
+:108060000000000000000000000000000000000010
+:108070000000000000000000000000000000000000
+:1080800000000000000000000000000000000000F0
+:1080900000000000000000000000000000000000E0
+:1080A00000000000000000000000000000000000D0
+:1080B00000000000000000000000000000000000C0
+:1080C00000000000000000000000000000000000B0
+:1080D00000000000000000000000000000000000A0
+:1080E0000000000000000000000000000000000090
+:1080F0000000000000000000000000000000000080
+:10810000000000000000000000000000000000006F
+:10811000000000000000000000000000000000005F
+:10812000000000000000000000000000000000004F
+:10813000000000000000000000000000000000003F
+:10814000000000000000000000000000000000002F
+:10815000000000000000000000000000000000001F
+:10816000000000000000000000000000000000000F
+:1081700000000000000000000000000000000000FF
+:1081800000000000000000000000000000000000EF
+:1081900000000000000000000000000000000000DF
+:1081A00000000000000000000000000000000000CF
+:1081B00000000000000000000000000000000000BF
+:1081C00000000000000000000000000000000000AF
+:1081D000000000000000000000000000000000009F
+:1081E000000000000000000000000000000000008F
+:1081F000000000000000000000000000000000007F
+:10820000000000000000000000000000000000006E
+:10821000000000000000000000000000000000005E
+:10822000000000000000000000000000000000004E
+:10823000000000000000000000000000000000003E
+:10824000000000000000000000000000000000002E
+:10825000000000000000000000000000000000001E
+:10826000000000000000000000000000000000000E
+:1082700000000000000000000000000000000000FE
+:1082800000000000000000000000000000000000EE
+:1082900000000000000000000000000000000000DE
+:1082A00000000000000000000000000000000000CE
+:1082B00000000000000000000000000000000000BE
+:1082C00000000000000000000000000000000000AE
+:1082D000000000000000000000000000000000009E
+:1082E000000000000000000000000000000000008E
+:1082F000000000000000000000000000000000007E
+:10830000000000000000000000000000000000006D
+:10831000000000000000000000000000000000005D
+:10832000000000000000000000000000000000014C
+:10833000010101010101010101010101010101012D
+:10834000010101010101010101010101010101011D
+:10835000010101010101010101010101010101010D
+:1083600001010101010101010101010101010101FD
+:1083700001010101010101010101010101010101ED
+:1083800001010101010101010101010101010101DD
+:1083900001010101010101010101010101010101CD
+:1083A00001010101010101010101010101010101BD
+:1083B00001010101010101010101010101010101AD
+:1083C000010101010101010101010101010101019D
+:1083D000010101010101010101010101010101018D
+:1083E000010101010101010101010101010101017D
+:1083F000010101010101010101010101010101016D
+:10840000010101010101010101010101010101015C
+:10841000010101010101010101010101010101014C
+:10842000010101010101010101010101010101013C
+:10843000010101010101010101010101010101012C
+:10844000010101010101010101010101010101011C
+:10845000010101010101010101010101010101010C
+:1084600001010101010101010101010101010101FC
+:1084700001010101010101010101010101010101EC
+:1084800001010101010101010101010101010101DC
+:1084900001010101010101010101010101010101CC
+:1084A00001010101010101010101010101010101BC
+:1084B00001010101010101010101010101010101AC
+:1084C000010101010101010101010101010101019C
+:1084D000010101010101010101010101010101018C
+:1084E000010101010101010101010101010101017C
+:1084F000010101010101010101010101010101016C
+:10850000010101010101010101010101010101015B
+:10851000010101010101010101010101010101014B
+:10852000010101010101010101010101010101013B
+:10853000010101010101010101010101010101012B
+:10854000010101010101010101010101010101011B
+:10855000010101010101010101010101010101010B
+:1085600001010101010101010101010101010101FB
+:1085700001010101010101010101010101010101EB
+:1085800001010101010101010101010101010101DB
+:1085900001010101010101010101010101010101CB
+:1085A00001010101010101010101010101010101BB
+:1085B00001010101010101010101010101010101AB
+:1085C000010101010101010101010101010101019B
+:1085D000010101010101010101010101010101018B
+:1085E000010101010101010101010101010101017B
+:1085F000010101010101010101010101010101016B
+:10860000010101010101010101010101010101015A
+:10861000010101010101010101010101010101014A
+:10862000010101010101010101010101010101013A
+:10863000010101010101010101010101010101012A
+:10864000010101010101010101010101010101011A
+:10865000010101010101010101010101010101010A
+:1086600001010101010101010101010101010101FA
+:1086700001010101010101010101010101010101EA
+:1086800001010101010101010101010101010101DA
+:1086900001010101010101010101010101010101CA
+:1086A00001010101010101010101010101010101BA
+:1086B00001010101010101010101010101010101AA
+:1086C000010101010101010101010101010101019A
+:1086D000010101010101010101010101010101018A
+:1086E000010101010101010101010101010101017A
+:1086F000010101010101010101010101010101016A
+:108700000101010101010101010101010101010159
+:108710000101010101010101010101010101010149
+:108720000101010101010101010101010101010139
+:108730000101010101010101010101010101010129
+:108740000101010101010101010101010101010119
+:108750000101010101010101010101010101010109
+:1087600001010101010101010101010101010101F9
+:1087700001010101010101010101010101010101E9
+:1087800001010101010101010101010101010101D9
+:1087900001010101010101010101010101010101C9
+:1087A00001010101010101010101010101010101B9
+:1087B00001010101010101010101010101010101A9
+:1087C0000101010101010101010101010101010199
+:1087D0000101010101010101010101010101010189
+:1087E0000101010101010101010101010101010179
+:1087F0000101010101010101010101010101010169
+:108800000101010101010101010101010101010158
+:108810000101010101010101010101010101010148
+:108820000101010101010101010101010101010138
+:108830000101010101010101010101010101010128
+:108840000101010101010101010101010101010118
+:108850000101010101010101010101010101010108
+:1088600001010101010101010101010101010101F8
+:1088700001010101010101010101010101010101E8
+:1088800001010101010101010101010101010101D8
+:1088900001010101010101010101010101010101C8
+:1088A00001010101010101010101010101010101B8
+:1088B00001010101010101010101010101010101A8
+:1088C0000101010101010101010101010101010198
+:1088D0000101010101010101010101010101010188
+:1088E0000101010101010101010101010101010178
+:1088F0000101010101010101010101010101010168
+:108900000101010101010101010101010101010157
+:108910000101010101010101010101010101010147
+:108920000101010101010101010101010101010137
+:108930000101010101010101010101010101010127
+:108940000101010101010101010101010101010117
+:108950000101010101010101010101010101010107
+:1089600001010101010101010101010101010101F7
+:1089700001010101010101010101010101010101E7
+:1089800001010101010101010101010101010101D7
+:1089900001010101010101010101010101010101C7
+:1089A00001010101010101010101010101010101B7
+:1089B00001010101010101010101010101010101A7
+:1089C0000101010101010101010101010101010197
+:1089D0000101010101010101010101010101010187
+:1089E0000101010101010101010101010101010177
+:1089F0000101010101010101010101010101010167
+:108A00000101010101010101010101010101010156
+:108A10000101010101010101010101010101010146
+:108A20000101010101010101010101010101010136
+:108A30000101010101010101010101010101010126
+:108A40000101010101010101010101010101010116
+:108A50000101010101010101010101010101010106
+:108A600001010101010101010101010101010101F6
+:108A700001010101010101010101010101010101E6
+:108A800001010101010101010101010101010101D6
+:108A900001010101010101010101010101010101C6
+:108AA00001010101010101010101010101010101B6
+:108AB00001010101010101010101010101010101A6
+:108AC0000101010101010101010101010101010196
+:108AD0000101010101010101010101010101010186
+:108AE0000101010101010101010101010101010176
+:108AF0000101010101010101010101010101010166
+:108B00000101010101010101010101010101010155
+:108B10000101010101010101010101010101010145
+:108B20000101010101010101010101010101010036
+:108B30000000000000000000000000000000000035
+:108B40000000000000000000000000000000000025
+:108B50000000000000000000000000000000000015
+:108B60000000000000000000000000000000000005
+:108B700000000000000000000000000000000000F5
+:108B800000000000000000000000000000000000E5
+:108B900000000000000000000000000000000000D5
+:108BA00000000000000000000000000000000000C5
+:108BB00000000000000000000000000000000000B5
+:108BC00000000000000000000000000000000000A5
+:108BD0000000000000000000000000000000000095
+:108BE0000000000000000000000000000000000085
+:108BF0000000000000000000000000000000000075
+:108C00000000000000000000000000000000000064
+:108C10000000000000000000000000000000000054
+:108C20000000000000000000000000000000000044
+:108C30000000000000000000000000000000000034
+:108C40000000000000000000000000000000000024
+:108C50000000000000000000000000000000000014
+:108C60000000000000000000000000000000000004
+:108C700000000000000000000000000000000000F4
+:108C800000000000000000000000000000000000E4
+:108C900000000000000000000000000000000000D4
+:108CA00000000000000000000000000000000000C4
+:108CB00000000000000000000000000000000000B4
+:108CC00000000000000000000000000000000000A4
+:108CD0000000000000000000000000000000000094
+:108CE0000000000000000000000000000000000084
+:108CF0000000000000000000000000000000000074
+:108D00000000000000000000000000000000000063
+:108D10000000000000000000000000000000000053
+:108D20000000000000000000000000000000000043
+:108D30000000000000000000000000000000000033
+:108D40000000000000000000000000000000000023
+:108D50000000000000000000000000000000000013
+:108D60000000000000000000000000000000000003
+:108D700000000000000000000000000000000000F3
+:108D800000000000000000000000000000000000E3
+:108D900000000000000000000000000000000000D3
+:108DA00000000000000000000000000000000000C3
+:108DB00000000000000000000000000000000000B3
+:108DC00000000000000000000000000000000000A3
+:108DD0000000000000000000000000000000000093
+:108DE0000000000000000000000000000000000083
+:108DF0000000000000000000000000000000000073
+:108E00000000000000000000000000000000000062
+:108E10000000000000000000000000000000000052
+:108E20000000000000000000000000000000000042
+:108E30000000000000000000000000000000000032
+:108E40000000000000000000000000000000000022
+:108E50000000000000000000000000000000000012
+:108E60000000000000000000000000000000000002
+:108E700000000000000000000000000000000000F2
+:108E800000000000000000000000000000000000E2
+:108E900000000000000000000000000000000000D2
+:108EA00000000000000000000000000000000000C2
+:108EB00000000000000000000000000000000000B2
+:108EC00000000000000000000000000000000000A2
+:108ED0000000000000000000000000000000000092
+:108EE0000000000000000000000000000000000082
+:108EF0000000000000000000000000000000000072
+:108F00000000000000000000000000000000000061
+:108F10000000000000000000000000000000000051
+:108F20000000000000000000000000000000000041
+:108F30000000000000000000000000000000000031
+:108F40000000000000000000000000000000000021
+:108F50000000000000000000000000000000000011
+:108F60000000000000000000000000000000000001
+:108F700000000000000000000000000000000000F1
+:108F800000000000000000000000000000000000E1
+:108F900000000000000000000000000000000000D1
+:108FA00000000000000000000000000000000000C1
+:108FB00000000000000000000000000000000000B1
+:108FC00000000000000000000000000000000000A1
+:108FD0000000000000000000000000000000000091
+:108FE0000000000000000000000000000000000081
+:108FF0000000000000000000000000000000000071
+:109000000000000000000000000000000000000060
+:109010000000000000000000000000000000000050
+:109020000000000000000000000000000000000040
+:109030000000000000000000000000000000000030
+:109040000000000000000000000000000000000020
+:109050000000000000000000000000000000000010
+:109060000000000000000000000000000000000000
+:1090700000000000000000000000000000000000F0
+:1090800000000000000000000000000000000000E0
+:1090900000000000000000000000000000000000D0
+:1090A00000000000000000000000000000000000C0
+:1090B00000000000000000000000000000000000B0
+:1090C00000000000000000000000000000000000A0
+:1090D0000000000000000000000000000000000090
+:1090E0000000000000000000000000000000000080
+:1090F0000000000000000000000000000000000070
+:10910000000000000000000000000000000000005F
+:10911000000000000000000000000000000000004F
+:10912000000000000000000000000000000000023D
+:10913000020202020202020202020202020202020F
+:1091400002020202020202020202020202020202FF
+:1091500002020202020202020202020202020202EF
+:1091600002020202020202020202020202020202DF
+:1091700002020202020202020202020202020202CF
+:1091800002020202020202020202020202020202BF
+:1091900002020202020202020202020202020202AF
+:1091A000020202020202020202020202020202029F
+:1091B000020202020202020202020202020202028F
+:1091C000020202020202020202020202020202027F
+:1091D000020202020202020202020202020202026F
+:1091E000020202020202020202020202020202025F
+:1091F000020202020202020202020202020202024F
+:10920000020202020202020202020202020202023E
+:10921000020202020202020202020202020202022E
+:10922000020202020202020202020202020202021E
+:10923000020202020202020202020202020202020E
+:1092400002020202020202020202020202020202FE
+:1092500002020202020202020202020202020202EE
+:1092600002020202020202020202020202020202DE
+:1092700002020202020202020202020202020202CE
+:1092800002020202020202020202020202020202BE
+:1092900002020202020202020202020202020202AE
+:1092A000020202020202020202020202020202029E
+:1092B000020202020202020202020202020202028E
+:1092C000020202020202020202020202020202027E
+:1092D000020202020202020202020202020202026E
+:1092E000020202020202020202020202020202025E
+:1092F000020202020202020202020202020202024E
+:10930000020202020202020202020202020202023D
+:10931000020202020202020202020202020202022D
+:10932000020202020202020202020202020202021D
+:10933000020202020202020202020202020202020D
+:1093400002020202020202020202020202020202FD
+:1093500002020202020202020202020202020202ED
+:1093600002020202020202020202020202020202DD
+:1093700002020202020202020202020202020202CD
+:1093800002020202020202020202020202020202BD
+:1093900002020202020202020202020202020202AD
+:1093A000020202020202020202020202020202029D
+:1093B000020202020202020202020202020202028D
+:1093C000020202020202020202020202020202027D
+:1093D000020202020202020202020202020202026D
+:1093E000020202020202020202020202020202025D
+:1093F000020202020202020202020202020202024D
+:10940000020202020202020202020202020202023C
+:10941000020202020202020202020202020202022C
+:10942000020202020202020202020202020202021C
+:10943000020202020202020202020202020202020C
+:1094400002020202020202020202020202020202FC
+:1094500002020202020202020202020202020202EC
+:1094600002020202020202020202020202020202DC
+:1094700002020202020202020202020202020202CC
+:1094800002020202020202020202020202020202BC
+:1094900002020202020202020202020202020202AC
+:1094A000020202020202020202020202020202029C
+:1094B000020202020202020202020202020202028C
+:1094C000020202020202020202020202020202027C
+:1094D000020202020202020202020202020202026C
+:1094E000020202020202020202020202020202025C
+:1094F000020202020202020202020202020202024C
+:10950000020202020202020202020202020202023B
+:10951000020202020202020202020202020202022B
+:10952000020202020202020202020202020202021B
+:10953000020202020202020202020202020202020B
+:1095400002020202020202020202020202020202FB
+:1095500002020202020202020202020202020202EB
+:1095600002020202020202020202020202020202DB
+:1095700002020202020202020202020202020202CB
+:1095800002020202020202020202020202020202BB
+:1095900002020202020202020202020202020202AB
+:1095A000020202020202020202020202020202029B
+:1095B000020202020202020202020202020202028B
+:1095C000020202020202020202020202020202027B
+:1095D000020202020202020202020202020202026B
+:1095E000020202020202020202020202020202025B
+:1095F000020202020202020202020202020202024B
+:10960000020202020202020202020202020202023A
+:10961000020202020202020202020202020202022A
+:10962000020202020202020202020202020202021A
+:10963000020202020202020202020202020202020A
+:1096400002020202020202020202020202020202FA
+:1096500002020202020202020202020202020202EA
+:1096600002020202020202020202020202020202DA
+:1096700002020202020202020202020202020202CA
+:1096800002020202020202020202020202020202BA
+:1096900002020202020202020202020202020202AA
+:1096A000020202020202020202020202020202029A
+:1096B000020202020202020202020202020202028A
+:1096C000020202020202020202020202020202027A
+:1096D000020202020202020202020202020202026A
+:1096E000020202020202020202020202020202025A
+:1096F000020202020202020202020202020202024A
+:109700000202020202020202020202020202020239
+:109710000202020202020202020202020202020229
+:109720000202020202020202020202020202020219
+:109730000202020202020202020202020202020209
+:1097400002020202020202020202020202020202F9
+:1097500002020202020202020202020202020202E9
+:1097600002020202020202020202020202020202D9
+:1097700002020202020202020202020202020202C9
+:1097800002020202020202020202020202020202B9
+:1097900002020202020202020202020202020202A9
+:1097A0000202020202020202020202020202020299
+:1097B0000202020202020202020202020202020289
+:1097C0000202020202020202020202020202020279
+:1097D0000202020202020202020202020202020269
+:1097E0000202020202020202020202020202020259
+:1097F0000202020202020202020202020202020249
+:109800000202020202020202020202020202020238
+:109810000202020202020202020202020202020228
+:109820000202020202020202020202020202020218
+:109830000202020202020202020202020202020208
+:1098400002020202020202020202020202020202F8
+:1098500002020202020202020202020202020202E8
+:1098600002020202020202020202020202020202D8
+:1098700002020202020202020202020202020202C8
+:1098800002020202020202020202020202020202B8
+:1098900002020202020202020202020202020202A8
+:1098A0000202020202020202020202020202020298
+:1098B0000202020202020202020202020202020288
+:1098C0000202020202020202020202020202020278
+:1098D0000202020202020202020202020202020268
+:1098E0000202020202020202020202020202020258
+:1098F0000202020202020202020202020202020248
+:109900000202020202020202020202020202020237
+:109910000202020202020202020202020202020227
+:109920000202020202020202020202020202020019
+:109930000000000000000000000000000000000027
+:109940000000000000000000000000000000000017
+:109950000000000000000000000000000000000007
+:1099600000000000000000000000000000000000F7
+:1099700000000000000000000000000000000000E7
+:1099800000000000000000000000000000000000D7
+:1099900000000000000000000000000000000000C7
+:1099A00000000000000000000000000000000000B7
+:1099B00000000000000000000000000000000000A7
+:1099C0000000000000000000000000000000000097
+:1099D0000000000000000000000000000000000087
+:1099E0000000000000000000000000000000000077
+:1099F0000000000000000000000000000000000067
+:109A00000000000000000000000000000000000056
+:109A10000000000000000000000000000000000046
+:109A20000000000000000000000000000000000036
+:109A30000000000000000000000000000000000026
+:109A40000000000000000000000000000000000016
+:109A50000000000000000000000000000000000006
+:109A600000000000000000000000000000000000F6
+:109A700000000000000000000000000000000000E6
+:109A800000000000000000000000000000000000D6
+:109A900000000000000000000000000000000000C6
+:109AA00000000000000000000000000000000000B6
+:109AB00000000000000000000000000000000000A6
+:109AC0000000000000000000000000000000000096
+:109AD0000000000000000000000000000000000086
+:109AE0000000000000000000000000000000000076
+:109AF0000000000000000000000000000000000066
+:109B00000000000000000000000000000000000055
+:109B10000000000000000000000000000000000045
+:109B20000000000000000000000000000000000035
+:109B30000000000000000000000000000000000025
+:109B40000000000000000000000000000000000015
+:109B50000000000000000000000000000000000005
+:109B600000000000000000000000000000000000F5
+:109B700000000000000000000000000000000000E5
+:109B800000000000000000000000000000000000D5
+:109B900000000000000000000000000000000000C5
+:109BA00000000000000000000000000000000000B5
+:109BB00000000000000000000000000000000000A5
+:109BC0000000000000000000000000000000000095
+:109BD0000000000000000000000000000000000085
+:109BE0000000000000000000000000000000000075
+:109BF0000000000000000000000000000000000065
+:109C00000000000000000000000000000000000054
+:109C10000000000000000000000000000000000044
+:109C20000000000000000000000000000000000034
+:109C30000000000000000000000000000000000024
+:109C40000000000000000000000000000000000014
+:109C50000000000000000000000000000000000004
+:109C600000000000000000000000000000000000F4
+:109C700000000000000000000000000000000000E4
+:109C800000000000000000000000000000000000D4
+:109C900000000000000000000000000000000000C4
+:109CA00000000000000000000000000000000000B4
+:109CB00000000000000000000000000000000000A4
+:109CC0000000000000000000000000000000000094
+:109CD0000000000000000000000000000000000084
+:109CE0000000000000000000000000000000000074
+:109CF0000000000000000000000000000000000064
+:109D00000000000000000000000000000000000053
+:109D10000000000000000000000000000000000043
+:109D20000000000000000000000000000000000033
+:109D30000000000000000000000000000000000023
+:109D40000000000000000000000000000000000013
+:109D50000000000000000000000000000000000003
+:109D600000000000000000000000000000000000F3
+:109D700000000000000000000000000000000000E3
+:109D800000000000000000000000000000000000D3
+:109D900000000000000000000000000000000000C3
+:109DA00000000000000000000000000000000000B3
+:109DB00000000000000000000000000000000000A3
+:109DC0000000000000000000000000000000000093
+:109DD0000000000000000000000000000000000083
+:109DE0000000000000000000000000000000000073
+:109DF0000000000000000000000000000000000063
+:109E00000000000000000000000000000000000052
+:109E10000000000000000000000000000000000042
+:109E20000000000000000000000000000000000032
+:109E30000000000000000000000000000000000022
+:109E40000000000000000000000000000000000012
+:109E50000000000000000000000000000000000002
+:109E600000000000000000000000000000000000F2
+:109E700000000000000000000000000000000000E2
+:109E800000000000000000000000000000000000D2
+:109E900000000000000000000000000000000000C2
+:109EA00000000000000000000000000000000000B2
+:109EB00000000000000000000000000000000000A2
+:109EC0000000000000000000000000000000000092
+:109ED0000000000000000000000000000000000082
+:109EE0000000000000000000000000000000000072
+:109EF0000000000000000000000000000000000062
+:109F00000000000000000000000000000000000051
+:109F10000000000000000000000000000000000041
+:109F200000000000000000000000000000000039F8
+:109F30000000000000000001010101010101010118
+:109F40000101010101010101010101010101010101
+:109F500001010101010101010101010101010101F1
+:109F600001010101010101010101010101010101E1
+:109F700001010101010101010101010101010101D1
+:109F800001010101010101010101010101010101C1
+:109F900001010101010101010101010101010101B1
+:109FA00001010101010101010101010101010101A1
+:109FB0000101010101010101010101010101010191
+:109FC0000101010101010101010101010101010181
+:109FD0000101010101010101010101010101010171
+:109FE0000101010101010101010101010101010161
+:109FF0000101010101010101010101010101010151
+:10A000000101010101010101010101010101010140
+:10A010000101010101010101010101010101010130
+:10A020000101010101010101010101010101010120
+:10A030000101010101010101010101010101010110
+:10A040000101010101010101010101010101010100
+:10A0500001010101010101010101010101010101F0
+:10A0600001010101010101010101010101010101E0
+:10A0700001010101010101010101010101010101D0
+:10A0800001010101010101010101010101010101C0
+:10A0900001010101010101010101010101010101B0
+:10A0A00001010101010101010101010101010101A0
+:10A0B0000101010101010101010101010101010190
+:10A0C0000101010101010101010101010101010180
+:10A0D0000101010101010101010101010101010170
+:10A0E0000101010101010101010101010101010160
+:10A0F0000101010101010101010101010101010150
+:10A10000010101010101010101010101010101013F
+:10A11000010101010101010101010101010101012F
+:10A12000010101010101010101010101010101011F
+:10A13000010101010101010101010101010101010F
+:10A1400001010101010101010101010101010101FF
+:10A1500001010101010101010101010101010101EF
+:10A1600001010101010101010101010101010101DF
+:10A1700001010101010101010101010101010101CF
+:10A1800001010101010101010101010101010101BF
+:10A1900001010101010101010101010101010101AF
+:10A1A000010101010101010101010101010101019F
+:10A1B000010101010101010101010101010101018F
+:10A1C000010101010101010101010101010101017F
+:10A1D000010101010101010101010101010101016F
+:10A1E000010101010101010101010101010101015F
+:10A1F000010101010101010101010101010101014F
+:10A20000010101010101010101010101010101013E
+:10A21000010101010101010101010101010101012E
+:10A22000010101010101010101010101010101011E
+:10A23000010101010101010101010101010101010E
+:10A2400001010101010101010101010101010101FE
+:10A2500001010101010101010101010101010101EE
+:10A2600001010101010101010101010101010101DE
+:10A2700001010101010101010101010101010101CE
+:10A2800001010101010101010101010101010101BE
+:10A2900001010101010101010101010101010101AE
+:10A2A000010101010101010101010101010101019E
+:10A2B000010101010101010101010101010101018E
+:10A2C000010101010101010101010101010101017E
+:10A2D000010101010101010101010101010101016E
+:10A2E000010101010101010101010101010101015E
+:10A2F000010101010101010101010101010101014E
+:10A30000010101010101010101010101010101013D
+:10A31000010101010101010101010101010101012D
+:10A32000010101010101010101010101010101011D
+:10A33000010101010101010101010101010101010D
+:10A3400001010101010101010101010101010101FD
+:10A3500001010101010101010101010101010101ED
+:10A3600001010101010101010101010101010101DD
+:10A3700001010101010101010101010101010101CD
+:10A3800001010101010101010101010101010101BD
+:10A3900001010101010101010101010101010101AD
+:10A3A000010101010101010101010101010101019D
+:10A3B000010101010101010101010101010101018D
+:10A3C000010101010101010101010101010101017D
+:10A3D000010101010101010101010101010101016D
+:10A3E000010101010101010101010101010101015D
+:10A3F000010101010101010101010101010101014D
+:10A40000010101010101010101010101010101013C
+:10A41000010101010101010101010101010101012C
+:10A42000010101010101010101010101010101011C
+:10A43000010101010101010101010101010101010C
+:10A4400001010101010101010101010101010101FC
+:10A4500001010101010101010101010101010101EC
+:10A4600001010101010101010101010101010101DC
+:10A4700001010101010101010101010101010101CC
+:10A4800001010101010101010101010101010101BC
+:10A4900001010101010101010101010101010101AC
+:10A4A000010101010101010101010101010101019C
+:10A4B000010101010101010101010101010101018C
+:10A4C000010101010101010101010101010101017C
+:10A4D000010101010101010101010101010101016C
+:10A4E000010101010101010101010101010101015C
+:10A4F000010101010101010101010101010101014C
+:10A50000010101010101010101010101010101013B
+:10A51000010101010101010101010101010101012B
+:10A52000010101010101010101010101010101011B
+:10A53000010101010101010101010101010101010B
+:10A5400001010101010101010101010101010101FB
+:10A5500001010101010101010101010101010101EB
+:10A5600001010101010101010101010101010101DB
+:10A5700001010101010101010101010101010101CB
+:10A5800001010101010101010101010101010101BB
+:10A5900001010101010101010101010101010101AB
+:10A5A000010101010101010101010101010101019B
+:10A5B000010101010101010101010101010101018B
+:10A5C000010101010101010101010101010101017B
+:10A5D000010101010101010101010101010101016B
+:10A5E000010101010101010101010101010101015B
+:10A5F000010101010101010101010101010101014B
+:10A60000010101010101010101010101010101013A
+:10A61000010101010101010101010101010101012A
+:10A62000010101010101010101010101010101011A
+:10A63000010101010101010101010101010101010A
+:10A6400001010101010101010101010101010101FA
+:10A6500001010101010101010101010101010101EA
+:10A6600001010101010101010101010101010101DA
+:10A6700001010101010101010101010101010101CA
+:10A6800001010101010101010101010101010101BA
+:10A6900001010101010101010101010101010101AA
+:10A6A000010101010101010101010101010101019A
+:10A6B000010101010101010101010101010101018A
+:10A6C000010101010101010101010101010101017A
+:10A6D000010101010101010101010101010101016A
+:10A6E000010101010101010101010101010101015A
+:10A6F000010101010101010101010101010101014A
+:10A700000101010101010101010101010101010139
+:10A710000101010101010101010101010101010129
+:10A720000101010101010101010101010101010119
+:10A730000101010101010100000000000000000012
+: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
+:10AD30000000000000000002020202020202020201
+:10AD400002020202020202020202020202020202E3
+:10AD500002020202020202020202020202020202D3
+:10AD600002020202020202020202020202020202C3
+:10AD700002020202020202020202020202020202B3
+:10AD800002020202020202020202020202020202A3
+:10AD90000202020202020202020202020202020293
+:10ADA0000202020202020202020202020202020283
+:10ADB0000202020202020202020202020202020273
+:10ADC0000202020202020202020202020202020263
+:10ADD0000202020202020202020202020202020253
+:10ADE0000202020202020202020202020202020243
+:10ADF0000202020202020202020202020202020233
+:10AE00000202020202020202020202020202020222
+:10AE10000202020202020202020202020202020212
+:10AE20000202020202020202020202020202020202
+:10AE300002020202020202020202020202020202F2
+:10AE400002020202020202020202020202020202E2
+:10AE500002020202020202020202020202020202D2
+:10AE600002020202020202020202020202020202C2
+:10AE700002020202020202020202020202020202B2
+:10AE800002020202020202020202020202020202A2
+:10AE90000202020202020202020202020202020292
+:10AEA0000202020202020202020202020202020282
+:10AEB0000202020202020202020202020202020272
+:10AEC0000202020202020202020202020202020262
+:10AED0000202020202020202020202020202020252
+:10AEE0000202020202020202020202020202020242
+:10AEF0000202020202020202020202020202020232
+:10AF00000202020202020202020202020202020221
+:10AF10000202020202020202020202020202020211
+:10AF20000202020202020202020202020202020201
+:10AF300002020202020202020202020202020202F1
+:10AF400002020202020202020202020202020202E1
+:10AF500002020202020202020202020202020202D1
+:10AF600002020202020202020202020202020202C1
+:10AF700002020202020202020202020202020202B1
+:10AF800002020202020202020202020202020202A1
+:10AF90000202020202020202020202020202020291
+:10AFA0000202020202020202020202020202020281
+:10AFB0000202020202020202020202020202020271
+:10AFC0000202020202020202020202020202020261
+:10AFD0000202020202020202020202020202020251
+:10AFE0000202020202020202020202020202020241
+:10AFF0000202020202020202020202020202020231
+:10B000000202020202020202020202020202020220
+:10B010000202020202020202020202020202020210
+:10B020000202020202020202020202020202020200
+:10B0300002020202020202020202020202020202F0
+:10B0400002020202020202020202020202020202E0
+:10B0500002020202020202020202020202020202D0
+:10B0600002020202020202020202020202020202C0
+:10B0700002020202020202020202020202020202B0
+:10B0800002020202020202020202020202020202A0
+:10B090000202020202020202020202020202020290
+:10B0A0000202020202020202020202020202020280
+:10B0B0000202020202020202020202020202020270
+:10B0C0000202020202020202020202020202020260
+:10B0D0000202020202020202020202020202020250
+:10B0E0000202020202020202020202020202020240
+:10B0F0000202020202020202020202020202020230
+:10B10000020202020202020202020202020202021F
+:10B11000020202020202020202020202020202020F
+:10B1200002020202020202020202020202020202FF
+:10B1300002020202020202020202020202020202EF
+:10B1400002020202020202020202020202020202DF
+:10B1500002020202020202020202020202020202CF
+:10B1600002020202020202020202020202020202BF
+:10B1700002020202020202020202020202020202AF
+:10B18000020202020202020202020202020202029F
+:10B19000020202020202020202020202020202028F
+:10B1A000020202020202020202020202020202027F
+:10B1B000020202020202020202020202020202026F
+:10B1C000020202020202020202020202020202025F
+:10B1D000020202020202020202020202020202024F
+:10B1E000020202020202020202020202020202023F
+:10B1F000020202020202020202020202020202022F
+:10B20000020202020202020202020202020202021E
+:10B21000020202020202020202020202020202020E
+:10B2200002020202020202020202020202020202FE
+:10B2300002020202020202020202020202020202EE
+:10B2400002020202020202020202020202020202DE
+:10B2500002020202020202020202020202020202CE
+:10B2600002020202020202020202020202020202BE
+:10B2700002020202020202020202020202020202AE
+:10B28000020202020202020202020202020202029E
+:10B29000020202020202020202020202020202028E
+:10B2A000020202020202020202020202020202027E
+:10B2B000020202020202020202020202020202026E
+:10B2C000020202020202020202020202020202025E
+:10B2D000020202020202020202020202020202024E
+:10B2E000020202020202020202020202020202023E
+:10B2F000020202020202020202020202020202022E
+:10B30000020202020202020202020202020202021D
+:10B31000020202020202020202020202020202020D
+:10B3200002020202020202020202020202020202FD
+:10B3300002020202020202020202020202020202ED
+:10B3400002020202020202020202020202020202DD
+:10B3500002020202020202020202020202020202CD
+:10B3600002020202020202020202020202020202BD
+:10B3700002020202020202020202020202020202AD
+:10B38000020202020202020202020202020202029D
+:10B39000020202020202020202020202020202028D
+:10B3A000020202020202020202020202020202027D
+:10B3B000020202020202020202020202020202026D
+:10B3C000020202020202020202020202020202025D
+:10B3D000020202020202020202020202020202024D
+:10B3E000020202020202020202020202020202023D
+:10B3F000020202020202020202020202020202022D
+:10B40000020202020202020202020202020202021C
+:10B41000020202020202020202020202020202020C
+:10B4200002020202020202020202020202020202FC
+:10B4300002020202020202020202020202020202EC
+:10B4400002020202020202020202020202020202DC
+:10B4500002020202020202020202020202020202CC
+:10B4600002020202020202020202020202020202BC
+:10B4700002020202020202020202020202020202AC
+:10B48000020202020202020202020202020202029C
+:10B49000020202020202020202020202020202028C
+:10B4A000020202020202020202020202020202027C
+:10B4B000020202020202020202020202020202026C
+:10B4C000020202020202020202020202020202025C
+:10B4D000020202020202020202020202020202024C
+:10B4E000020202020202020202020202020202023C
+:10B4F000020202020202020202020202020202022C
+:10B50000020202020202020202020202020202021B
+:10B51000020202020202020202020202020202020B
+:10B5200002020202020202020202020202020202FB
+:10B5300002020202020202000000000000000000FD
+: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
+:10BD300000000000000000010101010101010101FA
+:10BD400001010101010101010101010101010101E3
+:10BD500001010101010101010101010101010101D3
+:10BD600001010101010101010101010101010101C3
+:10BD700001010101010101010101010101010101B3
+:10BD800001010101010101010101010101010101A3
+:10BD90000101010101010101010101010101010193
+:10BDA0000101010101010101010101010101010183
+:10BDB0000101010101010101010101010101010173
+:10BDC0000101010101010101010101010101010163
+:10BDD0000101010101010101010101010101010153
+:10BDE0000101010101010101010101010101010143
+:10BDF0000101010101010101010101010101010133
+:10BE00000101010101010101010101010101010122
+:10BE10000101010101010101010101010101010112
+:10BE20000101010101010101010101010101010102
+:10BE300001010101010101010101010101010101F2
+:10BE400001010101010101010101010101010101E2
+:10BE500001010101010101010101010101010101D2
+:10BE600001010101010101010101010101010101C2
+:10BE700001010101010101010101010101010101B2
+:10BE800001010101010101010101010101010101A2
+:10BE90000101010101010101010101010101010192
+:10BEA0000101010101010101010101010101010182
+:10BEB0000101010101010101010101010101010172
+:10BEC0000101010101010101010101010101010162
+:10BED0000101010101010101010101010101010152
+:10BEE0000101010101010101010101010101010142
+:10BEF0000101010101010101010101010101010132
+:10BF00000101010101010101010101010101010121
+:10BF10000101010101010101010101010101010111
+:10BF20000101010101010101010101010101010101
+:10BF300001010101010101010101010101010101F1
+:10BF400001010101010101010101010101010101E1
+:10BF500001010101010101010101010101010101D1
+:10BF600001010101010101010101010101010101C1
+:10BF700001010101010101010101010101010101B1
+:10BF800001010101010101010101010101010101A1
+:10BF90000101010101010101010101010101010191
+:10BFA0000101010101010101010101010101010181
+:10BFB0000101010101010101010101010101010171
+:10BFC0000101010101010101010101010101010161
+:10BFD0000101010101010101010101010101010151
+:10BFE0000101010101010101010101010101010141
+:10BFF0000101010101010101010101010101010131
+:10C000000101010101010101010101010101010120
+:10C010000101010101010101010101010101010110
+:10C020000101010101010101010101010101010100
+:10C0300001010101010101010101010101010101F0
+:10C0400001010101010101010101010101010101E0
+:10C0500001010101010101010101010101010101D0
+:10C0600001010101010101010101010101010101C0
+:10C0700001010101010101010101010101010101B0
+:10C0800001010101010101010101010101010101A0
+:10C090000101010101010101010101010101010190
+:10C0A0000101010101010101010101010101010180
+:10C0B0000101010101010101010101010101010170
+:10C0C0000101010101010101010101010101010160
+:10C0D0000101010101010101010101010101010150
+:10C0E0000101010101010101010101010101010140
+:10C0F0000101010101010101010101010101010130
+:10C10000010101010101010101010101010101011F
+:10C11000010101010101010101010101010101010F
+:10C1200001010101010101010101010101010101FF
+:10C1300001010101010101010101010101010101EF
+:10C1400001010101010101010101010101010101DF
+:10C1500001010101010101010101010101010101CF
+:10C1600001010101010101010101010101010101BF
+:10C1700001010101010101010101010101010101AF
+:10C18000010101010101010101010101010101019F
+:10C19000010101010101010101010101010101018F
+:10C1A000010101010101010101010101010101017F
+:10C1B000010101010101010101010101010101016F
+:10C1C000010101010101010101010101010101015F
+:10C1D000010101010101010101010101010101014F
+:10C1E000010101010101010101010101010101013F
+:10C1F000010101010101010101010101010101012F
+:10C20000010101010101010101010101010101011E
+:10C21000010101010101010101010101010101010E
+:10C2200001010101010101010101010101010101FE
+:10C2300001010101010101010101010101010101EE
+:10C2400001010101010101010101010101010101DE
+:10C2500001010101010101010101010101010101CE
+:10C2600001010101010101010101010101010101BE
+:10C2700001010101010101010101010101010101AE
+:10C28000010101010101010101010101010101019E
+:10C29000010101010101010101010101010101018E
+:10C2A000010101010101010101010101010101017E
+:10C2B000010101010101010101010101010101016E
+:10C2C000010101010101010101010101010101015E
+:10C2D000010101010101010101010101010101014E
+:10C2E000010101010101010101010101010101013E
+:10C2F000010101010101010101010101010101012E
+:10C30000010101010101010101010101010101011D
+:10C31000010101010101010101010101010101010D
+:10C3200001010101010101010101010101010101FD
+:10C3300001010101010101010101010101010101ED
+:10C3400001010101010101010101010101010101DD
+:10C3500001010101010101010101010101010101CD
+:10C3600001010101010101010101010101010101BD
+:10C3700001010101010101010101010101010101AD
+:10C38000010101010101010101010101010101019D
+:10C39000010101010101010101010101010101018D
+:10C3A000010101010101010101010101010101017D
+:10C3B000010101010101010101010101010101016D
+:10C3C000010101010101010101010101010101015D
+:10C3D000010101010101010101010101010101014D
+:10C3E000010101010101010101010101010101013D
+:10C3F000010101010101010101010101010101012D
+:10C40000010101010101010101010101010101011C
+:10C41000010101010101010101010101010101010C
+:10C4200001010101010101010101010101010101FC
+:10C4300001010101010101010101010101010101EC
+:10C4400001010101010101010101010101010101DC
+:10C4500001010101010101010101010101010101CC
+:10C4600001010101010101010101010101010101BC
+:10C4700001010101010101010101010101010101AC
+:10C48000010101010101010101010101010101019C
+:10C49000010101010101010101010101010101018C
+:10C4A000010101010101010101010101010101017C
+:10C4B000010101010101010101010101010101016C
+:10C4C000010101010101010101010101010101015C
+:10C4D000010101010101010101010101010101014C
+:10C4E000010101010101010101010101010101013C
+:10C4F000010101010101010101010101010101012C
+:10C50000010101010101010101010101010101011B
+:10C51000010101010101010101010101010101010B
+:10C5200001010101010101010101010101010101FB
+:10C5300001010101010101000000000000000000F4
+: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
+:10CB300000000000000000020202020202020202E3
+:10CB400002020202020202020202020202020202C5
+:10CB500002020202020202020202020202020202B5
+:10CB600002020202020202020202020202020202A5
+:10CB70000202020202020202020202020202020295
+:10CB80000202020202020202020202020202020285
+:10CB90000202020202020202020202020202020275
+:10CBA0000202020202020202020202020202020265
+:10CBB0000202020202020202020202020202020255
+:10CBC0000202020202020202020202020202020245
+:10CBD0000202020202020202020202020202020235
+:10CBE0000202020202020202020202020202020225
+:10CBF0000202020202020202020202020202020215
+:10CC00000202020202020202020202020202020204
+:10CC100002020202020202020202020202020202F4
+:10CC200002020202020202020202020202020202E4
+:10CC300002020202020202020202020202020202D4
+:10CC400002020202020202020202020202020202C4
+:10CC500002020202020202020202020202020202B4
+:10CC600002020202020202020202020202020202A4
+:10CC70000202020202020202020202020202020294
+:10CC80000202020202020202020202020202020284
+:10CC90000202020202020202020202020202020274
+:10CCA0000202020202020202020202020202020264
+:10CCB0000202020202020202020202020202020254
+:10CCC0000202020202020202020202020202020244
+:10CCD0000202020202020202020202020202020234
+:10CCE0000202020202020202020202020202020224
+:10CCF0000202020202020202020202020202020214
+:10CD00000202020202020202020202020202020203
+:10CD100002020202020202020202020202020202F3
+:10CD200002020202020202020202020202020202E3
+:10CD300002020202020202020202020202020202D3
+:10CD400002020202020202020202020202020202C3
+:10CD500002020202020202020202020202020202B3
+:10CD600002020202020202020202020202020202A3
+:10CD70000202020202020202020202020202020293
+:10CD80000202020202020202020202020202020283
+:10CD90000202020202020202020202020202020273
+:10CDA0000202020202020202020202020202020263
+:10CDB0000202020202020202020202020202020253
+:10CDC0000202020202020202020202020202020243
+:10CDD0000202020202020202020202020202020233
+:10CDE0000202020202020202020202020202020223
+:10CDF0000202020202020202020202020202020213
+:10CE00000202020202020202020202020202020202
+:10CE100002020202020202020202020202020202F2
+:10CE200002020202020202020202020202020202E2
+:10CE300002020202020202020202020202020202D2
+:10CE400002020202020202020202020202020202C2
+:10CE500002020202020202020202020202020202B2
+:10CE600002020202020202020202020202020202A2
+:10CE70000202020202020202020202020202020292
+:10CE80000202020202020202020202020202020282
+:10CE90000202020202020202020202020202020272
+:10CEA0000202020202020202020202020202020262
+:10CEB0000202020202020202020202020202020252
+:10CEC0000202020202020202020202020202020242
+:10CED0000202020202020202020202020202020232
+:10CEE0000202020202020202020202020202020222
+:10CEF0000202020202020202020202020202020212
+:10CF00000202020202020202020202020202020201
+:10CF100002020202020202020202020202020202F1
+:10CF200002020202020202020202020202020202E1
+:10CF300002020202020202020202020202020202D1
+:10CF400002020202020202020202020202020202C1
+:10CF500002020202020202020202020202020202B1
+:10CF600002020202020202020202020202020202A1
+:10CF70000202020202020202020202020202020291
+:10CF80000202020202020202020202020202020281
+:10CF90000202020202020202020202020202020271
+:10CFA0000202020202020202020202020202020261
+:10CFB0000202020202020202020202020202020251
+:10CFC0000202020202020202020202020202020241
+:10CFD0000202020202020202020202020202020231
+:10CFE0000202020202020202020202020202020221
+:10CFF0000202020202020202020202020202020211
+:10D000000202020202020202020202020202020200
+:10D0100002020202020202020202020202020202F0
+:10D0200002020202020202020202020202020202E0
+:10D0300002020202020202020202020202020202D0
+:10D0400002020202020202020202020202020202C0
+:10D0500002020202020202020202020202020202B0
+:10D0600002020202020202020202020202020202A0
+:10D070000202020202020202020202020202020290
+:10D080000202020202020202020202020202020280
+:10D090000202020202020202020202020202020270
+:10D0A0000202020202020202020202020202020260
+:10D0B0000202020202020202020202020202020250
+:10D0C0000202020202020202020202020202020240
+:10D0D0000202020202020202020202020202020230
+:10D0E0000202020202020202020202020202020220
+:10D0F0000202020202020202020202020202020210
+:10D1000002020202020202020202020202020202FF
+:10D1100002020202020202020202020202020202EF
+:10D1200002020202020202020202020202020202DF
+:10D1300002020202020202020202020202020202CF
+:10D1400002020202020202020202020202020202BF
+:10D1500002020202020202020202020202020202AF
+:10D16000020202020202020202020202020202029F
+:10D17000020202020202020202020202020202028F
+:10D18000020202020202020202020202020202027F
+:10D19000020202020202020202020202020202026F
+:10D1A000020202020202020202020202020202025F
+:10D1B000020202020202020202020202020202024F
+:10D1C000020202020202020202020202020202023F
+:10D1D000020202020202020202020202020202022F
+:10D1E000020202020202020202020202020202021F
+:10D1F000020202020202020202020202020202020F
+:10D2000002020202020202020202020202020202FE
+:10D2100002020202020202020202020202020202EE
+:10D2200002020202020202020202020202020202DE
+:10D2300002020202020202020202020202020202CE
+:10D2400002020202020202020202020202020202BE
+:10D2500002020202020202020202020202020202AE
+:10D26000020202020202020202020202020202029E
+:10D27000020202020202020202020202020202028E
+:10D28000020202020202020202020202020202027E
+:10D29000020202020202020202020202020202026E
+:10D2A000020202020202020202020202020202025E
+:10D2B000020202020202020202020202020202024E
+:10D2C000020202020202020202020202020202023E
+:10D2D000020202020202020202020202020202022E
+:10D2E000020202020202020202020202020202021E
+:10D2F000020202020202020202020202020202020E
+:10D3000002020202020202020202020202020202FD
+:10D3100002020202020202020202020202020202ED
+:10D3200002020202020202020202020202020202DD
+:10D3300002020202020202000000000000000000DF
+: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
+:10D83000000000000000003F0000000000000001A8
+:10D8400001010101010101010101010101010101C8
+:10D8500001010101010101010101010101010101B8
+:10D8600001010101010101010101010101010101A8
+:10D870000101010101010101010101010101010198
+:10D880000101010101010101010101010101010188
+:10D890000101010101010101010101010101010178
+:10D8A0000101010101010101010101010101010168
+:10D8B0000101010101010101010101010101010158
+:10D8C0000101010101010101010101010101010148
+:10D8D0000101010101010101010101010101010138
+:10D8E0000101010101010101010101010101010128
+:10D8F0000101010101010101010101010101010118
+:10D900000101010101010101010101010101010107
+:10D9100001010101010101010101010101010101F7
+:10D9200001010101010101010101010101010101E7
+:10D9300001010101010101010101010101010101D7
+:10D9400001010101010101010101010101010101C7
+:10D9500001010101010101010101010101010101B7
+:10D9600001010101010101010101010101010101A7
+:10D970000101010101010101010101010101010197
+:10D980000101010101010101010101010101010187
+:10D990000101010101010101010101010101010177
+:10D9A0000101010101010101010101010101010167
+:10D9B0000101010101010101010101010101010157
+:10D9C0000101010101010101010101010101010147
+:10D9D0000101010101010101010101010101010137
+:10D9E0000101010101010101010101010101010127
+:10D9F0000101010101010101010101010101010117
+:10DA00000101010101010101010101010101010106
+:10DA100001010101010101010101010101010101F6
+:10DA200001010101010101010101010101010101E6
+:10DA300001010101010101010101010101010101D6
+:10DA400001010101010101010101010101010101C6
+:10DA500001010101010101010101010101010101B6
+:10DA600001010101010101010101010101010101A6
+:10DA70000101010101010101010101010101010196
+:10DA80000101010101010101010101010101010186
+:10DA90000101010101010101010101010101010176
+:10DAA0000101010101010101010101010101010166
+:10DAB0000101010101010101010101010101010156
+:10DAC0000101010101010101010101010101010146
+:10DAD0000101010101010101010101010101010136
+:10DAE0000101010101010101010101010101010126
+:10DAF0000101010101010101010101010101010116
+:10DB00000101010101010101010101010101010105
+:10DB100001010101010101010101010101010101F5
+:10DB200001010101010101010101010101010101E5
+:10DB300001010101010101010101010101010101D5
+:10DB400001010101010101010101010101010101C5
+:10DB500001010101010101010101010101010101B5
+:10DB600001010101010101010101010101010101A5
+:10DB70000101010101010101010101010101010195
+:10DB80000101010101010101010101010101010185
+:10DB90000101010101010101010101010101010175
+:10DBA0000101010101010101010101010101010165
+:10DBB0000101010101010101010101010101010155
+:10DBC0000101010101010101010101010101010145
+:10DBD0000101010101010101010101010101010135
+:10DBE0000101010101010101010101010101010125
+:10DBF0000101010101010101010101010101010115
+:10DC00000101010101010101010101010101010104
+:10DC100001010101010101010101010101010101F4
+:10DC200001010101010101010101010101010101E4
+:10DC300001010101010101010101010101010101D4
+:10DC400001010101010101010101010101010101C4
+:10DC500001010101010101010101010101010101B4
+:10DC600001010101010101010101010101010101A4
+:10DC70000101010101010101010101010101010194
+:10DC80000101010101010101010101010101010184
+:10DC90000101010101010101010101010101010174
+:10DCA0000101010101010101010101010101010164
+:10DCB0000101010101010101010101010101010154
+:10DCC0000101010101010101010101010101010144
+:10DCD0000101010101010101010101010101010134
+:10DCE0000101010101010101010101010101010124
+:10DCF0000101010101010101010101010101010114
+:10DD00000101010101010101010101010101010103
+:10DD100001010101010101010101010101010101F3
+:10DD200001010101010101010101010101010101E3
+:10DD300001010101010101010101010101010101D3
+:10DD400001010101010101010101010101010101C3
+:10DD500001010101010101010101010101010101B3
+:10DD600001010101010101010101010101010101A3
+:10DD70000101010101010101010101010101010193
+:10DD80000101010101010101010101010101010183
+:10DD90000101010101010101010101010101010173
+:10DDA0000101010101010101010101010101010163
+:10DDB0000101010101010101010101010101010153
+:10DDC0000101010101010101010101010101010143
+:10DDD0000101010101010101010101010101010133
+:10DDE0000101010101010101010101010101010123
+:10DDF0000101010101010101010101010101010113
+:10DE00000101010101010101010101010101010102
+:10DE100001010101010101010101010101010101F2
+:10DE200001010101010101010101010101010101E2
+:10DE300001010101010101010101010101010101D2
+:10DE400001010101010101010101010101010101C2
+:10DE500001010101010101010101010101010101B2
+:10DE600001010101010101010101010101010101A2
+:10DE70000101010101010101010101010101010192
+:10DE80000101010101010101010101010101010182
+:10DE90000101010101010101010101010101010172
+:10DEA0000101010101010101010101010101010162
+:10DEB0000101010101010101010101010101010152
+:10DEC0000101010101010101010101010101010142
+:10DED0000101010101010101010101010101010132
+:10DEE0000101010101010101010101010101010122
+:10DEF0000101010101010101010101010101010112
+:10DF00000101010101010101010101010101010101
+:10DF100001010101010101010101010101010101F1
+:10DF200001010101010101010101010101010101E1
+:10DF300001010101010101010101010101010101D1
+:10DF400001010101010101010101010101010101C1
+:10DF500001010101010101010101010101010101B1
+:10DF600001010101010101010101010101010101A1
+:10DF70000101010101010101010101010101010191
+:10DF80000101010101010101010101010101010181
+:10DF90000101010101010101010101010101010171
+:10DFA0000101010101010101010101010101010161
+:10DFB0000101010101010101010101010101010151
+:10DFC0000101010101010101010101010101010141
+:10DFD0000101010101010101010101010101010131
+:10DFE0000101010101010101010101010101010121
+:10DFF0000101010101010101010101010101010111
+:10E000000101010101010101010101010101010100
+:10E0100001010101010101010101010101010101F0
+:10E0200001010101010101010101010101010101E0
+:10E0300001010101010101010101010101010100D1
+:10E0400000000000000000000000000000000000D0
+:10E0500000000000000000000000000000000000C0
+:10E0600000000000000000000000000000000000B0
+:10E0700000000000000000000000000000000000A0
+:10E080000000000000000000000000000000000090
+:10E090000000000000000000000000000000000080
+:10E0A0000000000000000000000000000000000070
+:10E0B0000000000000000000000000000000000060
+:10E0C0000000000000000000000000000000000050
+:10E0D0000000000000000000000000000000000040
+:10E0E0000000000000000000000000000000000030
+:10E0F0000000000000000000000000000000000020
+:10E10000000000000000000000000000000000000F
+:10E1100000000000000000000000000000000000FF
+:10E1200000000000000000000000000000000000EF
+:10E1300000000000000000000000000000000000DF
+:10E1400000000000000000000000000000000000CF
+:10E1500000000000000000000000000000000000BF
+:10E1600000000000000000000000000000000000AF
+:10E17000000000000000000000000000000000009F
+:10E18000000000000000000000000000000000008F
+:10E19000000000000000000000000000000000007F
+:10E1A000000000000000000000000000000000006F
+:10E1B000000000000000000000000000000000005F
+:10E1C000000000000000000000000000000000004F
+:10E1D000000000000000000000000000000000003F
+:10E1E000000000000000000000000000000000002F
+:10E1F000000000000000000000000000000000001F
+:10E20000000000000000000000000000000000000E
+:10E2100000000000000000000000000000000000FE
+:10E2200000000000000000000000000000000000EE
+:10E2300000000000000000000000000000000000DE
+:10E2400000000000000000000000000000000000CE
+:10E2500000000000000000000000000000000000BE
+:10E2600000000000000000000000000000000000AE
+:10E27000000000000000000000000000000000009E
+:10E28000000000000000000000000000000000008E
+:10E29000000000000000000000000000000000007E
+:10E2A000000000000000000000000000000000006E
+:10E2B000000000000000000000000000000000005E
+:10E2C000000000000000000000000000000000004E
+:10E2D000000000000000000000000000000000003E
+:10E2E000000000000000000000000000000000002E
+:10E2F000000000000000000000000000000000001E
+:10E30000000000000000000000000000000000000D
+:10E3100000000000000000000000000000000000FD
+:10E3200000000000000000000000000000000000ED
+:10E3300000000000000000000000000000000000DD
+:10E3400000000000000000000000000000000000CD
+:10E3500000000000000000000000000000000000BD
+:10E3600000000000000000000000000000000000AD
+:10E37000000000000000000000000000000000009D
+:10E38000000000000000000000000000000000008D
+:10E39000000000000000000000000000000000007D
+:10E3A000000000000000000000000000000000006D
+:10E3B000000000000000000000000000000000005D
+:10E3C000000000000000000000000000000000004D
+:10E3D000000000000000000000000000000000003D
+:10E3E000000000000000000000000000000000002D
+:10E3F000000000000000000000000000000000001D
+:10E40000000000000000000000000000000000000C
+:10E4100000000000000000000000000000000000FC
+:10E4200000000000000000000000000000000000EC
+:10E4300000000000000000000000000000000000DC
+:10E4400000000000000000000000000000000000CC
+:10E4500000000000000000000000000000000000BC
+:10E4600000000000000000000000000000000000AC
+:10E47000000000000000000000000000000000009C
+:10E48000000000000000000000000000000000008C
+:10E49000000000000000000000000000000000007C
+:10E4A000000000000000000000000000000000006C
+:10E4B000000000000000000000000000000000005C
+:10E4C000000000000000000000000000000000004C
+:10E4D000000000000000000000000000000000003C
+:10E4E000000000000000000000000000000000002C
+:10E4F000000000000000000000000000000000001C
+:10E50000000000000000000000000000000000000B
+:10E5100000000000000000000000000000000000FB
+:10E5200000000000000000000000000000000000EB
+:10E5300000000000000000000000000000000000DB
+:10E5400000000000000000000000000000000000CB
+:10E5500000000000000000000000000000000000BB
+:10E5600000000000000000000000000000000000AB
+:10E57000000000000000000000000000000000009B
+:10E58000000000000000000000000000000000008B
+:10E59000000000000000000000000000000000007B
+:10E5A000000000000000000000000000000000006B
+:10E5B000000000000000000000000000000000005B
+:10E5C000000000000000000000000000000000004B
+:10E5D000000000000000000000000000000000003B
+:10E5E000000000000000000000000000000000002B
+:10E5F000000000000000000000000000000000001B
+:10E60000000000000000000000000000000000000A
+:10E6100000000000000000000000000000000000FA
+:10E6200000000000000000000000000000000000EA
+:10E6300000000000000000000000000000000000DA
+:10E6400000000000000000000000000000000000CA
+:10E6500000000000000000000000000000000000BA
+:10E6600000000000000000000000000000000000AA
+:10E67000000000000000000000000000000000009A
+:10E68000000000000000000000000000000000008A
+:10E69000000000000000000000000000000000007A
+:10E6A000000000000000000000000000000000006A
+:10E6B000000000000000000000000000000000005A
+:10E6C000000000000000000000000000000000004A
+:10E6D000000000000000000000000000000000003A
+:10E6E000000000000000000000000000000000002A
+:10E6F000000000000000000000000000000000001A
+:10E700000000000000000000000000000000000009
+:10E7100000000000000000000000000000000000F9
+:10E7200000000000000000000000000000000000E9
+:10E7300000000000000000000000000000000002D7
+:10E7400002020202020202020202020202020202A9
+:10E750000202020202020202020202020202020299
+:10E760000202020202020202020202020202020289
+:10E770000202020202020202020202020202020279
+:10E780000202020202020202020202020202020269
+:10E790000202020202020202020202020202020259
+:10E7A0000202020202020202020202020202020249
+:10E7B0000202020202020202020202020202020239
+:10E7C0000202020202020202020202020202020229
+:10E7D0000202020202020202020202020202020219
+:10E7E0000202020202020202020202020202020209
+:10E7F00002020202020202020202020202020202F9
+:10E8000002020202020202020202020202020202E8
+:10E8100002020202020202020202020202020202D8
+:10E8200002020202020202020202020202020202C8
+:10E8300002020202020202020202020202020202B8
+:10E8400002020202020202020202020202020202A8
+:10E850000202020202020202020202020202020298
+:10E860000202020202020202020202020202020288
+:10E870000202020202020202020202020202020278
+:10E880000202020202020202020202020202020268
+:10E890000202020202020202020202020202020258
+:10E8A0000202020202020202020202020202020248
+:10E8B0000202020202020202020202020202020238
+:10E8C0000202020202020202020202020202020228
+:10E8D0000202020202020202020202020202020218
+:10E8E0000202020202020202020202020202020208
+:10E8F00002020202020202020202020202020202F8
+:10E9000002020202020202020202020202020202E7
+:10E9100002020202020202020202020202020202D7
+:10E9200002020202020202020202020202020202C7
+:10E9300002020202020202020202020202020202B7
+:10E9400002020202020202020202020202020202A7
+:10E950000202020202020202020202020202020297
+:10E960000202020202020202020202020202020287
+:10E970000202020202020202020202020202020277
+:10E980000202020202020202020202020202020267
+:10E990000202020202020202020202020202020257
+:10E9A0000202020202020202020202020202020247
+:10E9B0000202020202020202020202020202020237
+:10E9C0000202020202020202020202020202020227
+:10E9D0000202020202020202020202020202020217
+:10E9E0000202020202020202020202020202020207
+:10E9F00002020202020202020202020202020202F7
+:10EA000002020202020202020202020202020202E6
+:10EA100002020202020202020202020202020202D6
+:10EA200002020202020202020202020202020202C6
+:10EA300002020202020202020202020202020202B6
+:10EA400002020202020202020202020202020202A6
+:10EA50000202020202020202020202020202020296
+:10EA60000202020202020202020202020202020286
+:10EA70000202020202020202020202020202020276
+:10EA80000202020202020202020202020202020266
+:10EA90000202020202020202020202020202020256
+:10EAA0000202020202020202020202020202020246
+:10EAB0000202020202020202020202020202020236
+:10EAC0000202020202020202020202020202020226
+:10EAD0000202020202020202020202020202020216
+:10EAE0000202020202020202020202020202020206
+:10EAF00002020202020202020202020202020202F6
+:10EB000002020202020202020202020202020202E5
+:10EB100002020202020202020202020202020202D5
+:10EB200002020202020202020202020202020202C5
+:10EB300002020202020202020202020202020202B5
+:10EB400002020202020202020202020202020202A5
+:10EB50000202020202020202020202020202020295
+:10EB60000202020202020202020202020202020285
+:10EB70000202020202020202020202020202020275
+:10EB80000202020202020202020202020202020265
+:10EB90000202020202020202020202020202020255
+:10EBA0000202020202020202020202020202020245
+:10EBB0000202020202020202020202020202020235
+:10EBC0000202020202020202020202020202020225
+:10EBD0000202020202020202020202020202020215
+:10EBE0000202020202020202020202020202020205
+:10EBF00002020202020202020202020202020202F5
+:10EC000002020202020202020202020202020202E4
+:10EC100002020202020202020202020202020202D4
+:10EC200002020202020202020202020202020202C4
+:10EC300002020202020202020202020202020202B4
+:10EC400002020202020202020202020202020202A4
+:10EC50000202020202020202020202020202020294
+:10EC60000202020202020202020202020202020284
+:10EC70000202020202020202020202020202020274
+:10EC80000202020202020202020202020202020264
+:10EC90000202020202020202020202020202020254
+:10ECA0000202020202020202020202020202020244
+:10ECB0000202020202020202020202020202020234
+:10ECC0000202020202020202020202020202020224
+:10ECD0000202020202020202020202020202020214
+:10ECE0000202020202020202020202020202020204
+:10ECF00002020202020202020202020202020202F4
+:10ED000002020202020202020202020202020202E3
+:10ED100002020202020202020202020202020202D3
+:10ED200002020202020202020202020202020202C3
+:10ED300002020202020202020202020202020202B3
+:10ED400002020202020202020202020202020202A3
+:10ED50000202020202020202020202020202020293
+:10ED60000202020202020202020202020202020283
+:10ED70000202020202020202020202020202020273
+:10ED80000202020202020202020202020202020263
+:10ED90000202020202020202020202020202020253
+:10EDA0000202020202020202020202020202020243
+:10EDB0000202020202020202020202020202020233
+:10EDC0000202020202020202020202020202020223
+:10EDD0000202020202020202020202020202020213
+:10EDE0000202020202020202020202020202020203
+:10EDF00002020202020202020202020202020202F3
+:10EE000002020202020202020202020202020202E2
+:10EE100002020202020202020202020202020202D2
+:10EE200002020202020202020202020202020202C2
+:10EE300002020202020202020202020202020202B2
+:10EE400002020202020202020202020202020202A2
+:10EE50000202020202020202020202020202020292
+:10EE60000202020202020202020202020202020282
+:10EE70000202020202020202020202020202020272
+:10EE80000202020202020202020202020202020262
+:10EE90000202020202020202020202020202020252
+:10EEA0000202020202020202020202020202020242
+:10EEB0000202020202020202020202020202020232
+:10EEC0000202020202020202020202020202020222
+:10EED0000202020202020202020202020202020212
+:10EEE0000202020202020202020202020202020202
+:10EEF00002020202020202020202020202020202F2
+:10EF000002020202020202020202020202020202E1
+:10EF100002020202020202020202020202020202D1
+:10EF200002020202020202020202020202020202C1
+:10EF300002020202020202020202020202020200B3
+:10EF400000000000000000000000000000000000C1
+:10EF500000000000000000000000000000000000B1
+:10EF600000000000000000000000000000000000A1
+:10EF70000000000000000000000000000000000091
+:10EF80000000000000000000000000000000000081
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB0000000000000000000000000000000000051
+:10EFC0000000000000000000000000000000000041
+:10EFD0000000000000000000000000000000000031
+:10EFE0000000000000000000000000000000000021
+:10EFF0000000000000000000000000000000000011
+:10F000000000000000000000000000000000000000
+:10F0100000000000000000000000000000000000F0
+:10F0200000000000000000000000000000000000E0
+:10F0300000000000000000000000000000000000D0
+:10F0400000000000000000000000000000000000C0
+:10F0500000000000000000000000000000000000B0
+:10F0600000000000000000000000000000000000A0
+:10F070000000000000000000000000000000000090
+:10F080000000000000000000000000000000000080
+:10F090000000000000000000000000000000000070
+:10F0A0000000000000000000000000000000000060
+:10F0B0000000000000000000000000000000000050
+:10F0C0000000000000000000000000000000000040
+:10F0D0000000000000000000000000000000000030
+:10F0E0000000000000000000000000000000000020
+:10F0F0000000000000000000000000000000000010
+:10F1000000000000000000000000000000000000FF
+:10F1100000000000000000000000000000000000EF
+:10F1200000000000000000000000000000000000DF
+:10F1300000000000000000000000000000000000CF
+:10F1400000000000000000000000000000000000BF
+:10F1500000000000000000000000000000000000AF
+:10F16000000000000000000000000000000000009F
+:10F17000000000000000000000000000000000008F
+:10F18000000000000000000000000000000000007F
+:10F19000000000000000000000000000000000006F
+:10F1A000000000000000000000000000000000005F
+:10F1B000000000000000000000000000000000004F
+:10F1C000000000000000000000000000000000003F
+:10F1D000000000000000000000000000000000002F
+:10F1E000000000000000000000000000000000001F
+:10F1F000000000000000000000000000000000000F
+:10F2000000000000000000000000000000000000FE
+:10F2100000000000000000000000000000000000EE
+:10F2200000000000000000000000000000000000DE
+:10F2300000000000000000000000000000000000CE
+:10F2400000000000000000000000000000000000BE
+:10F2500000000000000000000000000000000000AE
+:10F26000000000000000000000000000000000009E
+:10F27000000000000000000000000000000000008E
+:10F28000000000000000000000000000000000007E
+:10F29000000000000000000000000000000000006E
+:10F2A000000000000000000000000000000000005E
+:10F2B000000000000000000000000000000000004E
+:10F2C000000000000000000000000000000000003E
+:10F2D000000000000000000000000000000000002E
+:10F2E000000000000000000000000000000000001E
+:10F2F000000000000000000000000000000000000E
+:10F3000000000000000000000000000000000000FD
+:10F3100000000000000000000000000000000000ED
+:10F3200000000000000000000000000000000000DD
+:10F3300000000000000000000000000000000000CD
+:10F3400000000000000000000000000000000000BD
+:10F3500000000000000000000000000000000000AD
+:10F36000000000000000000000000000000000009D
+:10F37000000000000000000000000000000000008D
+:10F38000000000000000000000000000000000007D
+:10F39000000000000000000000000000000000006D
+:10F3A000000000000000000000000000000000005D
+:10F3B000000000000000000000000000000000004D
+:10F3C000000000000000000000000000000000003D
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000000000000000000000000000000CC
+:10F4400000000000000000000000000000000000BC
+:10F4500000000000000000000000000000000000AC
+:10F46000000000000000000000000000000000009C
+:10F47000000000000000000000000000000000008C
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000004C
+:10F4C000000000000000000000000000000000003C
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000009B
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B000000000000000000000000000000000004B
+:10F5C000000000000000000000000000000000003B
+:10F5D000000000000000000000000000000000002B
+:10F5E000000000000000000000000000000000001B
+:10F5F000000000000000000000000000000000000B
+:10F6000000000000000000000000000000000000FA
+:10F6100000000000000000000000000000000000EA
+:10F6200000000000000000000000000000000000DA
+:10F6300000000000000000000000000000000000CA
+:10F6400000000000000000000000000000000000BA
+:10F6500000000000000000000000000000000000AA
+:10F66000000000000000000000000000000000009A
+:10F67000000000000000000000000000000000008A
+:10F68000000000000000000000000000000000007A
+:10F69000000000000000000000000000000000006A
+:10F6A000000000000000000000000000000000005A
+:10F6B000000000000000000000000000000000004A
+:10F6C000000000000000000000000000000000003A
+:10F6D000000000000000000000000000000000002A
+:10F6E000000000000000000000000000000000001A
+:10F6F000000000000000000000000000000000000A
+:10F7000000000000000000000000000000000000F9
+:10F7100000000000000000000000000000000000E9
+:10F7200000000000000000000000000000000000D9
+:10F7300000000000000000000000000000000000C9
+:10F7400000000000000000000000000000000000B9
+:10F7500000000000000000000000000000000000A9
+:10F760000000000000000000000000000000000099
+:10F770000000000000000000000000000000000089
+:10F780000000000000000000000000000000000079
+:10F790000000000000000000000000000000000069
+:10F7A0000000000000000000000000000000000059
+:10F7B0000000000000000000000000000000000049
+:10F7C0000000000000000000000000000000000039
+:10F7D0000000000000000000000000000000000029
+:10F7E0000000000000000000000000000000000019
+:10F7F0000000000000000000000000000000000009
+:10F8000000000000000000000000000000000000F8
+:10F8100000000000000000000000000000000000E8
+:10F8200000000000000000000000000000000000D8
+:10F8300000000000000000000000000000000000C8
+:10F8400000000000000000000000000000000000B8
+:10F8500000000000000000000000000000000000A8
+:10F860000000000000000000000000000000000098
+:10F870000000000000000000000000000000000088
+:10F880000000000000000000000000000000000078
+:10F890000000000000000000000000000000000068
+:10F8A0000000000000000000000000000000000058
+:10F8B0000000000000000000000000000000000048
+:10F8C0000000000000000000000000000000000038
+:10F8D0000000000000000000000000000000000028
+:10F8E0000000000000000000000000000000000018
+:10F8F0000000000000000000000000000000000008
+:10F9000000000000000000000000000000000000F7
+:10F9100000000000000000000000000000000000E7
+:10F9200000000000000000000000000000000000D7
+:10F9300000000000000000000000000000000001C6
+:10F9400001010101010101010101010101010101A7
+:10F950000101010101010101010101010101010197
+:10F960000101010101010101010101010101010187
+:10F970000101010101010101010101010101010177
+:10F980000101010101010101010101010101010167
+:10F990000101010101010101010101010101010157
+:10F9A0000101010101010101010101010101010147
+:10F9B0000101010101010101010101010101010137
+:10F9C0000101010101010101010101010101010127
+:10F9D0000101010101010101010101010101010117
+:10F9E0000101010101010101010101010101010107
+:10F9F00001010101010101010101010101010101F7
+:10FA000001010101010101010101010101010101E6
+:10FA100001010101010101010101010101010101D6
+:10FA200001010101010101010101010101010101C6
+:10FA300001010101010101010101010101010101B6
+:10FA400001010101010101010101010101010101A6
+:10FA50000101010101010101010101010101010196
+:10FA60000101010101010101010101010101010186
+:10FA70000101010101010101010101010101010176
+:10FA80000101010101010101010101010101010166
+:10FA90000101010101010101010101010101010156
+:10FAA0000101010101010101010101010101010146
+:10FAB0000101010101010101010101010101010136
+:10FAC0000101010101010101010101010101010126
+:10FAD0000101010101010101010101010101010116
+:10FAE0000101010101010101010101010101010106
+:10FAF00001010101010101010101010101010101F6
+:10FB000001010101010101010101010101010101E5
+:10FB100001010101010101010101010101010101D5
+:10FB200001010101010101010101010101010101C5
+:10FB300001010101010101010101010101010101B5
+:10FB400001010101010101010101010101010101A5
+:10FB50000101010101010101010101010101010195
+:10FB60000101010101010101010101010101010185
+:10FB70000101010101010101010101010101010175
+:10FB80000101010101010101010101010101010165
+:10FB90000101010101010101010101010101010155
+:10FBA0000101010101010101010101010101010145
+:10FBB0000101010101010101010101010101010135
+:10FBC0000101010101010101010101010101010125
+:10FBD0000101010101010101010101010101010115
+:10FBE0000101010101010101010101010101010105
+:10FBF00001010101010101010101010101010101F5
+:10FC000001010101010101010101010101010101E4
+:10FC100001010101010101010101010101010101D4
+:10FC200001010101010101010101010101010101C4
+:10FC300001010101010101010101010101010101B4
+:10FC400001010101010101010101010101010101A4
+:10FC50000101010101010101010101010101010194
+:10FC60000101010101010101010101010101010184
+:10FC70000101010101010101010101010101010174
+:10FC80000101010101010101010101010101010164
+:10FC90000101010101010101010101010101010154
+:10FCA0000101010101010101010101010101010144
+:10FCB0000101010101010101010101010101010134
+:10FCC0000101010101010101010101010101010124
+:10FCD0000101010101010101010101010101010114
+:10FCE0000101010101010101010101010101010104
+:10FCF00001010101010101010101010101010101F4
+:10FD000001010101010101010101010101010101E3
+:10FD100001010101010101010101010101010101D3
+:10FD200001010101010101010101010101010101C3
+:10FD300001010101010101010101010101010101B3
+:10FD400001010101010101010101010101010101A3
+:10FD50000101010101010101010101010101010193
+:10FD60000101010101010101010101010101010183
+:10FD70000101010101010101010101010101010173
+:10FD80000101010101010101010101010101010163
+:10FD90000101010101010101010101010101010153
+:10FDA0000101010101010101010101010101010143
+:10FDB0000101010101010101010101010101010133
+:10FDC0000101010101010101010101010101010123
+:10FDD0000101010101010101010101010101010113
+:10FDE0000101010101010101010101010101010103
+:10FDF00001010101010101010101010101010101F3
+:10FE000001010101010101010101010101010101E2
+:10FE100001010101010101010101010101010101D2
+:10FE200001010101010101010101010101010101C2
+:10FE300001010101010101010101010101010101B2
+:10FE400001010101010101010101010101010101A2
+:10FE50000101010101010101010101010101010192
+:10FE60000101010101010101010101010101010182
+:10FE70000101010101010101010101010101010172
+:10FE80000101010101010101010101010101010162
+:10FE90000101010101010101010101010101010152
+:10FEA0000101010101010101010101010101010142
+:10FEB0000101010101010101010101010101010132
+:10FEC0000101010101010101010101010101010122
+:10FED0000101010101010101010101010101010112
+:10FEE0000101010101010101010101010101010102
+:10FEF00001010101010101010101010101010101F2
+:10FF000001010101010101010101010101010101E1
+:10FF100001010101010101010101010101010101D1
+:10FF200001010101010101010101010101010101C1
+:10FF300001010101010101010101010101010101B1
+:10FF400001010101010101010101010101010101A1
+:10FF50000101010101010101010101010101010191
+:10FF60000101010101010101010101010101010181
+:10FF70000101010101010101010101010101010171
+:10FF80000101010101010101010101010101010161
+:10FF90000101010101010101010101010101010151
+:10FFA0000101010101010101010101010101010141
+:10FFB0000101010101010101010101010101010131
+:10FFC0000101010101010101010101010101010121
+:10FFD0000101010101010101010101010101010111
+:10FFE0000101010101010101010101010101010101
+:10FFF00001010101010101010101010101010101F1
+:020000025000AC
+:1000000001010101010101010101010101010101E0
+:1000100001010101010101010101010101010101D0
+:1000200001010101010101010101010101010101C0
+:1000300001010101010101010101010101010101B0
+:1000400001010101010101010101010101010101A0
+:100050000101010101010101010101010101010190
+:100060000101010101010101010101010101010180
+:100070000101010101010101010101010101010170
+:100080000101010101010101010101010101010160
+:100090000101010101010101010101010101010150
+:1000A0000101010101010101010101010101010140
+:1000B0000101010101010101010101010101010130
+:1000C0000101010101010101010101010101010120
+:1000D0000101010101010101010101010101010110
+:1000E0000101010101010101010101010101010100
+:1000F00001010101010101010101010101010101F0
+:1001000001010101010101010101010101010101DF
+:1001100001010101010101010101010101010101CF
+:1001200001010101010101010101010101010101BF
+:1001300001010101010101010101010101010100B0
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000000000000000000000000000008F
+:10017000000000000000000000000000000000007F
+:10018000000000000000000000000000000000006F
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C000000000000000000000000000000000002F
+:1001D000000000000000000000000000000000001F
+:1001E000000000000000000000000000000000000F
+:1001F00000000000000000000000000000000000FF
+:1002000000000000000000000000000000000000EE
+:1002100000000000000000000000000000000000DE
+:1002200000000000000000000000000000000000CE
+:1002300000000000000000000000000000000000BE
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:10028000000000000000000000000000000000006E
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E000000000000000000000000000000000000E
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000000000000000000000BD
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:10038000000000000000000000000000000000006D
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E000000000000000000000000000000000000D
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000000007C
+:10048000000000000000000000000000000000006C
+:10049000000000000000000000000000000000005C
+:1004A000000000000000000000000000000000004C
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000000000000000000002C
+:1004D000000000000000000000000000000000001C
+:1004E000000000000000000000000000000000000C
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000000000000000000000CA
+:1006300000000000000000000000000000000000BA
+:1006400000000000000000000000000000000000AA
+:10065000000000000000000000000000000000009A
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:10068000000000000000000000000000000000006A
+:10069000000000000000000000000000000000005A
+:1006A000000000000000000000000000000000004A
+:1006B000000000000000000000000000000000003A
+:1006C000000000000000000000000000000000002A
+:1006D000000000000000000000000000000000001A
+:1006E000000000000000000000000000000000000A
+:1006F00000000000000000000000000000000000FA
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000000000000000000000C9
+:1007300000000000000000000000000000000000B9
+:1007400000000000000000000000000000000000A9
+:100750000000000000000000000000000000000099
+:100760000000000000000000000000000000000089
+:100770000000000000000000000000000000000079
+:100780000000000000000000000000000000000069
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000000029
+:1007D0000000000000000000000000000000000019
+:1007E0000000000000000000000000000000000009
+:1007F00000000000000000000000000000000000F9
+:1008000000000000000000000000000000000000E8
+:1008100000000000000000000000000000000000D8
+:1008200000000000000000000000000000000000C8
+:1008300000000000000000000000000000000002B6
+:100840000202020202020202020202020202020288
+:100850000202020202020202020202020202020278
+:100860000202020202020202020202020202020268
+:100870000202020202020202020202020202020258
+:100880000202020202020202020202020202020248
+:100890000202020202020202020202020202020238
+:1008A0000202020202020202020202020202020228
+:1008B0000202020202020202020202020202020218
+:1008C0000202020202020202020202020202020208
+:1008D00002020202020202020202020202020202F8
+:1008E00002020202020202020202020202020202E8
+:1008F00002020202020202020202020202020202D8
+:1009000002020202020202020202020202020202C7
+:1009100002020202020202020202020202020202B7
+:1009200002020202020202020202020202020202A7
+:100930000202020202020202020202020202020297
+:100940000202020202020202020202020202020287
+:100950000202020202020202020202020202020277
+:100960000202020202020202020202020202020267
+:100970000202020202020202020202020202020257
+:100980000202020202020202020202020202020247
+:100990000202020202020202020202020202020237
+:1009A0000202020202020202020202020202020227
+:1009B0000202020202020202020202020202020217
+:1009C0000202020202020202020202020202020207
+:1009D00002020202020202020202020202020202F7
+:1009E00002020202020202020202020202020202E7
+:1009F00002020202020202020202020202020202D7
+:100A000002020202020202020202020202020202C6
+:100A100002020202020202020202020202020202B6
+:100A200002020202020202020202020202020202A6
+:100A30000202020202020202020202020202020296
+:100A40000202020202020202020202020202020286
+:100A50000202020202020202020202020202020276
+:100A60000202020202020202020202020202020266
+:100A70000202020202020202020202020202020256
+:100A80000202020202020202020202020202020246
+:100A90000202020202020202020202020202020236
+:100AA0000202020202020202020202020202020226
+:100AB0000202020202020202020202020202020216
+:100AC0000202020202020202020202020202020206
+:100AD00002020202020202020202020202020202F6
+:100AE00002020202020202020202020202020202E6
+:100AF00002020202020202020202020202020202D6
+:100B000002020202020202020202020202020202C5
+:100B100002020202020202020202020202020202B5
+:100B200002020202020202020202020202020202A5
+:100B30000202020202020202020202020202020295
+:100B40000202020202020202020202020202020285
+:100B50000202020202020202020202020202020275
+:100B60000202020202020202020202020202020265
+:100B70000202020202020202020202020202020255
+:100B80000202020202020202020202020202020245
+:100B90000202020202020202020202020202020235
+:100BA0000202020202020202020202020202020225
+:100BB0000202020202020202020202020202020215
+:100BC0000202020202020202020202020202020205
+:100BD00002020202020202020202020202020202F5
+:100BE00002020202020202020202020202020202E5
+:100BF00002020202020202020202020202020202D5
+:100C000002020202020202020202020202020202C4
+:100C100002020202020202020202020202020202B4
+:100C200002020202020202020202020202020202A4
+:100C30000202020202020202020202020202020294
+:100C40000202020202020202020202020202020284
+:100C50000202020202020202020202020202020274
+:100C60000202020202020202020202020202020264
+:100C70000202020202020202020202020202020254
+:100C80000202020202020202020202020202020244
+:100C90000202020202020202020202020202020234
+:100CA0000202020202020202020202020202020224
+:100CB0000202020202020202020202020202020214
+:100CC0000202020202020202020202020202020204
+:100CD00002020202020202020202020202020202F4
+:100CE00002020202020202020202020202020202E4
+:100CF00002020202020202020202020202020202D4
+:100D000002020202020202020202020202020202C3
+:100D100002020202020202020202020202020202B3
+:100D200002020202020202020202020202020202A3
+:100D30000202020202020202020202020202020293
+:100D40000202020202020202020202020202020283
+:100D50000202020202020202020202020202020273
+:100D60000202020202020202020202020202020263
+:100D70000202020202020202020202020202020253
+:100D80000202020202020202020202020202020243
+:100D90000202020202020202020202020202020233
+:100DA0000202020202020202020202020202020223
+:100DB0000202020202020202020202020202020213
+:100DC0000202020202020202020202020202020203
+:100DD00002020202020202020202020202020202F3
+:100DE00002020202020202020202020202020202E3
+:100DF00002020202020202020202020202020202D3
+:100E000002020202020202020202020202020202C2
+:100E100002020202020202020202020202020202B2
+:100E200002020202020202020202020202020202A2
+:100E30000202020202020202020202020202020292
+:100E40000202020202020202020202020202020282
+:100E50000202020202020202020202020202020272
+:100E60000202020202020202020202020202020262
+:100E70000202020202020202020202020202020252
+:100E80000202020202020202020202020202020242
+:100E90000202020202020202020202020202020232
+:100EA0000202020202020202020202020202020222
+:100EB0000202020202020202020202020202020212
+:100EC0000202020202020202020202020202020202
+:100ED00002020202020202020202020202020202F2
+:100EE00002020202020202020202020202020202E2
+:100EF00002020202020202020202020202020202D2
+:100F000002020202020202020202020202020202C1
+:100F100002020202020202020202020202020202B1
+:100F200002020202020202020202020202020202A1
+:100F30000202020202020202020202020202020291
+:100F40000202020202020202020202020202020281
+:100F50000202020202020202020202020202020271
+:100F60000202020202020202020202020202020261
+:100F70000202020202020202020202020202020251
+:100F80000202020202020202020202020202020241
+:100F90000202020202020202020202020202020231
+:100FA0000202020202020202020202020202020221
+:100FB0000202020202020202020202020202020211
+:100FC0000202020202020202020202020202020201
+:100FD00002020202020202020202020202020202F1
+:100FE00002020202020202020202020202020202E1
+:100FF00002020202020202020202020202020202D1
+:1010000002020202020202020202020202020202C0
+:1010100002020202020202020202020202020202B0
+:1010200002020202020202020202020202020202A0
+:101030000202020202020202020202020202020092
+:1010400000000000000000000000000000000000A0
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000000000000000000000070
+:101080000000000000000000000000000000000060
+:101090000000000000000000000000000000000050
+:1010A0000000000000000000000000000000000040
+:1010B0000000000000000000000000000000000030
+:1010C0000000000000000000000000000000000020
+:1010D0000000000000000000000000000000000010
+:1010E0000000000000000000000000000000000000
+:1010F00000000000000000000000000000000000F0
+:1011000000000000000000000000000000000000DF
+:1011100000000000000000000000000000000000CF
+:1011200000000000000000000000000000000000BF
+:1011300000000000000000000000000000000000AF
+:10114000000000000000000000000000000000009F
+:10115000000000000000000000000000000000008F
+:10116000000000000000000000000000000000007F
+:10117000000000000000000000000000000000006F
+:10118000000000000000000000000000000000005F
+:10119000000000000000000000000000000000004F
+:1011A000000000000000000000000000000000003F
+:1011B000000000000000000000000000000000002F
+:1011C000000000000000000000000000000000001F
+:1011D000000000000000000000000000000000000F
+:1011E00000000000000000000000000000000000FF
+:1011F00000000000000000000000000000000000EF
+:1012000000000000000000000000000000000000DE
+:1012100000000000000000000000000000000000CE
+:1012200000000000000000000000000000000000BE
+:1012300000000000000000000000000000000000AE
+:10124000000000000000000000000000000000009E
+:10125000000000000000000000000000000000008E
+:10126000000000000000000000000000000000007E
+:10127000000000000000000000000000000000006E
+:10128000000000000000000000000000000000005E
+:10129000000000000000000000000000000000004E
+:1012A000000000000000000000000000000000003E
+:1012B000000000000000000000000000000000002E
+:1012C000000000000000000000000000000000001E
+:1012D000000000000000000000000000000000000E
+:1012E00000000000000000000000000000000000FE
+:1012F00000000000000000000000000000000000EE
+:1013000000000000000000000000000000000000DD
+:1013100000000000000000000000000000000000CD
+:1013200000000000000000000000000000000000BD
+:1013300000000000000000000000000000000000AD
+:10134000000000000000000000000000000000009D
+:10135000000000000000000000000000000000008D
+:10136000000000000000000000000000000000007D
+:10137000000000000000000000000000000000006D
+:10138000000000000000000000000000000000005D
+:10139000000000000000000000000000000000004D
+:1013A000000000000000000000000000000000003D
+:1013B000000000000000000000000000000000002D
+:1013C000000000000000000000000000000000001D
+:1013D000000000000000000000000000000000000D
+:1013E00000000000000000000000000000000000FD
+:1013F00000000000000000000000000000000000ED
+:1014000000000000000000000000000000000000DC
+:1014100000000000000000000000000000000000CC
+:1014200000000000000000000000000000000000BC
+:1014300000000000000000000000000000000000AC
+:10144000000000000000000000000000000000009C
+:10145000000000000000000000000000000000008C
+:10146000000000000000000000000000000000007C
+:10147000000000000000000000000000000000006C
+:10148000000000000000000000000000000000005C
+:10149000000000000000000000000000000000004C
+:1014A000000000000000000000000000000000003C
+:1014B000000000000000000000000000000000002C
+:1014C000000000000000000000000000000000001C
+:1014D000000000000000000000000000000000000C
+:1014E00000000000000000000000000000000000FC
+:1014F00000000000000000000000000000000000EC
+:1015000000000000000000000000000000000000DB
+:1015100000000000000000000000000000000000CB
+:1015200000000000000000000000000000000000BB
+:1015300000000000000000000000000000000000AB
+:10154000000000000000000000000000000000009B
+:10155000000000000000000000000000000000008B
+:10156000000000000000000000000000000000007B
+:10157000000000000000000000000000000000006B
+:10158000000000000000000000000000000000005B
+:10159000000000000000000000000000000000004B
+:1015A000000000000000000000000000000000003B
+:1015B000000000000000000000000000000000002B
+:1015C000000000000000000000000000000000001B
+:1015D000000000000000000000000000000000000B
+:1015E00000000000000000000000000000000000FB
+:1015F00000000000000000000000000000000000EB
+:1016000000000000000000000000000000000000DA
+:1016100000000000000000000000000000000000CA
+:1016200000000000000000000000000000000000BA
+:1016300000000000000000000000000000000000AA
+:10164000000000000000000000000000000000009A
+:10165000000000000000000000000000000000008A
+:10166000000000000000000000000000000000007A
+:10167000000000000000000000000000000000006A
+:10168000000000000000000000000000000000005A
+:10169000000000000000000000000000000000004A
+:1016A000000000000000000000000000000000003A
+:1016B000000000000000000000000000000000002A
+:1016C000000000000000000000000000000000001A
+:1016D000000000000000000000000000000000000A
+:1016E00000000000000000000000000000000000FA
+:1016F00000000000000000000000000000000000EA
+:1017000000000000000000000000000000000000D9
+:1017100000000000000000000000000000000000C9
+:1017200000000000000000000000000000000000B9
+:101730000000000000000000000000000000007039
+:10174000170500000000007835050000000000804B
+:101750004F050000000000886605000000000090B2
+:101760007D0500000000009892050000000000A028
+:10177000A5050000000000A8B6050000000000B0AC
+:10178000C6050000000000B8D6050000000000C03B
+:10179000E5050000000000C8F0050000000000D0D2
+:1017A000FF050000000000D8080600000000001E31
+:1017B0000000000000000000000000000000000029
+:1017C0000000000000000100000000000000000018
+:1017D0000000000000000000000000000000000009
+:1017E00000000000000000000000000000000000F9
+:1017F00000000000000000000000000000000000E9
+:1018000000000000000000000000000000000000D8
+:1018100000000000000000000000000000000000C8
+:1018200000000000000000000000000000000000B8
+:1018300000000000000000000000000000000000A8
+:101840000000000000000000000000000000000098
+:101850000000000000000000000000000000000088
+:101860000000000000000000000000000000000078
+:101870000000000000000000000000000000000068
+:101880000000000000000000000000000000000058
+:101890000000000000000000000000000000000048
+:1018A0000000000000000002020000000000000034
+:1018B0000000000000000000000000000000000028
+:1018C0000000000000000100000000000000000017
+:1018D0000000000000000000000000000000000008
+:1018E00000000000000000000000000000000000F8
+:1018F00000000000000000000000000000000000E8
+:1019000000000000000000000000000000000000D7
+:1019100000000000000000000000000000000000C7
+:1019200000000000000000000000000000000000B7
+:1019300000000000000000000000000000000000A7
+:101940000000000000000000000000000000000097
+:101950000000000000000000000000000000000087
+:101960000000000000000000000000000000000077
+:101970000000000000000000000000000000000067
+:101980000000000000000000000000000000000057
+:101990000000000000000000000000000000000047
+:1019A0000000000000000002020001000000000032
+:1019B0000000000000000000000000000000000027
+:1019C0000000000000010100000000000000000015
+:1019D0000000000000000000000000000000000007
+:1019E00000000000000000000000000000000000F7
+:1019F00000000000000000000000000000000000E7
+:101A000000000000000000000000000000000000D6
+:101A100000000000000000000000000000000000C6
+:101A200000000000000000000000000000000000B6
+:101A300000000000000000000000000000000000A6
+:101A40000000000000000000000000000000000096
+:101A50000000000000000000000000000000000086
+:101A60000000000000000000000000000000000076
+:101A70000000000000000000000000000000000066
+:101A80000000000000000000000000000000000056
+:101A90000000000000000000000000000000000046
+:101AA000000000000000000202020200010100012B
+:101AB0000000000000000000000000000000000026
+:101AC0000000000000010100000000000000000014
+:101AD0000000000000000000000000000000000006
+:101AE00000000000000000000000000000000000F6
+:101AF00000000000000000000000000000000000E6
+:101B000000000000000000000000000000000000D5
+:101B100000000000000000000000000000000000C5
+:101B200000000000000000000000000000000000B5
+:101B300000000000000000000000000000000000A5
+:101B40000000000000000000000000000000000095
+:101B50000000000000000000000000000000000085
+:101B60000000000000000000000000000000000075
+:101B70000000000000000000000000000000000065
+:101B80000000000000000000000000000000000055
+:101B90000000000000000000000000000000000045
+:101BA0000000000000000002020202010101000129
+:101BB0000000000000000000000000000000000025
+:101BC0000000000000010100000000000000000013
+:101BD0000000000000000000000000000000000005
+:101BE00000000000000000000000000000000000F5
+:101BF00000000000000000000000000000000000E5
+:101C000000000000000000000000000000000000D4
+:101C100000000000000000000000000000000000C4
+:101C200000000000000000000000000000000000B4
+:101C300000000000000000000000000000000000A4
+:101C40000000000000000000000000000000000094
+:101C50000000000000000000000000000000000084
+:101C60000000000000000000000000000000000074
+:101C70000000000000000000000000000000000064
+:101C80000000000000000000000000000000000054
+:101C90000000000000000000000000000000000044
+:101CA0000000000000000002020202020101000127
+:101CB0000001000000000000000000000000000023
+:101CC0000000000000010100000000000000000012
+:101CD0000000000000000000000000000000000004
+:101CE00000000000000000000000000000000000F4
+:101CF00000000000000000000000000000000000E4
+:101D000000000000000000000000000000000000D3
+:101D100000000000000000000000000000000000C3
+:101D200000000000000000000000000000000000B3
+:101D300000000000000000000000000000000000A3
+:101D40000000000000000000000000000000000093
+:101D50000000000000000000000000000000000083
+:101D60000000000000000000000000000000000073
+:101D70000000000000000000000000000000000063
+:101D80000000000000000000000000000000000053
+:101D90000000000000000000000000000000000043
+:101DA0000000000000000002020202020201010124
+:101DB0000101000000000000000000000000000021
+:101DC0000000000001010100000000000000000010
+:101DD0000000000000000000000000000000000003
+:101DE00000000000000000000000000000000000F3
+:101DF00000000000000000000000000000000000E3
+:101E000000000000000000000000000000000000D2
+:101E100000000000000000000000000000000000C2
+:101E200000000000000000000000000000000000B2
+:101E300000000000000000000000000000000000A2
+:101E40000000000000000000000000000000000092
+:101E50000000000000000000000000000000000082
+:101E60000000000000000000000000000000000072
+:101E70000000000000000000000000000000000062
+:101E80000000000000000000000000000000000052
+:101E90000000000000000000000000000000000042
+:101EA0000000000000000002020202020202010122
+:101EB0000101000000000000000000000000000020
+:101EC000000000000101010000000000000000000F
+:101ED0000000000000000000000000000000000002
+:101EE00000000000000000000000000000000000F2
+:101EF00000000000000000000000000000000000E2
+:101F000000000000000000000000000000000000D1
+:101F100000000000000000000000000000000000C1
+:101F200000000000000000000000000000000000B1
+:101F300000000000000000000000000000000000A1
+:101F40000000000000000000000000000000000091
+:101F50000000000000000000000000000000000081
+:101F60000000000000000000000000000000000071
+:101F70000000000000000000000000000000000061
+:101F80000000000000000000000000000000000051
+:101F90000000000000000000000000000000000041
+:101FA0000000000000000002020202020202010121
+:101FB000010101000000000000000000000000001E
+:101FC000000000010101010000000000000000000D
+:101FD0000000000000000000000000000000000001
+:101FE00000000000000000000000000000000000F1
+:101FF00000000000000000000000000000000000E1
+:1020000000000000000000000000000000000000D0
+:1020100000000000000000000000000000000000C0
+:1020200000000000000000000000000000000000B0
+:1020300000000000000000000000000000000000A0
+:102040000000000000000000000000000000000090
+:102050000000000000000000000000000000000080
+:102060000000000000000000000000000000000070
+:102070000000000000000000000000000000000060
+:102080000000000000000000000000000000000050
+:102090000000000000000000000000000000000040
+:1020A000000000000000000202020202020202021E
+:1020B000010101000000000000000000000000001D
+:1020C000000000010101010000000000000000000C
+:1020D0000000000000000000000000000000000000
+:1020E00000000000000000000000000000000000F0
+:1020F00000000000000000000000000000000000E0
+:1021000000000000000000000000000000000000CF
+:1021100000000000000000000000000000000000BF
+:1021200000000000000000000000000000000000AF
+:10213000000000000000000000000000000000009F
+:10214000000000000000000000000000000000008F
+:10215000000000000000000000000000000000007F
+:10216000000000000000000000000000000000006F
+:10217000000000000000000000000000000000005F
+:10218000000000000000000000000000000000004F
+:10219000000000000000000000000000000000003F
+:1021A000000000000000000202020202020202021D
+:1021B000010101000000000000000000000000001C
+:1021C000000001010101010000000000000000000A
+:1021D00000000000000000000000000000000000FF
+:1021E00000000000000000000000000000000000EF
+:1021F00000000000000000000000000000000000DF
+:1022000000000000000000000000000000000000CE
+:1022100000000000000000000000000000000000BE
+:1022200000000000000000000000000000000000AE
+:10223000000000000000000000000000000000009E
+:10224000000000000000000000000000000000008E
+:10225000000000000000000000000000000000007E
+:10226000000000000000000000000000000000006E
+:10227000000000000000000000000000000000005E
+:10228000000000000000000000000000000000004E
+:10229000000000000000000000000000000000003E
+:1022A000000000000000000202020202020202021C
+:1022B000020101000000000000000000000000001A
+:1022C0000001010101010100000000000000000008
+:1022D00000000000000000000000000000000000FE
+:1022E00000000000000000000000000000000000EE
+:1022F00000000000000000000000000000000000DE
+:1023000000000000000000000000000000000000CD
+:1023100000000000000000000000000000000000BD
+:1023200000000000000000000000000000000000AD
+:10233000000000000000000000000000000000009D
+:10234000000000000000000000000000000000008D
+:10235000000000000000000000000000000000007D
+:10236000000000000000000000000000000000006D
+:10237000000000000000000000000000000000005D
+:10238000000000000000000000000000000000004D
+:10239000000000000000000000000000000000003D
+:1023A000000000000000000202020202020202021B
+:1023B0000202010100000000000000000000000017
+:1023C0000001010101010100000000000000000007
+:1023D00000000000000000000000000000000000FD
+:1023E00000000000000000000000000000000000ED
+:1023F00000000000000000000000000000000000DD
+:1024000000000000000000000000000000000000CC
+:1024100000000000000000000000000000000000BC
+:1024200000000000000000000000000000000000AC
+:10243000000000000000000000000000000000009C
+:10244000000000000000000000000000000000008C
+:10245000000000000000000000000000000000007C
+:10246000000000000000000000000000000000006C
+:10247000000000000000000000000000000000005C
+:10248000000000000000000000000000000000004C
+:10249000000000000000000000000000000000003C
+:1024A000000000000000000202020202020202021A
+:1024B0000202010100000000000000000000000016
+:1024C0000001010101010100000000000000000006
+:1024D00000000000000000000000000000000000FC
+:1024E00000000000000000000000000000000000EC
+:1024F00000000000000000000000000000000000DC
+:1025000000000000000000000000000000000000CB
+:1025100000000000000000000000000000000000BB
+:1025200000000000000000000000000000000000AB
+:10253000000000000000000000000000000000009B
+:10254000000000000000000000000000000000008B
+:10255000000000000000000000000000000000007B
+:10256000000000000000000000000000000000006B
+:10257000000000000000000000000000000000005B
+:10258000000000000000000000000000000000004B
+:10259000000000000000000000000000000000003B
+:1025A0000000000000000002020202020202020219
+:1025B0000202020101010000000000000000000012
+:1025C0000101010101010100000000000000000004
+:1025D00000000000000000000000000000000000FB
+:1025E00000000000000000000000000000000000EB
+:1025F00000000000000000000000000000000000DB
+:1026000000000000000000000000000000000000CA
+:1026100000000000000000000000000000000000BA
+:1026200000000000000000000000000000000000AA
+:10263000000000000000000000000000000000009A
+:10264000000000000000000000000000000000008A
+:10265000000000000000000000000000000000007A
+:10266000000000000000000000000000000000006A
+:10267000000000000000000000000000000000005A
+:10268000000000000000000000000000000000004A
+:10269000000000000000000000000000000000003A
+:1026A0000000000000000002020202020202020218
+:1026B0000202020101010000000000000000000110
+:1026C0000101010101010100000000000000000003
+:1026D00000000000000000000000000000000000FA
+:1026E00000000000000000000000000000000000EA
+:1026F00000000000000000000000000000000000DA
+:1027000000000000000000000000000000000000C9
+:1027100000000000000000000000000000000000B9
+:1027200000000000000000000000000000000000A9
+:102730000000000000000000000000000000000099
+:102740000000000000000000000000000000000089
+:102750000000000000000000000000000000000079
+:102760000000000000000000000000000000000069
+:102770000000000000000000000000000000000059
+:102780000000000000000000000000000000000049
+:102790000000000000000000000000000000000039
+:1027A0000000000000000002020202020202020217
+:1027B000020202010101000000000000000000010F
+:1027C0000101010101010100000000000000000002
+:1027D00000000000000000000000000000000000F9
+:1027E00000000000000000000000000000000000E9
+:1027F00000000000000000000000000000000000D9
+:1028000000000000000000000000000000000000C8
+:1028100000000000000000000000000000000000B8
+:1028200000000000000000000000000000000000A8
+:102830000000000000000000000000000000000098
+:102840000000000000000000000000000000000088
+:102850000000000000000000000000000000000078
+:102860000000000000000000000000000000000068
+:102870000000000000000000000000000000000058
+:102880000000000000000000000000000000000048
+:102890000000000000000000000000000000000038
+:1028A0000000000000000002020202020202020216
+:1028B000020202020101000000000000000000010D
+:1028C0000101010101010100000000000000000001
+:1028D00000000000000000000000000000000000F8
+:1028E00000000000000000000000000000000000E8
+:1028F00000000000000000000000000000000000D8
+:1029000000000000000000000000000000000000C7
+:1029100000000000000000000000000000000000B7
+:1029200000000000000000000000000000000000A7
+:102930000000000000000000000000000000000097
+:102940000000000000000000000000000000000087
+:102950000000000000000000000000000000000077
+:102960000000000000000000000000000000000067
+:102970000000000000000000000000000000000057
+:102980000000000000000000000000000000000047
+:102990000000000000000000000000000000000037
+:1029A0000000000000000002020202020202020215
+:1029B000020202020101000000000000000001010B
+:1029C0000101010101010100000000000000000000
+:1029D00000000000000000000000000000000000F7
+:1029E00000000000000000000000000000000000E7
+:1029F00000000000000000000000000000000000D7
+:102A000000000000000000000000000000000000C6
+:102A100000000000000000000000000000000000B6
+:102A200000000000000000000000000000000000A6
+:102A30000000000000000000000000000000000096
+:102A40000000000000000000000000000000000086
+:102A50000000000000000000000000000000000076
+:102A60000000000000000000000000000000000066
+:102A70000000000000000000000000000000000056
+:102A80000000000000000000000000000000000046
+:102A90000000000000000000000000000000000036
+:102AA0000000000000000002020202020202020214
+:102AB0000202020202010000000000000001010108
+:102AC00001010101010101000000000000000000FF
+:102AD00000000000000000000000000000000000F6
+:102AE00000000000000000000000000000000000E6
+:102AF00000000000000000000000000000000000D6
+:102B000000000000000000000000000000000000C5
+:102B100000000000000000000000000000000000B5
+:102B200000000000000000000000000000000000A5
+:102B30000000000000000000000000000000000095
+:102B40000000000000000000000000000000000085
+:102B50000000000000000000000000000000000075
+:102B60000000000000000000000000000000000065
+:102B70000000000000000000000000000000000055
+:102B80000000000000000000000000000000000045
+:102B90000000000000000000000000000000000035
+:102BA0000000000000000002020202020202020213
+:102BB0000202020202010000000000000001010107
+:102BC00001010101010101000000000000000000FE
+:102BD00000000000000000000000000000000000F5
+:102BE00000000000000000000000000000000000E5
+:102BF00000000000000000000000000000000000D5
+:102C000000000000000000000000000000000000C4
+:102C100000000000000000000000000000000000B4
+:102C200000000000000000000000000000000000A4
+:102C30000000000000000000000000000000000094
+:102C40000000000000000000000000000000000084
+:102C50000000000000000000000000000000000074
+:102C60000000000000000000000000000000000064
+:102C70000000000000000000000000000000000054
+:102C80000000000000000000000000000000000044
+:102C90000000000000000000000000000000000034
+:102CA0000000000000000002020202020202020212
+:102CB0000202020202020000000000000101010104
+:102CC00001010101010101000000000000000000FD
+:102CD00000000000000000000000000000000000F4
+:102CE00000000000000000000000000000000000E4
+:102CF00000000000000000000000000000000000D4
+:102D000000000000000000000000000000000000C3
+:102D100000000000000000000000000000000000B3
+:102D200000000000000000000000000000000000A3
+:102D30000000000000000000000000000000000093
+:102D40000000000000000000000000000000000083
+:102D50000000000000000000000000000000000073
+:102D60000000000000000000000000000000000063
+:102D70000000000000000000000000000000000053
+:102D80000000000000000000000000000000000043
+:102D90000000000000000000000000000000000033
+:102DA0000000000000000002020202020202020211
+:102DB0000202020202020000000000000101010103
+:102DC00001010101010101000000000000000000FC
+:102DD00000000000000000000000000000000000F3
+:102DE00000000000000000000000000000000000E3
+:102DF00000000000000000000000000000000000D3
+:102E000000000000000000000000000000000000C2
+:102E100000000000000000000000000000000000B2
+:102E200000000000000000000000000000000000A2
+:102E30000000000000000000000000000000000092
+:102E40000000000000000000000000000000000082
+:102E50000000000000000000000000000000000072
+:102E60000000000000000000000000000000000062
+:102E70000000000000000000000000000000000052
+:102E80000000000000000000000000000000000042
+:102E90000000000000000000000000000000000032
+:102EA0000000000000000002020202020202020210
+:102EB0000202020202020000000000000101010102
+:102EC00001010101010101000000000000000000FB
+:102ED00000000000000000000000000000000000F2
+:102EE00000000000000000000000000000000000E2
+:102EF00000000000000000000000000000000000D2
+:102F000000000000000000000000000000000000C1
+:102F100000000000000000000000000000000000B1
+:102F200000000000000000000000000000000000A1
+:102F30000000000000000000000000000000000091
+:102F40000000000000000000000000000000000081
+:102F50000000000000000000000000000000000071
+:102F60000000000000000000000000000000000061
+:102F70000000000000000000000000000000000051
+:102F80000000000000000000000000000000000041
+:102F90000000000000000000000000000000000031
+:102FA000000000000000000202020202020202020F
+:102FB0000202020202020000000000010101010100
+:102FC00001010101010101000000000000000000FA
+:102FD00000000000000000000000000000000000F1
+:102FE00000000000000000000000000000000000E1
+:102FF00000000000000000000000000000000000D1
+:1030000000000000000000000000000000000000C0
+:1030100000000000000000000000000000000000B0
+:1030200000000000000000000000000000000000A0
+:103030000000000000000000000000000000000090
+:103040000000000000000000000000000000000080
+:103050000000000000000000000000000000000070
+:103060000000000000000000000000000000000060
+:103070000000000000000000000000000000000050
+:103080000000000000000000000000000000000040
+:103090000000000000000000000000000000000030
+:1030A000000000000000000202020202020202020E
+:1030B00002020202020200000000000101010101FF
+:1030C00001010101010101000000000000000000F9
+:1030D00000000000000000000000000000000000F0
+:1030E00000000000000000000000000000000000E0
+:1030F00000000000000000000000000000000000D0
+:1031000000000000000000000000000000000000BF
+:1031100000000000000000000000000000000000AF
+:10312000000000000000000000000000000000009F
+:10313000000000000000000000000000000000008F
+:10314000000000000000000000000000000000007F
+:10315000000000000000000000000000000000006F
+:10316000000000000000000000000000000000005F
+:10317000000000000000000000000000000000004F
+:10318000000000000000000000000000000000003F
+:10319000000000000000000000000000000000002F
+:1031A000000000000000000202020202020202020D
+:1031B00002020202020200000000010101010101FD
+:1031C00001010101010101000000000000000000F8
+:1031D00000000000000000000000000000000000EF
+:1031E00000000000000000000000000000000000DF
+:1031F00000000000000000000000000000000000CF
+:1032000000000000000000000000000000000000BE
+:1032100000000000000000000000000000000000AE
+:10322000000000000000000000000000000000009E
+:10323000000000000000000000000000000000008E
+:10324000000000000000000000000000000000007E
+:10325000000000000000000000000000000000006E
+:10326000000000000000000000000000000000005E
+:10327000000000000000000000000000000000004E
+:10328000000000000000000000000000000000003E
+:10329000000000000000000000000000000000002E
+:1032A000000000000000000202020202020202020C
+:1032B00002020202020200000001010101010101FB
+:1032C00001010101010101000000000000000000F7
+:1032D00000000000000000000000000000000000EE
+:1032E00000000000000000000000000000000000DE
+:1032F00000000000000000000000000000000000CE
+:1033000000000000000000000000000000000000BD
+:1033100000000000000000000000000000000000AD
+:10332000000000000000000000000000000000009D
+:10333000000000000000000000000000000000008D
+:10334000000000000000000000000000000000007D
+:10335000000000000000000000000000000000006D
+:10336000000000000000000000000000000000005D
+:10337000000000000000000000000000000000004D
+:10338000000000000000000000000000000000003D
+:10339000000000000000000000000000000000002D
+:1033A000000000000000000202020202020202020B
+:1033B00002020202020200000001010101010101FA
+:1033C00001010101010101000000000000000000F6
+:1033D00000000000000000000000000000000000ED
+:1033E00000000000000000000000000000000000DD
+:1033F00000000000000000000000000000000000CD
+:1034000000000000000000000000000000000000BC
+:1034100000000000000000000000000000000000AC
+:10342000000000000000000000000000000000009C
+:10343000000000000000000000000000000000008C
+:10344000000000000000000000000000000000007C
+:10345000000000000000000000000000000000006C
+:10346000000000000000000000000000000000005C
+:10347000000000000000000000000000000000004C
+:10348000000000000000000000000000000000003C
+:10349000000000000000000000000000000000002C
+:1034A000000000000000000202020202020202020A
+:1034B0000202020202020000000000000000000000
+:1034C00000000000000000000000000000000000FC
+:1034D00000000000000000000000000000000000EC
+:1034E00000000000000000000000000000000000DC
+:1034F00000000000000000000000000000000000CC
+:1035000000000000000000000000000000000000BB
+:1035100000000000000000000000000000000000AB
+:10352000000000000000000000000000000000009B
+:10353000000000000000000000000000000000008B
+:10354000000000000000000000000000000000007B
+:10355000000000000000000000000000000000006B
+:10356000000000000000000000000000000000005B
+:10357000000000000000000000000000000000004B
+:10358000000000000000000000000000000000003B
+:10359000000000000000000000000000000000002B
+:1035A000000000000000000000000000000000001B
+:1035B000000000000000001A0000000000000000F1
+:1035C00000000000000000000000000000000100FA
+:1035D00000000000000000000000000000000000EB
+:1035E00000000000000000000000000000000000DB
+:1035F00000000000000000000000000000000000CB
+:1036000000000000000000000000000000000000BA
+:1036100000000000000000000000000000000000AA
+:10362000000000000000000000000000000000009A
+:10363000000000000000000000000000000000008A
+:10364000000000000000000000000000000000007A
+:10365000000000000000000000000000000000006A
+:10366000000000000000000000000000000000005A
+:10367000000000000000000000000000000000004A
+:10368000000000000000000000000000000000003A
+:10369000000000000000000000000000000000002A
+:1036A0000000000000000000000000000000000218
+:1036B0000200000000000000000000000000000008
+:1036C00000000000000000000000000000000100F9
+:1036D00000000000000000000000000000000000EA
+:1036E00000000000000000000000000000000000DA
+:1036F00000000000000000000000000000000000CA
+:1037000000000000000000000000000000000000B9
+:1037100000000000000000000000000000000000A9
+:103720000000000000000000000000000000000099
+:103730000000000000000000000000000000000089
+:103740000000000000000000000000000000000079
+:103750000000000000000000000000000000000069
+:103760000000000000000000000000000000000059
+:103770000000000000000000000000000000000049
+:103780000000000000000000000000000000000039
+:103790000000000000000000000000000000000029
+:1037A0000000000000000000000000000000000217
+:1037B0000200000001000000000000000000000006
+:1037C00000000000000000000000000000000100F8
+:1037D00000000000000000000000000000000000E9
+:1037E00000000000000000000000000000000000D9
+:1037F00000000000000000000000000000000000C9
+:1038000000000000000000000000000000000000B8
+:1038100000000000000000000000000000000000A8
+:103820000000000000000000000000000000000098
+:103830000000000000000000000000000000000088
+:103840000000000000000000000000000000000078
+:103850000000000000000000000000000000000068
+:103860000000000000000000000000000000000058
+:103870000000000000000000000000000000000048
+:103880000000000000000000000000000000000038
+:103890000000000000000000000000000000000028
+:1038A0000000000000000000000000000000000216
+:1038B0000202010001010000000000000000000001
+:1038C00000000000000000000000000001010100F5
+:1038D00000000000000000000000000000000000E8
+:1038E00000000000000000000000000000000000D8
+:1038F00000000000000000000000000000000000C8
+:1039000000000000000000000000000000000000B7
+:1039100000000000000000000000000000000000A7
+:103920000000000000000000000000000000000097
+:103930000000000000000000000000000000000087
+:103940000000000000000000000000000000000077
+:103950000000000000000000000000000000000067
+:103960000000000000000000000000000000000057
+:103970000000000000000000000000000000000047
+:103980000000000000000000000000000000000037
+:103990000000000000000000000000000000000027
+:1039A0000000000000000000000000000000000215
+:1039B00002020200010100000000000000000000FF
+:1039C00000000000000000000000000001010100F4
+:1039D00000000000000000000000000000000000E7
+:1039E00000000000000000000000000000000000D7
+:1039F00000000000000000000000000000000000C7
+:103A000000000000000000000000000000000000B6
+:103A100000000000000000000000000000000000A6
+:103A20000000000000000000000000000000000096
+:103A30000000000000000000000000000000000086
+:103A40000000000000000000000000000000000076
+:103A50000000000000000000000000000000000066
+:103A60000000000000000000000000000000000056
+:103A70000000000000000000000000000000000046
+:103A80000000000000000000000000000000000036
+:103A90000000000000000000000000000000000026
+:103AA0000000000000000000000000000000000214
+:103AB00002020201010101000000000000000000FC
+:103AC00000000000000000000000000001010100F3
+:103AD00000000000000000000000000000000000E6
+:103AE00000000000000000000000000000000000D6
+:103AF00000000000000000000000000000000000C6
+:103B000000000000000000000000000000000000B5
+:103B100000000000000000000000000000000000A5
+:103B20000000000000000000000000000000000095
+:103B30000000000000000000000000000000000085
+:103B40000000000000000000000000000000000075
+:103B50000000000000000000000000000000000065
+:103B60000000000000000000000000000000000055
+:103B70000000000000000000000000000000000045
+:103B80000000000000000000000000000000000035
+:103B90000000000000000000000000000000000025
+:103BA0000000000000000000000000000000000213
+:103BB00002020202010101000000000000000000FA
+:103BC00000000000000000000000000001010100F2
+:103BD00000000000000000000000000000000000E5
+:103BE00000000000000000000000000000000000D5
+:103BF00000000000000000000000000000000000C5
+:103C000000000000000000000000000000000000B4
+:103C100000000000000000000000000000000000A4
+:103C20000000000000000000000000000000000094
+:103C30000000000000000000000000000000000084
+:103C40000000000000000000000000000000000074
+:103C50000000000000000000000000000000000064
+:103C60000000000000000000000000000000000054
+:103C70000000000000000000000000000000000044
+:103C80000000000000000000000000000000000034
+:103C90000000000000000000000000000000000024
+:103CA0000000000000000000000000000000000212
+:103CB00002020202020101000000000000000000F8
+:103CC00000000000000000000000010101010100EF
+:103CD00000000000000000000000000000000000E4
+:103CE00000000000000000000000000000000000D4
+:103CF00000000000000000000000000000000000C4
+:103D000000000000000000000000000000000000B3
+:103D100000000000000000000000000000000000A3
+:103D20000000000000000000000000000000000093
+:103D30000000000000000000000000000000000083
+:103D40000000000000000000000000000000000073
+:103D50000000000000000000000000000000000063
+:103D60000000000000000000000000000000000053
+:103D70000000000000000000000000000000000043
+:103D80000000000000000000000000000000000033
+:103D90000000000000000000000000000000000023
+:103DA0000000000000000000000000000000000211
+:103DB00002020202020201010100000000000000F4
+:103DC00000000000000000000000010101010100EE
+:103DD00000000000000000000000000000000000E3
+:103DE00000000000000000000000000000000000D3
+:103DF00000000000000000000000000000000000C3
+:103E000000000000000000000000000000000000B2
+:103E100000000000000000000000000000000000A2
+:103E20000000000000000000000000000000000092
+:103E30000000000000000000000000000000000082
+:103E40000000000000000000000000000000000072
+:103E50000000000000000000000000000000000062
+:103E60000000000000000000000000000000000052
+:103E70000000000000000000000000000000000042
+:103E80000000000000000000000000000000000032
+:103E90000000000000000000000000000000000022
+:103EA0000000000000000000000000000000000210
+:103EB00002020202020202010101010001000000EF
+:103EC00000000000000000000001010101010100EC
+:103ED00000000000000000000000000000000000E2
+:103EE00000000000000000000000000000000000D2
+:103EF00000000000000000000000000000000000C2
+:103F000000000000000000000000000000000000B1
+:103F100000000000000000000000000000000000A1
+:103F20000000000000000000000000000000000091
+:103F30000000000000000000000000000000000081
+:103F40000000000000000000000000000000000071
+:103F50000000000000000000000000000000000061
+:103F60000000000000000000000000000000000051
+:103F70000000000000000000000000000000000041
+:103F80000000000000000000000000000000000031
+:103F90000000000000000000000000000000000021
+:103FA000000000000000000000000000000000020F
+:103FB00002020202020202010101010001000000EE
+:103FC00000000000000000000101010101010100EA
+:103FD00000000000000000000000000000000000E1
+:103FE00000000000000000000000000000000000D1
+:103FF00000000000000000000000000000000000C1
+:1040000000000000000000000000000000000000B0
+:1040100000000000000000000000000000000000A0
+:104020000000000000000000000000000000000090
+:104030000000000000000000000000000000000080
+:104040000000000000000000000000000000000070
+:104050000000000000000000000000000000000060
+:104060000000000000000000000000000000000050
+:104070000000000000000000000000000000000040
+:104080000000000000000000000000000000000030
+:104090000000000000000000000000000000000020
+:1040A000000000000000000000000000000000020E
+:1040B00002020202020202020101010001000000EC
+:1040C00000000000000000000101010101010100E9
+:1040D00000000000000000000000000000000000E0
+:1040E00000000000000000000000000000000000D0
+:1040F00000000000000000000000000000000000C0
+:1041000000000000000000000000000000000000AF
+:10411000000000000000000000000000000000009F
+:10412000000000000000000000000000000000008F
+:10413000000000000000000000000000000000007F
+:10414000000000000000000000000000000000006F
+:10415000000000000000000000000000000000005F
+:10416000000000000000000000000000000000004F
+:10417000000000000000000000000000000000003F
+:10418000000000000000000000000000000000002F
+:10419000000000000000000000000000000000001F
+:1041A000000000000000000000000000000000020D
+:1041B00002020202020202020201010001000000EA
+:1041C00000000000000000010101010101010100E7
+:1041D00000000000000000000000000000000000DF
+:1041E00000000000000000000000000000000000CF
+:1041F00000000000000000000000000000000000BF
+:1042000000000000000000000000000000000000AE
+:10421000000000000000000000000000000000009E
+:10422000000000000000000000000000000000008E
+:10423000000000000000000000000000000000007E
+:10424000000000000000000000000000000000006E
+:10425000000000000000000000000000000000005E
+:10426000000000000000000000000000000000004E
+:10427000000000000000000000000000000000003E
+:10428000000000000000000000000000000000002E
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000000020C
+:1042B00002020202020202020202010101000000E7
+:1042C00000000000000101010101010101010100E4
+:1042D00000000000000000000000000000000000DE
+:1042E00000000000000000000000000000000000CE
+:1042F00000000000000000000000000000000000BE
+:1043000000000000000000000000000000000000AD
+:10431000000000000000000000000000000000009D
+:10432000000000000000000000000000000000008D
+:10433000000000000000000000000000000000007D
+:10434000000000000000000000000000000000006D
+:10435000000000000000000000000000000000005D
+:10436000000000000000000000000000000000004D
+:10437000000000000000000000000000000000003D
+:10438000000000000000000000000000000000002D
+:10439000000000000000000000000000000000001D
+:1043A000000000000000000000000000000000020B
+:1043B00002020202020202020202020101000000E5
+:1043C00000000000010101010101010101010100E2
+:1043D00000000000000000000000000000000000DD
+:1043E00000000000000000000000000000000000CD
+:1043F00000000000000000000000000000000000BD
+:1044000000000000000000000000000000000000AC
+:10441000000000000000000000000000000000009C
+:10442000000000000000000000000000000000008C
+:10443000000000000000000000000000000000007C
+:10444000000000000000000000000000000000006C
+:10445000000000000000000000000000000000005C
+:10446000000000000000000000000000000000004C
+:10447000000000000000000000000000000000003C
+:10448000000000000000000000000000000000002C
+:10449000000000000000000000000000000000001C
+:1044A000000000000000000000000000000000020A
+:1044B00002020202020202020202020101010000E3
+:1044C00000000000010101010101010101010100E1
+:1044D00000000000000000000000000000000000DC
+:1044E00000000000000000000000000000000000CC
+:1044F00000000000000000000000000000000000BC
+:1045000000000000000000000000000000000000AB
+:10451000000000000000000000000000000000009B
+:10452000000000000000000000000000000000008B
+:10453000000000000000000000000000000000007B
+:10454000000000000000000000000000000000006B
+:10455000000000000000000000000000000000005B
+:10456000000000000000000000000000000000004B
+:10457000000000000000000000000000000000003B
+:10458000000000000000000000000000000000002B
+:10459000000000000000000000000000000000001B
+:1045A0000000000000000000000000000000000209
+:1045B00002020202020202020202020202010000E0
+:1045C00000000000010101010101010101010100E0
+:1045D00000000000000000000000000000000000DB
+:1045E00000000000000000000000000000000000CB
+:1045F00000000000000000000000000000000000BB
+:1046000000000000000000000000000000000000AA
+:10461000000000000000000000000000000000009A
+:10462000000000000000000000000000000000008A
+:10463000000000000000000000000000000000007A
+:10464000000000000000000000000000000000006A
+:10465000000000000000000000000000000000005A
+:10466000000000000000000000000000000000004A
+:10467000000000000000000000000000000000003A
+:10468000000000000000000000000000000000002A
+:10469000000000000000000000000000000000001A
+:1046A0000000000000000000000000000000000208
+:1046B00002020202020202020202020202010000DF
+:1046C00000000000010101010101010101010100DF
+:1046D00000000000000000000000000000000000DA
+:1046E00000000000000000000000000000000000CA
+:1046F00000000000000000000000000000000000BA
+:1047000000000000000000000000000000000000A9
+:104710000000000000000000000000000000000099
+:104720000000000000000000000000000000000089
+:104730000000000000000000000000000000000079
+:104740000000000000000000000000000000000069
+:104750000000000000000000000000000000000059
+:104760000000000000000000000000000000000049
+:104770000000000000000000000000000000000039
+:104780000000000000000000000000000000000029
+:104790000000000000000000000000000000000019
+:1047A0000000000000000000000000000000000207
+:1047B00002020202020202020202020202010000DE
+:1047C00000000000010101010101010101010100DE
+:1047D00000000000000000000000000000000000D9
+:1047E00000000000000000000000000000000000C9
+:1047F00000000000000000000000000000000000B9
+:1048000000000000000000000000000000000000A8
+:104810000000000000000000000000000000000098
+:104820000000000000000000000000000000000088
+:104830000000000000000000000000000000000078
+:104840000000000000000000000000000000000068
+:104850000000000000000000000000000000000058
+:104860000000000000000000000000000000000048
+:104870000000000000000000000000000000000038
+:104880000000000000000000000000000000000028
+:104890000000000000000000000000000000000018
+:1048A0000000000000000000000000000000000206
+:1048B00002020202020202020202020202020000DC
+:1048C00000000001010101010101010101010100DC
+:1048D00000000000000000000000000000000000D8
+:1048E00000000000000000000000000000000000C8
+:1048F00000000000000000000000000000000000B8
+:1049000000000000000000000000000000000000A7
+:104910000000000000000000000000000000000097
+:104920000000000000000000000000000000000087
+:104930000000000000000000000000000000000077
+:104940000000000000000000000000000000000067
+:104950000000000000000000000000000000000057
+:104960000000000000000000000000000000000047
+:104970000000000000000000000000000000000037
+:104980000000000000000000000000000000000027
+:104990000000000000000000000000000000000017
+:1049A0000000000000000000000000000000000205
+:1049B00002020202020202020202020202020000DB
+:1049C00000000001010101010101010101010100DB
+:1049D00000000000000000000000000000000000D7
+:1049E00000000000000000000000000000000000C7
+:1049F00000000000000000000000000000000000B7
+:104A000000000000000000000000000000000000A6
+:104A10000000000000000000000000000000000096
+:104A20000000000000000000000000000000000086
+:104A30000000000000000000000000000000000076
+:104A40000000000000000000000000000000000066
+:104A50000000000000000000000000000000000056
+:104A60000000000000000000000000000000000046
+:104A70000000000000000000000000000000000036
+:104A80000000000000000000000000000000000026
+:104A90000000000000000000000000000000000016
+:104AA0000000000000000000000000000000000204
+:104AB00002020202020202020202020202020000DA
+:104AC00000000101010101010101010101010100D9
+:104AD00000000000000000000000000000000000D6
+:104AE00000000000000000000000000000000000C6
+:104AF00000000000000000000000000000000000B6
+:104B000000000000000000000000000000000000A5
+:104B10000000000000000000000000000000000095
+:104B20000000000000000000000000000000000085
+:104B30000000000000000000000000000000000075
+:104B40000000000000000000000000000000000065
+:104B50000000000000000000000000000000000055
+:104B60000000000000000000000000000000000045
+:104B70000000000000000000000000000000000035
+:104B80000000000000000000000000000000000025
+:104B90000000000000000000000000000000000015
+:104BA0000000000000000000000000000000000203
+:104BB00002020202020202020202020202020000D9
+:104BC00000000101010101010101010101010100D8
+:104BD00000000000000000000000000000000000D5
+:104BE00000000000000000000000000000000000C5
+:104BF00000000000000000000000000000000000B5
+:104C000000000000000000000000000000000000A4
+:104C10000000000000000000000000000000000094
+:104C20000000000000000000000000000000000084
+:104C30000000000000000000000000000000000074
+:104C40000000000000000000000000000000000064
+:104C50000000000000000000000000000000000054
+:104C60000000000000000000000000000000000044
+:104C70000000000000000000000000000000000034
+:104C80000000000000000000000000000000000024
+:104C90000000000000000000000000000000000014
+:104CA0000000000000000000000000000000000202
+:104CB00002020202020202020202020202020000D8
+:104CC00000010101010101010101010101010100D6
+:104CD00000000000000000000000000000000000D4
+:104CE00000000000000000000000000000000000C4
+:104CF00000000000000000000000000000000000B4
+:104D000000000000000000000000000000000000A3
+:104D10000000000000000000000000000000000093
+:104D20000000000000000000000000000000000083
+:104D30000000000000000000000000000000000073
+:104D40000000000000000000000000000000000063
+:104D50000000000000000000000000000000000053
+:104D60000000000000000000000000000000000043
+:104D70000000000000000000000000000000000033
+:104D80000000000000000000000000000000000023
+:104D90000000000000000000000000000000000013
+:104DA0000000000000000000000000000000000201
+:104DB00002020202020202020202020202020000D7
+:104DC00000010101010101010101010101010100D5
+:104DD00000000000000000000000000000000000D3
+:104DE00000000000000000000000000000000000C3
+:104DF00000000000000000000000000000000000B3
+:104E000000000000000000000000000000000000A2
+:104E10000000000000000000000000000000000092
+:104E20000000000000000000000000000000000082
+:104E30000000000000000000000000000000000072
+:104E40000000000000000000000000000000000062
+:104E50000000000000000000000000000000000052
+:104E60000000000000000000000000000000000042
+:104E70000000000000000000000000000000000032
+:104E80000000000000000000000000000000000022
+:104E90000000000000000000000000000000000012
+:104EA0000000000000000000000000000000000200
+:104EB00002020202020202020202020202020000D6
+:104EC00000000000000000000000000000000000E2
+:104ED00000000000000000000000000000000000D2
+:104EE00000000000000000000000000000000000C2
+:104EF00000000000000000000000000000000000B2
+:104F000000000000000000000000000000000000A1
+:104F10000000000000000000000000000000000091
+:104F20000000000000000000000000000000000081
+:104F30000000000000000000000000000000000071
+:104F40000000000000000000000000000000000061
+:104F50000000000000000000000000000000000051
+:104F60000000000000000000000000000000000041
+:104F70000000000000000000000000000000000031
+:104F80000000000000000000000000000000000021
+:104F90000000000000000000000000000000000011
+:104FA0000000000000000000000000000000000001
+:104FB00000000000000000000000000000000017DA
+:104FC00000000000000000000000000000000000E1
+:104FD00000000000000001000000000000000000D0
+:104FE00000000000000000000000000000000000C1
+:104FF00000000000000000000000000000000000B1
+:1050000000000000000000000000000000000000A0
+:105010000000000000000000000000000000000090
+:105020000000000000000000000000000000000080
+:105030000000000000000000000000000000000070
+:105040000000000000000000000000000000000060
+:105050000000000000000000000000000000000050
+:105060000000000000000000000000000000000040
+:105070000000000000000000000000000000000030
+:105080000000000000000000000000000000000020
+:105090000000000000000000000000000000000010
+:1050A0000000000000000000000000000000000000
+:1050B00000000000000000020000000000000000EE
+:1050C00000000000000000000000000000000000E0
+:1050D00000000000000001000000000000000000CF
+:1050E00000000000000000000000000000000000C0
+:1050F00000000000000000000000000000000000B0
+:10510000000000000000000000000000000000009F
+:10511000000000000000000000000000000000008F
+:10512000000000000000000000000000000000007F
+:10513000000000000000000000000000000000006F
+:10514000000000000000000000000000000000005F
+:10515000000000000000000000000000000000004F
+:10516000000000000000000000000000000000003F
+:10517000000000000000000000000000000000002F
+:10518000000000000000000000000000000000001F
+:10519000000000000000000000000000000000000F
+:1051A00000000000000000000000000000000000FF
+:1051B00000000000000000020001000000000000EC
+:1051C00000000000000000000000000000000000DF
+:1051D00000000000000101000000000000000000CD
+:1051E00000000000000000000000000000000000BF
+:1051F00000000000000000000000000000000000AF
+:10520000000000000000000000000000000000009E
+:10521000000000000000000000000000000000008E
+:10522000000000000000000000000000000000007E
+:10523000000000000000000000000000000000006E
+:10524000000000000000000000000000000000005E
+:10525000000000000000000000000000000000004E
+:10526000000000000000000000000000000000003E
+:10527000000000000000000000000000000000002E
+:10528000000000000000000000000000000000001E
+:10529000000000000000000000000000000000000E
+:1052A00000000000000000000000000000000000FE
+:1052B00000000000000000020201000000000000E9
+:1052C00000000000000000000000000000000000DE
+:1052D00000000000010101000000000000000000CB
+:1052E00000000000000000000000000000000000BE
+:1052F00000000000000000000000000000000000AE
+:10530000000000000000000000000000000000009D
+:10531000000000000000000000000000000000008D
+:10532000000000000000000000000000000000007D
+:10533000000000000000000000000000000000006D
+:10534000000000000000000000000000000000005D
+:10535000000000000000000000000000000000004D
+:10536000000000000000000000000000000000003D
+:10537000000000000000000000000000000000002D
+:10538000000000000000000000000000000000001D
+:10539000000000000000000000000000000000000D
+:1053A00000000000000000000000000000000000FD
+:1053B00000000000000000020202000000000000E7
+:1053C00000000000000000000000000000000000DD
+:1053D00000000000010101000000000000000000CA
+:1053E00000000000000000000000000000000000BD
+:1053F00000000000000000000000000000000000AD
+:10540000000000000000000000000000000000009C
+:10541000000000000000000000000000000000008C
+:10542000000000000000000000000000000000007C
+:10543000000000000000000000000000000000006C
+:10544000000000000000000000000000000000005C
+:10545000000000000000000000000000000000004C
+:10546000000000000000000000000000000000003C
+:10547000000000000000000000000000000000002C
+:10548000000000000000000000000000000000001C
+:10549000000000000000000000000000000000000C
+:1054A00000000000000000000000000000000000FC
+:1054B00000000000000000020202000000000000E6
+:1054C00000000000000000000000000000000000DC
+:1054D00000000000010101000000000000000000C9
+:1054E00000000000000000000000000000000000BC
+:1054F00000000000000000000000000000000000AC
+:10550000000000000000000000000000000000009B
+:10551000000000000000000000000000000000008B
+:10552000000000000000000000000000000000007B
+:10553000000000000000000000000000000000006B
+:10554000000000000000000000000000000000005B
+:10555000000000000000000000000000000000004B
+:10556000000000000000000000000000000000003B
+:10557000000000000000000000000000000000002B
+:10558000000000000000000000000000000000001B
+:10559000000000000000000000000000000000000B
+:1055A00000000000000000000000000000000000FB
+:1055B00000000000000000020202020100000001E1
+:1055C00000000000000000000000000000000000DB
+:1055D00000000001010101000000000000000000C7
+:1055E00000000000000000000000000000000000BB
+:1055F00000000000000000000000000000000000AB
+:10560000000000000000000000000000000000009A
+:10561000000000000000000000000000000000008A
+:10562000000000000000000000000000000000007A
+:10563000000000000000000000000000000000006A
+:10564000000000000000000000000000000000005A
+:10565000000000000000000000000000000000004A
+:10566000000000000000000000000000000000003A
+:10567000000000000000000000000000000000002A
+:10568000000000000000000000000000000000001A
+:10569000000000000000000000000000000000000A
+:1056A00000000000000000000000000000000000FA
+:1056B00000000000000000020202020200000001DF
+:1056C00000000000000000000000000000000000DA
+:1056D00000000101010101000000000000000000C5
+:1056E00000000000000000000000000000000000BA
+:1056F00000000000000000000000000000000000AA
+:105700000000000000000000000000000000000099
+:105710000000000000000000000000000000000089
+:105720000000000000000000000000000000000079
+:105730000000000000000000000000000000000069
+:105740000000000000000000000000000000000059
+:105750000000000000000000000000000000000049
+:105760000000000000000000000000000000000039
+:105770000000000000000000000000000000000029
+:105780000000000000000000000000000000000019
+:105790000000000000000000000000000000000009
+:1057A00000000000000000000000000000000000F9
+:1057B00000000000000000020202020201010101DB
+:1057C00000000000010000000000000000000000D8
+:1057D00000010101010101000000000000000000C3
+:1057E00000000000000000000000000000000000B9
+:1057F00000000000000000000000000000000000A9
+:105800000000000000000000000000000000000098
+:105810000000000000000000000000000000000088
+:105820000000000000000000000000000000000078
+:105830000000000000000000000000000000000068
+:105840000000000000000000000000000000000058
+:105850000000000000000000000000000000000048
+:105860000000000000000000000000000000000038
+:105870000000000000000000000000000000000028
+:105880000000000000000000000000000000000018
+:105890000000000000000000000000000000000008
+:1058A00000000000000000000000000000000000F8
+:1058B00000000000000000020202020202010101D9
+:1058C00000000000010000000000000000000001D6
+:1058D00001010101010101000000000000000000C1
+:1058E00000000000000000000000000000000000B8
+:1058F00000000000000000000000000000000000A8
+:105900000000000000000000000000000000000097
+:105910000000000000000000000000000000000087
+:105920000000000000000000000000000000000077
+:105930000000000000000000000000000000000067
+:105940000000000000000000000000000000000057
+:105950000000000000000000000000000000000047
+:105960000000000000000000000000000000000037
+:105970000000000000000000000000000000000027
+:105980000000000000000000000000000000000017
+:105990000000000000000000000000000000000007
+:1059A00000000000000000000000000000000000F7
+:1059B00000000000000000020202020202020202D5
+:1059C00001000100010000000000000000000001D3
+:1059D00001010101010101000000000000000000C0
+:1059E00000000000000000000000000000000000B7
+:1059F00000000000000000000000000000000000A7
+:105A00000000000000000000000000000000000096
+:105A10000000000000000000000000000000000086
+:105A20000000000000000000000000000000000076
+:105A30000000000000000000000000000000000066
+:105A40000000000000000000000000000000000056
+:105A50000000000000000000000000000000000046
+:105A60000000000000000000000000000000000036
+:105A70000000000000000000000000000000000026
+:105A80000000000000000000000000000000000016
+:105A90000000000000000000000000000000000006
+:105AA00000000000000000000000000000000000F6
+:105AB00000000000000000020202020202020202D4
+:105AC00001010100010100000000000000010101CE
+:105AD00001010101010101000000000000000000BF
+:105AE00000000000000000000000000000000000B6
+:105AF00000000000000000000000000000000000A6
+:105B00000000000000000000000000000000000095
+:105B10000000000000000000000000000000000085
+:105B20000000000000000000000000000000000075
+:105B30000000000000000000000000000000000065
+:105B40000000000000000000000000000000000055
+:105B50000000000000000000000000000000000045
+:105B60000000000000000000000000000000000035
+:105B70000000000000000000000000000000000025
+:105B80000000000000000000000000000000000015
+:105B90000000000000000000000000000000000005
+:105BA00000000000000000000000000000000000F5
+:105BB00000000000000000020202020202020202D3
+:105BC00002010100010100000000000000010101CC
+:105BD00001010101010101000000000000000000BE
+:105BE00000000000000000000000000000000000B5
+:105BF00000000000000000000000000000000000A5
+:105C00000000000000000000000000000000000094
+:105C10000000000000000000000000000000000084
+:105C20000000000000000000000000000000000074
+:105C30000000000000000000000000000000000064
+:105C40000000000000000000000000000000000054
+:105C50000000000000000000000000000000000044
+:105C60000000000000000000000000000000000034
+:105C70000000000000000000000000000000000024
+:105C80000000000000000000000000000000000014
+:105C90000000000000000000000000000000000004
+:105CA00000000000000000000000000000000000F4
+:105CB00000000000000000020202020202020202D2
+:105CC00002020201010100000000000001010101C7
+:105CD00001010101010101000000000000000000BD
+:105CE00000000000000000000000000000000000B4
+:105CF00000000000000000000000000000000000A4
+:105D00000000000000000000000000000000000093
+:105D10000000000000000000000000000000000083
+:105D20000000000000000000000000000000000073
+:105D30000000000000000000000000000000000063
+:105D40000000000000000000000000000000000053
+:105D50000000000000000000000000000000000043
+:105D60000000000000000000000000000000000033
+:105D70000000000000000000000000000000000023
+:105D80000000000000000000000000000000000013
+:105D90000000000000000000000000000000000003
+:105DA00000000000000000000000000000000000F3
+:105DB00000000000000000020202020202020202D1
+:105DC00002020201020100000000000001010101C5
+:105DD00001010101010101000000000000000000BC
+:105DE00000000000000000000000000000000000B3
+:105DF00000000000000000000000000000000000A3
+:105E00000000000000000000000000000000000092
+:105E10000000000000000000000000000000000082
+:105E20000000000000000000000000000000000072
+:105E30000000000000000000000000000000000062
+:105E40000000000000000000000000000000000052
+:105E50000000000000000000000000000000000042
+:105E60000000000000000000000000000000000032
+:105E70000000000000000000000000000000000022
+:105E80000000000000000000000000000000000012
+:105E90000000000000000000000000000000000002
+:105EA00000000000000000000000000000000000F2
+:105EB00000000000000000020202020202020202D0
+:105EC00002020202020100000000000101010101C2
+:105ED00001010101010101000000000000000000BB
+:105EE00000000000000000000000000000000000B2
+:105EF00000000000000000000000000000000000A2
+:105F00000000000000000000000000000000000091
+:105F10000000000000000000000000000000000081
+:105F20000000000000000000000000000000000071
+:105F30000000000000000000000000000000000061
+:105F40000000000000000000000000000000000051
+:105F50000000000000000000000000000000000041
+:105F60000000000000000000000000000000000031
+:105F70000000000000000000000000000000000021
+:105F80000000000000000000000000000000000011
+:105F90000000000000000000000000000000000001
+:105FA00000000000000000000000000000000000F1
+:105FB00000000000000000020202020202020202CF
+:105FC00002020202020200000000000101010101C0
+:105FD00001010101010101000000000000000000BA
+:105FE00000000000000000000000000000000000B1
+:105FF00000000000000000000000000000000000A1
+:106000000000000000000000000000000000000090
+:106010000000000000000000000000000000000080
+:106020000000000000000000000000000000000070
+:106030000000000000000000000000000000000060
+:106040000000000000000000000000000000000050
+:106050000000000000000000000000000000000040
+:106060000000000000000000000000000000000030
+:106070000000000000000000000000000000000020
+:106080000000000000000000000000000000000010
+:106090000000000000000000000000000000000000
+:1060A00000000000000000000000000000000000F0
+:1060B00000000000000000020202020202020202CE
+:1060C00002020202020200000001010101010101BD
+:1060D00001010101010101000000000000000000B9
+:1060E00000000000000000000000000000000000B0
+:1060F00000000000000000000000000000000000A0
+:10610000000000000000000000000000000000008F
+:10611000000000000000000000000000000000007F
+:10612000000000000000000000000000000000006F
+:10613000000000000000000000000000000000005F
+:10614000000000000000000000000000000000004F
+:10615000000000000000000000000000000000003F
+:10616000000000000000000000000000000000002F
+:10617000000000000000000000000000000000001F
+:10618000000000000000000000000000000000000F
+:1061900000000000000000000000000000000000FF
+:1061A00000000000000000000000000000000000EF
+:1061B00000000000000000020202020202020202CD
+:1061C00002020202020200000001010101010101BC
+:1061D00001010101010101000000000000000000B8
+:1061E00000000000000000000000000000000000AF
+:1061F000000000000000000000000000000000009F
+:10620000000000000000000000000000000000008E
+:10621000000000000000000000000000000000007E
+:10622000000000000000000000000000000000006E
+:10623000000000000000000000000000000000005E
+:10624000000000000000000000000000000000004E
+:10625000000000000000000000000000000000003E
+:10626000000000000000000000000000000000002E
+:10627000000000000000000000000000000000001E
+:10628000000000000000000000000000000000000E
+:1062900000000000000000000000000000000000FE
+:1062A00000000000000000000000000000000000EE
+:1062B00000000000000000020202020202020202CC
+:1062C00002020202020200000001010101010101BB
+:1062D00001010101010101000000000000000000B7
+:1062E00000000000000000000000000000000000AE
+:1062F000000000000000000000000000000000009E
+:10630000000000000000000000000000000000008D
+:10631000000000000000000000000000000000007D
+:10632000000000000000000000000000000000006D
+:10633000000000000000000000000000000000005D
+:10634000000000000000000000000000000000004D
+:10635000000000000000000000000000000000003D
+:10636000000000000000000000000000000000002D
+:10637000000000000000000000000000000000001D
+:10638000000000000000000000000000000000000D
+:1063900000000000000000000000000000000000FD
+:1063A00000000000000000000000000000000000ED
+:1063B00000000000000000020202020202020202CB
+:1063C00002020202020200000101010101010101B9
+:1063D00001010101010101000000000000000000B6
+:1063E00000000000000000000000000000000000AD
+:1063F000000000000000000000000000000000009D
+:10640000000000000000000000000000000000008C
+:10641000000000000000000000000000000000007C
+:10642000000000000000000000000000000000006C
+:10643000000000000000000000000000000000005C
+:10644000000000000000000000000000000000004C
+:10645000000000000000000000000000000000003C
+:10646000000000000000000000000000000000002C
+:10647000000000000000000000000000000000001C
+:10648000000000000000000000000000000000000C
+:1064900000000000000000000000000000000000FC
+:1064A00000000000000000000000000000000000EC
+:1064B00000000000000000020202020202020202CA
+:1064C00002020202020200000101010101010101B8
+:1064D00001010101010101000000000000000000B5
+:1064E00000000000000000000000000000000000AC
+:1064F000000000000000000000000000000000009C
+:10650000000000000000000000000000000000008B
+:10651000000000000000000000000000000000007B
+:10652000000000000000000000000000000000006B
+:10653000000000000000000000000000000000005B
+:10654000000000000000000000000000000000004B
+:10655000000000000000000000000000000000003B
+:10656000000000000000000000000000000000002B
+:10657000000000000000000000000000000000001B
+:10658000000000000000000000000000000000000B
+:1065900000000000000000000000000000000000FB
+:1065A00000000000000000000000000000000000EB
+:1065B00000000000000000020202020202020202C9
+:1065C00002020202020200000000000000000000BF
+:1065D00000000000000000000000000000000000BB
+:1065E00000000000000000000000000000000000AB
+:1065F000000000000000000000000000000000009B
+:10660000000000000000000000000000000000008A
+:10661000000000000000000000000000000000007A
+:10662000000000000000000000000000000000006A
+:10663000000000000000000000000000000000005A
+:10664000000000000000000000000000000000004A
+:10665000000000000000000000000000000000003A
+:10666000000000000000000000000000000000002A
+:10667000000000000000000000000000000000001A
+:10668000000000000000000000000000000000000A
+:1066900000000000000000000000000000000000FA
+:1066A00000000000000000000000000000000000EA
+:1066B00000000000000000000000000000000000DA
+:1066C00000000000000000170000000000000000B3
+:1066D00000000000000000000000000000000100B9
+:1066E00000000000000000000000000000000000AA
+:1066F000000000000000000000000000000000009A
+:106700000000000000000000000000000000000089
+:106710000000000000000000000000000000000079
+:106720000000000000000000000000000000000069
+:106730000000000000000000000000000000000059
+:106740000000000000000000000000000000000049
+:106750000000000000000000000000000000000039
+:106760000000000000000000000000000000000029
+:106770000000000000000000000000000000000019
+:106780000000000000000000000000000000000009
+:1067900000000000000000000000000000000000F9
+:1067A00000000000000000000000000000000000E9
+:1067B00000000000000000000000000000000002D7
+:1067C00000000000000000000000000000000000C9
+:1067D00000000000000000000000000000000100B8
+:1067E00000000000000000000000000000000000A9
+:1067F0000000000000000000000000000000000099
+:106800000000000000000000000000000000000088
+:106810000000000000000000000000000000000078
+:106820000000000000000000000000000000000068
+:106830000000000000000000000000000000000058
+:106840000000000000000000000000000000000048
+:106850000000000000000000000000000000000038
+:106860000000000000000000000000000000000028
+:106870000000000000000000000000000000000018
+:106880000000000000000000000000000000000008
+:1068900000000000000000000000000000000000F8
+:1068A00000000000000000000000000000000000E8
+:1068B00000000000000000000000000000000002D6
+:1068C00001010000000000000000000000000000C6
+:1068D00000000000000000000000000000010100B6
+:1068E00000000000000000000000000000000000A8
+:1068F0000000000000000000000000000000000098
+:106900000000000000000000000000000000000087
+:106910000000000000000000000000000000000077
+:106920000000000000000000000000000000000067
+:106930000000000000000000000000000000000057
+:106940000000000000000000000000000000000047
+:106950000000000000000000000000000000000037
+:106960000000000000000000000000000000000027
+:106970000000000000000000000000000000000017
+:106980000000000000000000000000000000000007
+:1069900000000000000000000000000000000000F7
+:1069A00000000000000000000000000000000000E7
+:1069B00000000000000000000000000000000002D5
+:1069C00001010000000000000000000000000000C5
+:1069D00000000000000000000000000000010100B5
+:1069E00000000000000000000000000000000000A7
+:1069F0000000000000000000000000000000000097
+:106A00000000000000000000000000000000000086
+:106A10000000000000000000000000000000000076
+:106A20000000000000000000000000000000000066
+:106A30000000000000000000000000000000000056
+:106A40000000000000000000000000000000000046
+:106A50000000000000000000000000000000000036
+:106A60000000000000000000000000000000000026
+:106A70000000000000000000000000000000000016
+:106A80000000000000000000000000000000000006
+:106A900000000000000000000000000000000000F6
+:106AA00000000000000000000000000000000000E6
+:106AB00000000000000000000000000000000002D4
+:106AC00002020000000000000000000000000000C2
+:106AD00000000000000000000000000001010100B3
+:106AE00000000000000000000000000000000000A6
+:106AF0000000000000000000000000000000000096
+:106B00000000000000000000000000000000000085
+:106B10000000000000000000000000000000000075
+:106B20000000000000000000000000000000000065
+:106B30000000000000000000000000000000000055
+:106B40000000000000000000000000000000000045
+:106B50000000000000000000000000000000000035
+:106B60000000000000000000000000000000000025
+:106B70000000000000000000000000000000000015
+:106B80000000000000000000000000000000000005
+:106B900000000000000000000000000000000000F5
+:106BA00000000000000000000000000000000000E5
+:106BB00000000000000000000000000000000002D3
+:106BC00002020000000000000000000000000000C1
+:106BD00000000000000000000000000101010100B1
+:106BE00000000000000000000000000000000000A5
+:106BF0000000000000000000000000000000000095
+:106C00000000000000000000000000000000000084
+:106C10000000000000000000000000000000000074
+:106C20000000000000000000000000000000000064
+:106C30000000000000000000000000000000000054
+:106C40000000000000000000000000000000000044
+:106C50000000000000000000000000000000000034
+:106C60000000000000000000000000000000000024
+:106C70000000000000000000000000000000000014
+:106C80000000000000000000000000000000000004
+:106C900000000000000000000000000000000000F4
+:106CA00000000000000000000000000000000000E4
+:106CB00000000000000000000000000000000002D2
+:106CC00002020200010000000000000000000000BD
+:106CD00000000000000000000000010101010100AF
+:106CE00000000000000000000000000000000000A4
+:106CF0000000000000000000000000000000000094
+:106D00000000000000000000000000000000000083
+:106D10000000000000000000000000000000000073
+:106D20000000000000000000000000000000000063
+:106D30000000000000000000000000000000000053
+:106D40000000000000000000000000000000000043
+:106D50000000000000000000000000000000000033
+:106D60000000000000000000000000000000000023
+:106D70000000000000000000000000000000000013
+:106D80000000000000000000000000000000000003
+:106D900000000000000000000000000000000000F3
+:106DA00000000000000000000000000000000000E3
+:106DB00000000000000000000000000000000002D1
+:106DC00002020200010000000000000000000000BC
+:106DD00000000000000000000101010101010100AC
+:106DE00000000000000000000000000000000000A3
+:106DF0000000000000000000000000000000000093
+:106E00000000000000000000000000000000000082
+:106E10000000000000000000000000000000000072
+:106E20000000000000000000000000000000000062
+:106E30000000000000000000000000000000000052
+:106E40000000000000000000000000000000000042
+:106E50000000000000000000000000000000000032
+:106E60000000000000000000000000000000000022
+:106E70000000000000000000000000000000000012
+:106E80000000000000000000000000000000000002
+:106E900000000000000000000000000000000000F2
+:106EA00000000000000000000000000000000000E2
+:106EB00000000000000000000000000000000002D0
+:106EC00002020202010100000100000000000000B7
+:106ED00000000000000000000101010101010100AB
+:106EE00000000000000000000000000000000000A2
+:106EF0000000000000000000000000000000000092
+:106F00000000000000000000000000000000000081
+:106F10000000000000000000000000000000000071
+:106F20000000000000000000000000000000000061
+:106F30000000000000000000000000000000000051
+:106F40000000000000000000000000000000000041
+:106F50000000000000000000000000000000000031
+:106F60000000000000000000000000000000000021
+:106F70000000000000000000000000000000000011
+:106F80000000000000000000000000000000000001
+:106F900000000000000000000000000000000000F1
+:106FA00000000000000000000000000000000000E1
+:106FB00000000000000000000000000000000002CF
+:106FC00002020202020101000100000000000000B4
+:106FD00000000000000000010101010101010100A9
+:106FE00000000000000000000000000000000000A1
+:106FF0000000000000000000000000000000000091
+:107000000000000000000000000000000000000080
+:107010000000000000000000000000000000000070
+:107020000000000000000000000000000000000060
+:107030000000000000000000000000000000000050
+:107040000000000000000000000000000000000040
+:107050000000000000000000000000000000000030
+:107060000000000000000000000000000000000020
+:107070000000000000000000000000000000000010
+:107080000000000000000000000000000000000000
+:1070900000000000000000000000000000000000F0
+:1070A00000000000000000000000000000000000E0
+:1070B00000000000000000000000000000000002CE
+:1070C00002020202020201000100000000000000B2
+:1070D00000000000000001010101010101010100A7
+:1070E00000000000000000000000000000000000A0
+:1070F0000000000000000000000000000000000090
+:10710000000000000000000000000000000000007F
+:10711000000000000000000000000000000000006F
+:10712000000000000000000000000000000000005F
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000003F
+:10715000000000000000000000000000000000002F
+:10716000000000000000000000000000000000001F
+:10717000000000000000000000000000000000000F
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000000EF
+:1071A00000000000000000000000000000000000DF
+:1071B00000000000000000000000000000000002CD
+:1071C00002020202020202000100010000010000AE
+:1071D00000000000010101010101010101010100A4
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000008F
+:10720000000000000000000000000000000000007E
+:10721000000000000000000000000000000000006E
+:10722000000000000000000000000000000000005E
+:10723000000000000000000000000000000000004E
+:10724000000000000000000000000000000000003E
+:10725000000000000000000000000000000000002E
+:10726000000000000000000000000000000000001E
+:10727000000000000000000000000000000000000E
+:1072800000000000000000000000000000000000FE
+:1072900000000000000000000000000000000000EE
+:1072A00000000000000000000000000000000000DE
+:1072B00000000000000000000000000000000002CC
+:1072C00002020202020202010201010100010000A9
+:1072D00000000000010101010101010101010100A3
+:1072E000000000000000000000000000000000009E
+:1072F000000000000000000000000000000000008E
+:10730000000000000000000000000000000000007D
+:10731000000000000000000000000000000000006D
+:10732000000000000000000000000000000000005D
+:10733000000000000000000000000000000000004D
+:10734000000000000000000000000000000000003D
+:10735000000000000000000000000000000000002D
+:10736000000000000000000000000000000000001D
+:10737000000000000000000000000000000000000D
+:1073800000000000000000000000000000000000FD
+:1073900000000000000000000000000000000000ED
+:1073A00000000000000000000000000000000000DD
+:1073B00000000000000000000000000000000002CB
+:1073C00002020202020202020201010100010000A7
+:1073D00000000000010101010101010101010100A2
+:1073E000000000000000000000000000000000009D
+:1073F000000000000000000000000000000000008D
+:10740000000000000000000000000000000000007C
+:10741000000000000000000000000000000000006C
+:10742000000000000000000000000000000000005C
+:10743000000000000000000000000000000000004C
+:10744000000000000000000000000000000000003C
+:10745000000000000000000000000000000000002C
+:10746000000000000000000000000000000000001C
+:10747000000000000000000000000000000000000C
+:1074800000000000000000000000000000000000FC
+:1074900000000000000000000000000000000000EC
+:1074A00000000000000000000000000000000000DC
+:1074B00000000000000000000000000000000002CA
+:1074C00002020202020202020202020100010000A4
+:1074D00000000000010101010101010101010100A1
+:1074E000000000000000000000000000000000009C
+:1074F000000000000000000000000000000000008C
+:10750000000000000000000000000000000000007B
+:10751000000000000000000000000000000000006B
+:10752000000000000000000000000000000000005B
+:10753000000000000000000000000000000000004B
+:10754000000000000000000000000000000000003B
+:10755000000000000000000000000000000000002B
+:10756000000000000000000000000000000000001B
+:10757000000000000000000000000000000000000B
+:1075800000000000000000000000000000000000FB
+:1075900000000000000000000000000000000000EB
+:1075A00000000000000000000000000000000000DB
+:1075B00000000000000000000000000000000002C9
+:1075C00002020202020202020202020201010000A1
+:1075D000000000010101010101010101010101009F
+:1075E000000000000000000000000000000000009B
+:1075F000000000000000000000000000000000008B
+:10760000000000000000000000000000000000007A
+:10761000000000000000000000000000000000006A
+:10762000000000000000000000000000000000005A
+:10763000000000000000000000000000000000004A
+:10764000000000000000000000000000000000003A
+:10765000000000000000000000000000000000002A
+:10766000000000000000000000000000000000001A
+:10767000000000000000000000000000000000000A
+:1076800000000000000000000000000000000000FA
+:1076900000000000000000000000000000000000EA
+:1076A00000000000000000000000000000000000DA
+:1076B00000000000000000000000000000000002C8
+:1076C000020202020202020202020202010200009F
+:1076D000000000010101010101010101010101009E
+:1076E000000000000000000000000000000000009A
+:1076F000000000000000000000000000000000008A
+:107700000000000000000000000000000000000079
+:107710000000000000000000000000000000000069
+:107720000000000000000000000000000000000059
+:107730000000000000000000000000000000000049
+:107740000000000000000000000000000000000039
+:107750000000000000000000000000000000000029
+:107760000000000000000000000000000000000019
+:107770000000000000000000000000000000000009
+:1077800000000000000000000000000000000000F9
+:1077900000000000000000000000000000000000E9
+:1077A00000000000000000000000000000000000D9
+:1077B00000000000000000000000000000000002C7
+:1077C000020202020202020202020202020200009D
+:1077D000010101010101010101010101010101009A
+:1077E0000000000000000000000000000000000099
+:1077F0000000000000000000000000000000000089
+:107800000000000000000000000000000000000078
+:107810000000000000000000000000000000000068
+:107820000000000000000000000000000000000058
+:107830000000000000000000000000000000000048
+:107840000000000000000000000000000000000038
+:107850000000000000000000000000000000000028
+:107860000000000000000000000000000000000018
+:107870000000000000000000000000000000000008
+:1078800000000000000000000000000000000000F8
+:1078900000000000000000000000000000000000E8
+:1078A00000000000000000000000000000000000D8
+:1078B00000000000000000000000000000000002C6
+:1078C000020202020202020202020202020200009C
+:1078D0000101010101010101010101010101010099
+:1078E0000000000000000000000000000000000098
+:1078F0000000000000000000000000000000000088
+:107900000000000000000000000000000000000077
+:107910000000000000000000000000000000000067
+:107920000000000000000000000000000000000057
+:107930000000000000000000000000000000000047
+:107940000000000000000000000000000000000037
+:107950000000000000000000000000000000000027
+:107960000000000000000000000000000000000017
+:107970000000000000000000000000000000000007
+:1079800000000000000000000000000000000000F7
+:1079900000000000000000000000000000000000E7
+:1079A00000000000000000000000000000000000D7
+:1079B00000000000000000000000000000000002C5
+:1079C000020202020202020202020202020200009B
+:1079D0000101010101010101010101010101010098
+:1079E0000000000000000000000000000000000097
+:1079F0000000000000000000000000000000000087
+:107A00000000000000000000000000000000000076
+:107A10000000000000000000000000000000000066
+:107A20000000000000000000000000000000000056
+:107A30000000000000000000000000000000000046
+:107A40000000000000000000000000000000000036
+:107A50000000000000000000000000000000000026
+:107A60000000000000000000000000000000000016
+:107A70000000000000000000000000000000000006
+:107A800000000000000000000000000000000000F6
+:107A900000000000000000000000000000000000E6
+:107AA00000000000000000000000000000000000D6
+:107AB00000000000000000000000000000000002C4
+:107AC000020202020202020202020202020200009A
+:107AD0000101010101010101010101010101010097
+:107AE0000000000000000000000000000000000096
+:107AF0000000000000000000000000000000000086
+:107B00000000000000000000000000000000000075
+:107B10000000000000000000000000000000000065
+:107B20000000000000000000000000000000000055
+:107B30000000000000000000000000000000000045
+:107B40000000000000000000000000000000000035
+:107B50000000000000000000000000000000000025
+:107B60000000000000000000000000000000000015
+:107B70000000000000000000000000000000000005
+:107B800000000000000000000000000000000000F5
+:107B900000000000000000000000000000000000E5
+:107BA00000000000000000000000000000000000D5
+:107BB00000000000000000000000000000000002C3
+:107BC0000202020202020202020202020202000099
+:107BD0000101010101010101010101010101010096
+:107BE0000000000000000000000000000000000095
+:107BF0000000000000000000000000000000000085
+:107C00000000000000000000000000000000000074
+:107C10000000000000000000000000000000000064
+:107C20000000000000000000000000000000000054
+:107C30000000000000000000000000000000000044
+:107C40000000000000000000000000000000000034
+:107C50000000000000000000000000000000000024
+:107C60000000000000000000000000000000000014
+:107C70000000000000000000000000000000000004
+:107C800000000000000000000000000000000000F4
+:107C900000000000000000000000000000000000E4
+:107CA00000000000000000000000000000000000D4
+:107CB00000000000000000000000000000000002C2
+:107CC0000202020202020202020202020202000098
+:107CD00000000000000000000000000000000000A4
+:107CE0000000000000000000000000000000000094
+:107CF0000000000000000000000000000000000084
+:107D00000000000000000000000000000000000073
+:107D10000000000000000000000000000000000063
+:107D20000000000000000000000000000000000053
+:107D30000000000000000000000000000000000043
+:107D40000000000000000000000000000000000033
+:107D50000000000000000000000000000000000023
+:107D60000000000000000000000000000000000013
+:107D70000000000000000000000000000000000003
+:107D800000000000000000000000000000000000F3
+:107D900000000000000000000000000000000000E3
+:107DA00000000000000000000000000000000000D3
+:107DB00000000000000000000000000000000000C3
+:107DC000000000000000000000000000000000159E
+:107DD00000000000000000000000000000000000A3
+:107DE0000000000000000100000000000000000092
+:107DF0000000000000000000000000000000000083
+:107E00000000000000000000000000000000000072
+:107E10000000000000000000000000000000000062
+:107E20000000000000000000000000000000000052
+:107E30000000000000000000000000000000000042
+:107E40000000000000000000000000000000000032
+:107E50000000000000000000000000000000000022
+:107E60000000000000000000000000000000000012
+:107E70000000000000000000000000000000000002
+:107E800000000000000000000000000000000000F2
+:107E900000000000000000000000000000000000E2
+:107EA00000000000000000000000000000000000D2
+:107EB00000000000000000000000000000000000C2
+:107EC00000000000000000020000000000000000B0
+:107ED00000000000000000000000000000000000A2
+:107EE000000000000101010000000000000000008F
+:107EF0000000000000000000000000000000000082
+:107F00000000000000000000000000000000000071
+:107F10000000000000000000000000000000000061
+:107F20000000000000000000000000000000000051
+:107F30000000000000000000000000000000000041
+:107F40000000000000000000000000000000000031
+:107F50000000000000000000000000000000000021
+:107F60000000000000000000000000000000000011
+:107F70000000000000000000000000000000000001
+:107F800000000000000000000000000000000000F1
+:107F900000000000000000000000000000000000E1
+:107FA00000000000000000000000000000000000D1
+:107FB00000000000000000000000000000000000C1
+:107FC00000000000000000020100000000000000AE
+:107FD00000000000000000000000000000000000A1
+:107FE000000000010101010000000000000000008D
+:107FF0000000000000000000000000000000000081
+:108000000000000000000000000000000000000070
+:108010000000000000000000000000000000000060
+:108020000000000000000000000000000000000050
+:108030000000000000000000000000000000000040
+:108040000000000000000000000000000000000030
+:108050000000000000000000000000000000000020
+:108060000000000000000000000000000000000010
+:108070000000000000000000000000000000000000
+:1080800000000000000000000000000000000000F0
+:1080900000000000000000000000000000000000E0
+:1080A00000000000000000000000000000000000D0
+:1080B00000000000000000000000000000000000C0
+:1080C00000000000000000020100000001000000AC
+:1080D00000000000000000000000000000000000A0
+:1080E000000000010101010000000000000000008C
+:1080F0000000000000000000000000000000000080
+:10810000000000000000000000000000000000006F
+:10811000000000000000000000000000000000005F
+:10812000000000000000000000000000000000004F
+:10813000000000000000000000000000000000003F
+:10814000000000000000000000000000000000002F
+:10815000000000000000000000000000000000001F
+:10816000000000000000000000000000000000000F
+:1081700000000000000000000000000000000000FF
+:1081800000000000000000000000000000000000EF
+:1081900000000000000000000000000000000000DF
+:1081A00000000000000000000000000000000000CF
+:1081B00000000000000000000000000000000000BF
+:1081C00000000000000000020201000001000000A9
+:1081D000000000000000000000000000000000009F
+:1081E000000001010101010000000000000000008A
+:1081F000000000000000000000000000000000007F
+:10820000000000000000000000000000000000006E
+:10821000000000000000000000000000000000005E
+:10822000000000000000000000000000000000004E
+:10823000000000000000000000000000000000003E
+:10824000000000000000000000000000000000002E
+:10825000000000000000000000000000000000001E
+:10826000000000000000000000000000000000000E
+:1082700000000000000000000000000000000000FE
+:1082800000000000000000000000000000000000EE
+:1082900000000000000000000000000000000000DE
+:1082A00000000000000000000000000000000000CE
+:1082B00000000000000000000000000000000000BE
+:1082C00000000000000000020202010101000000A5
+:1082D000000000000000000000000000000000009E
+:1082E0000101010101010100000000000000000087
+:1082F000000000000000000000000000000000007E
+:10830000000000000000000000000000000000006D
+:10831000000000000000000000000000000000005D
+:10832000000000000000000000000000000000004D
+:10833000000000000000000000000000000000003D
+:10834000000000000000000000000000000000002D
+:10835000000000000000000000000000000000001D
+:10836000000000000000000000000000000000000D
+:1083700000000000000000000000000000000000FD
+:1083800000000000000000000000000000000000ED
+:1083900000000000000000000000000000000000DD
+:1083A00000000000000000000000000000000000CD
+:1083B00000000000000000000000000000000000BD
+:1083C00000000000000000020202010101000000A4
+:1083D000000000000000000000000000000000019C
+:1083E0000101010101010100000000000000000086
+:1083F000000000000000000000000000000000007D
+:10840000000000000000000000000000000000006C
+:10841000000000000000000000000000000000005C
+:10842000000000000000000000000000000000004C
+:10843000000000000000000000000000000000003C
+:10844000000000000000000000000000000000002C
+:10845000000000000000000000000000000000001C
+:10846000000000000000000000000000000000000C
+:1084700000000000000000000000000000000000FC
+:1084800000000000000000000000000000000000EC
+:1084900000000000000000000000000000000000DC
+:1084A00000000000000000000000000000000000CC
+:1084B00000000000000000000000000000000000BC
+:1084C00000000000000000020202020101010001A0
+:1084D0000000000100000000000000000000010199
+:1084E0000101010101010100000000000000000085
+:1084F000000000000000000000000000000000007C
+:10850000000000000000000000000000000000006B
+:10851000000000000000000000000000000000005B
+:10852000000000000000000000000000000000004B
+:10853000000000000000000000000000000000003B
+:10854000000000000000000000000000000000002B
+:10855000000000000000000000000000000000001B
+:10856000000000000000000000000000000000000B
+:1085700000000000000000000000000000000000FB
+:1085800000000000000000000000000000000000EB
+:1085900000000000000000000000000000000000DB
+:1085A00000000000000000000000000000000000CB
+:1085B00000000000000000000000000000000000BB
+:1085C000000000000000000202020202020101019C
+:1085D0000100000101010000000000000101010193
+:1085E0000101010101010100000000000000000084
+:1085F000000000000000000000000000000000007B
+:10860000000000000000000000000000000000006A
+:10861000000000000000000000000000000000005A
+:10862000000000000000000000000000000000004A
+:10863000000000000000000000000000000000003A
+:10864000000000000000000000000000000000002A
+:10865000000000000000000000000000000000001A
+:10866000000000000000000000000000000000000A
+:1086700000000000000000000000000000000000FA
+:1086800000000000000000000000000000000000EA
+:1086900000000000000000000000000000000000DA
+:1086A00000000000000000000000000000000000CA
+:1086B00000000000000000000000000000000000BA
+:1086C000000000000000000202020202020101019B
+:1086D0000100010101010000000000000101010191
+:1086E0000101010101010100000000000000000083
+:1086F000000000000000000000000000000000007A
+:108700000000000000000000000000000000000069
+:108710000000000000000000000000000000000059
+:108720000000000000000000000000000000000049
+:108730000000000000000000000000000000000039
+:108740000000000000000000000000000000000029
+:108750000000000000000000000000000000000019
+:108760000000000000000000000000000000000009
+:1087700000000000000000000000000000000000F9
+:1087800000000000000000000000000000000000E9
+:1087900000000000000000000000000000000000D9
+:1087A00000000000000000000000000000000000C9
+:1087B00000000000000000000000000000000000B9
+:1087C0000000000000000002020202020202010199
+:1087D000010001010101000000000001010101018F
+:1087E0000101010101010100000000000000000082
+:1087F0000000000000000000000000000000000079
+:108800000000000000000000000000000000000068
+:108810000000000000000000000000000000000058
+:108820000000000000000000000000000000000048
+:108830000000000000000000000000000000000038
+:108840000000000000000000000000000000000028
+:108850000000000000000000000000000000000018
+:108860000000000000000000000000000000000008
+:1088700000000000000000000000000000000000F8
+:1088800000000000000000000000000000000000E8
+:1088900000000000000000000000000000000000D8
+:1088A00000000000000000000000000000000000C8
+:1088B00000000000000000000000000000000000B8
+:1088C0000000000000000002020202020202020296
+:1088D000010001010101000000000001010101018E
+:1088E0000101010101010100000000000000000081
+:1088F0000000000000000000000000000000000078
+:108900000000000000000000000000000000000067
+:108910000000000000000000000000000000000057
+:108920000000000000000000000000000000000047
+:108930000000000000000000000000000000000037
+:108940000000000000000000000000000000000027
+:108950000000000000000000000000000000000017
+:108960000000000000000000000000000000000007
+:1089700000000000000000000000000000000000F7
+:1089800000000000000000000000000000000000E7
+:1089900000000000000000000000000000000000D7
+:1089A00000000000000000000000000000000000C7
+:1089B00000000000000000000000000000000000B7
+:1089C0000000000000000002020202020202020295
+:1089D000020101010101000000000101010101018A
+:1089E0000101010101010100000000000000000080
+:1089F0000000000000000000000000000000000077
+:108A00000000000000000000000000000000000066
+:108A10000000000000000000000000000000000056
+:108A20000000000000000000000000000000000046
+:108A30000000000000000000000000000000000036
+:108A40000000000000000000000000000000000026
+:108A50000000000000000000000000000000000016
+:108A60000000000000000000000000000000000006
+:108A700000000000000000000000000000000000F6
+:108A800000000000000000000000000000000000E6
+:108A900000000000000000000000000000000000D6
+:108AA00000000000000000000000000000000000C6
+:108AB00000000000000000000000000000000000B6
+:108AC0000000000000000002020202020202020294
+:108AD0000201020201010000000001010101010187
+:108AE000010101010101010000000000000000007F
+:108AF0000000000000000000000000000000000076
+:108B00000000000000000000000000000000000065
+:108B10000000000000000000000000000000000055
+:108B20000000000000000000000000000000000045
+:108B30000000000000000000000000000000000035
+:108B40000000000000000000000000000000000025
+:108B50000000000000000000000000000000000015
+:108B60000000000000000000000000000000000005
+:108B700000000000000000000000000000000000F5
+:108B800000000000000000000000000000000000E5
+:108B900000000000000000000000000000000000D5
+:108BA00000000000000000000000000000000000C5
+:108BB00000000000000000000000000000000000B5
+:108BC0000000000000000002020202020202020293
+:108BD0000202020202020000000001010101010183
+:108BE000010101010101010000000000000000007E
+:108BF0000000000000000000000000000000000075
+:108C00000000000000000000000000000000000064
+:108C10000000000000000000000000000000000054
+:108C20000000000000000000000000000000000044
+:108C30000000000000000000000000000000000034
+:108C40000000000000000000000000000000000024
+:108C50000000000000000000000000000000000014
+:108C60000000000000000000000000000000000004
+:108C700000000000000000000000000000000000F4
+:108C800000000000000000000000000000000000E4
+:108C900000000000000000000000000000000000D4
+:108CA00000000000000000000000000000000000C4
+:108CB00000000000000000000000000000000000B4
+:108CC0000000000000000002020202020202020292
+:108CD0000202020202020000010101010101010180
+:108CE000010101010101010000000000000000007D
+:108CF0000000000000000000000000000000000074
+:108D00000000000000000000000000000000000063
+:108D10000000000000000000000000000000000053
+:108D20000000000000000000000000000000000043
+:108D30000000000000000000000000000000000033
+:108D40000000000000000000000000000000000023
+:108D50000000000000000000000000000000000013
+:108D60000000000000000000000000000000000003
+:108D700000000000000000000000000000000000F3
+:108D800000000000000000000000000000000000E3
+:108D900000000000000000000000000000000000D3
+:108DA00000000000000000000000000000000000C3
+:108DB00000000000000000000000000000000000B3
+:108DC0000000000000000002020202020202020291
+:108DD000020202020202000001010101010101017F
+:108DE000010101010101010000000000000000007C
+:108DF0000000000000000000000000000000000073
+:108E00000000000000000000000000000000000062
+:108E10000000000000000000000000000000000052
+:108E20000000000000000000000000000000000042
+:108E30000000000000000000000000000000000032
+:108E40000000000000000000000000000000000022
+:108E50000000000000000000000000000000000012
+:108E60000000000000000000000000000000000002
+:108E700000000000000000000000000000000000F2
+:108E800000000000000000000000000000000000E2
+:108E900000000000000000000000000000000000D2
+:108EA00000000000000000000000000000000000C2
+:108EB00000000000000000000000000000000000B2
+:108EC0000000000000000002020202020202020290
+:108ED000020202020202000001010101010101017E
+:108EE000010101010101010000000000000000007B
+:108EF0000000000000000000000000000000000072
+:108F00000000000000000000000000000000000061
+:108F10000000000000000000000000000000000051
+:108F20000000000000000000000000000000000041
+:108F30000000000000000000000000000000000031
+:108F40000000000000000000000000000000000021
+:108F50000000000000000000000000000000000011
+:108F60000000000000000000000000000000000001
+:108F700000000000000000000000000000000000F1
+:108F800000000000000000000000000000000000E1
+:108F900000000000000000000000000000000000D1
+:108FA00000000000000000000000000000000000C1
+:108FB00000000000000000000000000000000000B1
+:108FC000000000000000000202020202020202028F
+:108FD000020202020202000001010101010101017D
+:108FE000010101010101010000000000000000007A
+:108FF0000000000000000000000000000000000071
+:109000000000000000000000000000000000000060
+:109010000000000000000000000000000000000050
+:109020000000000000000000000000000000000040
+:109030000000000000000000000000000000000030
+:109040000000000000000000000000000000000020
+:109050000000000000000000000000000000000010
+:109060000000000000000000000000000000000000
+:1090700000000000000000000000000000000000F0
+:1090800000000000000000000000000000000000E0
+:1090900000000000000000000000000000000000D0
+:1090A00000000000000000000000000000000000C0
+:1090B00000000000000000000000000000000000B0
+:1090C000000000000000000202020202020202028E
+:1090D000020202020202000001010101010101017C
+:1090E0000101010101010100000000000000000079
+:1090F0000000000000000000000000000000000070
+:10910000000000000000000000000000000000005F
+:10911000000000000000000000000000000000004F
+:10912000000000000000000000000000000000003F
+:10913000000000000000000000000000000000002F
+:10914000000000000000000000000000000000001F
+:10915000000000000000000000000000000000000F
+:1091600000000000000000000000000000000000FF
+:1091700000000000000000000000000000000000EF
+:1091800000000000000000000000000000000000DF
+:1091900000000000000000000000000000000000CF
+:1091A00000000000000000000000000000000000BF
+:1091B00000000000000000000000000000000000AF
+:1091C000000000000000000202020202020202028D
+:1091D0000202020202020000000000000000000083
+:1091E000000000000000000000000000000000007F
+:1091F000000000000000000000000000000000006F
+:10920000000000000000000000000000000000005E
+:10921000000000000000000000000000000000004E
+:10922000000000000000000000000000000000003E
+:10923000000000000000000000000000000000002E
+:10924000000000000000000000000000000000001E
+:10925000000000000000000000000000000000000E
+:1092600000000000000000000000000000000000FE
+:1092700000000000000000000000000000000000EE
+:1092800000000000000000000000000000000000DE
+:1092900000000000000000000000000000000000CE
+:1092A00000000000000000000000000000000000BE
+:1092B00000000000000000000000000000000000AE
+:1092C000000000000000000000000000000000009E
+:1092D000000000000000001300000000000000007B
+:1092E000000000000000000000000000000101007C
+:1092F000000000000000000000000000000000006E
+:10930000000000000000000000000000000000005D
+:10931000000000000000000000000000000000004D
+:10932000000000000000000000000000000000003D
+:10933000000000000000000000000000000000002D
+:10934000000000000000000000000000000000001D
+:10935000000000000000000000000000000000000D
+:1093600000000000000000000000000000000000FD
+:1093700000000000000000000000000000000000ED
+:1093800000000000000000000000000000000000DD
+:1093900000000000000000000000000000000000CD
+:1093A00000000000000000000000000000000000BD
+:1093B00000000000000000000000000000000000AD
+:1093C000000000000000000000000000000000029B
+:1093D000010000000000000000000000000000008C
+:1093E000000000000000000000000000000101007B
+:1093F000000000000000000000000000000000006D
+:10940000000000000000000000000000000000005C
+:10941000000000000000000000000000000000004C
+:10942000000000000000000000000000000000003C
+:10943000000000000000000000000000000000002C
+:10944000000000000000000000000000000000001C
+:10945000000000000000000000000000000000000C
+:1094600000000000000000000000000000000000FC
+:1094700000000000000000000000000000000000EC
+:1094800000000000000000000000000000000000DC
+:1094900000000000000000000000000000000000CC
+:1094A00000000000000000000000000000000000BC
+:1094B00000000000000000000000000000000000AC
+:1094C000000000000000000000000000000000029A
+:1094D000010000000000000000000000000000008B
+:1094E000000000000000000000000000000101007A
+:1094F000000000000000000000000000000000006C
+:10950000000000000000000000000000000000005B
+:10951000000000000000000000000000000000004B
+:10952000000000000000000000000000000000003B
+:10953000000000000000000000000000000000002B
+:10954000000000000000000000000000000000001B
+:10955000000000000000000000000000000000000B
+:1095600000000000000000000000000000000000FB
+:1095700000000000000000000000000000000000EB
+:1095800000000000000000000000000000000000DB
+:1095900000000000000000000000000000000000CB
+:1095A00000000000000000000000000000000000BB
+:1095B00000000000000000000000000000000000AB
+:1095C0000000000000000000000000000000000299
+:1095D0000101010000000000000000000000000088
+:1095E0000000000000000000000000010101010077
+:1095F000000000000000000000000000000000006B
+:10960000000000000000000000000000000000005A
+:10961000000000000000000000000000000000004A
+:10962000000000000000000000000000000000003A
+:10963000000000000000000000000000000000002A
+:10964000000000000000000000000000000000001A
+:10965000000000000000000000000000000000000A
+:1096600000000000000000000000000000000000FA
+:1096700000000000000000000000000000000000EA
+:1096800000000000000000000000000000000000DA
+:1096900000000000000000000000000000000000CA
+:1096A00000000000000000000000000000000000BA
+:1096B00000000000000000000000000000000000AA
+:1096C0000000000000000000000000000000000298
+:1096D0000201010101000000000000000000000084
+:1096E0000000000000000000000001010101010075
+:1096F000000000000000000000000000000000006A
+:109700000000000000000000000000000000000059
+:109710000000000000000000000000000000000049
+:109720000000000000000000000000000000000039
+:109730000000000000000000000000000000000029
+:109740000000000000000000000000000000000019
+:109750000000000000000000000000000000000009
+:1097600000000000000000000000000000000000F9
+:1097700000000000000000000000000000000000E9
+:1097800000000000000000000000000000000000D9
+:1097900000000000000000000000000000000000C9
+:1097A00000000000000000000000000000000000B9
+:1097B00000000000000000000000000000000000A9
+:1097C0000000000000000000000000000000000297
+:1097D0000202010101000000000000000000000082
+:1097E0000000000000000001010101010101010071
+:1097F0000000000000000000000000000000000069
+:109800000000000000000000000000000000000058
+:109810000000000000000000000000000000000048
+:109820000000000000000000000000000000000038
+:109830000000000000000000000000000000000028
+:109840000000000000000000000000000000000018
+:109850000000000000000000000000000000000008
+:1098600000000000000000000000000000000000F8
+:1098700000000000000000000000000000000000E8
+:1098800000000000000000000000000000000000D8
+:1098900000000000000000000000000000000000C8
+:1098A00000000000000000000000000000000000B8
+:1098B00000000000000000000000000000000000A8
+:1098C0000000000000000000000000000000000296
+:1098D000020202010100000100000000000000007F
+:1098E000000000000000010101010101010101006F
+:1098F0000000000000000000000000000000000068
+:109900000000000000000000000000000000000057
+:109910000000000000000000000000000000000047
+:109920000000000000000000000000000000000037
+:109930000000000000000000000000000000000027
+:109940000000000000000000000000000000000017
+:109950000000000000000000000000000000000007
+:1099600000000000000000000000000000000000F7
+:1099700000000000000000000000000000000000E7
+:1099800000000000000000000000000000000000D7
+:1099900000000000000000000000000000000000C7
+:1099A00000000000000000000000000000000000B7
+:1099B00000000000000000000000000000000000A7
+:1099C0000000000000000000000000000000000295
+:1099D000020202020100010100000000000100007B
+:1099E000000000000101010101010101010101006C
+:1099F0000000000000000000000000000000000067
+:109A00000000000000000000000000000000000056
+:109A10000000000000000000000000000000000046
+:109A20000000000000000000000000000000000036
+:109A30000000000000000000000000000000000026
+:109A40000000000000000000000000000000000016
+:109A50000000000000000000000000000000000006
+:109A600000000000000000000000000000000000F6
+:109A700000000000000000000000000000000000E6
+:109A800000000000000000000000000000000000D6
+:109A900000000000000000000000000000000000C6
+:109AA00000000000000000000000000000000000B6
+:109AB00000000000000000000000000000000000A6
+:109AC0000000000000000000000000000000000294
+:109AD0000202020202010101000000000001000078
+:109AE000000000000101010101010101010101006B
+:109AF0000000000000000000000000000000000066
+:109B00000000000000000000000000000000000055
+:109B10000000000000000000000000000000000045
+:109B20000000000000000000000000000000000035
+:109B30000000000000000000000000000000000025
+:109B40000000000000000000000000000000000015
+:109B50000000000000000000000000000000000005
+:109B600000000000000000000000000000000000F5
+:109B700000000000000000000000000000000000E5
+:109B800000000000000000000000000000000000D5
+:109B900000000000000000000000000000000000C5
+:109BA00000000000000000000000000000000000B5
+:109BB00000000000000000000000000000000000A5
+:109BC0000000000000000000000000000000000293
+:109BD0000202020202010101000000000001000077
+:109BE0000000000101010101010101010101010069
+:109BF0000000000000000000000000000000000065
+:109C00000000000000000000000000000000000054
+:109C10000000000000000000000000000000000044
+:109C20000000000000000000000000000000000034
+:109C30000000000000000000000000000000000024
+:109C40000000000000000000000000000000000014
+:109C50000000000000000000000000000000000004
+:109C600000000000000000000000000000000000F4
+:109C700000000000000000000000000000000000E4
+:109C800000000000000000000000000000000000D4
+:109C900000000000000000000000000000000000C4
+:109CA00000000000000000000000000000000000B4
+:109CB00000000000000000000000000000000000A4
+:109CC0000000000000000000000000000000000292
+:109CD0000202020202020202010000000001000072
+:109CE0000000010101010101010101010101010067
+:109CF0000000000000000000000000000000000064
+:109D00000000000000000000000000000000000053
+:109D10000000000000000000000000000000000043
+:109D20000000000000000000000000000000000033
+:109D30000000000000000000000000000000000023
+:109D40000000000000000000000000000000000013
+:109D50000000000000000000000000000000000003
+:109D600000000000000000000000000000000000F3
+:109D700000000000000000000000000000000000E3
+:109D800000000000000000000000000000000000D3
+:109D900000000000000000000000000000000000C3
+:109DA00000000000000000000000000000000000B3
+:109DB00000000000000000000000000000000000A3
+:109DC0000000000000000000000000000000000291
+:109DD0000202020202020202010001000001000070
+:109DE0000000010101010101010101010101010066
+:109DF0000000000000000000000000000000000063
+:109E00000000000000000000000000000000000052
+:109E10000000000000000000000000000000000042
+:109E20000000000000000000000000000000000032
+:109E30000000000000000000000000000000000022
+:109E40000000000000000000000000000000000012
+:109E50000000000000000000000000000000000002
+:109E600000000000000000000000000000000000F2
+:109E700000000000000000000000000000000000E2
+:109E800000000000000000000000000000000000D2
+:109E900000000000000000000000000000000000C2
+:109EA00000000000000000000000000000000000B2
+:109EB00000000000000000000000000000000000A2
+:109EC0000000000000000000000000000000000290
+:109ED000020202020202020202010101000100006C
+:109EE0000101010101010101010101010101010063
+:109EF0000000000000000000000000000000000062
+:109F00000000000000000000000000000000000051
+:109F10000000000000000000000000000000000041
+:109F20000000000000000000000000000000000031
+:109F30000000000000000000000000000000000021
+:109F40000000000000000000000000000000000011
+:109F50000000000000000000000000000000000001
+:109F600000000000000000000000000000000000F1
+:109F700000000000000000000000000000000000E1
+:109F800000000000000000000000000000000000D1
+:109F900000000000000000000000000000000000C1
+:109FA00000000000000000000000000000000000B1
+:109FB00000000000000000000000000000000000A1
+:109FC000000000000000000000000000000000028F
+:109FD0000202020202020202020202010002000068
+:109FE0000101010101010101010101010101010062
+:109FF0000000000000000000000000000000000061
+:10A000000000000000000000000000000000000050
+:10A010000000000000000000000000000000000040
+:10A020000000000000000000000000000000000030
+:10A030000000000000000000000000000000000020
+:10A040000000000000000000000000000000000010
+:10A050000000000000000000000000000000000000
+:10A0600000000000000000000000000000000000F0
+:10A0700000000000000000000000000000000000E0
+:10A0800000000000000000000000000000000000D0
+:10A0900000000000000000000000000000000000C0
+:10A0A00000000000000000000000000000000000B0
+:10A0B00000000000000000000000000000000000A0
+:10A0C000000000000000000000000000000000028E
+:10A0D0000202020202020202020202020102000065
+:10A0E0000101010101010101010101010101010061
+:10A0F0000000000000000000000000000000000060
+:10A10000000000000000000000000000000000004F
+:10A11000000000000000000000000000000000003F
+:10A12000000000000000000000000000000000002F
+:10A13000000000000000000000000000000000001F
+:10A14000000000000000000000000000000000000F
+:10A1500000000000000000000000000000000000FF
+:10A1600000000000000000000000000000000000EF
+:10A1700000000000000000000000000000000000DF
+:10A1800000000000000000000000000000000000CF
+:10A1900000000000000000000000000000000000BF
+:10A1A00000000000000000000000000000000000AF
+:10A1B000000000000000000000000000000000009F
+:10A1C000000000000000000000000000000000028D
+:10A1D0000202020202020202020202020202000063
+:10A1E0000101010101010101010101010101010060
+:10A1F000000000000000000000000000000000005F
+:10A20000000000000000000000000000000000004E
+:10A21000000000000000000000000000000000003E
+:10A22000000000000000000000000000000000002E
+:10A23000000000000000000000000000000000001E
+:10A24000000000000000000000000000000000000E
+:10A2500000000000000000000000000000000000FE
+:10A2600000000000000000000000000000000000EE
+:10A2700000000000000000000000000000000000DE
+:10A2800000000000000000000000000000000000CE
+:10A2900000000000000000000000000000000000BE
+:10A2A00000000000000000000000000000000000AE
+:10A2B000000000000000000000000000000000009E
+:10A2C000000000000000000000000000000000028C
+:10A2D0000202020202020202020202020202000062
+:10A2E000010101010101010101010101010101005F
+:10A2F000000000000000000000000000000000005E
+:10A30000000000000000000000000000000000004D
+:10A31000000000000000000000000000000000003D
+:10A32000000000000000000000000000000000002D
+:10A33000000000000000000000000000000000001D
+:10A34000000000000000000000000000000000000D
+:10A3500000000000000000000000000000000000FD
+:10A3600000000000000000000000000000000000ED
+:10A3700000000000000000000000000000000000DD
+:10A3800000000000000000000000000000000000CD
+:10A3900000000000000000000000000000000000BD
+:10A3A00000000000000000000000000000000000AD
+:10A3B000000000000000000000000000000000009D
+:10A3C000000000000000000000000000000000028B
+:10A3D0000202020202020202020202020202000061
+:10A3E000010101010101010101010101010101005E
+:10A3F000000000000000000000000000000000005D
+:10A40000000000000000000000000000000000004C
+:10A41000000000000000000000000000000000003C
+:10A42000000000000000000000000000000000002C
+:10A43000000000000000000000000000000000001C
+:10A44000000000000000000000000000000000000C
+:10A4500000000000000000000000000000000000FC
+:10A4600000000000000000000000000000000000EC
+:10A4700000000000000000000000000000000000DC
+:10A4800000000000000000000000000000000000CC
+:10A4900000000000000000000000000000000000BC
+:10A4A00000000000000000000000000000000000AC
+:10A4B000000000000000000000000000000000009C
+:10A4C000000000000000000000000000000000028A
+:10A4D0000202020202020202020202020202000060
+:10A4E000000000000000000000000000000000006C
+:10A4F000000000000000000000000000000000005C
+:10A50000000000000000000000000000000000004B
+:10A51000000000000000000000000000000000003B
+:10A52000000000000000000000000000000000002B
+:10A53000000000000000000000000000000000001B
+:10A54000000000000000000000000000000000000B
+:10A5500000000000000000000000000000000000FB
+:10A5600000000000000000000000000000000000EB
+:10A5700000000000000000000000000000000000DB
+:10A5800000000000000000000000000000000000CB
+:10A5900000000000000000000000000000000000BB
+:10A5A00000000000000000000000000000000000AB
+:10A5B000000000000000000000000000000000009B
+:10A5C000000000000000000000000000000000008B
+:10A5D000000000000000000000000000000000116A
+:10A5E000000000000000000000000000000000006B
+:10A5F000000000000000000000000000000000005B
+:10A60000000000000000000000000000000000004A
+:10A61000000000000000000000000000000000003A
+:10A62000000000000000000000000000000000002A
+:10A63000000000000000000000000000000000001A
+:10A64000000000000000000000000000000000000A
+:10A6500000000000000000000000000000000000FA
+:10A6600000000000000000000000000000000000EA
+:10A6700000000000000000000000000000000000DA
+:10A6800000000000000000000000000000000000CA
+:10A6900000000000000000000000000000000000BA
+:10A6A00000000000000000000000000000000000AA
+:10A6B000000000000000000000000000000000009A
+:10A6C000000000000000000000000000000000008A
+:10A6D0000000000000000000010100000000000078
+:10A6E000000000000000000000000000000000006A
+:10A6F0000000000000010100000000000000000058
+:10A700000000000000000000000000000000000049
+:10A710000000000000000000000000000000000039
+:10A720000000000000000000000000000000000029
+:10A730000000000000000000000000000000000019
+:10A740000000000000000000000000000000000009
+:10A7500000000000000000000000000000000000F9
+:10A7600000000000000000000000000000000000E9
+:10A7700000000000000000000000000000000000D9
+:10A7800000000000000000000000000000000000C9
+:10A7900000000000000000000000000000000000B9
+:10A7A00000000000000000000000000000000000A9
+:10A7B0000000000000000000000000000000000099
+:10A7C0000000000000000000000000000000000089
+:10A7D0000000000000000002010101000000000074
+:10A7E0000000000000000000000000000000000069
+:10A7F0000000000000010100000000000000000057
+:10A800000000000000000000000000000000000048
+:10A810000000000000000000000000000000000038
+:10A820000000000000000000000000000000000028
+:10A830000000000000000000000000000000000018
+:10A840000000000000000000000000000000000008
+:10A8500000000000000000000000000000000000F8
+:10A8600000000000000000000000000000000000E8
+:10A8700000000000000000000000000000000000D8
+:10A8800000000000000000000000000000000000C8
+:10A8900000000000000000000000000000000000B8
+:10A8A00000000000000000000000000000000000A8
+:10A8B0000000000000000000000000000000000098
+:10A8C0000000000000000000000000000000000088
+:10A8D0000000000000000002010101000000000073
+:10A8E0000000000000000000000000000000000068
+:10A8F0000000000101010100000000000000000054
+:10A900000000000000000000000000000000000047
+:10A910000000000000000000000000000000000037
+:10A920000000000000000000000000000000000027
+:10A930000000000000000000000000000000000017
+:10A940000000000000000000000000000000000007
+:10A9500000000000000000000000000000000000F7
+:10A9600000000000000000000000000000000000E7
+:10A9700000000000000000000000000000000000D7
+:10A9800000000000000000000000000000000000C7
+:10A9900000000000000000000000000000000000B7
+:10A9A00000000000000000000000000000000000A7
+:10A9B0000000000000000000000000000000000097
+:10A9C0000000000000000000000000000000000087
+:10A9D0000000000000000002020101010000000070
+:10A9E0000000000000000000000000000000000067
+:10A9F0000001010101010100000000000000000051
+:10AA00000000000000000000000000000000000046
+:10AA10000000000000000000000000000000000036
+:10AA20000000000000000000000000000000000026
+:10AA30000000000000000000000000000000000016
+:10AA40000000000000000000000000000000000006
+:10AA500000000000000000000000000000000000F6
+:10AA600000000000000000000000000000000000E6
+:10AA700000000000000000000000000000000000D6
+:10AA800000000000000000000000000000000000C6
+:10AA900000000000000000000000000000000000B6
+:10AAA00000000000000000000000000000000000A6
+:10AAB0000000000000000000000000000000000096
+:10AAC0000000000000000000000000000000000086
+:10AAD000000000000000000202020101000000006E
+:10AAE0000000000000010000000000000000000164
+:10AAF000010101010101010000000000000000004F
+:10AB00000000000000000000000000000000000045
+:10AB10000000000000000000000000000000000035
+:10AB20000000000000000000000000000000000025
+:10AB30000000000000000000000000000000000015
+:10AB40000000000000000000000000000000000005
+:10AB500000000000000000000000000000000000F5
+:10AB600000000000000000000000000000000000E5
+:10AB700000000000000000000000000000000000D5
+:10AB800000000000000000000000000000000000C5
+:10AB900000000000000000000000000000000000B5
+:10ABA00000000000000000000000000000000000A5
+:10ABB0000000000000000000000000000000000095
+:10ABC0000000000000000000000000000000000085
+:10ABD000000000000000000202020201000000006C
+:10ABE0000000000000010000000000000000010162
+:10ABF000010101010101010000000000000000004E
+:10AC00000000000000000000000000000000000044
+:10AC10000000000000000000000000000000000034
+:10AC20000000000000000000000000000000000024
+:10AC30000000000000000000000000000000000014
+:10AC40000000000000000000000000000000000004
+:10AC500000000000000000000000000000000000F4
+:10AC600000000000000000000000000000000000E4
+:10AC700000000000000000000000000000000000D4
+:10AC800000000000000000000000000000000000C4
+:10AC900000000000000000000000000000000000B4
+:10ACA00000000000000000000000000000000000A4
+:10ACB0000000000000000000000000000000000094
+:10ACC0000000000000000000000000000000000084
+:10ACD0000000000000000002020202020000000169
+:10ACE0000000000000010000000000000001010160
+:10ACF000010101010101010000000000000000004D
+:10AD00000000000000000000000000000000000043
+:10AD10000000000000000000000000000000000033
+:10AD20000000000000000000000000000000000023
+:10AD30000000000000000000000000000000000013
+:10AD40000000000000000000000000000000000003
+:10AD500000000000000000000000000000000000F3
+:10AD600000000000000000000000000000000000E3
+:10AD700000000000000000000000000000000000D3
+:10AD800000000000000000000000000000000000C3
+:10AD900000000000000000000000000000000000B3
+:10ADA00000000000000000000000000000000000A3
+:10ADB0000000000000000000000000000000000093
+:10ADC0000000000000000000000000000000000083
+:10ADD0000000000000000002020202020100010166
+:10ADE000000100000001000000000101010101015B
+:10ADF000010101010101010000000000000000004C
+:10AE00000000000000000000000000000000000042
+:10AE10000000000000000000000000000000000032
+:10AE20000000000000000000000000000000000022
+:10AE30000000000000000000000000000000000012
+:10AE40000000000000000000000000000000000002
+:10AE500000000000000000000000000000000000F2
+:10AE600000000000000000000000000000000000E2
+:10AE700000000000000000000000000000000000D2
+:10AE800000000000000000000000000000000000C2
+:10AE900000000000000000000000000000000000B2
+:10AEA00000000000000000000000000000000000A2
+:10AEB0000000000000000000000000000000000092
+:10AEC0000000000000000000000000000000000082
+:10AED0000000000000000002020202020201010163
+:10AEE0000101000100010000000101010101010157
+:10AEF000010101010101010000000000000000004B
+:10AF00000000000000000000000000000000000041
+:10AF10000000000000000000000000000000000031
+:10AF20000000000000000000000000000000000021
+:10AF30000000000000000000000000000000000011
+:10AF40000000000000000000000000000000000001
+:10AF500000000000000000000000000000000000F1
+:10AF600000000000000000000000000000000000E1
+:10AF700000000000000000000000000000000000D1
+:10AF800000000000000000000000000000000000C1
+:10AF900000000000000000000000000000000000B1
+:10AFA00000000000000000000000000000000000A1
+:10AFB0000000000000000000000000000000000091
+:10AFC0000000000000000000000000000000000081
+:10AFD000000000000000000202020202020202025F
+:10AFE0000101010100010000000101010101010155
+:10AFF000010101010101010000000000000000004A
+:10B000000000000000000000000000000000000040
+:10B010000000000000000000000000000000000030
+:10B020000000000000000000000000000000000020
+:10B030000000000000000000000000000000000010
+:10B040000000000000000000000000000000000000
+:10B0500000000000000000000000000000000000F0
+:10B0600000000000000000000000000000000000E0
+:10B0700000000000000000000000000000000000D0
+:10B0800000000000000000000000000000000000C0
+:10B0900000000000000000000000000000000000B0
+:10B0A00000000000000000000000000000000000A0
+:10B0B0000000000000000000000000000000000090
+:10B0C0000000000000000000000000000000000080
+:10B0D000000000000000000202020202020202025E
+:10B0E0000202010100020000010101010101010150
+:10B0F0000101010101010100000000000000000049
+:10B10000000000000000000000000000000000003F
+:10B11000000000000000000000000000000000002F
+:10B12000000000000000000000000000000000001F
+:10B13000000000000000000000000000000000000F
+:10B1400000000000000000000000000000000000FF
+:10B1500000000000000000000000000000000000EF
+:10B1600000000000000000000000000000000000DF
+:10B1700000000000000000000000000000000000CF
+:10B1800000000000000000000000000000000000BF
+:10B1900000000000000000000000000000000000AF
+:10B1A000000000000000000000000000000000009F
+:10B1B000000000000000000000000000000000008F
+:10B1C000000000000000000000000000000000007F
+:10B1D000000000000000000202020202020202025D
+:10B1E000020202020002000001010101010101014D
+:10B1F0000101010101010100000000000000000048
+:10B20000000000000000000000000000000000003E
+:10B21000000000000000000000000000000000002E
+:10B22000000000000000000000000000000000001E
+:10B23000000000000000000000000000000000000E
+:10B2400000000000000000000000000000000000FE
+:10B2500000000000000000000000000000000000EE
+:10B2600000000000000000000000000000000000DE
+:10B2700000000000000000000000000000000000CE
+:10B2800000000000000000000000000000000000BE
+:10B2900000000000000000000000000000000000AE
+:10B2A000000000000000000000000000000000009E
+:10B2B000000000000000000000000000000000008E
+:10B2C000000000000000000000000000000000007E
+:10B2D000000000000000000202020202020202025C
+:10B2E000020202020102000001010101010101014B
+:10B2F0000101010101010100000000000000000047
+:10B30000000000000000000000000000000000003D
+:10B31000000000000000000000000000000000002D
+:10B32000000000000000000000000000000000001D
+:10B33000000000000000000000000000000000000D
+:10B3400000000000000000000000000000000000FD
+:10B3500000000000000000000000000000000000ED
+:10B3600000000000000000000000000000000000DD
+:10B3700000000000000000000000000000000000CD
+:10B3800000000000000000000000000000000000BD
+:10B3900000000000000000000000000000000000AD
+:10B3A000000000000000000000000000000000009D
+:10B3B000000000000000000000000000000000008D
+:10B3C000000000000000000000000000000000007D
+:10B3D000000000000000000202020202020202025B
+:10B3E0000202020202020000010101010101010149
+:10B3F0000101010101010100000000000000000046
+:10B40000000000000000000000000000000000003C
+:10B41000000000000000000000000000000000002C
+:10B42000000000000000000000000000000000001C
+:10B43000000000000000000000000000000000000C
+:10B4400000000000000000000000000000000000FC
+:10B4500000000000000000000000000000000000EC
+:10B4600000000000000000000000000000000000DC
+:10B4700000000000000000000000000000000000CC
+:10B4800000000000000000000000000000000000BC
+:10B4900000000000000000000000000000000000AC
+:10B4A000000000000000000000000000000000009C
+:10B4B000000000000000000000000000000000008C
+:10B4C000000000000000000000000000000000007C
+:10B4D000000000000000000202020202020202025A
+:10B4E0000202020202020000010101010101010148
+:10B4F0000101010101010100000000000000000045
+:10B50000000000000000000000000000000000003B
+:10B51000000000000000000000000000000000002B
+:10B52000000000000000000000000000000000001B
+:10B53000000000000000000000000000000000000B
+:10B5400000000000000000000000000000000000FB
+:10B5500000000000000000000000000000000000EB
+:10B5600000000000000000000000000000000000DB
+:10B5700000000000000000000000000000000000CB
+:10B5800000000000000000000000000000000000BB
+:10B5900000000000000000000000000000000000AB
+:10B5A000000000000000000000000000000000009B
+:10B5B000000000000000000000000000000000008B
+:10B5C000000000000000000000000000000000007B
+:10B5D0000000000000000002020202020202020259
+:10B5E000020202020202000000000000000000004F
+:10B5F000000000000000000000000000000000004B
+:10B60000000000000000000000000000000000003A
+:10B61000000000000000000000000000000000002A
+:10B62000000000000000000000000000000000001A
+:10B63000000000000000000000000000000000000A
+:10B6400000000000000000000000000000000000FA
+:10B6500000000000000000000000000000000000EA
+:10B6600000000000000000000000000000000000DA
+:10B6700000000000000000000000000000000000CA
+:10B6800000000000000000000000000000000000BA
+:10B6900000000000000000000000000000000000AA
+:10B6A000000000000000000000000000000000009A
+:10B6B000000000000000000000000000000000008A
+:10B6C000000000000000000000000000000000007A
+:10B6D000000000000000000000000000000000006A
+:10B6E000000000000000001000000000000000004A
+:10B6F0000000000000000000000000000000010049
+:10B700000000000000000000000000000000000039
+:10B710000000000000000000000000000000000029
+:10B720000000000000000000000000000000000019
+:10B730000000000000000000000000000000000009
+:10B7400000000000000000000000000000000000F9
+:10B7500000000000000000000000000000000000E9
+:10B7600000000000000000000000000000000000D9
+:10B7700000000000000000000000000000000000C9
+:10B7800000000000000000000000000000000000B9
+:10B7900000000000000000000000000000000000A9
+:10B7A0000000000000000000000000000000000099
+:10B7B0000000000000000000000000000000000089
+:10B7C0000000000000000000000000000000000079
+:10B7D0000000000000000000000000000000000267
+:10B7E0000101010000000000000000000000000056
+:10B7F0000000000000000000000000000101010046
+:10B800000000000000000000000000000000000038
+:10B810000000000000000000000000000000000028
+:10B820000000000000000000000000000000000018
+:10B830000000000000000000000000000000000008
+:10B8400000000000000000000000000000000000F8
+:10B8500000000000000000000000000000000000E8
+:10B8600000000000000000000000000000000000D8
+:10B8700000000000000000000000000000000000C8
+:10B8800000000000000000000000000000000000B8
+:10B8900000000000000000000000000000000000A8
+:10B8A0000000000000000000000000000000000098
+:10B8B0000000000000000000000000000000000088
+:10B8C0000000000000000000000000000000000078
+:10B8D0000000000000000000000000000000000266
+:10B8E0000101010100000000000000000000000054
+:10B8F0000000000000000000000000010101010044
+:10B900000000000000000000000000000000000037
+:10B910000000000000000000000000000000000027
+:10B920000000000000000000000000000000000017
+:10B930000000000000000000000000000000000007
+:10B9400000000000000000000000000000000000F7
+:10B9500000000000000000000000000000000000E7
+:10B9600000000000000000000000000000000000D7
+:10B9700000000000000000000000000000000000C7
+:10B9800000000000000000000000000000000000B7
+:10B9900000000000000000000000000000000000A7
+:10B9A0000000000000000000000000000000000097
+:10B9B0000000000000000000000000000000000087
+:10B9C0000000000000000000000000000000000077
+:10B9D0000000000000000000000000000000000265
+:10B9E0000201010100000000000000000000000052
+:10B9F0000000000000000000000101010101010041
+:10BA00000000000000000000000000000000000036
+:10BA10000000000000000000000000000000000026
+:10BA20000000000000000000000000000000000016
+:10BA30000000000000000000000000000000000006
+:10BA400000000000000000000000000000000000F6
+:10BA500000000000000000000000000000000000E6
+:10BA600000000000000000000000000000000000D6
+:10BA700000000000000000000000000000000000C6
+:10BA800000000000000000000000000000000000B6
+:10BA900000000000000000000000000000000000A6
+:10BAA0000000000000000000000000000000000096
+:10BAB0000000000000000000000000000000000086
+:10BAC0000000000000000000000000000000000076
+:10BAD0000000000000000000000000000000000264
+:10BAE0000202010100000000000000000000000050
+:10BAF000000000000000000101010101010101003E
+:10BB00000000000000000000000000000000000035
+:10BB10000000000000000000000000000000000025
+:10BB20000000000000000000000000000000000015
+:10BB30000000000000000000000000000000000005
+:10BB400000000000000000000000000000000000F5
+:10BB500000000000000000000000000000000000E5
+:10BB600000000000000000000000000000000000D5
+:10BB700000000000000000000000000000000000C5
+:10BB800000000000000000000000000000000000B5
+:10BB900000000000000000000000000000000000A5
+:10BBA0000000000000000000000000000000000095
+:10BBB0000000000000000000000000000000000085
+:10BBC0000000000000000000000000000000000075
+:10BBD0000000000000000000000000000000000263
+:10BBE000020202010000000000000000010000004D
+:10BBF000000000000001010101010101010101003B
+:10BC00000000000000000000000000000000000034
+:10BC10000000000000000000000000000000000024
+:10BC20000000000000000000000000000000000014
+:10BC30000000000000000000000000000000000004
+:10BC400000000000000000000000000000000000F4
+:10BC500000000000000000000000000000000000E4
+:10BC600000000000000000000000000000000000D4
+:10BC700000000000000000000000000000000000C4
+:10BC800000000000000000000000000000000000B4
+:10BC900000000000000000000000000000000000A4
+:10BCA0000000000000000000000000000000000094
+:10BCB0000000000000000000000000000000000084
+:10BCC0000000000000000000000000000000000074
+:10BCD0000000000000000000000000000000000262
+:10BCE000020202020100000000000000010000004A
+:10BCF0000000000101010101010101010101010038
+:10BD00000000000000000000000000000000000033
+:10BD10000000000000000000000000000000000023
+:10BD20000000000000000000000000000000000013
+:10BD30000000000000000000000000000000000003
+:10BD400000000000000000000000000000000000F3
+:10BD500000000000000000000000000000000000E3
+:10BD600000000000000000000000000000000000D3
+:10BD700000000000000000000000000000000000C3
+:10BD800000000000000000000000000000000000B3
+:10BD900000000000000000000000000000000000A3
+:10BDA0000000000000000000000000000000000093
+:10BDB0000000000000000000000000000000000083
+:10BDC0000000000000000000000000000000000073
+:10BDD0000000000000000000000000000000000261
+:10BDE0000202020201010000000000000101000047
+:10BDF0000000010101010101010101010101010036
+:10BE00000000000000000000000000000000000032
+:10BE10000000000000000000000000000000000022
+:10BE20000000000000000000000000000000000012
+:10BE30000000000000000000000000000000000002
+:10BE400000000000000000000000000000000000F2
+:10BE500000000000000000000000000000000000E2
+:10BE600000000000000000000000000000000000D2
+:10BE700000000000000000000000000000000000C2
+:10BE800000000000000000000000000000000000B2
+:10BE900000000000000000000000000000000000A2
+:10BEA0000000000000000000000000000000000092
+:10BEB0000000000000000000000000000000000082
+:10BEC0000000000000000000000000000000000072
+:10BED0000000000000000000000000000000000260
+:10BEE0000202020202010001000000000101000044
+:10BEF0000000010101010101010101010101010035
+:10BF00000000000000000000000000000000000031
+:10BF10000000000000000000000000000000000021
+:10BF20000000000000000000000000000000000011
+:10BF30000000000000000000000000000000000001
+:10BF400000000000000000000000000000000000F1
+:10BF500000000000000000000000000000000000E1
+:10BF600000000000000000000000000000000000D1
+:10BF700000000000000000000000000000000000C1
+:10BF800000000000000000000000000000000000B1
+:10BF900000000000000000000000000000000000A1
+:10BFA0000000000000000000000000000000000091
+:10BFB0000000000000000000000000000000000081
+:10BFC0000000000000000000000000000000000071
+:10BFD000000000000000000000000000000000025F
+:10BFE0000202020202020101000100000101000040
+:10BFF0000001010101010101010101010101010033
+:10C000000000000000000000000000000000000030
+:10C010000000000000000000000000000000000020
+:10C020000000000000000000000000000000000010
+:10C030000000000000000000000000000000000000
+:10C0400000000000000000000000000000000000F0
+:10C0500000000000000000000000000000000000E0
+:10C0600000000000000000000000000000000000D0
+:10C0700000000000000000000000000000000000C0
+:10C0800000000000000000000000000000000000B0
+:10C0900000000000000000000000000000000000A0
+:10C0A0000000000000000000000000000000000090
+:10C0B0000000000000000000000000000000000080
+:10C0C0000000000000000000000000000000000070
+:10C0D000000000000000000000000000000000025E
+:10C0E000020202020202020201010001020100003A
+:10C0F0000001010101010101010101010101010032
+:10C10000000000000000000000000000000000002F
+:10C11000000000000000000000000000000000001F
+:10C12000000000000000000000000000000000000F
+:10C1300000000000000000000000000000000000FF
+:10C1400000000000000000000000000000000000EF
+:10C1500000000000000000000000000000000000DF
+:10C1600000000000000000000000000000000000CF
+:10C1700000000000000000000000000000000000BF
+:10C1800000000000000000000000000000000000AF
+:10C19000000000000000000000000000000000009F
+:10C1A000000000000000000000000000000000008F
+:10C1B000000000000000000000000000000000007F
+:10C1C000000000000000000000000000000000006F
+:10C1D000000000000000000000000000000000025D
+:10C1E0000202020202020202020201010202000035
+:10C1F0000101010101010101010101010101010030
+:10C20000000000000000000000000000000000002E
+:10C21000000000000000000000000000000000001E
+:10C22000000000000000000000000000000000000E
+:10C2300000000000000000000000000000000000FE
+:10C2400000000000000000000000000000000000EE
+:10C2500000000000000000000000000000000000DE
+:10C2600000000000000000000000000000000000CE
+:10C2700000000000000000000000000000000000BE
+:10C2800000000000000000000000000000000000AE
+:10C29000000000000000000000000000000000009E
+:10C2A000000000000000000000000000000000008E
+:10C2B000000000000000000000000000000000007E
+:10C2C000000000000000000000000000000000006E
+:10C2D000000000000000000000000000000000025C
+:10C2E0000202020202020202020202020202000032
+:10C2F000010101010101010101010101010101002F
+:10C30000000000000000000000000000000000002D
+:10C31000000000000000000000000000000000001D
+:10C32000000000000000000000000000000000000D
+:10C3300000000000000000000000000000000000FD
+:10C3400000000000000000000000000000000000ED
+:10C3500000000000000000000000000000000000DD
+:10C3600000000000000000000000000000000000CD
+:10C3700000000000000000000000000000000000BD
+:10C3800000000000000000000000000000000000AD
+:10C39000000000000000000000000000000000009D
+:10C3A000000000000000000000000000000000008D
+:10C3B000000000000000000000000000000000007D
+:10C3C000000000000000000000000000000000006D
+:10C3D000000000000000000000000000000000025B
+:10C3E0000202020202020202020202020202000031
+:10C3F000010101010101010101010101010101002E
+:10C40000000000000000000000000000000000002C
+:10C41000000000000000000000000000000000001C
+:10C42000000000000000000000000000000000000C
+:10C4300000000000000000000000000000000000FC
+:10C4400000000000000000000000000000000000EC
+:10C4500000000000000000000000000000000000DC
+:10C4600000000000000000000000000000000000CC
+:10C4700000000000000000000000000000000000BC
+:10C4800000000000000000000000000000000000AC
+:10C49000000000000000000000000000000000009C
+:10C4A000000000000000000000000000000000008C
+:10C4B000000000000000000000000000000000007C
+:10C4C000000000000000000000000000000000006C
+:10C4D000000000000000000000000000000000025A
+:10C4E0000202020202020202020202020202000030
+:10C4F000010101010101010101010101010101002D
+:10C50000000000000000000000000000000000002B
+:10C51000000000000000000000000000000000001B
+:10C52000000000000000000000000000000000000B
+:10C5300000000000000000000000000000000000FB
+:10C5400000000000000000000000000000000000EB
+:10C5500000000000000000000000000000000000DB
+:10C5600000000000000000000000000000000000CB
+:10C5700000000000000000000000000000000000BB
+:10C5800000000000000000000000000000000000AB
+:10C59000000000000000000000000000000000009B
+:10C5A000000000000000000000000000000000008B
+:10C5B000000000000000000000000000000000007B
+:10C5C000000000000000000000000000000000006B
+:10C5D0000000000000000000000000000000000259
+:10C5E000020202020202020202020202020200002F
+:10C5F000000000000000000000000000000000003B
+:10C60000000000000000000000000000000000002A
+:10C61000000000000000000000000000000000001A
+:10C62000000000000000000000000000000000000A
+:10C6300000000000000000000000000000000000FA
+:10C6400000000000000000000000000000000000EA
+:10C6500000000000000000000000000000000000DA
+:10C6600000000000000000000000000000000000CA
+:10C6700000000000000000000000000000000000BA
+:10C6800000000000000000000000000000000000AA
+:10C69000000000000000000000000000000000009A
+:10C6A000000000000000000000000000000000008A
+:10C6B000000000000000000000000000000000007A
+:10C6C000000000000000000000000000000000006A
+:10C6D000000000000000000000000000000000005A
+:10C6E000000000000000000000000000000000103A
+:10C6F000000000000000000000000000000000003A
+:10C700000000000000000100000000000000000028
+:10C710000000000000000000000000000000000019
+:10C720000000000000000000000000000000000009
+:10C7300000000000000000000000000000000000F9
+:10C7400000000000000000000000000000000000E9
+:10C7500000000000000000000000000000000000D9
+:10C7600000000000000000000000000000000000C9
+:10C7700000000000000000000000000000000000B9
+:10C7800000000000000000000000000000000000A9
+:10C790000000000000000000000000000000000099
+:10C7A0000000000000000000000000000000000089
+:10C7B0000000000000000000000000000000000079
+:10C7C0000000000000000000000000000000000069
+:10C7D0000000000000000000000000000000000059
+:10C7E0000000000000000002000001000100000045
+:10C7F0000000000000000000000000000000000039
+:10C800000000010101010100000000000000000023
+:10C810000000000000000000000000000000000018
+:10C820000000000000000000000000000000000008
+:10C8300000000000000000000000000000000000F8
+:10C8400000000000000000000000000000000000E8
+:10C8500000000000000000000000000000000000D8
+:10C8600000000000000000000000000000000000C8
+:10C8700000000000000000000000000000000000B8
+:10C8800000000000000000000000000000000000A8
+:10C890000000000000000000000000000000000098
+:10C8A0000000000000000000000000000000000088
+:10C8B0000000000000000000000000000000000078
+:10C8C0000000000000000000000000000000000068
+:10C8D0000000000000000000000000000000000058
+:10C8E0000000000000000002010101010100010040
+:10C8F0000000000000000000000000000000000038
+:10C900000000010101010100000000000000000022
+:10C910000000000000000000000000000000000017
+:10C920000000000000000000000000000000000007
+:10C9300000000000000000000000000000000000F7
+:10C9400000000000000000000000000000000000E7
+:10C9500000000000000000000000000000000000D7
+:10C9600000000000000000000000000000000000C7
+:10C9700000000000000000000000000000000000B7
+:10C9800000000000000000000000000000000000A7
+:10C990000000000000000000000000000000000097
+:10C9A0000000000000000000000000000000000087
+:10C9B0000000000000000000000000000000000077
+:10C9C0000000000000000000000000000000000067
+:10C9D0000000000000000000000000000000000057
+:10C9E000000000000000000201010101010001003F
+:10C9F0000000010101010000000000000000000033
+:10CA0000010101010101010000000000000000001F
+:10CA10000000000000000000000000000000000016
+:10CA20000000000000000000000000000000000006
+:10CA300000000000000000000000000000000000F6
+:10CA400000000000000000000000000000000000E6
+:10CA500000000000000000000000000000000000D6
+:10CA600000000000000000000000000000000000C6
+:10CA700000000000000000000000000000000000B6
+:10CA800000000000000000000000000000000000A6
+:10CA90000000000000000000000000000000000096
+:10CAA0000000000000000000000000000000000086
+:10CAB0000000000000000000000000000000000076
+:10CAC0000000000000000000000000000000000066
+:10CAD0000000000000000000000000000000000056
+:10CAE000000000000000000202010101010001003D
+:10CAF0000000010101010000000000000000010130
+:10CB0000010101010101010000000000000000001E
+:10CB10000000000000000000000000000000000015
+:10CB20000000000000000000000000000000000005
+:10CB300000000000000000000000000000000000F5
+:10CB400000000000000000000000000000000000E5
+:10CB500000000000000000000000000000000000D5
+:10CB600000000000000000000000000000000000C5
+:10CB700000000000000000000000000000000000B5
+:10CB800000000000000000000000000000000000A5
+:10CB90000000000000000000000000000000000095
+:10CBA0000000000000000000000000000000000085
+:10CBB0000000000000000000000000000000000075
+:10CBC0000000000000000000000000000000000065
+:10CBD0000000000000000000000000000000000055
+:10CBE0000000000000000002020202010101010039
+:10CBF000010001010101000000000000010101012C
+:10CC0000010101010101010000000000000000001D
+:10CC10000000000000000000000000000000000014
+:10CC20000000000000000000000000000000000004
+:10CC300000000000000000000000000000000000F4
+:10CC400000000000000000000000000000000000E4
+:10CC500000000000000000000000000000000000D4
+:10CC600000000000000000000000000000000000C4
+:10CC700000000000000000000000000000000000B4
+:10CC800000000000000000000000000000000000A4
+:10CC90000000000000000000000000000000000094
+:10CCA0000000000000000000000000000000000084
+:10CCB0000000000000000000000000000000000074
+:10CCC0000000000000000000000000000000000064
+:10CCD0000000000000000000000000000000000054
+:10CCE0000000000000000002020202020201010135
+:10CCF000010001010101000000000001010101012A
+:10CD0000010101010101010000000000000000001C
+:10CD10000000000000000000000000000000000013
+:10CD20000000000000000000000000000000000003
+:10CD300000000000000000000000000000000000F3
+:10CD400000000000000000000000000000000000E3
+:10CD500000000000000000000000000000000000D3
+:10CD600000000000000000000000000000000000C3
+:10CD700000000000000000000000000000000000B3
+:10CD800000000000000000000000000000000000A3
+:10CD90000000000000000000000000000000000093
+:10CDA0000000000000000000000000000000000083
+:10CDB0000000000000000000000000000000000073
+:10CDC0000000000000000000000000000000000063
+:10CDD0000000000000000000000000000000000053
+:10CDE0000000000000000002020202020201020133
+:10CDF0000101010101010000000001010101010127
+:10CE0000010101010101010000000000000000001B
+:10CE10000000000000000000000000000000000012
+:10CE20000000000000000000000000000000000002
+:10CE300000000000000000000000000000000000F2
+:10CE400000000000000000000000000000000000E2
+:10CE500000000000000000000000000000000000D2
+:10CE600000000000000000000000000000000000C2
+:10CE700000000000000000000000000000000000B2
+:10CE800000000000000000000000000000000000A2
+:10CE90000000000000000000000000000000000092
+:10CEA0000000000000000000000000000000000082
+:10CEB0000000000000000000000000000000000072
+:10CEC0000000000000000000000000000000000062
+:10CED0000000000000000000000000000000000052
+:10CEE0000000000000000002020202020202020131
+:10CEF0000101010101010000000101010101010125
+:10CF0000010101010101010000000000000000001A
+:10CF10000000000000000000000000000000000011
+:10CF20000000000000000000000000000000000001
+:10CF300000000000000000000000000000000000F1
+:10CF400000000000000000000000000000000000E1
+:10CF500000000000000000000000000000000000D1
+:10CF600000000000000000000000000000000000C1
+:10CF700000000000000000000000000000000000B1
+:10CF800000000000000000000000000000000000A1
+:10CF90000000000000000000000000000000000091
+:10CFA0000000000000000000000000000000000081
+:10CFB0000000000000000000000000000000000071
+:10CFC0000000000000000000000000000000000061
+:10CFD0000000000000000000000000000000000051
+:10CFE000000000000000000202020202020202022F
+:10CFF000020102020202000000010101010101011F
+:10D000000101010101010100000000000000000019
+:10D010000000000000000000000000000000000010
+:10D020000000000000000000000000000000000000
+:10D0300000000000000000000000000000000000F0
+:10D0400000000000000000000000000000000000E0
+:10D0500000000000000000000000000000000000D0
+:10D0600000000000000000000000000000000000C0
+:10D0700000000000000000000000000000000000B0
+:10D0800000000000000000000000000000000000A0
+:10D090000000000000000000000000000000000090
+:10D0A0000000000000000000000000000000000080
+:10D0B0000000000000000000000000000000000070
+:10D0C0000000000000000000000000000000000060
+:10D0D0000000000000000000000000000000000050
+:10D0E000000000000000000202020202020202022E
+:10D0F000020202020202000001010101010101011C
+:10D100000101010101010100000000000000000018
+:10D11000000000000000000000000000000000000F
+:10D1200000000000000000000000000000000000FF
+:10D1300000000000000000000000000000000000EF
+:10D1400000000000000000000000000000000000DF
+:10D1500000000000000000000000000000000000CF
+:10D1600000000000000000000000000000000000BF
+:10D1700000000000000000000000000000000000AF
+:10D18000000000000000000000000000000000009F
+:10D19000000000000000000000000000000000008F
+:10D1A000000000000000000000000000000000007F
+:10D1B000000000000000000000000000000000006F
+:10D1C000000000000000000000000000000000005F
+:10D1D000000000000000000000000000000000004F
+:10D1E000000000000000000202020202020202022D
+:10D1F000020202020202000001010101010101011B
+:10D200000101010101010100000000000000000017
+:10D21000000000000000000000000000000000000E
+:10D2200000000000000000000000000000000000FE
+:10D2300000000000000000000000000000000000EE
+:10D2400000000000000000000000000000000000DE
+:10D2500000000000000000000000000000000000CE
+:10D2600000000000000000000000000000000000BE
+:10D2700000000000000000000000000000000000AE
+:10D28000000000000000000000000000000000009E
+:10D29000000000000000000000000000000000008E
+:10D2A000000000000000000000000000000000007E
+:10D2B000000000000000000000000000000000006E
+:10D2C000000000000000000000000000000000005E
+:10D2D000000000000000000000000000000000004E
+:10D2E000000000000000000202020202020202022C
+:10D2F000020202020202000001010101010101011A
+:10D300000101010101010100000000000000000016
+:10D31000000000000000000000000000000000000D
+:10D3200000000000000000000000000000000000FD
+:10D3300000000000000000000000000000000000ED
+:10D3400000000000000000000000000000000000DD
+:10D3500000000000000000000000000000000000CD
+:10D3600000000000000000000000000000000000BD
+:10D3700000000000000000000000000000000000AD
+:10D38000000000000000000000000000000000009D
+:10D39000000000000000000000000000000000008D
+:10D3A000000000000000000000000000000000007D
+:10D3B000000000000000000000000000000000006D
+:10D3C000000000000000000000000000000000005D
+:10D3D000000000000000000000000000000000004D
+:10D3E000000000000000000202020202020202022B
+:10D3F0000202020202020000010101010101010119
+:10D400000101010101010100000000000000000015
+:10D41000000000000000000000000000000000000C
+:10D4200000000000000000000000000000000000FC
+:10D4300000000000000000000000000000000000EC
+:10D4400000000000000000000000000000000000DC
+:10D4500000000000000000000000000000000000CC
+:10D4600000000000000000000000000000000000BC
+:10D4700000000000000000000000000000000000AC
+:10D48000000000000000000000000000000000009C
+:10D49000000000000000000000000000000000008C
+:10D4A000000000000000000000000000000000007C
+:10D4B000000000000000000000000000000000006C
+:10D4C000000000000000000000000000000000005C
+:10D4D000000000000000000000000000000000004C
+:10D4E000000000000000000202020202020202022A
+:10D4F0000202020202020000010101010101010118
+:10D500000101010101010100000000000000000014
+:10D51000000000000000000000000000000000000B
+:10D5200000000000000000000000000000000000FB
+:10D5300000000000000000000000000000000000EB
+:10D5400000000000000000000000000000000000DB
+:10D5500000000000000000000000000000000000CB
+:10D5600000000000000000000000000000000000BB
+:10D5700000000000000000000000000000000000AB
+:10D58000000000000000000000000000000000009B
+:10D59000000000000000000000000000000000008B
+:10D5A000000000000000000000000000000000007B
+:10D5B000000000000000000000000000000000006B
+:10D5C000000000000000000000000000000000005B
+:10D5D000000000000000000000000000000000004B
+:10D5E0000000000000000002020202020202020229
+:10D5F000020202020202000000000000000000001F
+:10D60000000000000000000000000000000000001A
+:10D61000000000000000000000000000000000000A
+:10D6200000000000000000000000000000000000FA
+:10D6300000000000000000000000000000000000EA
+:10D6400000000000000000000000000000000000DA
+:10D6500000000000000000000000000000000000CA
+:10D6600000000000000000000000000000000000BA
+:10D6700000000000000000000000000000000000AA
+:10D68000000000000000000000000000000000009A
+:10D69000000000000000000000000000000000008A
+:10D6A000000000000000000000000000000000007A
+:10D6B000000000000000000000000000000000006A
+:10D6C000000000000000000000000000000000005A
+:10D6D000000000000000000000000000000000004A
+:10D6E000000000000000000000000000000000003A
+:10D6F000000000000000000F00000000000000001B
+:10D700000000000000000000000000000001010017
+:10D710000000000000000000000000000000000009
+:10D7200000000000000000000000000000000000F9
+:10D7300000000000000000000000000000000000E9
+:10D7400000000000000000000000000000000000D9
+:10D7500000000000000000000000000000000000C9
+:10D7600000000000000000000000000000000000B9
+:10D7700000000000000000000000000000000000A9
+:10D780000000000000000000000000000000000099
+:10D790000000000000000000000000000000000089
+:10D7A0000000000000000000000000000000000079
+:10D7B0000000000000000000000000000000000069
+:10D7C0000000000000000000000000000000000059
+:10D7D0000000000000000000000000000000000049
+:10D7E0000000000000000000000000000000000237
+:10D7F0000100000000000100000001000001000025
+:10D800000000000000000000000000000001010016
+:10D810000000000000000000000000000000000008
+:10D8200000000000000000000000000000000000F8
+:10D8300000000000000000000000000000000000E8
+:10D8400000000000000000000000000000000000D8
+:10D8500000000000000000000000000000000000C8
+:10D8600000000000000000000000000000000000B8
+:10D8700000000000000000000000000000000000A8
+:10D880000000000000000000000000000000000098
+:10D890000000000000000000000000000000000088
+:10D8A0000000000000000000000000000000000078
+:10D8B0000000000000000000000000000000000068
+:10D8C0000000000000000000000000000000000058
+:10D8D0000000000000000000000000000000000048
+:10D8E0000000000000000000000000000000000236
+:10D8F0000101010000000100010001000001000021
+:10D900000000000000000000000001010101010012
+:10D910000000000000000000000000000000000007
+:10D9200000000000000000000000000000000000F7
+:10D9300000000000000000000000000000000000E7
+:10D9400000000000000000000000000000000000D7
+:10D9500000000000000000000000000000000000C7
+:10D9600000000000000000000000000000000000B7
+:10D9700000000000000000000000000000000000A7
+:10D980000000000000000000000000000000000097
+:10D990000000000000000000000000000000000087
+:10D9A0000000000000000000000000000000000077
+:10D9B0000000000000000000000000000000000067
+:10D9C0000000000000000000000000000000000057
+:10D9D0000000000000000000000000000000000047
+:10D9E0000000000000000000000000000000000235
+:10D9F000020101000000010001000101000100001E
+:10DA0000000000000000000001010101010101000F
+:10DA10000000000000000000000000000000000006
+:10DA200000000000000000000000000000000000F6
+:10DA300000000000000000000000000000000000E6
+:10DA400000000000000000000000000000000000D6
+:10DA500000000000000000000000000000000000C6
+:10DA600000000000000000000000000000000000B6
+:10DA700000000000000000000000000000000000A6
+:10DA80000000000000000000000000000000000096
+:10DA90000000000000000000000000000000000086
+:10DAA0000000000000000000000000000000000076
+:10DAB0000000000000000000000000000000000066
+:10DAC0000000000000000000000000000000000056
+:10DAD0000000000000000000000000000000000046
+:10DAE0000000000000000000000000000000000234
+:10DAF000020101000101010001010101000100001A
+:10DB0000000000000000010101010101010101000C
+:10DB10000000000000000000000000000000000005
+:10DB200000000000000000000000000000000000F5
+:10DB300000000000000000000000000000000000E5
+:10DB400000000000000000000000000000000000D5
+:10DB500000000000000000000000000000000000C5
+:10DB600000000000000000000000000000000000B5
+:10DB700000000000000000000000000000000000A5
+:10DB80000000000000000000000000000000000095
+:10DB90000000000000000000000000000000000085
+:10DBA0000000000000000000000000000000000075
+:10DBB0000000000000000000000000000000000065
+:10DBC0000000000000000000000000000000000055
+:10DBD0000000000000000000000000000000000045
+:10DBE0000000000000000000000000000000000233
+:10DBF0000202020001010101010101010101000015
+:10DC00000000000001010101010101010101010009
+:10DC10000000000000000000000000000000000004
+:10DC200000000000000000000000000000000000F4
+:10DC300000000000000000000000000000000000E4
+:10DC400000000000000000000000000000000000D4
+:10DC500000000000000000000000000000000000C4
+:10DC600000000000000000000000000000000000B4
+:10DC700000000000000000000000000000000000A4
+:10DC80000000000000000000000000000000000094
+:10DC90000000000000000000000000000000000084
+:10DCA0000000000000000000000000000000000074
+:10DCB0000000000000000000000000000000000064
+:10DCC0000000000000000000000000000000000054
+:10DCD0000000000000000000000000000000000044
+:10DCE0000000000000000000000000000000000232
+:10DCF0000202020101010201010101010101000012
+:10DD00000000000001010101010101010101010008
+:10DD10000000000000000000000000000000000003
+:10DD200000000000000000000000000000000000F3
+:10DD300000000000000000000000000000000000E3
+:10DD400000000000000000000000000000000000D3
+:10DD500000000000000000000000000000000000C3
+:10DD600000000000000000000000000000000000B3
+:10DD700000000000000000000000000000000000A3
+:10DD80000000000000000000000000000000000093
+:10DD90000000000000000000000000000000000083
+:10DDA0000000000000000000000000000000000073
+:10DDB0000000000000000000000000000000000063
+:10DDC0000000000000000000000000000000000053
+:10DDD0000000000000000000000000000000000043
+:10DDE0000000000000000000000000000000000231
+:10DDF000020202020202020102010201010100000C
+:10DE00000001010101010101010101010101010004
+:10DE10000000000000000000000000000000000002
+:10DE200000000000000000000000000000000000F2
+:10DE300000000000000000000000000000000000E2
+:10DE400000000000000000000000000000000000D2
+:10DE500000000000000000000000000000000000C2
+:10DE600000000000000000000000000000000000B2
+:10DE700000000000000000000000000000000000A2
+:10DE80000000000000000000000000000000000092
+:10DE90000000000000000000000000000000000082
+:10DEA0000000000000000000000000000000000072
+:10DEB0000000000000000000000000000000000062
+:10DEC0000000000000000000000000000000000052
+:10DED0000000000000000000000000000000000042
+:10DEE0000000000000000000000000000000000230
+:10DEF0000202020202020202020202020102000007
+:10DF00000001010101010101010101010101010003
+:10DF10000000000000000000000000000000000001
+:10DF200000000000000000000000000000000000F1
+:10DF300000000000000000000000000000000000E1
+:10DF400000000000000000000000000000000000D1
+:10DF500000000000000000000000000000000000C1
+:10DF600000000000000000000000000000000000B1
+:10DF700000000000000000000000000000000000A1
+:10DF80000000000000000000000000000000000091
+:10DF90000000000000000000000000000000000081
+:10DFA0000000000000000000000000000000000071
+:10DFB0000000000000000000000000000000000061
+:10DFC0000000000000000000000000000000000051
+:10DFD0000000000000000000000000000000000041
+:10DFE000000000000000000000000000000000022F
+:10DFF0000202020202020202020202020202000005
+:10E000000001010101010101010101010101010002
+:10E010000000000000000000000000000000000000
+:10E0200000000000000000000000000000000000F0
+:10E0300000000000000000000000000000000000E0
+:10E0400000000000000000000000000000000000D0
+:10E0500000000000000000000000000000000000C0
+:10E0600000000000000000000000000000000000B0
+:10E0700000000000000000000000000000000000A0
+:10E080000000000000000000000000000000000090
+:10E090000000000000000000000000000000000080
+:10E0A0000000000000000000000000000000000070
+:10E0B0000000000000000000000000000000000060
+:10E0C0000000000000000000000000000000000050
+:10E0D0000000000000000000000000000000000040
+:10E0E000000000000000000000000000000000022E
+:10E0F0000202020202020202020202020202000004
+:10E100000101010101010101010101010101010000
+:10E1100000000000000000000000000000000000FF
+:10E1200000000000000000000000000000000000EF
+:10E1300000000000000000000000000000000000DF
+:10E1400000000000000000000000000000000000CF
+:10E1500000000000000000000000000000000000BF
+:10E1600000000000000000000000000000000000AF
+:10E17000000000000000000000000000000000009F
+:10E18000000000000000000000000000000000008F
+:10E19000000000000000000000000000000000007F
+:10E1A000000000000000000000000000000000006F
+:10E1B000000000000000000000000000000000005F
+:10E1C000000000000000000000000000000000004F
+:10E1D000000000000000000000000000000000003F
+:10E1E000000000000000000000000000000000022D
+:10E1F0000202020202020202020202020202000003
+:10E2000001010101010101010101010101010100FF
+:10E2100000000000000000000000000000000000FE
+:10E2200000000000000000000000000000000000EE
+:10E2300000000000000000000000000000000000DE
+:10E2400000000000000000000000000000000000CE
+:10E2500000000000000000000000000000000000BE
+:10E2600000000000000000000000000000000000AE
+:10E27000000000000000000000000000000000009E
+:10E28000000000000000000000000000000000008E
+:10E29000000000000000000000000000000000007E
+:10E2A000000000000000000000000000000000006E
+:10E2B000000000000000000000000000000000005E
+:10E2C000000000000000000000000000000000004E
+:10E2D000000000000000000000000000000000003E
+:10E2E000000000000000000000000000000000022C
+:10E2F0000202020202020202020202020202000002
+:10E3000001010101010101010101010101010100FE
+:10E3100000000000000000000000000000000000FD
+:10E3200000000000000000000000000000000000ED
+:10E3300000000000000000000000000000000000DD
+:10E3400000000000000000000000000000000000CD
+:10E3500000000000000000000000000000000000BD
+:10E3600000000000000000000000000000000000AD
+:10E37000000000000000000000000000000000009D
+:10E38000000000000000000000000000000000008D
+:10E39000000000000000000000000000000000007D
+:10E3A000000000000000000000000000000000006D
+:10E3B000000000000000000000000000000000005D
+:10E3C000000000000000000000000000000000004D
+:10E3D000000000000000000000000000000000003D
+:10E3E000000000000000000000000000000000022B
+:10E3F0000202020202020202020202020202000001
+:10E4000001010101010101010101010101010100FD
+:10E4100000000000000000000000000000000000FC
+:10E4200000000000000000000000000000000000EC
+:10E4300000000000000000000000000000000000DC
+:10E4400000000000000000000000000000000000CC
+:10E4500000000000000000000000000000000000BC
+:10E4600000000000000000000000000000000000AC
+:10E47000000000000000000000000000000000009C
+:10E48000000000000000000000000000000000008C
+:10E49000000000000000000000000000000000007C
+:10E4A000000000000000000000000000000000006C
+:10E4B000000000000000000000000000000000005C
+:10E4C000000000000000000000000000000000004C
+:10E4D000000000000000000000000000000000003C
+:10E4E000000000000000000000000000000000022A
+:10E4F0000202020202020202020202020202000000
+:10E50000000000000000000000000000000000000B
+:10E5100000000000000000000000000000000000FB
+:10E5200000000000000000000000000000000000EB
+:10E5300000000000000000000000000000000000DB
+:10E5400000000000000000000000000000000000CB
+:10E5500000000000000000000000000000000000BB
+:10E5600000000000000000000000000000000000AB
+:10E57000000000000000000000000000000000009B
+:10E58000000000000000000000000000000000008B
+:10E59000000000000000000000000000000000007B
+:10E5A000000000000000000000000000000000006B
+:10E5B000000000000000000000000000000000005B
+:10E5C000000000000000000000000000000000004B
+:10E5D000000000000000000000000000000000003B
+:10E5E000000000000000000000000000000000002B
+:10E5F0000000000000000000000000000000000B10
+:10E60000000000000000000000000000000000000A
+:10E6100000000000000001000000000000000000F9
+:10E6200000000000000000000000000000000000EA
+:10E6300000000000000000000000000000000000DA
+:10E6400000000000000000000000000000000000CA
+:10E6500000000000000000000000000000000000BA
+:10E6600000000000000000000000000000000000AA
+:10E67000000000000000000000000000000000009A
+:10E68000000000000000000000000000000000008A
+:10E69000000000000000000000000000000000007A
+:10E6A000000000000000000000000000000000006A
+:10E6B000000000000000000000000000000000005A
+:10E6C000000000000000000000000000000000004A
+:10E6D000000000000000000000000000000000003A
+:10E6E000000000000000000000000000000000002A
+:10E6F0000000000000000002000001000000000017
+:10E700000000000000000000000000000000000009
+:10E7100000000000000101000000000000000000F7
+:10E7200000000000000000000000000000000000E9
+:10E7300000000000000000000000000000000000D9
+:10E7400000000000000000000000000000000000C9
+:10E7500000000000000000000000000000000000B9
+:10E7600000000000000000000000000000000000A9
+:10E770000000000000000000000000000000000099
+:10E780000000000000000000000000000000000089
+:10E790000000000000000000000000000000000079
+:10E7A0000000000000000000000000000000000069
+:10E7B0000000000000000000000000000000000059
+:10E7C0000000000000000000000000000000000049
+:10E7D0000000000000000000000000000000000039
+:10E7E0000000000000000000000000000000000029
+:10E7F0000000000000000002020101000000000013
+:10E800000000000000010000000000000000000007
+:10E8100000000101010101000000000000000000F3
+:10E8200000000000000000000000000000000000E8
+:10E8300000000000000000000000000000000000D8
+:10E8400000000000000000000000000000000000C8
+:10E8500000000000000000000000000000000000B8
+:10E8600000000000000000000000000000000000A8
+:10E870000000000000000000000000000000000098
+:10E880000000000000000000000000000000000088
+:10E890000000000000000000000000000000000078
+:10E8A0000000000000000000000000000000000068
+:10E8B0000000000000000000000000000000000058
+:10E8C0000000000000000000000000000000000048
+:10E8D0000000000000000000000000000000000038
+:10E8E0000000000000000000000000000000000028
+:10E8F0000000000000000002020202000000000010
+:10E900000000000000010000000000000000000105
+:10E9100001010101010101000000000000000000F0
+:10E9200000000000000000000000000000000000E7
+:10E9300000000000000000000000000000000000D7
+:10E9400000000000000000000000000000000000C7
+:10E9500000000000000000000000000000000000B7
+:10E9600000000000000000000000000000000000A7
+:10E970000000000000000000000000000000000097
+:10E980000000000000000000000000000000000087
+:10E990000000000000000000000000000000000077
+:10E9A0000000000000000000000000000000000067
+:10E9B0000000000000000000000000000000000057
+:10E9C0000000000000000000000000000000000047
+:10E9D0000000000000000000000000000000000037
+:10E9E0000000000000000000000000000000000027
+:10E9F000000000000000000202020200000000000F
+:10EA00000000000000010000000000000001010102
+:10EA100001010101010101000000000000000000EF
+:10EA200000000000000000000000000000000000E6
+:10EA300000000000000000000000000000000000D6
+:10EA400000000000000000000000000000000000C6
+:10EA500000000000000000000000000000000000B6
+:10EA600000000000000000000000000000000000A6
+:10EA70000000000000000000000000000000000096
+:10EA80000000000000000000000000000000000086
+:10EA90000000000000000000000000000000000076
+:10EAA0000000000000000000000000000000000066
+:10EAB0000000000000000000000000000000000056
+:10EAC0000000000000000000000000000000000046
+:10EAD0000000000000000000000000000000000036
+:10EAE0000000000000000000000000000000000026
+:10EAF000000000000000000202020202000101000A
+:10EB000000000100000100000000000001010101FF
+:10EB100001010101010101000000000000000000EE
+:10EB200000000000000000000000000000000000E5
+:10EB300000000000000000000000000000000000D5
+:10EB400000000000000000000000000000000000C5
+:10EB500000000000000000000000000000000000B5
+:10EB600000000000000000000000000000000000A5
+:10EB70000000000000000000000000000000000095
+:10EB80000000000000000000000000000000000085
+:10EB90000000000000000000000000000000000075
+:10EBA0000000000000000000000000000000000065
+:10EBB0000000000000000000000000000000000055
+:10EBC0000000000000000000000000000000000045
+:10EBD0000000000000000000000000000000000035
+:10EBE0000000000000000000000000000000000025
+:10EBF0000000000000000002020202020202020104
+:10EC000001000100000200000000010101010101FA
+:10EC100001010101010101000000000000000000ED
+:10EC200000000000000000000000000000000000E4
+:10EC300000000000000000000000000000000000D4
+:10EC400000000000000000000000000000000000C4
+:10EC500000000000000000000000000000000000B4
+:10EC600000000000000000000000000000000000A4
+:10EC70000000000000000000000000000000000094
+:10EC80000000000000000000000000000000000084
+:10EC90000000000000000000000000000000000074
+:10ECA0000000000000000000000000000000000064
+:10ECB0000000000000000000000000000000000054
+:10ECC0000000000000000000000000000000000044
+:10ECD0000000000000000000000000000000000034
+:10ECE0000000000000000000000000000000000024
+:10ECF0000000000000000002020202020202020202
+:10ED000002000201000200000001010101010101F5
+:10ED100001010101010101000000000000000000EC
+:10ED200000000000000000000000000000000000E3
+:10ED300000000000000000000000000000000000D3
+:10ED400000000000000000000000000000000000C3
+:10ED500000000000000000000000000000000000B3
+:10ED600000000000000000000000000000000000A3
+:10ED70000000000000000000000000000000000093
+:10ED80000000000000000000000000000000000083
+:10ED90000000000000000000000000000000000073
+:10EDA0000000000000000000000000000000000063
+:10EDB0000000000000000000000000000000000053
+:10EDC0000000000000000000000000000000000043
+:10EDD0000000000000000000000000000000000033
+:10EDE0000000000000000000000000000000000023
+:10EDF0000000000000000002020202020202020201
+:10EE000002020202000200000001010101010101F1
+:10EE100001010101010101000000000000000000EB
+:10EE200000000000000000000000000000000000E2
+:10EE300000000000000000000000000000000000D2
+:10EE400000000000000000000000000000000000C2
+:10EE500000000000000000000000000000000000B2
+:10EE600000000000000000000000000000000000A2
+:10EE70000000000000000000000000000000000092
+:10EE80000000000000000000000000000000000082
+:10EE90000000000000000000000000000000000072
+:10EEA0000000000000000000000000000000000062
+:10EEB0000000000000000000000000000000000052
+:10EEC0000000000000000000000000000000000042
+:10EED0000000000000000000000000000000000032
+:10EEE0000000000000000000000000000000000022
+:10EEF0000000000000000002020202020202020200
+:10EF000002020202020200000101010101010101ED
+:10EF100001010101010101000000000000000000EA
+:10EF200000000000000000000000000000000000E1
+:10EF300000000000000000000000000000000000D1
+:10EF400000000000000000000000000000000000C1
+:10EF500000000000000000000000000000000000B1
+:10EF600000000000000000000000000000000000A1
+:10EF70000000000000000000000000000000000091
+:10EF80000000000000000000000000000000000081
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB0000000000000000000000000000000000051
+:10EFC0000000000000000000000000000000000041
+:10EFD0000000000000000000000000000000000031
+:10EFE0000000000000000000000000000000000021
+:10EFF00000000000000000020202020202020202FF
+:10F0000002020202020200000000000000000000F4
+:10F0100000000000000000000000000000000000F0
+:10F0200000000000000000000000000000000000E0
+:10F0300000000000000000000000000000000000D0
+:10F0400000000000000000000000000000000000C0
+:10F0500000000000000000000000000000000000B0
+:10F0600000000000000000000000000000000000A0
+:10F070000000000000000000000000000000000090
+:10F080000000000000000000000000000000000080
+:10F090000000000000000000000000000000000070
+:10F0A0000000000000000000000000000000000060
+:10F0B0000000000000000000000000000000000050
+:10F0C0000000000000000000000000000000000040
+:10F0D0000000000000000000000000000000000030
+:10F0E0000000000000000000000000000000000020
+:10F0F0000000000000000000000000000000000010
+:10F10000000000000000000F0000000000000000F0
+:10F1100000000000000000000000000000000000EF
+:10F1200000000000000000000000000000000000DF
+:10F1300000000000000000000000000000000000CF
+:10F1400000000000000000000000000000000000BF
+:10F1500000000000000000000000000000000000AF
+:10F16000000000000000000000000000000000009F
+:10F17000000000000000000000000000000000008F
+:10F18000000000000000000000000000000000007F
+:10F19000000000000000000000000000000000006F
+:10F1A000000000000000000000000000000000005F
+:10F1B000000000000000000000000000000000004F
+:10F1C000000000000000000000000000000000003F
+:10F1D000000000000000000000000000000000002F
+:10F1E000000000000000000000000000000000001F
+:10F1F000000000000000000000000000000000000F
+:10F2000000010001000000000000000001000000FB
+:10F2100000000000000000000000000000000000EE
+:10F2200000000000000000000000000000000000DE
+:10F2300000000000000000000000000000000000CE
+:10F2400000000000000000000000000000000000BE
+:10F2500000000000000000000000000000000000AE
+:10F26000000000000000000000000000000000009E
+:10F27000000000000000000000000000000000008E
+:10F28000000000000000000000000000000000007E
+:10F29000000000000000000000000000000000006E
+:10F2A000000000000000000000000000000000005E
+:10F2B000000000000000000000000000000000004E
+:10F2C000000000000000000000000000000000003E
+:10F2D000000000000000000000000000000000002E
+:10F2E000000000000000000000000000000000001E
+:10F2F000000000000000000000000000000000000E
+:10F3000000010001000000000001000001000000F9
+:10F3100000000000000000000000000000000000ED
+:10F3200000000000000000000000000000000000DD
+:10F3300000000000000000000000000000000000CD
+:10F3400000000000000000000000000000000000BD
+:10F3500000000000000000000000000000000000AD
+:10F36000000000000000000000000000000000009D
+:10F37000000000000000000000000000000000008D
+:10F38000000000000000000000000000000000007D
+:10F39000000000000000000000000000000000006D
+:10F3A000000000000000000000000000000000005D
+:10F3B000000000000000000000000000000000004D
+:10F3C000000000000000000000000000000000003D
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000010001000000000001000001000000F8
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000000000000000000000000000000CC
+:10F4400000000000000000000000000000000000BC
+:10F4500000000000000000000000000000000000AC
+:10F46000000000000000000000000000000000009C
+:10F47000000000000000000000000000000000008C
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000004C
+:10F4C000000000000000000000000000000000003C
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000010001000000000001000001000000F7
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000009B
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B000000000000000000000000000000000004B
+:10F5C000000000000000000000000000000000003B
+:10F5D000000000000000000000000000000000002B
+:10F5E000000000000000000000000000000000001B
+:10F5F000000000000000000000000000000000000B
+:10F6000001010001000000000001000001000000F5
+:10F6100000000000000000000000000000000000EA
+:10F6200000000000000000000000000000000000DA
+:10F6300000000000000000000000000000000000CA
+:10F6400000000000000000000000000000000000BA
+:10F6500000000000000000000000000000000000AA
+:10F66000000000000000000000000000000000009A
+:10F67000000000000000000000000000000000008A
+:10F68000000000000000000000000000000000007A
+:10F69000000000000000000000000000000000006A
+:10F6A000000000000000000000000000000000005A
+:10F6B000000000000000000000000000000000004A
+:10F6C000000000000000000000000000000000003A
+:10F6D000000000000000000000000000000000002A
+:10F6E000000000000000000000000000000000001A
+:10F6F000000000000000000000000000000000000A
+:10F7000001020002000000000001000001000000F2
+:10F7100000000000000000000000000001000100E7
+:10F7200000000000000000000000000000000000D9
+:10F7300000000000000000000000000000000000C9
+:10F7400000000000000000000000000000000000B9
+:10F7500000000000000000000000000000000000A9
+:10F760000000000000000000000000000000000099
+:10F770000000000000000000000000000000000089
+:10F780000000000000000000000000000000000079
+:10F790000000000000000000000000000000000069
+:10F7A0000000000000000000000000000000000059
+:10F7B0000000000000000000000000000000000049
+:10F7C0000000000000000000000000000000000039
+:10F7D0000000000000000000000000000000000029
+:10F7E0000000000000000000000000000000000019
+:10F7F0000000000000000000000000000000000207
+:10F8000002020102000000000001010001000000EE
+:10F8100000000000000000000001000101010100E3
+:10F8200000000000000000000000000000000000D8
+:10F8300000000000000000000000000000000000C8
+:10F8400000000000000000000000000000000000B8
+:10F8500000000000000000000000000000000000A8
+:10F860000000000000000000000000000000000098
+:10F870000000000000000000000000000000000088
+:10F880000000000000000000000000000000000078
+:10F890000000000000000000000000000000000068
+:10F8A0000000000000000000000000000000000058
+:10F8B0000000000000000000000000000000000048
+:10F8C0000000000000000000000000000000000038
+:10F8D0000000000000000000000000000000000028
+:10F8E0000000000000000000000000000000000018
+:10F8F0000000000000000000000000000000000206
+:10F9000002020202010202010102010102000000E2
+:10F9100000000000000000000001010101010100E1
+:10F9200000000000000000000000000000000000D7
+:10F9300000000000000000000000000000000000C7
+:10F9400000000000000000000000000000000000B7
+:10F9500000000000000000000000000000000000A7
+:10F960000000000000000000000000000000000097
+:10F970000000000000000000000000000000000087
+:10F980000000000000000000000000000000000077
+:10F990000000000000000000000000000000000067
+:10F9A0000000000000000000000000000000000057
+:10F9B0000000000000000000000000000000000047
+:10F9C0000000000000000000000000000000000037
+:10F9D0000000000000000000000000000000000027
+:10F9E0000000000000000000000000000000000017
+:10F9F0000000000000000000000000000000000205
+:10FA000002020202020202020102010102000000DF
+:10FA100000000000000000000101010101010100DF
+:10FA200000000000000000000000000000000000D6
+:10FA300000000000000000000000000000000000C6
+:10FA400000000000000000000000000000000000B6
+:10FA500000000000000000000000000000000000A6
+:10FA60000000000000000000000000000000000096
+:10FA70000000000000000000000000000000000086
+:10FA80000000000000000000000000000000000076
+:10FA90000000000000000000000000000000000066
+:10FAA0000000000000000000000000000000000056
+:10FAB0000000000000000000000000000000000046
+:10FAC0000000000000000000000000000000000036
+:10FAD0000000000000000000000000000000000026
+:10FAE0000000000000000000000000000000000016
+:10FAF0000000000000000000000000000000000204
+:10FB000002020202020202020202020102010000DB
+:10FB100000010001000000000101010101010100DC
+:10FB200000000000000000000000000000000000D5
+:10FB300000000000000000000000000000000000C5
+:10FB400000000000000000000000000000000000B5
+:10FB500000000000000000000000000000000000A5
+:10FB60000000000000000000000000000000000095
+:10FB70000000000000000000000000000000000085
+:10FB80000000000000000000000000000000000075
+:10FB90000000000000000000000000000000000065
+:10FBA0000000000000000000000000000000000055
+:10FBB0000000000000000000000000000000000045
+:10FBC0000000000000000000000000000000000035
+:10FBD0000000000000000000000000000000000025
+:10FBE0000000000000000000000000000000000015
+:10FBF0000000000000000000000000000000000203
+:10FC000002020202020202020202020202010000D9
+:10FC100000010001010000010101010101010100D9
+:10FC200000000000000000000000000000000000D4
+:10FC300000000000000000000000000000000000C4
+:10FC400000000000000000000000000000000000B4
+:10FC500000000000000000000000000000000000A4
+:10FC60000000000000000000000000000000000094
+:10FC70000000000000000000000000000000000084
+:10FC80000000000000000000000000000000000074
+:10FC90000000000000000000000000000000000064
+:10FCA0000000000000000000000000000000000054
+:10FCB0000000000000000000000000000000000044
+:10FCC0000000000000000000000000000000000034
+:10FCD0000000000000000000000000000000000024
+:10FCE0000000000000000000000000000000000014
+:10FCF0000000000000000000000000000000000202
+:10FD000002020202020202020202020202020000D7
+:10FD100001010101010000010101010101010100D6
+:10FD200000000000000000000000000000000000D3
+:10FD300000000000000000000000000000000000C3
+:10FD400000000000000000000000000000000000B3
+:10FD500000000000000000000000000000000000A3
+:10FD60000000000000000000000000000000000093
+:10FD70000000000000000000000000000000000083
+:10FD80000000000000000000000000000000000073
+:10FD90000000000000000000000000000000000063
+:10FDA0000000000000000000000000000000000053
+:10FDB0000000000000000000000000000000000043
+:10FDC0000000000000000000000000000000000033
+:10FDD0000000000000000000000000000000000023
+:10FDE0000000000000000000000000000000000013
+:10FDF0000000000000000000000000000000000201
+:10FE000002020202020202020202020202020000D6
+:10FE100001010101010101010101010101010100D3
+:10FE200000000000000000000000000000000000D2
+:10FE300000000000000000000000000000000000C2
+:10FE400000000000000000000000000000000000B2
+:10FE500000000000000000000000000000000000A2
+:10FE60000000000000000000000000000000000092
+:10FE70000000000000000000000000000000000082
+:10FE80000000000000000000000000000000000072
+:10FE90000000000000000000000000000000000062
+:10FEA0000000000000000000000000000000000052
+:10FEB0000000000000000000000000000000000042
+:10FEC0000000000000000000000000000000000032
+:10FED0000000000000000000000000000000000022
+:10FEE0000000000000000000000000000000000012
+:10FEF0000000000000000000000000000000000200
+:10FF000002020202020202020202020202020000D5
+:10FF100000000000000000000000000000000000E1
+:10FF200000000000000000000000000000000000D1
+:10FF300000000000000000000000000000000000C1
+:10FF400000000000000000000000000000000000B1
+:10FF500000000000000000000000000000000000A1
+:10FF60000000000000000000000000000000000091
+:10FF70000000000000000000000000000000000081
+:10FF80000000000000000000000000000000000071
+:10FF90000000000000000000000000000000000061
+:10FFA0000000000000000000000000000000000051
+:10FFB0000000000000000000000000000000000041
+:10FFC0000000000000000000000000000000000031
+:10FFD0000000000000000000000000000000000021
+:10FFE0000000000000000000000000000000000011
+:10FFF0000000000000000000000000000000000001
+:0200000260009C
+:1000000000000000000000000000000000000009E7
+:1000100000000000000000000000000000000000E0
+:1000200000000000000101000000000000000000CE
+:1000300000000000000000000000000000000000C0
+:1000400000000000000000000000000000000000B0
+:1000500000000000000000000000000000000000A0
+:100060000000000000000000000000000000000090
+:100070000000000000000000000000000000000080
+:100080000000000000000000000000000000000070
+:100090000000000000000000000000000000000060
+:1000A0000000000000000000000000000000000050
+:1000B0000000000000000000000000000000000040
+:1000C0000000000000000000000000000000000030
+:1000D0000000000000000000000000000000000020
+:1000E0000000000000000000000000000000000010
+:1000F0000000000000000000000000000000000000
+:1001000000000000000000020100010000000000EB
+:1001100000000101000100000000000000000000DC
+:1001200000000000010101000000000000000000CC
+:1001300000000000000000000000000000000000BF
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000000000000000000000000000008F
+:10017000000000000000000000000000000000007F
+:10018000000000000000000000000000000000006F
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C000000000000000000000000000000000002F
+:1001D000000000000000000000000000000000001F
+:1001E000000000000000000000000000000000000F
+:1001F00000000000000000000000000000000000FF
+:1002000000000000000000020202020101010201E0
+:1002100001010101010100000000000000000000D8
+:1002200000000001010101000000000000000000CA
+:1002300000000000000000000000000000000000BE
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:10028000000000000000000000000000000000006E
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E000000000000000000000000000000000000E
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000020202020202020202DB
+:1003100002010201010100000000000000000000D5
+:1003200000010001010101000000000000000000C8
+:1003300000000000000000000000000000000000BD
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:10038000000000000000000000000000000000006D
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E000000000000000000000000000000000000D
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000020202020202020202DA
+:1004100002020202010100000000000000000000D2
+:1004200000010101010101000000000000000000C6
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000000007C
+:10048000000000000000000000000000000000006C
+:10049000000000000000000000000000000000005C
+:1004A000000000000000000000000000000000004C
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000000000000000000002C
+:1004D000000000000000000000000000000000001C
+:1004E000000000000000000000000000000000000C
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000020202020202020202D9
+:1005100002020202020200000000000101010001CB
+:1005200001010101010101000000000000000000C4
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000020202020202020202D8
+:1006100002020202020200000100010101010001C8
+:1006200001010101010101000000000000000000C3
+:1006300000000000000000000000000000000000BA
+:1006400000000000000000000000000000000000AA
+:10065000000000000000000000000000000000009A
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:10068000000000000000000000000000000000006A
+:10069000000000000000000000000000000000005A
+:1006A000000000000000000000000000000000004A
+:1006B000000000000000000000000000000000003A
+:1006C000000000000000000000000000000000002A
+:1006D000000000000000000000000000000000001A
+:1006E000000000000000000000000000000000000A
+:1006F00000000000000000000000000000000000FA
+:1007000000000000000000020202020202020202D7
+:1007100002020202020200000101010101010101C5
+:1007200001010101010101000000000000000000C2
+:1007300000000000000000000000000000000000B9
+:1007400000000000000000000000000000000000A9
+:100750000000000000000000000000000000000099
+:100760000000000000000000000000000000000089
+:100770000000000000000000000000000000000079
+:100780000000000000000000000000000000000069
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000000029
+:1007D0000000000000000000000000000000000019
+:1007E0000000000000000000000000000000000009
+:1007F00000000000000000000000000000000000F9
+:1008000000000000000000020202020202020202D6
+:1008100002020202020200000000000000000000CC
+:1008200000000000000000000000000000000000C8
+:1008300000000000000000000000000000000000B8
+:1008400000000000000000000000000000000000A8
+:100850000000000000000000000000000000000098
+:100860000000000000000000000000000000000088
+:100870000000000000000000000000000000000078
+:100880000000000000000000000000000000000068
+:100890000000000000000000000000000000000058
+:1008A0000000000000000000000000000000000048
+:1008B0000000000000000000000000000000000038
+:1008C0000000000000000000000000000000000028
+:1008D0000000000000000000000000000000000018
+:1008E0000000000000000000000000000000000008
+:1008F00000000000000000000000000000000000F8
+:1009000000000000000000000000000000000000E7
+:1009100000000000000000090000000000000000CE
+:1009200000000000000000000000000000000100C6
+:1009300000000000000000000000000000000000B7
+:1009400000000000000000000000000000000000A7
+:100950000000000000000000000000000000000097
+:100960000000000000000000000000000000000087
+:100970000000000000000000000000000000000077
+:100980000000000000000000000000000000000067
+:100990000000000000000000000000000000000057
+:1009A0000000000000000000000000000000000047
+:1009B0000000000000000000000000000000000037
+:1009C0000000000000000000000000000000000027
+:1009D0000000000000000000000000000000000017
+:1009E0000000000000000000000000000000000007
+:1009F00000000000000000000000000000000000F7
+:100A000000000000000000000000000000000002E4
+:100A100000000100000101000000010000000000D2
+:100A200000000000000000000100000000000100C4
+:100A300000000000000000000000000000000000B6
+:100A400000000000000000000000000000000000A6
+:100A50000000000000000000000000000000000096
+:100A60000000000000000000000000000000000086
+:100A70000000000000000000000000000000000076
+:100A80000000000000000000000000000000000066
+:100A90000000000000000000000000000000000056
+:100AA0000000000000000000000000000000000046
+:100AB0000000000000000000000000000000000036
+:100AC0000000000000000000000000000000000026
+:100AD0000000000000000000000000000000000016
+:100AE0000000000000000000000000000000000006
+:100AF00000000000000000000000000000000000F6
+:100B000000000000000000000000000000000002E3
+:100B100002010201000101000101010000000000CA
+:100B200000000000000001000100000000010100C1
+:100B300000000000000000000000000000000000B5
+:100B400000000000000000000000000000000000A5
+:100B50000000000000000000000000000000000095
+:100B60000000000000000000000000000000000085
+:100B70000000000000000000000000000000000075
+:100B80000000000000000000000000000000000065
+:100B90000000000000000000000000000000000055
+:100BA0000000000000000000000000000000000045
+:100BB0000000000000000000000000000000000035
+:100BC0000000000000000000000000000000000025
+:100BD0000000000000000000000000000000000015
+:100BE0000000000000000000000000000000000005
+:100BF00000000000000000000000000000000000F5
+:100C000000000000000000000000000000000002E2
+:100C100002020202020201000101020000010000C2
+:100C200000000000000001010101000001010100BD
+:100C300000000000000000000000000000000000B4
+:100C400000000000000000000000000000000000A4
+:100C50000000000000000000000000000000000094
+:100C60000000000000000000000000000000000084
+:100C70000000000000000000000000000000000074
+:100C80000000000000000000000000000000000064
+:100C90000000000000000000000000000000000054
+:100CA0000000000000000000000000000000000044
+:100CB0000000000000000000000000000000000034
+:100CC0000000000000000000000000000000000024
+:100CD0000000000000000000000000000000000014
+:100CE0000000000000000000000000000000000004
+:100CF00000000000000000000000000000000000F4
+:100D000000000000000000000000000000000002E1
+:100D100002020202020202010102020001010000BD
+:100D200000000000000101010101010101010100B9
+:100D300000000000000000000000000000000000B3
+:100D400000000000000000000000000000000000A3
+:100D50000000000000000000000000000000000093
+:100D60000000000000000000000000000000000083
+:100D70000000000000000000000000000000000073
+:100D80000000000000000000000000000000000063
+:100D90000000000000000000000000000000000053
+:100DA0000000000000000000000000000000000043
+:100DB0000000000000000000000000000000000033
+:100DC0000000000000000000000000000000000023
+:100DD0000000000000000000000000000000000013
+:100DE0000000000000000000000000000000000003
+:100DF00000000000000000000000000000000000F3
+:100E000000000000000000000000000000000002E0
+:100E100002020202020202020202020202020000B6
+:100E200000010001000101010101010101010100B6
+:100E300000000000000000000000000000000000B2
+:100E400000000000000000000000000000000000A2
+:100E50000000000000000000000000000000000092
+:100E60000000000000000000000000000000000082
+:100E70000000000000000000000000000000000072
+:100E80000000000000000000000000000000000062
+:100E90000000000000000000000000000000000052
+:100EA0000000000000000000000000000000000042
+:100EB0000000000000000000000000000000000032
+:100EC0000000000000000000000000000000000022
+:100ED0000000000000000000000000000000000012
+:100EE0000000000000000000000000000000000002
+:100EF00000000000000000000000000000000000F2
+:100F000000000000000000000000000000000002DF
+:100F100002020202020202020202020202020000B5
+:100F200000010101010101010101010101010100B3
+:100F300000000000000000000000000000000000B1
+:100F400000000000000000000000000000000000A1
+:100F50000000000000000000000000000000000091
+:100F60000000000000000000000000000000000081
+:100F70000000000000000000000000000000000071
+:100F80000000000000000000000000000000000061
+:100F90000000000000000000000000000000000051
+:100FA0000000000000000000000000000000000041
+:100FB0000000000000000000000000000000000031
+:100FC0000000000000000000000000000000000021
+:100FD0000000000000000000000000000000000011
+:100FE0000000000000000000000000000000000001
+:100FF00000000000000000000000000000000000F1
+:1010000000000000000000000000000000000002DE
+:1010100002020202020202020202020202020000B4
+:1010200001010101010101010101010101010100B1
+:1010300000000000000000000000000000000000B0
+:1010400000000000000000000000000000000000A0
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000000000000000000000070
+:101080000000000000000000000000000000000060
+:101090000000000000000000000000000000000050
+:1010A0000000000000000000000000000000000040
+:1010B0000000000000000000000000000000000030
+:1010C0000000000000000000000000000000000020
+:1010D0000000000000000000000000000000000010
+:1010E0000000000000000000000000000000000000
+:1010F00000000000000000000000000000000000F0
+:1011000000000000000000000000000000000002DD
+:1011100002020202020202020202020202020000B3
+:1011200000000000000000000000000000000000BF
+:1011300000000000000000000000000000000000AF
+:10114000000000000000000000000000000000009F
+:10115000000000000000000000000000000000008F
+:10116000000000000000000000000000000000007F
+:10117000000000000000000000000000000000006F
+:10118000000000000000000000000000000000005F
+:10119000000000000000000000000000000000004F
+:1011A000000000000000000000000000000000003F
+:1011B000000000000000000000000000000000002F
+:1011C000000000000000000000000000000000001F
+:1011D000000000000000000000000000000000000F
+:1011E00000000000000000000000000000000000FF
+:1011F00000000000000000000000000000000000EF
+:1012000000000000000000000000000000000000DE
+:10121000000000000000000000000000000000507E
+:101220001206000000000058620600000000006086
+:10123000AC06000000000068EE0600000000007030
+:1012400031070000000000787107000000000080F6
+:10125000AC07000000000088DF07000000000090DD
+:10126000100800000000009841080000000000A0E5
+:1012700072080000000000A8A3080000000000B0F1
+:10128000D4080000000000B805090000000000506C
+:10129000000000000000000000000001000000004D
+:1012A000000000010100000000000000000000003C
+:1012B000000000000000010000000000000000002D
+:1012C000000000000000000000000000000000011D
+:1012D000000000000000000000000000000000010D
+:1012E00000000000000000000000000000000000FE
+:1012F00000000000000000000000000000010000ED
+:1013000000000000000000000000000000000000DD
+:1013100000000000000000000000000000000000CD
+:1013200000000000000000000000000000000000BD
+:1013300000000000000000000000000000000000AD
+:10134000000000000000000000000000000000009D
+:10135000000000000000000000000000000000008D
+:10136000000000000000010000000000000000007C
+:10137000000000000000000000000000000000006D
+:10138000000000000000000000000000000000005D
+:10139000000000000000000000010001000000004B
+:1013A000000000010100000000000000000000003B
+:1013B000000100000000010000000000000000002B
+:1013C000000000000000000000000000000000011C
+:1013D000000000000000010000000000000000010B
+:1013E00001000000000000000000000000000000FC
+:1013F00000000000000100000000000000010000EB
+:1014000000000000000000000000000000000000DC
+:1014100000000000000000000000000000000000CC
+:1014200000000000000000000000000000000000BC
+:1014300000000000000000000000000000000000AC
+:10144000000000000000000000000000000000009C
+:10145000000000000000000000000000000000008C
+:10146000000000000000010000000000000000007B
+:10147000000000000000000000000000000000006C
+:10148000000000000000000000000000000000005C
+:101490000000000000000000000101010000010048
+:1014A000000000010100000000000000000000003A
+:1014B000000100000000010000000000000000002A
+:1014C000000000000000010000000000000000011A
+:1014D000000000000000010000000000000000010A
+:1014E00001000000000000000000000001010000F9
+:1014F00000000000000100000000000000010000EA
+:1015000000000000000000000000000000000000DB
+:1015100000000000000000000000000000000000CB
+:1015200000000000000100000000000000000000BA
+:1015300000000000000000000000000000000000AB
+:101540000000000000000000010100000000000099
+:10155000000000000000000000000000000000008B
+:10156000000000000000010000000000000000007A
+:10157000000000000000010000000000000000006A
+:10158000000000000000000000000000000000005B
+:101590000000000000000000000101010100010046
+:1015A0000000000101000000000000000000000039
+:1015B0000001000000000100000000000001000028
+:1015C0000000000000000100000000000000000119
+:1015D0000100010000000100000000000000000107
+:1015E00001000000000000000000000101010000F7
+:1015F00000000000000100000000000000010100E8
+:1016000000000000000100000000000000000000D9
+:1016100000000000000000000000000000000000CA
+:1016200000000000000100000000000000000000B9
+:1016300000000000000000000000000000000000AA
+:101640000000000000000000010101000000000097
+:101650000000000001000000000000000000000089
+:101660000000000000000100000000000000000079
+:101670000000000000000100000000000000000069
+:10168000000000000000000000000000000000005A
+:101690000001000000000000000101010100010044
+:1016A0000000010101000000000000010000000036
+:1016B0000001000000000100000001000001000026
+:1016C0000000000000000100000000000000000118
+:1016D0000100010000000100000000000000000106
+:1016E00001000000000000000000000101010000F6
+:1016F00000010000000100000000000000010101E5
+:1017000000000000000100000000000000000000D8
+:1017100000000000000000000000000000000000C9
+:1017200000000000000100000000000000000000B8
+:1017300000000000000000000000000000000000A9
+:101740000000000000000000010101000000000096
+:101750000000000001000000000000000000000088
+:101760000000000000000100000000000000000078
+:101770000000000000000100000000000000000068
+:101780000000000000000000000000000000000059
+:101790000001010000000001010101010100010040
+:1017A0000000010101000001010100010000000032
+:1017B0000001000000000100000001000101000024
+:1017C0000000000000000100000000000000010116
+:1017D0000100010000000100000000000000000105
+:1017E00001000000000000000000000101010100F4
+:1017F00001010101000100000000000000010101E1
+:1018000000000000000100000000000000000000D7
+:1018100000000000000000000000000000000000C8
+:1018200000000000000100000000000000000000B7
+:1018300000000000000000000000000000000000A8
+:101840000000000000000000010101010000000094
+:101850000000000001000100000000000000000185
+:101860000000000000000100000000000000000077
+:101870000000000000000100000000000000000067
+:101880000000000000000000000000000000000058
+:10189000000101000000000101010101010001003F
+:1018A0000000010101000001010100010000000031
+:1018B0000001000100000100000001000101010021
+:1018C0000100000000000100000000000000010114
+:1018D0000100010000000100000000000100000103
+:1018E00001000000000000000000000101010101F2
+:1018F00001010101000100000000000000010101E0
+:1019000000000000000100000000000000000000D6
+:1019100000000000000000000000000000000000C7
+:1019200000000000000100000000000000000000B6
+:1019300000000000000000000000000000000000A7
+:101940000000000000010001010101010000000091
+:101950000000000001000100000000000000000184
+:101960000000000000000100000000000000000076
+:101970000000000000010100000000000000000065
+:101980000000000000000000000000000000000057
+:10199000010101010100000101010101010001003B
+:1019A0000000010101000001010100010000000030
+:1019B000000100010000010100000100010101001F
+:1019C0000100000000000100000000000000010113
+:1019D0000100010000000100000000000100000102
+:1019E00001000000000000000000000101010101F1
+:1019F00001010101000100000000000000010101DF
+:101A000000000001000100000000000000000000D4
+:101A100000000000000100000000000000000000C5
+:101A200000000000000100000000000000000000B5
+:101A300000000000000000000000000000000000A6
+:101A4000000100000001000101010101000000008F
+:101A50000000000001000100000000000000000183
+:101A60000000000000000100000000000000000075
+:101A70000001000000010100000000000000000063
+:101A80000000000000000000000000000101000153
+:101A9000010101010100000101010101010001003A
+:101AA000000001010100000101010001000000002F
+:101AB000000100010100010100000100010101001D
+:101AC0000100000000000100000100000000010111
+:101AD0000100010000000101000000000100000100
+:101AE00001000000000000000000000101010101F0
+:101AF00001010101000100000000000001010101DD
+:101B000000000001000100000000000000000000D3
+:101B100000000000000100000000000000000000C4
+:101B200000000000010100000000000000000000B3
+:101B300000000000000100000000000000000000A4
+:101B4000010101000001000101010101010100008A
+:101B50000000000001000100000000000000000182
+:101B60000100000000000100000000000000000073
+:101B7000010101000101010000000000000000005F
+:101B8000000000000000000000000101010101014F
+:101B90000101010101000001010101010100010138
+:101BA000000001010100000101010001000000002E
+:101BB000000100010100010101010100010101001A
+:101BC0000100000000000100000100000000010110
+:101BD00001000100000101010000000001000001FE
+:101BE00001000000000000000000000101010101EF
+:101BF00001010101000100000000000001010101DC
+:101C000000000101010100000000000000000000D0
+:101C100001000000000100000100000000000001C0
+:101C200000000000010100000000000000000000B2
+:101C300000000000000100000101000001000000A0
+:101C40000101010000010001010101010101010088
+:101C50000000000001010100000000000000000180
+:101C60000100000000000100000000000000000072
+:101C7000010101000101010000000000000000005E
+:101C8000000000000000000000000101010101014E
+:101C90000101010101000001010101010100010137
+:101CA000010001010100000101010001000000002C
+:101CB0000101010101000101010101000101010017
+:101CC000010000000000010001010000000001010E
+:101CD00001010100000101010000000001000001FC
+:101CE00001000000000000000000000101010101EE
+:101CF00001010101000100000000000001010101DB
+:101D000000000101010100000000000000000000CF
+:101D100001010000000100000100000000000001BE
+:101D200000000000010101000000000000000000B0
+:101D3000000000000001000001010100010000009E
+:101D40000101010000010001010101010101010186
+:101D5000000100000101010000000000000000017E
+:101D60000100000001000100000000000000000070
+:101D7000010101000101010000000000000000005D
+:101D8000000000000000000000000101010101014D
+:101D90000101010101000001010101010101010135
+:101DA0000101010101000001010100010100000029
+:101DB0000101010101000101010101000101010016
+:101DC000010000000000010001010000000001010D
+:101DD00001010101000101010000000001000001FA
+:101DE00001000100010000000000000101010101EB
+:101DF00001010101010100000000010001010101D8
+:101E000000000101010100000000000000000000CE
+:101E100001010000000101000101000000000001BB
+:101E200000000000010101000000000000000000AF
+:101E3000000000000001000001010100010100009C
+:101E40000101010000010001010101010101010185
+:101E5000010101010101010000000000000000017A
+:101E6000010000000100010000000000000000006F
+:101E7000010101000101010000000000000000005C
+:101E8000000000000000000000000101010101014C
+:101E90000101010101000001010201020101010132
+:101EA0000101010101000002020100020100000025
+:101EB0000101010101000101010101010101010014
+:101EC000010000000000010101010000000101010A
+:101ED00001010101000101010000000001010001F8
+:101EE00001000100010000000000000101010101EA
+:101EF00001010101010100000000010001010101D7
+:101F000000000101010100000000000000010000CC
+:101F100001010000000101000101000000000001BA
+:101F200001000001010101000000010100000000AA
+:101F3000000000000001000001010100010100009B
+:101F40000101010001010101010101010101010182
+:101F50000101010101010100000000000000000179
+:101F6000010000000100010000000000000000006E
+:101F7000010101000101010000000000000000005B
+:101F8000000100000000000000000101010101014A
+:101F90000101010101000001010202020101010130
+:101FA0000101010101000002020200020100000023
+:101FB0000101010101000101010102010101010111
+:101FC0000101000000000101010101000001010107
+:101FD00001010101000101010000000101010001F6
+:101FE00001000100010000000000000101010101E9
+:101FF00001010101010100000000010001010101D6
+:1020000000000101010100000000000000010000CB
+:1020100001010000010101000101000000000001B8
+:1020200001010001010101000000010100000000A8
+:102030000000000000010000010101000101000199
+:102040000101010001010101010101010101010181
+:102050000101010101010101000000000001000176
+:10206000010000000100010000000000000100006C
+:10207000010101000101010000000000000000005A
+:102080000001010101000000000001010101010146
+:10209000010101010100000202020202010101012D
+:1020A0000101010101000002020201020100000021
+:1020B000010201010101010201010201010201010C
+:1020C0000101000100000101010101000001010105
+:1020D00001010101000101010000000101010001F5
+:1020E00001000100010000000001000101010101E7
+:1020F00001010101010100000000010001010101D5
+:1021000000000101010100000000000000010000CA
+:1021100001010000010101000101000100000001B6
+:1021200001010101010101000000010100000000A6
+:102130000000000000010000010101000101010197
+:102140000101010001010101010101010101010180
+:102150000101010101010101000000000001010174
+:10216000010000000100010000000000000100006B
+:102170000101010001010100000000000000000059
+:102180000001010101000000000001010101010145
+:10219000010101010100000202020202020102012A
+:1021A000010101010100000202020102010100011E
+:1021B0000102010101010102020102010202010109
+:1021C0000101000100000101010101000001010203
+:1021D00001010101000101010000000101010101F3
+:1021E00001000100010001000001010101010101E4
+:1021F00001010101010101000000010001010101D3
+:1022000000000101010100000000000000010100C8
+:1022100001010100010101000101000101000001B3
+:1022200001010101010101000101010101000000A2
+:102230000000000000010000010101000101010196
+:10224000010101000101010101010101010101017F
+:102250000101010101010101010100000001010171
+:10226000010000000100010000000000000100006A
+:102270000101010001010100000000000000000058
+:102280000001010101000000000001010101010144
+:102290000101010101000002020202020201020129
+:1022A000010101010100000202020102010100011D
+:1022B0000102010101010102020202010202020106
+:1022C0000101010100000101010101000101010200
+:1022D00001010101000101010000000101010101F2
+:1022E00001010100010001000001010101010101E2
+:1022F00001010101010101010100010001010101D0
+:1023000000000101010100000000000001010101C5
+:1023100001010100010101000101010101000001B1
+:1023200001010101010101000101010101000000A1
+:102330000000000000010000010101010101010194
+:10234000010101010101010101010101010101017D
+:10235000010101010101010101010100000101016F
+:102360000100000001000100000000000001010068
+:102370000101010101010100000100000000000055
+:102380000001010101000000000001010101010143
+:102390000101010101000002020202020201020128
+:1023A000010101010100000202020102020100011B
+:1023B0000102010201010102020202010202020104
+:1023C00002010101000001010202010001010202FB
+:1023D00002010101010101020000000101010102ED
+:1023E00001010101010001000001010201010101DF
+:1023F00001010101010101010100010001010101CF
+:1024000000000101010101000000000001010101C3
+:1024100001010101010101000101010101010001AE
+:10242000010101010101010001010101010100019E
+:102430000000000000010000010101010101010193
+:10244000010101010101010101010101010101017C
+:10245000010101010101010101010100000101016E
+:102460000100000001000101010100000001010064
+:102470000101010101010100000101000000000053
+:102480000001010101000000000001010101010142
+:102490000101010101000002020202020201020127
+:1024A0000101010201000002020202020201010117
+:1024B0000202010201010102020202020202020101
+:1024C00002010101000001010202010001010202FA
+:1024D00002010201010101020100000102010102E9
+:1024E00002010101010001000001010202010101DC
+:1024F00001010101010101010101010001020101CC
+:1025000000010101010101000001000001010101C0
+:1025100001010101010101000101010101010101AC
+:10252000010101010101010001010101010100019D
+:102530000000000000010000010101010101010192
+:10254000010101010101010101010101010101017B
+:10255000010101010101010101010101000101016C
+:102560000100010101000101010101000001010060
+:102570000101010101010100010101000000000051
+:102580000001010101000000000001010101010141
+:102590000101010101000002020202020201020126
+:1025A0000101020202000002020202020201010114
+:1025B00002020202020102020202020202020201FD
+:1025C00002010101000001020202010101010202F7
+:1025D00002010201010101020100010102010102E7
+:1025E00002010101010001000001010202020101DA
+:1025F00001010101010101010101010001020101CB
+:1026000001010101010101000001010001010101BD
+:1026100001010101010101000101010101010101AB
+:10262000010101010101010101010101010100019B
+:102630000001000000010000010101010101010190
+:10264000010101010101010101010101010101017A
+:10265000010101010101010101010101010101016A
+:10266000010001010100010101010100000101005F
+:10267000010101010101010001010101000000004F
+:102680000001010101000000000001010101010140
+:102690000101010101000002020202020202020223
+:1026A0000101020202010002020202020202010111
+:1026B00002020202020102020202020202020201FC
+:1026C00002010101010001020202020101010202F4
+:1026D00002010201010101020101010102010102E5
+:1026E00002010101010001010101010202020101D7
+:1026F00001010101010101010101010001020201C9
+:1027000001010101010101000001010001010101BC
+:1027100001010101010101000101010101010101AA
+:10272000010101010101010101010101010100019A
+:10273000010100000001010001010101010101018D
+:102740000101010101010101020101010101010178
+:102750000101010101010101010101010101010169
+:10276000010001010100010101010101000101005D
+:10277000010101010101010001010101010100004C
+:10278000000101010100000000000101010101013F
+:102790000101010101000002020202020202020222
+:1027A000020102020201000202020202020201020E
+:1027B00002020202020102020202020202020202FA
+:1027C00002010101010001020202020101020202F2
+:1027D00002010201010101020101010202010102E3
+:1027E00002010101010001010101010202020201D5
+:1027F00001010101010101010101010101020201C7
+:1028000001010101010101000001010101010101BA
+:1028100001010101010101010101010101010101A8
+:102820000101010101010101010101010101000199
+:10283000010100000001010101010101010101018B
+:102840000101010101010101020201010101010176
+:102850000101010101010101010101010101010168
+:10286000010001010100010101010101010101005B
+:10287000010101010101010001010101010100004B
+:10288000000101010101010000000101010101013C
+:102890000101010101000002020202020202020221
+:1028A000020102020201000202020202020202020C
+:1028B00002020202020102020202020202020202F9
+:1028C00002020101010002020202020101020202EF
+:1028D00002020201010101020101010202020102E0
+:1028E00002010101010001010101010202020201D4
+:1028F00002010101010101010101020102020202C2
+:1029000001010101010101000001010101010101B9
+:1029100001010101010101010101010101010101A7
+:102920000101010101010101010101010101000198
+:102930000101010101010101010101010101010187
+:102940000101010101010102020202010101010173
+:102950000101010101010101010101010101010167
+:10296000010001010100010101010101010101005A
+:102970000101010101010100010101010101000149
+:10298000000101010101010000000101010101013B
+:10299000010101010101010202020202020202021E
+:1029A000020202020201000202020202020202020A
+:1029B00002020202020102020202020202020202F8
+:1029C00002020102010002020202020102020202EC
+:1029D00002020202010102020201010202020102DC
+:1029E00002010101010001010102010202020202D1
+:1029F00002020101010101010101020102020202C0
+:102A000001010101010101000001010101010101B8
+:102A100001010101010101010201010101010101A5
+:102A20000101010101010101010101010101000197
+:102A30000101010101010101010101010101010186
+:102A40000101010101010102020202010101010172
+:102A50000101010101010101010101010101010166
+:102A60000101010101000101010101010101010157
+:102A70000101010101010100010101010101010147
+:102A80000101010101010100010101010101010137
+:102A9000010101010101010202020202020202021D
+:102AA0000202020202010002020202020202020209
+:102AB00002020202020202020202020202020202F6
+:102AC00002020202010102020202020202020202E8
+:102AD00002020202010102020201020202020202D9
+:102AE00002010201010001010102020202020202CE
+:102AF00002020201010101020201020102020202BC
+:102B000001010101010101010101010101010101B5
+:102B100001010101010101010201010101010101A4
+:102B20000101010101010101010101010101010195
+:102B30000101010101010101020101010101010184
+:102B40000101010101010102020202020101010170
+:102B50000101010101010101010101010101010165
+:102B60000101010101010101010101010101010155
+:102B70000101010101010101010101010101010145
+:102B80000101010101010100010101010101010136
+:102B9000010101010101010202020202020202021C
+:102BA0000202020202010002020202020202020208
+:102BB00002020202020202020202020202020202F5
+:102BC00002020202010102020202020202020202E7
+:102BD00002020202010102020202020202020202D7
+:102BE00002010201010101010102020202020202CC
+:102BF00002020202010101020201020102020202BA
+:102C000001010101010101010101010101020101B3
+:102C100002010101010101010202010101010101A1
+:102C20000101010101010101010102010101010193
+:102C30000101010101010101020201010101010182
+:102C4000010101010101010202020202010101016F
+:102C50000101010101010101010101010101010164
+:102C60000101010101010101010101010101010154
+:102C70000101010101010101010101010101010144
+:102C80000101010101010100010102010101010134
+:102C9000010101010101010202020202020202021B
+:102CA0000202020202010002020202020202020207
+:102CB00002020202020202020202020202020202F4
+:102CC00002020202010102020202020202020202E6
+:102CD00002020202010202020202020202020202D5
+:102CE00002010201020101020202020202020202C8
+:102CF00002020202010101020202020102020202B8
+:102D000001010101010101010102010101020101B1
+:102D100002010101010101010202010101010101A0
+:102D20000101010101010101020102020101010190
+:102D30000101010101010101020202010101010180
+:102D4000010101010101010202020202010101016E
+:102D50000101010101010102010101010101010162
+:102D60000101010101010101010101010101010153
+:102D70000101010101010101010101010101010143
+:102D80000101010101010100010102020101010132
+:102D9000010101010101010202020202020202021A
+:102DA0000202020202010002020202020202020206
+:102DB00002020202020202020202020202020202F3
+:102DC00002020202020102020202020202020202E4
+:102DD00002020202020202020202020202020202D3
+:102DE00002020201020101020202020202020202C6
+:102DF00002020202010201020202020102020202B6
+:102E000001010202010101010102020102020201AB
+:102E1000020201010101010102020102010101019D
+:102E2000010101010101010102020202010101018E
+:102E3000010101010101010102020201020101017E
+:102E4000010101010101010202020202020101016C
+:102E5000010101010101010202010101010101025F
+:102E60000101010101010101010101010101010152
+:102E70000101010101010101010101010101010142
+:102E80000101010101010100010102020201010130
+:102E90000101010101010102020202020202020219
+:102EA0000202020202010002020202020202020205
+:102EB00002020202020202020202020202020202F2
+:102EC00002020202020102020202020202020202E3
+:102ED00002020202020202020202020202020202D2
+:102EE00002020202020101020202020202020202C4
+:102EF00002020202010201020202020102020202B5
+:102F000001010202010101010102020102020201AA
+:102F1000020201010101010102020202010101029A
+:102F2000010101010101010202020202010101018C
+:102F3000010101010101010102020201020101017D
+:102F4000010101010101010202020202020201016A
+:102F5000010101010101010202020101010101025D
+:102F60000101010101010101010101010101010151
+:102F70000101010101010101010101010101010141
+:102F8000010101010101010001010202020201012E
+:102F90000101010101010102020202020202020218
+:102FA0000202020202010002020202020202020204
+:102FB00002020202020202020202020202020202F1
+:102FC00002020202020102020202020202020202E2
+:102FD00002020202020202020202020202020202D1
+:102FE00002020202020101020202020202020202C3
+:102FF00002020202020201020202020202020202B2
+:1030000001010202020201020202020202020202A3
+:103010000202010101010101020202020201010298
+:10302000010101010101010202020202020101018A
+:10303000010101010101010102020201020201017B
+:103040000201010101010102020202020202020167
+:10305000010101010101010202020201010101025B
+:10306000020101010101010202010101010101014D
+:10307000010101010101010102020101010101013E
+:10308000010101010101010001010202020202012C
+:103090000101010101010102020202020202020217
+:1030A0000202020202010002020202020202020203
+:1030B00002020202020202020202020202020202F0
+:1030C00002020202020102020202020202020202E1
+:1030D00002020202020202020202020202020202D0
+:1030E00002020202020101020202020202020202C2
+:1030F00002020202020201020202020202020202B1
+:1031000001010202020201020202020202020202A2
+:103110000202020101010102020202020201010295
+:103120000201010101010102020202020201010188
+:103130000101010101010101020202020202010179
+:103140000202010101010102020202020202020165
+:103150000101010101010102020202010102010259
+:10316000020101010101010202020101010101014B
+:10317000020101010101010102020201010101013B
+:10318000010101010101010001010202020202022A
+:103190000202010101010102020202020202020214
+:1031A0000202020202020002020202020202020201
+:1031B00002020202020202020202020202020202EF
+:1031C00002020202020102020202020202020202E0
+:1031D00002020202020202020202020202020202CF
+:1031E00002020202020102020202020202020202C0
+:1031F00002020202020201020202020202020202B0
+:1032000002010202020201020202020202020202A0
+:103210000202020102020102020202020202010291
+:103220000201010101020102020202020202010185
+:103230000101010101010102020202020202020176
+:103240000202020101010102020202020202020262
+:103250000101010101010102020202020102020256
+:103260000201010101010102020202010102010148
+:103270000202010101010101020202010101010139
+:103280000101010101010100010102020202020229
+:103290000202020101010102020202020202020212
+:1032A0000202020202020002020202020202020200
+:1032B00002020202020202020202020202020202EE
+:1032C00002020202020202020202020202020202DE
+:1032D00002020202020202020202020202020202CE
+:1032E00002020202020102020202020202020202BF
+:1032F00002020202020201020202020202020202AF
+:10330000020202020202010202020202020202029E
+:10331000020202020202010202020202020202028E
+:103320000202010102020102020202020202010281
+:103330000101010101010102020202020202020274
+:103340000202020101010102020202020202020261
+:103350000201010102010102020202020102020253
+:103360000201010101010202020202010102010146
+:103370000202020101010101020202020101010136
+:103380000101010101010100020102020202020227
+:103390000202020101010102020202020202020211
+:1033A00002020202020200020202020202020202FF
+:1033B00002020202020202020202020202020202ED
+:1033C00002020202020202020202020202020202DD
+:1033D00002020202020202020202020202020202CD
+:1033E00002020202020102020202020202020202BE
+:1033F00002020202020201020202020202020202AE
+:10340000020202020202010202020202020202029D
+:10341000020202020202010202020202020202028D
+:10342000020202020202010202020202020201027E
+:103430000101010101010102020202020202020273
+:103440000202020101010102020202020202020260
+:103450000202010102010102020202020202020250
+:103460000201010101010202020202020102020143
+:103470000202020101010102020202020101010134
+:103480000101010101010100020202020202020225
+:10349000020202020101010202020202020202020F
+:1034A00002020202020200020202020202020202FE
+:1034B00002020202020202020202020202020202EC
+:1034C00002020202020202020202020202020202DC
+:1034D00002020202020202020202020202020202CC
+:1034E00002020202020102020202020202020202BD
+:1034F00002020202020201020202020202020202AD
+:10350000020202020202010202020202020202029C
+:10351000020202020202020202020202020202028B
+:10352000020202020202010202020202020201027D
+:103530000201010101020102020202020202020270
+:10354000020202010101010202020202020202025F
+:10355000020202010201010202020202020202024E
+:103560000201010101010202020202020102020142
+:103570000202020101010202020202020201010131
+:103580000102010101010100020202020202020223
+:10359000020202020201010202020202020202020D
+:1035A00002020202020200020202020202020202FD
+:1035B00002020202020202020202020202020202EB
+:1035C00002020202020202020202020202020202DB
+:1035D00002020202020202020202020202020202CB
+:1035E00002020202020102020202020202020202BC
+:1035F00002020202020202020202020202020202AB
+:10360000020202020202010202020202020202029B
+:10361000020202020202020202020202020202028A
+:10362000020202020202010202020202020202027B
+:10363000020201010102010202020202020202026E
+:10364000020202010102010202020202020202025D
+:10365000020202020201010202020202020202024C
+:10366000020101010201020202020202020202013F
+:10367000020202010201020202020202020201012E
+:103680000102020101010100020202020202020221
+:10369000020202020201010202020202020202020C
+:1036A00002020202020200020202020202020202FC
+:1036B00002020202020202020202020202020202EA
+:1036C00002020202020202020202020202020202DA
+:1036D00002020202020202020202020202020202CA
+:1036E00002020202020202020202020202020202BA
+:1036F00002020202020202020202020202020202AA
+:10370000020202020202010202020202020202029A
+:103710000202020202020202020202020202020289
+:10372000020202020202010202020202020202027A
+:10373000020201010102010202020202020202026D
+:10374000020202010202010202020202020202025B
+:10375000020202020201020202020202020202024A
+:10376000020101010201020202020202020202013E
+:10377000020202010202020202020202020201012C
+:10378000010202020101010002020202020202021F
+:10379000020202020201010202020202020202020B
+:1037A00002020202020200020202020202020202FB
+:1037B00002020202020202020202020202020202E9
+:1037C00002020202020202020202020202020202D9
+:1037D00002020202020202020202020202020202C9
+:1037E00002020202020202020202020202020202B9
+:1037F00002020202020202020202020202020202A9
+:103800000202020202020202020202020202020298
+:103810000202020202020202020202020202020288
+:103820000202020202020202020202020202020278
+:10383000020202010102010202020202020202026B
+:103840000202020202020102020202020202020259
+:103850000202020202010202020202020202020249
+:10386000020102010201020202020202020202013C
+:10387000020202010202020202020202020202012A
+:10388000010202020201010002020202020202021D
+:10389000020202020201010202020202020202020A
+:1038A00002020202020200020202020202020202FA
+:1038B00002020202020202020202020202020202E8
+:1038C00002020202020202020202020202020202D8
+:1038D00002020202020202020202020202020202C8
+:1038E00002020202020202020202020202020202B8
+:1038F00002020202020202020202020202020202A8
+:103900000202020202020202020202020202020297
+:103910000202020202020202020202020202020287
+:103920000202020202020202020202020202020277
+:103930000202020201020102020202020202020269
+:103940000202020202020102020202020202020258
+:103950000202020202020202020202020202020247
+:10396000020102020201020202020202020202013A
+:103970000202020202020202020202020202020227
+:10398000010202020201010002020202020202021C
+:103990000202020202010102020202020202020209
+:1039A00002020202020200020202020202020202F9
+:1039B00002020202020202020202020202020202E7
+:1039C00002020202020202020202020202020202D7
+:1039D00002020202020202020202020202020202C7
+:1039E00002020202020202020202020202020202B7
+:1039F00002020202020202020202020202020202A7
+:103A00000202020202020202020202020202020296
+:103A10000202020202020202020202020202020286
+:103A20000202020202020202020202020202020276
+:103A30000202020202020102020202020202020267
+:103A40000202020202020202020202020202020256
+:103A50000202020202020202020202020202020246
+:103A60000201020202010202020202020202020238
+:103A70000202020202020202020202020202020226
+:103A8000020202020201010002020202020202021A
+:103A90000202020202010102020202020202020208
+:103AA00002020202020200020202020202020202F8
+:103AB00002020202020202020202020202020202E6
+:103AC00002020202020202020202020202020202D6
+:103AD00002020202020202020202020202020202C6
+:103AE00002020202020202020202020202020202B6
+:103AF00002020202020202020202020202020202A6
+:103B00000202020202020202020202020202020295
+:103B10000202020202020202020202020202020285
+:103B20000202020202020202020202020202020275
+:103B30000202020202020102020202020202020266
+:103B40000202020202020202020202020202020255
+:103B50000202020202020202020202020202020245
+:103B60000202020202010202020202020202020236
+:103B70000202020202020202020202020202020225
+:103B80000202020202010100020202020202020219
+:103B90000202020202010102020202020202020207
+:103BA00002020202020200020202020202020202F7
+:103BB00002020201010102020202020202020202E8
+:103BC00002020202020202020202020202020202D5
+:103BD00002020202020202020202020202020202C5
+:103BE00002020202020202020202020202020202B5
+:103BF00002020202020202020202020202020202A5
+:103C00000202020202020202020202020202020294
+:103C10000202020202020202020202020202020284
+:103C20000202020202020202020202020202020274
+:103C30000202020202020102020202020202020265
+:103C40000202020202020202020202020202020254
+:103C50000202020202020202020202020202020244
+:103C60000202020202010202020202020202020235
+:103C70000202020202020202020202020202020224
+:103C80000202020202010100020202020202020218
+:103C90000202020202010102020202020202020206
+:103CA00002020202020200020202020202020202F6
+:103CB00002010101010101020202020202020202EA
+:103CC00002020202020202020202020202020202D4
+:103CD00002020202020202020202020202020202C4
+:103CE00002020202020202020202020202020202B4
+:103CF00002020202020202020202020202020202A4
+:103D00000202020202020202020202020202020293
+:103D10000202020202020202020202020202020283
+:103D20000202020202020202020202020202020273
+:103D30000202020202020202020202020202020263
+:103D40000202020202020202020202020202020253
+:103D50000202020202020202020202020202020243
+:103D60000202020202010202020202020202020234
+:103D70000202020202020202020202020202020223
+:103D80000202020202010102020202020202020215
+:103D90000202020202010102020202020202020205
+:103DA00002020202020200020202020202020202F5
+:103DB00001010101010101020202020202020202EA
+:103DC00002020202020202020202020202020202D3
+:103DD00002020202020202020202020202020202C3
+:103DE00002020202020202020202020202020202B3
+:103DF00002020202020202020202020202020202A3
+:103E00000202020202020202020202020202020292
+:103E10000202020202020202020202020202020282
+:103E20000202020202020202020202020202020272
+:103E30000202020202020202020202020202020262
+:103E40000202020202020202020202020202020252
+:103E50000202020202020202020202020202020242
+:103E60000202020202010202020202020202020233
+:103E70000202020202020202020202020202020222
+:103E80000202020202010102020202020202020214
+:103E90000202020202010102020202020202020204
+:103EA00002020202020200020202020202020201F5
+:103EB00001010101010101020202020202020202E9
+:103EC00002020201010202020202020202020202D4
+:103ED00002020202020202020202020202020202C2
+:103EE00002020202020202020202020202020202B2
+:103EF00002020202020202020202020202020202A2
+:103F00000202020202020202020202020202020291
+:103F10000202020202020202020202020202020281
+:103F20000202020202020202020202020202020271
+:103F30000202020202020202020202020202020261
+:103F40000202020202020202020202020202020251
+:103F50000202020202020202020202020202020241
+:103F60000202020202010202020202020202020232
+:103F70000202020202020202020202020202020221
+:103F80000202020202020102020202020202020212
+:103F90000202020202010102020202020202020203
+:103FA00002020202020200020202020101010101F8
+:103FB00001010101010101020202020202020202E8
+:103FC00001010101010101020202020202020202D8
+:103FD00002020202020202020202020202020202C1
+:103FE00002020202020202020202020202020202B1
+:103FF00002020202020202020202020202020202A1
+:104000000202020202020202020202020202020290
+:104010000202020202020202020202020202020280
+:104020000202020202020202020202020202020270
+:104030000202020202020202020202020202020260
+:104040000202020202020202020202020202020250
+:104050000202020202020202020202020202020240
+:104060000202020202010202020202020202020231
+:104070000202020202020202020202020202020220
+:104080000202020202020202020202020202020210
+:104090000202020202020102020202020202020201
+:1040A00002020101010100020202020101010101FB
+:1040B00001010101010101020202020202010101EA
+:1040C00001010101010101020202020202020202D7
+:1040D00002020101010202020202020202020202C3
+:1040E00002020202020202020202020202020202B0
+:1040F00002020202020202020202020202020202A0
+:10410000020202020202020202020202020202028F
+:10411000020202020202020202020202020202027F
+:10412000020202020202020202020202020202026F
+:10413000020202020202020202020202020202025F
+:10414000020202020202020202020202020202024F
+:10415000020202020202020202020202020202023F
+:10416000020202020202020202020202020202022F
+:10417000020202020202020202020202020202021F
+:10418000020202020202020202020202020202020F
+:104190000202020202020202020202020202010101
+:1041A0000101010101010001010101010101010100
+:1041B00001010101010101020202020201010101EA
+:1041C00001010101010101020202020202020201D7
+:1041D00001010101010101020202020202020202C6
+:1041E00002020202020202020202020202020202AF
+:1041F000020202020202020202020202020202029F
+:10420000020202020202020202020202020202028E
+:10421000020202020202020202020202020202027E
+:10422000020202020202020202020202020202026E
+:10423000020202020202020202020202020202025E
+:10424000020202020202020202020202020202024E
+:10425000020202020202020202020202020202023E
+:10426000020202020202020202020202020202022E
+:10427000020202020202020202020202020202021E
+:10428000020202020202020202020202020202020E
+:104290000202020202020202020202010101010103
+:1042A00001010101010101010101010101010101FE
+:1042B00001010101010101020202010101010101EB
+:1042C00001010101010101020202020202020101D7
+:1042D00001010101010101020202020202020202C5
+:1042E00002020202020202020202020202020202AE
+:1042F000020202020202020202020202020202029E
+:10430000020202020202020202020202020202028D
+:10431000020202020202020202020202020202027D
+:10432000020202020202020202020202020202026D
+:10433000020202020202020202020202020202025D
+:10434000020202020202020202020202020202024D
+:10435000020202020202020202020202020202023D
+:10436000020202020202020202020202020202022D
+:10437000020202020202020202020202020202021D
+:10438000020202020202020202020202020202020D
+:104390000202020202020202020101010101010104
+:1043A00001010101010101010101010101010101FD
+:1043B00001010101010101010101010101010101ED
+:1043C00001010101010101020202020202010101D7
+:1043D00001010101010101020202020202020202C4
+:1043E00002020101010201020202020202020202B1
+:1043F000020202020202020202020202020202029D
+:10440000020202020202020202020202020202028C
+:10441000020202020202020202020202020202027C
+:10442000020202020202020202020202020202026C
+:10443000020202020202020202020202020202025C
+:10444000020202020202020202020202020202024C
+:10445000020202020202020202020202020202023C
+:10446000020202020202020202020202020202022C
+:10447000020202020202020202020202020202021C
+:10448000020202020202020202020202020202020C
+:104490000202020202020201010101010101010105
+:1044A00001010101010101010101010101010101FC
+:1044B00001010101010101010101010101010101EC
+:1044C00001010101010101020202020201010101D7
+:1044D00001010101010101020202020202020201C4
+:1044E00001010101010101020202020202020202B3
+:1044F000020202020202020202020202020202029C
+:10450000020202020202020202020202020202028B
+:10451000020202020202020202020202020202027B
+:10452000020202020202020202020202020202026B
+:10453000020202020202020202020202020202025B
+:10454000020202020202020202020202020202024B
+:10455000020202020202020202020202020202023B
+:10456000020202020202020202020202020202022B
+:10457000020202020202020202020202020202021B
+:10458000020202020202020202020202020202020B
+:104590000202020202020201010101010101010104
+:1045A00001010101010101010101010101010101FB
+:1045B00001010101010101010101010101010101EB
+:1045C00001010101010101020101010101010101DA
+:1045D00001010101010101020202020201010101C6
+:1045E00001010101010101020202020202020202B2
+:1045F000020202020202020202020202020202029B
+:10460000020202020202020202020202020202028A
+:10461000020202020202020202020202020202027A
+:10462000020202020202020202020202020202026A
+:10463000020202020202020202020202020202025A
+:10464000020202020202020202020202020202024A
+:10465000020202020202020202020202020202023A
+:10466000020202020202020202020202020202022A
+:10467000020202020202020202020202020202021A
+:10468000020202020202020202020202020202020A
+:104690000202020202020201010101010101010103
+:1046A00001010101010101010101010101010101FA
+:1046B00001010101010101010101010101010101EA
+:1046C00001010101010101010101010101010101DA
+:1046D00001010101010101020202020101010101C6
+:1046E00001010101010101020202020202020202B1
+:1046F000020202020202020202020202020202029A
+:104700000202020202020202020202020202020289
+:104710000202020202020202020202020202020279
+:104720000202020202020202020202020202020269
+:104730000202020202020202020202020202020259
+:104740000202020202020202020202020202020249
+:104750000202020202020202020202020202020239
+:104760000202020202020202020202020202020229
+:104770000202020202020202020202020202020219
+:104780000202020202020202020202020202020209
+:104790000202020202020201010101010101010102
+:1047A00001010101010101010101010101010101F9
+:1047B00001010101010101010101010101010101E9
+:1047C00001010101010101010101010101010101D9
+:1047D00001010101010101010202010101010101C7
+:1047E00001010101010101020202020202020202B0
+:1047F0000202020202020202020202020202020299
+:104800000202020202020202020202020202020288
+:104810000202020202020202020202020202020278
+:104820000202020202020202020202020202020268
+:104830000202020202020202020202020202020258
+:104840000202020202020202020202020202020248
+:104850000202020202020202020202020202020238
+:104860000202020202020202020202020202020228
+:104870000202020202020202020202020202020218
+:104880000202020202020202020202020202020208
+:104890000202020202020201010101010101010101
+:1048A00001010101010101010101010101010101F8
+:1048B00001010101010101010101010101010101E8
+:1048C00001010101010101010101010101010101D8
+:1048D00001010101010101010101010101010101C8
+:1048E00001010101010101020202020202020202AF
+:1048F000010101010102020202020202020202029D
+:104900000202020202020202020202020202020287
+:104910000202020202020202020202020202020277
+:104920000202020202020202020202020202020267
+:104930000202020202020202020202020202020257
+:104940000202020202020202020202020202020247
+:104950000202020202020202020202020202020237
+:104960000202020202020202020202020202020227
+:104970000202020202020202020202020202020217
+:104980000202020202020202020202020202020207
+:104990000202020202020201010101010101010100
+:1049A00001010101010101010101010101010101F7
+:1049B00001010101010101010101010101010101E7
+:1049C00001010101010101010101010101010101D7
+:1049D00001010101010101010101010101010101C7
+:1049E00001010101010101020202020101010101B3
+:1049F000010101010101010202020202020202029E
+:104A00000202020202020202020202020202020286
+:104A10000202020202020202020202020202020276
+:104A20000202020202020202020202020202020266
+:104A30000202020202020202020202020202020256
+:104A40000202020202020202020202020202020246
+:104A50000202020202020202020202020202020236
+:104A60000202020202020202020202020202020226
+:104A70000202020202020202020202020202020216
+:104A80000202020202020202020202020202020206
+:104A900002020202020202010101010101010101FF
+:104AA00001010101010101010101010101010101F6
+:104AB00001010101010101010101010101010101E6
+:104AC00001010101010101010101010101010101D6
+:104AD00001010101010101010101010101010101C6
+:104AE00001010101010101020202020101010101B2
+:104AF00001010101010101020202020202010101A0
+:104B00000202010101020202020202020202020288
+:104B1000010101010102020202020202020202027A
+:104B20000202020202020202020202020202020265
+:104B30000202020202020202020202020202020255
+:104B40000202020202020202020202020202020245
+:104B50000202020202020202020202020202020235
+:104B60000202020202020202020202020202020225
+:104B70000202020202020202020202020202020215
+:104B80000202020202020202020202020202020205
+:104B900002020202020202010101010101010101FE
+:104BA00001010101010101010101010101010101F5
+:104BB00001010101010101010101010101010101E5
+:104BC00001010101010101010101010101010101D5
+:104BD00001010101010101010101010101010101C5
+:104BE00001010101010101020201010101010101B3
+:104BF00001010101010101020202020201010101A0
+:104C0000010101010101010202020202020101018E
+:104C1000010101010101010202020202020202027B
+:104C20000202020202020202020202020202020264
+:104C30000202020202020202020202020202020254
+:104C40000202020202020202020202020202020244
+:104C50000202020202020202020202020202020234
+:104C60000202020202020202020202020202020224
+:104C70000202020202020202020202020202020214
+:104C80000202020202020202020202020202020204
+:104C900002020202020202010101010101010101FD
+:104CA00001010101010101010101010101010101F4
+:104CB00001010101010101010101010101010101E4
+:104CC00001010101010101010101010101010101D4
+:104CD00001010101010101010101010101010101C4
+:104CE00001010101010101010101010101010101B4
+:104CF00001010101010101020202010201010101A0
+:104D0000010101010101010202020202010101018E
+:104D1000010101010101010202020202020202027A
+:104D20000202020202020202020202020202020263
+:104D30000202020202020202020202020202020253
+:104D40000202020202020202020202020202020243
+:104D50000202020202020202020202020202020233
+:104D60000202020202020202020202020202020223
+:104D70000202020202020202020202020202020213
+:104D80000202020202020202020202020202020203
+:104D900002020202020202010101010101010101FC
+:104DA00001010101010101010101010101010101F3
+:104DB00001010101010101010101010101010101E3
+:104DC00001010101010101010101010101010101D3
+:104DD00001010101010101010101010101010101C3
+:104DE00001010101010101010101010101010101B3
+:104DF00001010101010101010101010101010101A3
+:104E00000101010101010102020101010101010190
+:104E10000101010101010102020202020202020279
+:104E20000202020202020202020202020202020262
+:104E30000202020202020202020202020202020252
+:104E40000202020202020202020202020202020242
+:104E50000202020202020202020202020202020232
+:104E60000202020202020202020202020202020222
+:104E70000202020202020202020202020202020212
+:104E80000202020202020202020202020202020202
+:104E900002020202020202010101010101010101FB
+:104EA00001010101010101010101010101010101F2
+:104EB00001010101010101010101010101010101E2
+:104EC00001010101010101010101010101010101D2
+:104ED00001010101010101010101010101010101C2
+:104EE00001010101010101010101010101010101B2
+:104EF00001010101010101010101010101010101A2
+:104F00000101010101010101010101010101010191
+:104F10000101010101010102020202020202020278
+:104F20000202020202020202020202020202020261
+:104F30000202020202020202020202020202020251
+:104F40000202020202020202020202020202020241
+:104F50000202020202020202020202020202020231
+:104F60000202020202020202020202020202020221
+:104F70000202020202020202020202020202020211
+:104F80000202020202020202020202020202020201
+:104F900002020202020202010101010101010101FA
+:104FA00001010101010101010101010101010101F1
+:104FB00001010101010101010101010101010101E1
+:104FC00001010101010101010101010101010101D1
+:104FD00001010101010101010101010101010101C1
+:104FE00001010101010101010101010101010101B1
+:104FF00001010101010101010101010101010101A1
+:105000000101010101010101010101010101010190
+:105010000101010101010102020202020202020277
+:105020000202020202020202020202020202020260
+:105030000202020202020202020202020202020250
+:105040000202020202020202020202020202020240
+:105050000202020202020202020202020202020230
+:105060000202020202020202020202020202020220
+:105070000202020202020202020202020202020210
+:105080000202020202020202020202020202020200
+:1050900002020202020202010101010101010101F9
+:1050A00001010101010101010101010101010101F0
+:1050B00001010101010101010101010101010101E0
+:1050C00001010101010101010101010101010101D0
+:1050D00001010101010101010101010101010101C0
+:1050E00001010101010101010101010101010101B0
+:1050F00001010101010101010101010101010101A0
+:10510000010101010101010101010101010101018F
+:105110000101010101010102020202020202020177
+:105120000101010101010202020202020202020166
+:105130000101010101010202020202020202020255
+:10514000020202020202020202020202020202023F
+:10515000020202020202020202020202020202022F
+:10516000020202020202020202020202020202021F
+:10517000020202020202020202020202020202020F
+:1051800002020202020202020202020202020202FF
+:1051900002020202020202010101010101010101F8
+:1051A00001010101010101010101010101010101EF
+:1051B00001010101010101010101010101010101DF
+:1051C00001010101010101010101010101010101CF
+:1051D00001010101010101010101010101010101BF
+:1051E00001010101010101010101010101010101AF
+:1051F000010101010101010101010101010101019F
+:10520000010101010101010101010101010101018E
+:10521000010101010101010202020201010101017A
+:10522000010101010101010202020101010101016B
+:105230000101010101010102020202020202020255
+:10524000020202020202020202020202020202023E
+:10525000020202020202020202020202020202022E
+:10526000020202020202020202020202020202021E
+:10527000020202020202020202020202020202020E
+:1052800002020202020202020202020202020202FE
+:1052900002020202020202010101010101010101F7
+:1052A00001010101010101010101010101010101EE
+:1052B00001010101010101010101010101010101DE
+:1052C00001010101010101010101010101010101CE
+:1052D00001010101010101010101010101010101BE
+:1052E00001010101010101010101010101010101AE
+:1052F000010101010101010101010101010101019E
+:10530000010101010101010101010101010101018D
+:10531000010101010101010201010101010101017C
+:10532000010101010101010101010101010101016D
+:105330000101010101010102020202020202020254
+:10534000020202020202020202020202020202023D
+:10535000020202020202020202020202020202022D
+:10536000020202020202020202020202020202021D
+:10537000020202020202020202020202020202020D
+:1053800002020202020202020202020202020202FD
+:1053900002020202020202010101010101010101F6
+:1053A00001010101010101010101010101010101ED
+:1053B00001010101010101010101010101010101DD
+:1053C00001010101010101010101010101010101CD
+:1053D00001010101010101010101010101010101BD
+:1053E00001010101010101010101010101010101AD
+:1053F000010101010101010101010101010101019D
+:10540000010101010101010101010101010101018C
+:10541000010101010101010101010101010101017C
+:10542000010101010101010101010101010101016C
+:105430000101010101010102020202020202020253
+:10544000010101020202020202020202020202023F
+:10545000020202020202020202020202020202022C
+:10546000020202020202020202020202020202021C
+:10547000020202020202020202020202020202020C
+:1054800002020202020202020202020202020202FC
+:1054900002020202020202010101010101010101F5
+:1054A00001010101010101010101010101010101EC
+:1054B00001010101010101010101010101010101DC
+:1054C00001010101010101010101010101010101CC
+:1054D00001010101010101010101010101010101BC
+:1054E00001010101010101010101010101010101AC
+:1054F000010101010101010101010101010101019C
+:10550000010101010101010101010101010101018B
+:10551000010101010101010101010101010101017B
+:10552000010101010101010101010101010101016B
+:105530000101010101010102020202020101010156
+:105540000101010101010102020202020202020242
+:10555000020202020202020202020202020202012C
+:10556000010202020202010202020202020202021D
+:10557000020202020202020202020202020202020B
+:1055800002020202020202020202020202020202FB
+:1055900002020202020202010101010101010101F4
+:1055A00001010101010101010101010101010101EB
+:1055B00001010101010101010101010101010101DB
+:1055C00001010101010101010101010101010101CB
+:1055D00001010101010101010101010101010101BB
+:1055E00001010101010101010101010101010101AB
+:1055F000010101010101010101010101010101019B
+:10560000010101010101010101010101010101018A
+:10561000010101010101010101010101010101017A
+:10562000010101010101010101010101010101016A
+:105630000101010101010102010101010101010159
+:10564000010101010101010101010101010101014A
+:105650000101010101020102020202020201010133
+:10566000010201010102010202020202020202021F
+:10567000020202020202020202020202020202020A
+:1056800002020202020202020202020202020202FA
+:1056900002020202020202010101010101010101F3
+:1056A00001010101010101010101010101010101EA
+:1056B00001010101010101010101010101010101DA
+:1056C00001010101010101010101010101010101CA
+:1056D00001010101010101010101010101010101BA
+:1056E00001010101010101010101010101010101AA
+:1056F000010101010101010101010101010101019A
+:105700000101010101010101010101010101010189
+:105710000101010101010101010101010101010179
+:105720000101010101010101010101010101010169
+:105730000101010101010101010101010101010159
+:105740000101010101010101010101010101010149
+:105750000101010101010101010101010101010139
+:10576000010101010102010202020202020202021F
+:10577000010101020202010202020202020202020D
+:1057800002020202020202020202020202020202F9
+:1057900002020202020202010101010101010101F2
+:1057A00001010101010101010101010101010101E9
+:1057B00001010101010101010101010101010101D9
+:1057C00001010101010101010101010101010101C9
+:1057D00001010101010101010101010101010101B9
+:1057E00001010101010101010101010101010101A9
+:1057F0000101010101010101010101010101010199
+:105800000101010101010101010101010101010188
+:105810000101010101010101010101010101010178
+:105820000101010101010101010101010101010168
+:105830000101010101010101010101010101010158
+:105840000101010101010101010101010101010148
+:105850000101010101010101010101010101010138
+:105860000101010101010102020202020201010221
+:10587000010101010101010202020202020202020F
+:1058800002020202020202020202020202020202F8
+:1058900002020202020202010101010101010101F1
+:1058A00001010101010101010101010101010101E8
+:1058B00001010101010101010101010101010101D8
+:1058C00001010101010101010101010101010101C8
+:1058D00001010101010101010101010101010101B8
+:1058E00001010101010101010101010101010101A8
+:1058F0000101010101010101010101010101010198
+:105900000101010101010101010101010101010187
+:105910000101010101010101010101010101010177
+:105920000101010101010101010101010101010167
+:105930000101010101010101010101010101010157
+:105940000101010101010101010101010101010147
+:105950000101010101010101010101010101010137
+:105960000101010101010101010101010101010127
+:10597000010101010101010202020202020202020E
+:105980000201010101020202020201010101010101
+:1059900001010101010202010101010101010101F5
+:1059A00001010101010101010101010101010101E7
+:1059B00001010101010101010101010101010101D7
+:1059C00001010101010101010101010101010101C7
+:1059D00001010101010101010101010101010101B7
+:1059E00001010101010101010101010101010101A7
+:1059F0000101010101010101010101010101010197
+:105A00000101010101010101010101010101010186
+:105A10000101010101010101010101010101010176
+:105A20000101010101010101010101010101010166
+:105A30000101010101010101010101010101010156
+:105A40000101010101010101010101010101010146
+:105A50000101010101010101010101010101010136
+:105A60000101010101010101010101010101010126
+:105A70000101010101010102010101010101010115
+:105A80000101010101010100010101010101010107
+:105A900001010101010101010101010101010101F6
+:105AA00001010101010101010101010101010101E6
+:105AB00001010101010101010101010101010101D6
+:105AC00001010101010101010101010101010101C6
+:105AD00001010101010101010101010101010101B6
+:105AE00001010101010101010101010101010101A6
+:105AF0000101010101010101010101010101010196
+:105B00000101010101010101010101010101010185
+:105B10000101010101010101010101010101010175
+:105B20000101010101010101010101010101010165
+:105B30000101010101010101010101010101010155
+:105B40000101010101010101010101010101010145
+:105B50000101010101010101010101010101010135
+:105B60000101010101010101010101010101010125
+:105B70000101010101010101010101010101010115
+:105B8000010101010101010000000000000000000E
+:105B900000000000000000010101010101010101FC
+:105BA00001010101010101010101010101010101E5
+:105BB00001010101010101010101010101010101D5
+:105BC00001010101010101010101010101010101C5
+:105BD00001010101010101010101010101010101B5
+:105BE00001010101010101010101010101010101A5
+:105BF0000101010101010101010101010101010195
+:105C00000101010101010101010101010101010184
+:105C10000101010101010101010101010101010174
+:105C20000101010101010101010101010101010164
+:105C30000101010101010101010101010101010154
+:105C40000101010101010101010101010101010144
+:105C50000101010101010101010101010101010134
+:105C60000101010101010101010101010101010124
+:105C70000101010101010101010101010101010114
+:105C8000010101010101010000000000000000000D
+:105C900000000000000000010101010101010101FB
+:105CA00001010101010101010101010101010101E4
+:105CB00001010101010101010101010101010101D4
+:105CC00001010101010101010101010101010101C4
+:105CD00001010101010101010101010101010101B4
+:105CE00001010101010101010101010101010101A4
+:105CF0000101010101010101010101010101010194
+:105D00000101010101010101010101010101010183
+:105D10000101010101010101010101010101010173
+:105D20000101010101010101010101010101010163
+:105D30000101010101010101010101010101010153
+:105D40000101010101010101010101010101010143
+:105D50000101010101010101010101010101010133
+:105D60000101010101010101010101010101010123
+:105D70000101010101010101010101010101010113
+:105D8000010101010101010000000000000000000C
+:105D900000000000000000010101010101010101FA
+:105DA00001010101010101010101010101010101E3
+:105DB00001010101010101010101010101010101D3
+:105DC00001010101010101010101010101010101C3
+:105DD00001010101010101010101010101010101B3
+:105DE00001010101010101010101010101010101A3
+:105DF0000101010101010101010101010101010193
+:105E00000101010101010101010101010101010182
+:105E10000101010101010101010101010101010172
+:105E20000101010101010101010101010101010162
+:105E30000101010101010101010101010101010152
+:105E40000101010101010101010101010101010142
+:105E50000101010101010101010101010101010132
+:105E60000101010101010101010101010101010122
+:105E70000101010101010101010101010101010112
+:105E8000010101010101010000000000000000000B
+:105E900000000000000000010101010101010101F9
+:105EA00001010101010101010101010101010101E2
+:105EB00001010101010101010101010101010101D2
+:105EC00001010101010101010101010101010101C2
+:105ED00001010101010101010101010101010101B2
+:105EE00001010101010101010101010101010101A2
+:105EF0000101010101010101010101010101010192
+:105F00000101010101010101010101010101010181
+:105F10000101010101010101010101010101010171
+:105F20000101010101010101010101010101010161
+:105F30000101010101010101010101010101010151
+:105F40000101010101010101010101010101010141
+:105F50000101010101010101010101010101010131
+:105F60000101010101010101010101010101010121
+:105F70000101010101010101010101010101010111
+:105F8000010101010101010000000000000000000A
+:105F90000000000000000000000000000000000001
+:105FA00000000000000000020202020202020202DF
+:105FB00002020202020202020202020202020202C1
+:105FC00002020202020202020202020202020202B1
+:105FD00002020202020202020202020202020202A1
+:105FE0000202020202020202020202020202020291
+:105FF0000202020202020202020202020202020281
+:106000000202020202020202020202020202020270
+:106010000202020202020200000000000000000072
+:10602000000000000000000202020202020202025E
+:106030000202020202020200000000000000000052
+:106040000000000000000000000000000000000050
+:10605000000000000000000202020202020202022E
+:106060000202020202020202020202020202020210
+:106070000202020202020202020202020202020200
+:106080000202020202020200000000000000000002
+:106090000000000000000000000000000000000000
+:1060A00000000000000000020202020202020202DE
+:1060B00002020202020202020202020202020202C0
+:1060C00002020202020202020202020202020202B0
+:1060D00002020202020202020202020202020202A0
+:1060E00002020202020202000000000000000000A2
+:1060F00000000000000000000000000000000000A0
+:10610000000000000000000202020202020202027D
+:106110000202020202020200000000000000000071
+:10612000000000000000000000000000000000006F
+:10613000000000000000000000000000000000005F
+:10614000000000000000000000000000000000004F
+:10615000000000000000000000000000000000003F
+:10616000000000000000000000000000000000002F
+:10617000000000000000000202020202020202020D
+:106180000202020202020200000000000000000001
+:1061900000000000000000000000000000000000FF
+:1061A00000000000000000000000000000000000EF
+:1061B00000000000000000000000000000000000DF
+:1061C00000000000000000000000000000000000CF
+:1061D00000000000000000000000000000000000BF
+:1061E00000000000000000000000000000000000AF
+:1061F000000000000000000000000000000000009F
+:10620000000000000000000000000000000000008E
+:10621000000000000000000000000000000000007E
+:10622000000000000000000000000000000000006E
+:10623000000000000000000000000000000000005E
+:10624000000000000000000000000000000000004E
+:10625000000000000000000000000000000000003E
+:10626000000000000000000000000000000000002E
+:10627000000000000000000000000000000000001E
+:10628000000000000000000000000000000000000E
+:10629000000000000000004A0000000000000000B4
+:1062A00000000000000000000000000000000000EE
+:1062B00000000000000000000000000000000000DE
+:1062C00000000000000000000000000000000000CE
+:1062D00000000000000000000000000000000000BE
+:1062E00000000000000000000000000000000000AE
+:1062F000000000000000000000000000000000009E
+:10630000000000000000000000000000000000008D
+:10631000000000000000000000000100000000007C
+:10632000000000000000000000000000000000006D
+:10633000000000000000000000000000000000005D
+:10634000000000000000000000000000000000004D
+:10635000000000000000000000000000000000003D
+:10636000000000000000000000000000000000002D
+:10637000000000000000000000000000000000001D
+:10638000000000000000000000000000000000000D
+:1063900000000000000000000000000000000000FD
+:1063A00000000000000000000000000000000000ED
+:1063B00000000000000000000000000000000000DD
+:1063C00000000000000000000000000000000000CD
+:1063D00000000000000000000000000000000000BD
+:1063E00000000000000000000000000000000000AD
+:1063F000000000000000000000000000000000009D
+:10640000000000000000000000000000000000008C
+:10641000000000000000000000000100000000007B
+:10642000000000000000000000000000000000006C
+:10643000000000000000000000000000000000005C
+:10644000000000000000000000000000000000004C
+:10645000000000000000000000000000000000003C
+:10646000000000000000000000000000000000002C
+:10647000000000000000000000000000000000001C
+:10648000000000000000000000000000000000000C
+:1064900000000000000000000000000000000000FC
+:1064A00000000000000000000000000000000000EC
+:1064B00000000000000000000000000000000000DC
+:1064C00000000000000000000000000000000000CC
+:1064D00000000000000000000000000000000000BC
+:1064E00000000000000000000000000000000000AC
+:1064F000000000000000000000000000000000009C
+:10650000000000000000000000000000000000008B
+:106510000000000000000000000101010101000076
+:10652000000000000000000000000000000000006B
+:10653000000000000000000000000000000000005B
+:10654000000000000000000000000000000000004B
+:10655000000000000000000000000000000000003B
+:10656000000000000000000000000000000000002B
+:10657000000000000000000000000000000000001B
+:10658000000000000000000000000000000000000B
+:1065900000000000000000000000000000000000FB
+:1065A00000000000000001000000000000000000EA
+:1065B00000000000000000000000000000000000DB
+:1065C00000000000000000000000000000000000CB
+:1065D00000000000000000000000000000000000BB
+:1065E00000000000000000000000000000000000AB
+:1065F000000000000000000000000000000000009B
+:10660000000000000000000000000000000000008A
+:106610000000000000000001010101010101000172
+:106620000100000000000000000000000001000068
+:10663000000000000000000000000000000000005A
+:10664000000000000000000000000000000000004A
+:10665000000000000000000000000000000000003A
+:10666000000000000000000000000000000000002A
+:10667000000000000000000000000000000000001A
+:10668000000000000000000000000000000000000A
+:1066900000000000000000000000000000000000FA
+:1066A00000000000010001010100000000000000E6
+:1066B00000000000000000000000000000000000DA
+:1066C00000000000000000000000000000000000CA
+:1066D00000000000000000000000000000000000BA
+:1066E00000000000000000000000000000000000AA
+:1066F0000000000000010000000000000000000099
+:106700000000000000000000000000000000000089
+:106710000000000000000101010101010101000170
+:106720000100000000000000000000000001000067
+:106730000000000000000000000000000000000059
+:106740000000000000000000000000000000000049
+:106750000000000000000000000000000000000039
+:106760000000000000000000000000000000000029
+:106770000000000000000000000000000000000019
+:106780000000000000000000000000000000000009
+:1067900000000000000000000000000000000001F8
+:1067A00001010101010101010101010001010000DC
+:1067B00000000000000000000000000000000001D8
+:1067C00001000000000101000001010000000000C4
+:1067D00000000000000000000000000000000000B9
+:1067E00000010000000000000000000000000000A8
+:1067F0000000000000010000000000000000000098
+:106800000000000000000000000000000000000088
+:10681000000000000000010101010101010100016F
+:106820000100000000000000000000000001000066
+:106830000000000000010000000000000000000057
+:106840000000000000000000000000000000000048
+:106850000000000000000000000000000000000038
+:106860000000000000000000000000000000010027
+:106870000000000000000000000001000100000016
+:106880000000000000000000000000000000000008
+:1068900000000000000000000000000000000001F7
+:1068A00001010101010101010101010001010000DB
+:1068B00000000000000000000000000000000001D7
+:1068C00001000000010101000101010000000000C1
+:1068D00000000000000000000000000000000000B8
+:1068E00000010000000000000000000000000000A7
+:1068F0000000000000010100000000000101000094
+:106900000000000000000000000000000000000087
+:10691000000000000000010101010101010100016E
+:106920000100000000000000000000000001000065
+:106930000000000000010000000000000000000056
+:106940000000000000000000000000000000000047
+:106950000000000000000000000000000000000037
+:106960000000000000000000000000000000010026
+:106970000000000000000000010001000100000014
+:106980000000000000000000000000000000000007
+:1069900000000000000000000000000000000001F6
+:1069A00001010101010101010101010001010001D9
+:1069B00000010100000000000000000000000001D4
+:1069C00001010101010101000101010000000000BD
+:1069D00001010101000000000000000000000000B3
+:1069E00000010100000000000000000000000000A5
+:1069F0000000000000010100000000000101010092
+:106A00000000000000000000000000000000000086
+:106A1000000000000000010101010101010100016D
+:106A20000101010000000000000000000001000062
+:106A30000000000000010000000000000000000055
+:106A40000000000000000000000000000000000046
+:106A50000000000000000000000000000100000035
+:106A60000000000000000000000000000000010025
+:106A70000000000000000000010101000100000012
+:106A80000000000000000000000000000000000006
+:106A900000000000000000000000000000000001F5
+:106AA00001010101010101010101010001010001D8
+:106AB00000010100000000000000000000000001D3
+:106AC00001010101010101010101010000000000BB
+:106AD00001010101010000000000000000000000B1
+:106AE00000010100000000000000000000000001A3
+:106AF000010100000001010000010100010101008D
+:106B00000000000000000000000000000000000184
+:106B1000010100000000010101010101010100016A
+:106B20000101010001000000000000000001000060
+:106B30000000000000010000000000000000000054
+:106B40000000000000000000000000000000000045
+:106B50000000000000000001010000000100000032
+:106B60000000000000000000000000000000010024
+:106B70000000000000000001010101000100000010
+:106B80000000000000000000000000000000000005
+:106B900000000000000000000000000000000001F4
+:106BA00001010101010101010101010101010001D6
+:106BB00001010101000000000000010000000001CF
+:106BC00001010101010101010101010000010000B9
+:106BD00001010101010100000000000000000000AF
+:106BE00000010100000100000000000000000001A1
+:106BF000010100000001010101010100010101008A
+:106C00000000000000000000000000000000000183
+:106C10000101000000000101010101010101000169
+:106C2000010101000101010000000000000100005D
+:106C30000000000000010100000000000000000052
+:106C40000000000000000000000000000000000044
+:106C5000000000000000000101010100010000002F
+:106C60000000000000000000000000000000010023
+:106C7000000000000000000101010100010000000F
+:106C80000000000000000000000000000000000004
+:106C900000000000000000000000000000000001F3
+:106CA00001010101010101010101010101010001D5
+:106CB00001010101010000000000010000000101CC
+:106CC00001010101010101010101010000010000B8
+:106CD00001010101010100000000000000000000AE
+:106CE000000101000101000000000000000000019F
+:106CF0000101000000010101010101000101010089
+:106D00000000000000000000000000000000000182
+:106D10000101010000000101010101010101000167
+:106D2000010101000101010000000000000100005C
+:106D30000000000000010100000000000000000051
+:106D40000000000000000000000000000000000043
+:106D5000000000000000000101010100010000002E
+:106D60000000000000000000000000000000010022
+:106D7000000000000000000101010100010001000D
+:106D80000000000000000000000000000000000003
+:106D900000000000000000000000000000000001F2
+:106DA00001010101010101010101010101010001D4
+:106DB00001010101010101000000010000000101C9
+:106DC00001010101010101010101010100010000B6
+:106DD00001010101010101000000000001000000AB
+:106DE000000101010101000000000000000000019D
+:106DF0000101000000010101010101000101010088
+:106E00000000000000000000000000000000000181
+:106E10000101010000000101010101010101000166
+:106E2000010101010101010000000000000100005A
+:106E3000000000000001010000000000010100004E
+:106E40000000000000000000000000000000000042
+:106E5000000000000000000101010100010100002C
+:106E60000000000000000000000000000000010021
+:106E7000000000000000000101010100010001000C
+:106E80000000000000010000000000000000000001
+:106E900000000000000000000000000000000001F1
+:106EA00001010101010101010101010101010001D3
+:106EB00001010101010101000000010000000101C8
+:106EC00001010101010101010101010100010100B4
+:106ED00001010101010101000000000001000000AA
+:106EE000000101010101000000000000000000019C
+:106EF0000101010000010101010101000101010086
+:106F00000000000000000000000000000000000180
+:106F10000101010000000101010101010101000165
+:106F20000101010101010100000000000001000059
+:106F3000000000000001010101000000010100004B
+:106F40000000000000000000000000000000000041
+:106F5000000000000000000101010100010100002B
+:106F60000000000000000000000000000000010020
+:106F7000000000000000000101010100010001000B
+:106F80000000000000010000000000000000000000
+:106F900000000000000000000000000000000001F0
+:106FA00001010101010101010101010101010001D2
+:106FB00001010101010101000000010000000101C7
+:106FC00001010101010101010101010101010101B1
+:106FD00001010101010101000000000001000001A8
+:106FE000010101010101000000000000000000019A
+:106FF0000101010000010101010101000101010184
+:10700000000000000000000000000000000100017E
+:107010000101010001000101010101010101000163
+:107020000101010101010100000000000001000058
+:10703000000000000001010101000000010100004A
+:107040000000000000000000000000000000000040
+:107050000000000000000001010101010101000029
+:10706000000000000000000000000000000001001F
+:10707000000000000000000101010100010001000A
+:1070800000000000000101000000000000000000FE
+:1070900000000000000000000000000000000001EF
+:1070A00001010101010101010101010101010001D1
+:1070B00001010101010101010000010000000101C5
+:1070C00001010101010101010101010101010101B0
+:1070D00001010101010101010100000001000001A5
+:1070E0000101010101010000000000000000000199
+:1070F0000101010000010101010101010101010182
+:10710000000000000000000000000000000100017D
+:107110000101010101010101010101010101000160
+:107120000101010101010100000000000001000057
+:107130000000000000010101010000000101000049
+:10714000000000000000000000000000000000003F
+:107150000000000000000001010101010101010126
+:10716000010100000000000000000000000001001C
+:107170000000000000000001010101000100010009
+:1071800000000000000101010100000000000000FB
+:1071900000000000000000000000000000000002ED
+:1071A00002010101010101010101010101010001CF
+:1071B00001010101010101010000010000000102C3
+:1071C00002010101010101010101010101010101AE
+:1071D00001010101010101010101010001010001A1
+:1071E0000101010101010000000000000000000198
+:1071F0000101010000010101010101010101010181
+:10720000000000000000000000000001000100017B
+:10721000010101010101010101010101010100015F
+:107220000101010101010100000000000101000055
+:107230000000000000010101010000000101000048
+:10724000000000000000000000000000000000013D
+:107250000101000000000001010101010101010123
+:10726000010100000000000000000000000001001B
+:107270000000000000000001010101000100010008
+:1072800000000000000101010100000000000000FA
+:1072900000000000000000000000000000000002EC
+:1072A00002020101010101010101010101010001CD
+:1072B00001010101010101010100010000000102C1
+:1072C00002010101010101010101010101010101AD
+:1072D00001010101010101010101010001010001A0
+:1072E0000101010101010000000000000000000197
+:1072F000010101010001010101010101010101017F
+:107300000000000000000000000000010001010179
+:10731000010101010101010101010101010100015E
+:107320000101010101010100000000000101000054
+:107330000000000000010101010000000101010046
+:10734000000000000000000000000000000000013C
+:107350000101000000000001010101010101010122
+:107360000101010000000000000000000100010018
+:107370000000000000000001010101000100010007
+:1073800000000000000101010100000000000000F9
+:1073900000000000000000000000000000000002EB
+:1073A00002020202010101010101010101010002C9
+:1073B00001020201010101010100010000000102BE
+:1073C00002020101010101010101010101010101AB
+:1073D000020101010101010101010101010100019D
+:1073E0000102010101010100000000000000000194
+:1073F000010101010101010101010101010101017D
+:107400000000010000000000000000010001010177
+:10741000010101010101010101010101010100015D
+:107420000101010101010100000000000101000152
+:107430000100000000010101010000000101010044
+:10744000000000000000000000000000000000013B
+:107450000101000000000001010101010101010121
+:107460000101010001000000000000000100010016
+:107470000000000000000001010101000100010006
+:1074800000000000000101010101010000000000F6
+:1074900000000000000000000000000000000002EA
+:1074A00002020202010102010101010101010002C7
+:1074B00002020202010101010100010000000102BB
+:1074C00002020202010102010101010101010101A7
+:1074D000020202010101010101010101010100019A
+:1074E0000102010101010100000000000000000193
+:1074F000010101010101010101010101010101017C
+:107500000000010000000000000000010001010176
+:10751000010101010101010101010101010100015C
+:10752000010101010101010101000000010101014E
+:107530000100000000010101010000000101010043
+:10754000000000000000000000000000000000013A
+:107550000101000000000001010101010101010120
+:107560000101010001010000000001000100010013
+:107570000000000000000001010101000100010005
+:1075800000000000000101010101010000000000F5
+:1075900000000000000000000000000000000002E9
+:1075A00002020202020102020101010101010002C4
+:1075B00002020202010101010101010000000102B9
+:1075C00002020202010202010101010101010101A5
+:1075D0000202020201010101010101010101000198
+:1075E0000102020101010100000000000100000190
+:1075F000010101010101010101010101010101017B
+:107600000000010000000000000001010101010173
+:10761000010101010101010101010101010100025A
+:10762000020101010101010101000000010101014C
+:107630000101000000010101010000000101010041
+:107640000000000000010000000000000100000137
+:10765000010101000000000101010101010101011E
+:107660000101010001010000010001000100010011
+:107670000000000000000001010101000100010103
+:1076800001010000000101010101010000000000F2
+:1076900000000000000000000000000000000002E8
+:1076A00002020202020202020201010101010002C1
+:1076B00002020202010101010101010000000102B8
+:1076C00002020202020202020202010101010101A0
+:1076D0000202020201010101010101010101000197
+:1076E000010202010101010001000000010000028D
+:1076F0000201010101010101010101010101010179
+:107700000000010000000000000001010101010172
+:107710000101010101010101010101010101000259
+:10772000020101010101010101000000010101014B
+:10773000010100000101010101000000010101003F
+:107740000000000000010000000000000100000136
+:10775000010101000100000101010101010101011C
+:10776000010101010101010001010100010101000C
+:107770000000000000000001010101000100010102
+:1077800001010000010101010101010000000000F0
+:1077900000000000000000000000000000000002E7
+:1077A00002020202020202020202010101010002BF
+:1077B00002020202020202010101010100000102B3
+:1077C000020202020202020202020201010101029D
+:1077D0000202020202010101010101010101000294
+:1077E0000202020101010100010101000100000289
+:1077F0000202010101010101010101010101010177
+:10780000000001010000000000000101010101026F
+:107810000201010101010101010101010101010256
+:107820000201010101010101010001010101010148
+:10783000010101000101010101010100010101013A
+:107840000000000000010100000000000100000134
+:107850000101010101010001010101010101010119
+:107860000101010101010101010101000101010109
+:107870000000000000000001010101000100010101
+:1078800001010000010101010101010000000000EF
+:1078900000000000000000000000000000000002E6
+:1078A00002020202020202020202020101010002BD
+:1078B00002020202020202010101020100000102B1
+:1078C000020202020202020202020201010101029C
+:1078D0000202020202020101010101010101010291
+:1078E0000202020201010100010101000100000287
+:1078F0000202010101010101010101010101010176
+:10790000000001010000000000000101010101026E
+:107910000202010101010101010101010101010254
+:107920000202010101010101010001010101010146
+:107930000101010001010101010101000101010139
+:107940000000000000010101010000000100000131
+:107950000101010101010001010101010101010118
+:107960000101010101010101010101010101010107
+:1079700000000000010000010101010001000101FF
+:1079800001010000010101010101010000000000EE
+:1079900000000000000000000000000000000002E5
+:1079A00002020202020202020202020101010002BC
+:1079B00002020202020202020101020101000102AE
+:1079C000020202020202020202020201010101029B
+:1079D000020202020202020101010101010101028F
+:1079E0000202020201020100010101000100000285
+:1079F0000202010101020101010101010101010174
+:107A0000000001010001000000000101010101026C
+:107A10000202010101010101010101010101010253
+:107A20000202020101010101010101010101010143
+:107A30000101010101010101010101010101010136
+:107A4000010100000001010101000000010100012D
+:107A50000101010101010001010101010101010117
+:107A60000101010101010101010101010101010106
+:107A700001010100010100010101010001010101F9
+:107A800001010100010101010101010000000000EC
+:107A900000000000010000000000000000000102E2
+:107AA00002020202020202020202020202020002B8
+:107AB00002020202020202020201020101000102AC
+:107AC0000202020202020202020202020101010299
+:107AD000020202020202020201010101010101028D
+:107AE0000202020202020100010101000100000283
+:107AF0000202020101020201010101010101010270
+:107B0000000001010101000000000101010101026A
+:107B1000020202010101020201010101010101024F
+:107B20000202020101010101010101010101010142
+:107B30000101010101010101010101010101010135
+:107B4000010100000001010101000000010101012B
+:107B50000101010101010001010101010101010116
+:107B60000101010101010101010101010101010105
+:107B700001010100010100010101010001010101F8
+:107B800001010100010101010101010000000000EB
+:107B900000000000010100000000000001010102DE
+:107BA00002020202020202020202020202020002B7
+:107BB00002020202020202020201020101010202A9
+:107BC0000202020202020202020202020102010297
+:107BD000020202020202020202010101010101028B
+:107BE0000202020202020100010101000100000282
+:107BF000020202010102020101010101010101026F
+:107C00000101010101010000000001010101010267
+:107C1000020202010101020202020201010101024B
+:107C20000202020101010101010101010101010141
+:107C30000101010101010101010101010101010134
+:107C40000101010000010101010101010101010126
+:107C50000101010101010001010101010101010115
+:107C60000101010101010101010101010101010104
+:107C700001010100010101010101010101010101F5
+:107C800001010101010101010101010001000000E8
+:107C900000000000010100000000000001010102DD
+:107CA00002020202020202020202020202020002B6
+:107CB00002020202020202020202020101010202A7
+:107CC0000202020202020202020202020102010296
+:107CD0000202020202020202020201010101010289
+:107CE0000202020202020101010101000100000280
+:107CF000020202010102020201010101010101026D
+:107D00000101010101010000000001010101010266
+:107D10000202020101010202020202020101010249
+:107D2000020202020101010101010101010101013F
+:107D30000101010101020101010101010101010132
+:107D40000101010001010101010101010101010223
+:107D50000201010101010001010101010101010113
+:107D60000101010101010101010101010101010103
+:107D700001010100010101010101010101010101F4
+:107D800001010101010101010101010001000100E6
+:107D900001010101010101000000010101010102D5
+:107DA00002020202020202020202020202020002B5
+:107DB00002020202020202020202020101010202A6
+:107DC0000202020202020202020202020202020293
+:107DD0000202020202020202020202010201010286
+:107DE000020202020202020101010101010000027D
+:107DF0000202020201020202020201010101010269
+:107E00000101010101010000000001010101010265
+:107E10000202020201010202020202020101010247
+:107E2000020202020201010101010101010101023C
+:107E30000201010101020101010101010101010130
+:107E40000101010001010101010101010101010222
+:107E5000020201010101010101010101010101020F
+:107E60000201010101010101010101010101010101
+:107E700001010101010101010101010101010101F2
+:107E800001010101010101010101010101010100E3
+:107E900001010101010101010100010101010102D2
+:107EA00002020202020202020202020202020002B4
+:107EB00002020202020202020202020201010202A4
+:107EC0000202020202020202020202020202020292
+:107ED0000202020202020202020202020201010284
+:107EE000020202020202020101010101010000027C
+:107EF0000202020201020202020202010101010267
+:107F00000101020101010000000001010101010263
+:107F10000202020201010202020202020202010244
+:107F20000202020202020201010101010101010239
+:107F3000020101010102020101010101010101012E
+:107F40000101010001010101010101010101010221
+:107F5000020201010101010201010101010101020D
+:107F600002020101010101010101010101010101FF
+:107F700001010101010101010101010101010101F1
+:107F800001010101010101010101010101010100E2
+:107F900001010101010101010101010101010102D0
+:107FA00002020202020202020202020202020002B3
+:107FB00002020202020202020202020201010202A3
+:107FC0000202020202020202020202020202020291
+:107FD0000202020202020202020202020202010282
+:107FE0000202020202020201020101010101000279
+:107FF0000202020201020202020202010202010264
+:108000000101020101010100000101010101010260
+:108010000202020202010202020202020202010242
+:108020000202020202020201010101010102010237
+:10803000020201010102020101010101010101022B
+:10804000010101010101010101010101010101021F
+:10805000020201010101010202010101010101020B
+:1080600002020101010101010101010101010101FE
+:1080700001010101010101010101010101010101F0
+:1080800001010101010101010101010101010100E1
+:1080900001010101010101010101010101010102CF
+:1080A00002020202020202020202020202020002B2
+:1080B00002020202020202020202020201010202A2
+:1080C0000202020202020202020202020202020290
+:1080D0000202020202020202020202020202010281
+:1080E0000202020202020201020201010101010276
+:1080F0000202020202020202020202010202010262
+:10810000010102010101010101010101010101025D
+:108110000202020202020202020202020202010240
+:108120000202020202020201010101010102010236
+:108130000202010101020202010101010101010229
+:10814000020101010101010101010101010101021D
+:108150000202020101010102020201010101010208
+:1081600002020201010101010101010101010101FC
+:1081700001010101010101020201010101010102EC
+:1081800002010101010101010101010101010100DF
+:1081900001010101010101010101010101010102CE
+:1081A00002020202020202020202020202020002B1
+:1081B00002020202020202020202020202010202A0
+:1081C000020202020202020202020202020202028F
+:1081D0000202020202020202020202020202010280
+:1081E0000202020202020201020202010101010274
+:1081F000020202020202020202020202020202025F
+:10820000020102020101010101010101010101025A
+:10821000020202020202020202020202020201023F
+:108220000202020202020201010101010102010235
+:108230000202020101020202020101010101010226
+:10824000020201010101010101010101010101021B
+:108250000202020101010102020202010101010206
+:1082600002020201010101010101010101010102FA
+:1082700001010101010101020202020101010102E9
+:1082800002020101010201010101010101010100DC
+:1082900001010101010101010101010101010102CD
+:1082A00002020202020202020202020202020002B0
+:1082B000020202020202020202020202020202029E
+:1082C000020202020202020202020202020202028E
+:1082D000020202020202020202020202020201027F
+:1082E0000202020202020202020202010201010271
+:1082F000020202020202020202020202020202025E
+:108300000202020201010101010101020101010257
+:10831000020202020202020202020202020201023E
+:108320000202020202020201010101010102010234
+:108330000202020101020202020101010101010225
+:10834000020201010101010101010101010101021A
+:108350000202020201010102020202010201010203
+:1083600002020201010101010101010101010102F9
+:1083700002010101010101020202020101010102E7
+:1083800002020101010202010101010101010100DA
+:1083900001010101010101010101010101010102CC
+:1083A00002020202020202020202020202020002AF
+:1083B000020202020202020202020202020202029D
+:1083C000020202020202020202020202020202028D
+:1083D000020202020202020202020202020202027D
+:1083E000020202020202020202020202020101026F
+:1083F000020202020202020202020202020202025D
+:108400000202020201010101010101020101010256
+:10841000020202020202020202020202020201023D
+:108420000202020202020202010101010102010232
+:108430000202020201020202020101010101010223
+:108440000202020101020101010101010101010217
+:108450000202020201010102020202020201010201
+:1084600002020202010101010101010101010102F7
+:1084700002020101010101020202020102010102E4
+:1084800002020101010202020101010101010100D8
+:1084900002010101010101010101010101010102CA
+:1084A00002020202020202020202020202020002AE
+:1084B000020202020202020202020202020202029C
+:1084C000020202020202020202020202020202028C
+:1084D000020202020202020202020202020202027C
+:1084E000020202020202020202020202020101026E
+:1084F000020202020202020202020202020202025C
+:108500000202020201020101010102020102010252
+:10851000020202020202020202020202020201023C
+:108520000202020202020202020101010102010230
+:10853000020202020202020202010101020201021F
+:108540000202020101020201010101010101010215
+:1085500002020202020101020202020202020102FE
+:1085600002020202020101010101010101010202F4
+:1085700002020201010101020202020102010102E2
+:1085800002020201010202020201010101010100D5
+:1085900002020101010101010101010101010102C8
+:1085A00002020202020202020202020202020002AD
+:1085B000020202020202020202020202020202029B
+:1085C000020202020202020202020202020202028B
+:1085D000020202020202020202020202020202027B
+:1085E000020202020202020202020202020101026D
+:1085F000020202020202020202020202020202025B
+:108600000202020202020101010102020102010250
+:10861000020202020202020202020202020201023B
+:10862000020202020202020202010101010201022F
+:10863000020202020202020202010101020201021E
+:108640000202020101020202010101010101010213
+:1086500002020202020201020202020202020102FC
+:1086600002020202020201010101010101010202F2
+:1086700002020201010101020202020102010102E1
+:1086800002020201010202020201010101010100D4
+:1086900002020201010101010101010101010102C6
+:1086A00002020202020202020202020202020002AC
+:1086B000020202020202020202020202020202029A
+:1086C000020202020202020202020202020202028A
+:1086D000020202020202020202020202020202027A
+:1086E000020202020202020202020202020201026B
+:1086F000020202020202020202020202020202025A
+:10870000020202020202010101010202010201024F
+:10871000020202020202020202020202020201023A
+:10872000020202020202020202010101020201022D
+:10873000020202020202020202020101020201021C
+:108740000202020201020202020101010101010210
+:1087500002020202020201020202020202020102FB
+:1087600002020202020202010101010101010202F0
+:1087700002020201010101020202020102010102E0
+:1087800002020202020202020202010101010100D0
+:1087900002020202010101010101010101010102C4
+:1087A00002020202020202020202020202020002AB
+:1087B0000202020202020202020202020202020299
+:1087C0000202020202020202020202020202020289
+:1087D0000202020202020202020202020202020279
+:1087E000020202020202020202020202020201026A
+:1087F0000202020202020202020202020202020259
+:10880000020202020202020101010202020202024B
+:108810000202020202020202020202020202010239
+:108820000202020202020202020202020202010229
+:10883000020202020202020202020201020201021A
+:10884000020202020202020202010101010101020E
+:1088500002020202020201020202020202020202F9
+:1088600002020202020202020201010101010202ED
+:1088700002020202020101020202020102010202DC
+:1088800002020202020202020202020101010100CE
+:1088900002020202020101010101010101010102C2
+:1088A00002020202020202020202020202020002AA
+:1088B0000202020202020202020202020202020298
+:1088C0000202020202020202020202020202020288
+:1088D0000202020202020202020202020202020278
+:1088E0000202020202020202020202020202010269
+:1088F0000202020202020202020202020202020258
+:108900000202020202020202010102020202020249
+:108910000202020202020202020202020202010238
+:108920000202020202020202020202020202010228
+:108930000202020202020202020202020202020217
+:10894000020202020202020202020101020101020B
+:1089500002020202020202020202020202020202F7
+:1089600002020202020202020202020101010202EA
+:1089700002020202020201020202020102010202DA
+:1089800002020202020202020202020101010100CD
+:1089900002020202020201010101010101010102C0
+:1089A00002020202020202020202020202020002A9
+:1089B0000202020202020202020202020202020297
+:1089C0000202020202020202020202020202020287
+:1089D0000202020202020202020202020202020277
+:1089E0000202020202020202020202020202020267
+:1089F0000202020202020202020202020202020257
+:108A00000202020202020202020202020202020246
+:108A10000202020202020202020202020202010237
+:108A20000202020202020202020202020202020226
+:108A30000202020202020202020202020202020216
+:108A40000202020202020202020202020201010208
+:108A500002020202020202020202020202020202F6
+:108A600002020202020202020202020102010202E8
+:108A700002020202020202020202020102010202D8
+:108A800002020202020202020202020101010100CC
+:108A900002020202020202010101010101010102BE
+:108AA00002020202020202020202020202020002A8
+:108AB0000202020202020202020202020202020296
+:108AC0000202020202020202020202020202020286
+:108AD0000202020202020202020202020202020276
+:108AE0000202020202020202020202020202020266
+:108AF0000202020202020202020202020202020256
+:108B00000202020202020202020202020202020245
+:108B10000202020202020202020202020202020235
+:108B20000202020202020202020202020202020225
+:108B30000202020202020202020202020202020215
+:108B40000202020202020202020202020202010206
+:108B500002020202020202020202020202020202F5
+:108B600002020202020202020202020202010202E6
+:108B700002020202020202020202020102010202D7
+:108B800002020202020202020202020101010100CB
+:108B900002020202020202020101010101010102BC
+:108BA00002020202020202020202020202020002A7
+:108BB0000202020202020202020202020202020295
+:108BC0000202020202020202020202020202020285
+:108BD0000202020202020202020202020202020275
+:108BE0000202020202020202020202020202020265
+:108BF0000202020202020202020202020202020255
+:108C00000202020202020202020202020202020244
+:108C10000202020202020202020202020202020234
+:108C20000202020202020202020202020202020224
+:108C30000202020202020202020202020202020214
+:108C40000202020202020202020202020202010205
+:108C500002020202020202020202020202020202F4
+:108C600002020202020202020202020202020202E4
+:108C700002020202020202020202020102010202D6
+:108C800002020202020202020202020101010100CA
+:108C900002020202020202020201010101010102BA
+:108CA00002020202020202020202020202020002A6
+:108CB0000202020202020202020202020202010295
+:108CC0000202020202020202020202020202020284
+:108CD0000202020202020202020202020202020274
+:108CE0000202020202020202020202020202020264
+:108CF0000202020202020202020202020202020254
+:108D00000202020202020202020202020202020243
+:108D10000202020202020202020202020202020233
+:108D20000202020202020202020202020202020223
+:108D30000202020202020202020202020202020213
+:108D40000202020202020202020202020202020203
+:108D500002020202020202020202020202020202F3
+:108D600002020202020202020202020202020202E3
+:108D700002020202020202020202020202010202D4
+:108D800002020202020202020202020101010102C7
+:108D900002020202020202020202020201010102B6
+:108DA00002020202020202020202020202020002A5
+:108DB000020202020202020201010101010101029A
+:108DC0000202020202020202020202020202020283
+:108DD0000202020202020202020202020202020273
+:108DE0000202020202020202020202020202020263
+:108DF0000202020202020202020202020202020253
+:108E00000202020202020202020202020202020242
+:108E10000202020202020202020202020202020232
+:108E20000202020202020202020202020202020222
+:108E30000202020202020202020202020202020212
+:108E40000202020202020202020202020202020202
+:108E500002020202020202020202020202020202F2
+:108E600002020202020202020202020202020202E2
+:108E700002020202020202020202020202020202D2
+:108E800002020202020202020202020201010102C5
+:108E900002020202020202020202020202020102B3
+:108EA00002020202020202020202020202020002A4
+:108EB000020202020201010101010101010101029C
+:108EC0000202020202020202020202020202010283
+:108ED0000202020202020202020202020202020272
+:108EE0000202020202020202020202020202020262
+:108EF0000202020202020202020202020202020252
+:108F00000202020202020202020202020202020241
+:108F10000202020202020202020202020202020231
+:108F20000202020202020202020202020202020221
+:108F30000202020202020202020202020202020211
+:108F40000202020202020202020202020202020201
+:108F500002020202020202020202020202020202F1
+:108F600002020202020202020202020202020202E1
+:108F700002020202020202020202020202020202D1
+:108F800002020202020202020202020202010102C3
+:108F900002020202020202020202020202020202B1
+:108FA00002020202020202020202020202020002A3
+:108FB000020202010101010101010101010101029D
+:108FC000020202020202010101010101010101028A
+:108FD0000202020202020202020202020202020271
+:108FE0000202020202020202020202020202020261
+:108FF0000202020202020202020202020202020251
+:109000000202020202020202020202020202020240
+:109010000202020202020202020202020202020230
+:109020000202020202020202020202020202020220
+:109030000202020202020202020202020202020210
+:109040000202020202020202020202020202020200
+:1090500002020202020202020202020202020202F0
+:1090600002020202020202020202020202020202E0
+:1090700002020202020202020202020202020202D0
+:1090800002020202020202020202020202020102C1
+:1090900002020202020202020202020202020202B0
+:1090A00002020202020201010101010101010102A9
+:1090B000020201010101010101010101010101029D
+:1090C000020202020201010101010101010101028A
+:1090D0000202020202020202020202020202010271
+:1090E0000202020202020202020202020202020260
+:1090F0000202020202020202020202020202020250
+:10910000020202020202020202020202020202023F
+:10911000020202020202020202020202020202022F
+:10912000020202020202020202020202020202021F
+:10913000020202020202020202020202020202020F
+:1091400002020202020202020202020202020202FF
+:1091500002020202020202020202020202020202EF
+:1091600002020202020202020202020202020202DF
+:1091700002020202020202020202020202020202CF
+:1091800002020202020202020202020202020202BF
+:1091900002020202020202020202020202020202AF
+:1091A00002020201010101010101010101010102AB
+:1091B000020101010101010101010101010101029D
+:1091C000020202010101010101010101010101028B
+:1091D0000202020202020201010101010101010277
+:1091E000020202020202020202020202020202025F
+:1091F000020202020202020202020202020202024F
+:10920000020202020202020202020202020202023E
+:10921000020202020202020202020202020202022E
+:10922000020202020202020202020202020202021E
+:10923000020202020202020202020202020202020E
+:1092400002020202020202020202020202020202FE
+:1092500002020202020202020202020202020202EE
+:1092600002020202020202020202020202020202DE
+:1092700002020202020202020202020202020202CE
+:1092800002020202020202020202020202020202BE
+:1092900002020202020202020202020202020201AF
+:1092A00001010101010101010101010101010101AE
+:1092B000010101010101010101010101010101019E
+:1092C000010101010101010101010101010101028D
+:1092D0000202020201010101010101010101010279
+:1092E0000202020202020202020202010201020260
+:1092F000020202020202020202020202020202024E
+:10930000020202020202020202020202020202023D
+:10931000020202020202020202020202020202022D
+:10932000020202020202020202020202020202021D
+:10933000020202020202020202020202020202020D
+:1093400002020202020202020202020202020202FD
+:1093500002020202020202020202020202020202ED
+:1093600002020202020202020202020202020202DD
+:1093700002020202020202020202020202020202CD
+:1093800002020202020202020202020202020202BD
+:1093900002020202020202020202020202020201AE
+:1093A00001010101010101010101010101010101AD
+:1093B000010101010101010101010101010101019D
+:1093C000010101010101010101010101010101028C
+:1093D000020201010101010101010101010101027A
+:1093E0000202020202020202010101010101010264
+:1093F000020202020202020202020202020202024D
+:10940000020202020202020202020202020202023C
+:10941000020202020202020202020202020202022C
+:10942000020202020202020202020202020202021C
+:10943000020202020202020202020202020202020C
+:1094400002020202020202020202020202020202FC
+:1094500002020202020202020202020202020202EC
+:1094600002020202020202020202020202020202DC
+:1094700002020202020202020202020202020202CC
+:1094800002020202020202020202020202020202BC
+:1094900002020202020202020202020202020201AD
+:1094A00001010101010101010101010101010101AC
+:1094B000010101010101010101010101010101019C
+:1094C000010101010101010101010101010101028B
+:1094D000010101010101010101010101010101027B
+:1094E0000202020202010101010101010101010266
+:1094F000020202020202020202020202020202024C
+:10950000020202020202020202020202020202023B
+:10951000020202020202020202020202020202022B
+:10952000020202020202020202020202020202021B
+:10953000020202020202020202020202020202020B
+:1095400002020202020202020202020202020202FB
+:1095500002020202020202020202020202020202EB
+:1095600002020202020202020202020202020202DB
+:1095700002020202020202020202020202020202CB
+:1095800002020202020202020202020202020202BB
+:1095900002020202020202020202020202020201AC
+:1095A00001010101010101010101010101010101AB
+:1095B000010101010101010101010101010101019B
+:1095C000010101010101010101010101010101018B
+:1095D000010101010101010101010101010101027A
+:1095E0000201010101010101010101010101010269
+:1095F000020202020202020202020202020202024B
+:10960000020202020202020202020202020202023A
+:10961000020202020202020202020202020202022A
+:10962000020202020202020202020202020202021A
+:10963000020202020202020202020202020202020A
+:1096400002020202020202020202020202020202FA
+:1096500002020202020202020202020202020202EA
+:1096600002020202020202020202020202020202DA
+:1096700002020202020202020202020202020202CA
+:1096800002020202020202020202020202020202BA
+:1096900002020202020202020202020202020201AB
+:1096A00001010101010101010101010101010101AA
+:1096B000010101010101010101010101010101019A
+:1096C000010101010101010101010101010101018A
+:1096D000010101010101010101010101010101017A
+:1096E0000101010101010101010101010101010269
+:1096F000020202020202020202020202020202024A
+:109700000202020202020202020202020202020239
+:109710000202020202020202020202020202020229
+:109720000202020202020202020202020202020219
+:109730000202020202020202020202020202020209
+:1097400002020202020202020202020202020202F9
+:1097500002020202020202020202020202020202E9
+:1097600002020202020202020202020202020202D9
+:1097700002020202020202020202020202020202C9
+:1097800002020202020202020202020202020202B9
+:1097900002020202020202020202020202020201AA
+:1097A00001010101010101010101010101010101A9
+:1097B0000101010101010101010101010101010199
+:1097C0000101010101010101010101010101010189
+:1097D0000101010101010101010101010101010179
+:1097E0000101010101010101010101010101010268
+:1097F0000202020202020202020202020202020249
+:109800000202020202020202020202020202020238
+:109810000202020202020202020202020202020228
+:109820000202020202020202020202020202020218
+:109830000202020202020202020202020202020208
+:1098400002020202020202020202020202020202F8
+:1098500002020202020202020202020202020202E8
+:1098600002020202020202020202020202020202D8
+:1098700002020202020202020202020202020202C8
+:1098800002020202020202020202020202020202B8
+:1098900002020202020202020202020202020201A9
+:1098A00001010101010101010101010101010101A8
+:1098B0000101010101010101010101010101010198
+:1098C0000101010101010101010101010101010188
+:1098D0000101010101010101010101010101010178
+:1098E0000101010101010101010101010101010267
+:1098F0000202020202020202020202020202020248
+:109900000202020202020202020202020202020237
+:109910000202020202020202020202020202020227
+:109920000202020202020202020202020202020217
+:109930000202020202020202020202020202020207
+:1099400002020202020202020202020202020202F7
+:1099500002020202020202020202020202020202E7
+:1099600002020202020202020202020202020202D7
+:1099700002020202020202020202020202020202C7
+:1099800002020202020202020202020202020202B7
+:1099900002020202020202020202020202020201A8
+:1099A00001010101010101010101010101010101A7
+:1099B0000101010101010101010101010101010197
+:1099C0000101010101010101010101010101010187
+:1099D0000101010101010101010101010101010177
+:1099E0000101010101010101010101010101010266
+:1099F0000202020202020202020202020202020247
+:109A00000202020202020202020202020202020236
+:109A10000202020202020202020202020202020226
+:109A20000202020202020202020202020202020216
+:109A30000202020202020202020202020202020206
+:109A400002020202020202020202020202020202F6
+:109A500002020202020202020202020202020202E6
+:109A600002020202020202020202020202020202D6
+:109A700002020202020202020202020202020202C6
+:109A800002020202020202020202020202020202B6
+:109A900002020202020202020202020202020201A7
+:109AA00001010101010101010101010101010101A6
+:109AB0000101010101010101010101010101010196
+:109AC0000101010101010101010101010101010186
+:109AD0000101010101010101010101010101010176
+:109AE0000101010101010101010101010101010265
+:109AF0000202020202010101010101010101010250
+:109B00000202020202020202020202020202020235
+:109B10000202020202020202020202020202020225
+:109B20000202020202020202020202020202020215
+:109B30000202020202020202020202020202020205
+:109B400002020202020202020202020202020202F5
+:109B500002020202020202020202020202020202E5
+:109B600002020202020202020202020202020202D5
+:109B700002020202020202020202020202020202C5
+:109B800002020202020202020202020202020202B5
+:109B900002020202020202020202020202020201A6
+:109BA00001010101010101010101010101010101A5
+:109BB0000101010101010101010101010101010195
+:109BC0000101010101010101010101010101010185
+:109BD0000101010101010101010101010101010175
+:109BE0000101010101010101010101010101010165
+:109BF0000101010101010101010101010101010254
+:109C00000202020202020202020201010202020236
+:109C1000020202020202010101010101010102022C
+:109C20000202020202020202020202020202020214
+:109C30000202020202020202020202020202020204
+:109C400002020202020202020202020202020202F4
+:109C500002020202020202020202020202020202E4
+:109C600002020202020202020202020202020202D4
+:109C700002020202020202020202020202020202C4
+:109C800002020202020202020202020202020202B4
+:109C900002020202020202020202020202020201A5
+:109CA00001010101010101010101010101010101A4
+:109CB0000101010101010101010101010101010194
+:109CC0000101010101010101010101010101010184
+:109CD0000101010101010101010101010101010174
+:109CE0000101010101010101010101010101010164
+:109CF0000101010101010101010101010101010253
+:109D0000020202020201010101010101010101013E
+:109D10000101010101010101010101010101010232
+:109D20000202020202020202020202020201020214
+:109D30000202020202020202020202020202020203
+:109D400002020202020202020202020202020202F3
+:109D500002020202020202020202020202020202E3
+:109D600002020202020202020202020202020202D3
+:109D700002020202020202020202020202020202C3
+:109D800002020202020202020202020202020202B3
+:109D900002020202020202020202020202020201A4
+:109DA00001010101010101010101010101010101A3
+:109DB0000101010101010101010101010101010193
+:109DC0000101010101010101010101010101010183
+:109DD0000101010101010101010101010101010173
+:109DE0000101010101010101010101010101010163
+:109DF0000101010101010101010101010101010153
+:109E00000202010101010101010101010101010140
+:109E10000101010101010101010101010101010132
+:109E20000101010101010101010101010101010221
+:109E30000202020202020202020202020202020202
+:109E400002020202020202020202020202020202F2
+:109E500002020202020202020202020202020202E2
+:109E600002020202020202020202020202020202D2
+:109E700002020202020202020202020202020202C2
+:109E800002020202020202020202020202020202B2
+:109E900002020202020202020202020202020201A3
+:109EA00001010101010101010101010101010101A2
+:109EB0000101010101010101010101010101010192
+:109EC0000101010101010101010101010101010182
+:109ED0000101010101010101010101010101010172
+:109EE0000101010101010101010101010101010162
+:109EF0000101010101010101010101010101010152
+:109F00000101010101010101010101010101010141
+:109F10000101010101010101010101010101010131
+:109F20000101010101010101010101010101010220
+:109F3000020202020201010101010101010101020B
+:109F400002020202020101010101010101010102FB
+:109F500002020202020202020202020202020202E1
+:109F600002020202020202020202020202020202D1
+:109F700002020202020202020202020202020202C1
+:109F800002020202020202020202020202020202B1
+:109F900002020202020202020202020202020201A2
+:109FA00001010101010101010101010101010101A1
+:109FB0000101010101010101010101010101010191
+:109FC0000101010101010101010101010101010181
+:109FD0000101010101010101010101010101010171
+:109FE0000101010101010101010101010101010161
+:109FF0000101010101010101010101010101010151
+:10A000000101010101010101010101010101010140
+:10A010000101010101010101010101010101010130
+:10A020000101010101010101010101010101010120
+:10A030000101010101010101010101010101010110
+:10A0400001010101010101010101010101010102FF
+:10A0500002020202020202010101010101010102E8
+:10A0600002020202020202020202020202020202D0
+:10A0700002020202020202020202020202020202C0
+:10A0800002020202020202020202020202020202B0
+:10A0900002020202020202020202020202020201A1
+:10A0A00001010101010101010101010101010101A0
+:10A0B0000101010101010101010101010101010190
+:10A0C0000101010101010101010101010101010180
+:10A0D0000101010101010101010101010101010170
+:10A0E0000101010101010101010101010101010160
+:10A0F0000101010101010101010101010101010150
+:10A10000010101010101010101010101010101013F
+:10A11000010101010101010101010101010101012F
+:10A12000010101010101010101010101010101011F
+:10A13000010101010101010101010101010101010F
+:10A1400001010101010101010101010101010101FF
+:10A1500001010101010101010101010101010102EE
+:10A1600002020202020202020202020202020202CF
+:10A1700002020202020202020202020202020202BF
+:10A1800002020202020202020202020202020202AF
+:10A1900002020202020202020202020202020201A0
+:10A1A000010101010101010101010101010101019F
+:10A1B000010101010101010101010101010101018F
+:10A1C000010101010101010101010101010101017F
+:10A1D000010101010101010101010101010101016F
+:10A1E000010101010101010101010101010101015F
+:10A1F000010101010101010101010101010101014F
+:10A20000010101010101010101010101010101013E
+:10A21000010101010101010101010101010101012E
+:10A22000010101010101010101010101010101011E
+:10A23000010101010101010101010101010101010E
+:10A2400001010101010101010101010101010101FE
+:10A2500001010101010101010101010101010102ED
+:10A2600002020202020202020202020202020102CF
+:10A2700002020202020202020202020202020202BE
+:10A2800002020202020202020202020202020202AE
+:10A29000020202020202020202020202020202019F
+:10A2A000010101010101010101010101010101019E
+:10A2B000010101010101010101010101010101018E
+:10A2C000010101010101010101010101010101017E
+:10A2D000010101010101010101010101010101016E
+:10A2E000010101010101010101010101010101015E
+:10A2F000010101010101010101010101010101014E
+:10A30000010101010101010101010101010101013D
+:10A31000010101010101010101010101010101012D
+:10A32000010101010101010101010101010101011D
+:10A33000010101010101010101010101010101010D
+:10A3400001010101010101010101010101010101FD
+:10A3500001010101010101010101010101010101ED
+:10A3600001010101010101010101010101010102DC
+:10A3700002020202020202020202020202020202BD
+:10A3800002020202020202020202020202020202AD
+:10A39000020202020202020202020202020202019E
+:10A3A000010101010101010101010101010101019D
+:10A3B000010101010101010101010101010101018D
+:10A3C000010101010101010101010101010101017D
+:10A3D000010101010101010101010101010101016D
+:10A3E000010101010101010101010101010101015D
+:10A3F000010101010101010101010101010101014D
+:10A40000010101010101010101010101010101013C
+:10A41000010101010101010101010101010101012C
+:10A42000010101010101010101010101010101011C
+:10A43000010101010101010101010101010101010C
+:10A4400001010101010101010101010101010101FC
+:10A4500001010101010101010101010101010101EC
+:10A4600001010101010101010101010101010102DB
+:10A4700002020202020202020202020202020202BC
+:10A4800002020202020101010101010202020202B2
+:10A49000020202020202020202020202020202019D
+:10A4A000010101010101010101010101010101019C
+:10A4B000010101010101010101010101010101018C
+:10A4C000010101010101010101010101010101017C
+:10A4D000010101010101010101010101010101016C
+:10A4E000010101010101010101010101010101015C
+:10A4F000010101010101010101010101010101014C
+:10A50000010101010101010101010101010101013B
+:10A51000010101010101010101010101010101012B
+:10A52000010101010101010101010101010101011B
+:10A53000010101010101010101010101010101010B
+:10A5400001010101010101010101010101010101FB
+:10A5500001010101010101010101010101010101EB
+:10A5600001010101010101010101010101010102DA
+:10A5700002020202020202010101010201020101C2
+:10A5800001010101010101010101010101010102BA
+:10A5900001010101010101010101010101010101AB
+:10A5A000010101010101010101010101010101019B
+:10A5B000010101010101010101010101010101018B
+:10A5C000010101010101010101010101010101017B
+:10A5D000010101010101010101010101010101016B
+:10A5E000010101010101010101010101010101015B
+:10A5F000010101010101010101010101010101014B
+:10A60000010101010101010101010101010101013A
+:10A61000010101010101010101010101010101012A
+:10A62000010101010101010101010101010101011A
+:10A63000010101010101010101010101010101010A
+:10A6400001010101010101010101010101010101FA
+:10A6500001010101010101010101010101010101EA
+:10A6600001010101010101010101010101010101DA
+:10A6700001010101010101010101010101010101CA
+:10A6800001010101010101010101010101010100BB
+:10A6900000000000000000000000000000000001B9
+:10A6A000010101010101010101010101010101019A
+:10A6B000010101010101010101010101010101018A
+:10A6C000010101010101010101010101010101017A
+:10A6D000010101010101010101010101010101016A
+:10A6E000010101010101010101010101010101015A
+:10A6F000010101010101010101010101010101014A
+:10A700000101010101010101010101010101010139
+:10A710000101010101010101010101010101010129
+:10A720000101010101010101010101010101010119
+:10A730000101010101010101010101010101010109
+:10A7400001010101010101010101010101010101F9
+:10A7500001010101010101010101010101010101E9
+:10A7600001010101010101010101010101010101D9
+:10A7700001010101010101010101010101010101C9
+:10A7800001010101010101010101010101010100BA
+:10A7900000000000000000000000000000000001B8
+:10A7A0000101010101010101010101010101010199
+:10A7B0000101010101010101010101010101010189
+:10A7C0000101010101010101010101010101010179
+:10A7D0000101010101010101010101010101010169
+:10A7E0000101010101010101010101010101010159
+:10A7F0000101010101010101010101010101010149
+:10A800000101010101010101010101010101010138
+:10A810000101010101010101010101010101010128
+:10A820000101010101010101010101010101010118
+:10A830000101010101010101010101010101010108
+:10A8400001010101010101010101010101010101F8
+:10A8500001010101010101010101010101010101E8
+:10A8600001010101010101010101010101010101D8
+:10A8700001010101010101010101010101010101C8
+:10A8800001010101010101010101010101010100B9
+:10A8900000000000000000000000000000000001B7
+:10A8A0000101010101010101010101010101010198
+:10A8B0000101010101010101010101010101010188
+:10A8C0000101010101010101010101010101010178
+:10A8D0000101010101010101010101010101010168
+:10A8E0000101010101010101010101010101010158
+:10A8F0000101010101010101010101010101010148
+:10A900000101010101010101010101010101010137
+:10A910000101010101010101010101010101010127
+:10A920000101010101010101010101010101010117
+:10A930000101010101010101010101010101010107
+:10A9400001010101010101010101010101010101F7
+:10A9500001010101010101010101010101010101E7
+:10A9600001010101010101010101010101010101D7
+:10A9700001010101010101010101010101010101C7
+:10A9800001010101010101010101010101010100B8
+:10A9900000000000000000000000000000000000B7
+:10A9A00000000000000000000000000000000002A5
+:10A9B0000202020202020202020202020202020277
+:10A9C0000202020202020202020202020202020267
+:10A9D0000202020202020202020202020202020257
+:10A9E0000202020202020202020202020202020049
+:10A9F0000000000000000000000000000000000057
+:10AA00000000000000000000000000000000000244
+:10AA10000202020202020202020202020202020216
+:10AA20000202020202020202020202020202020206
+:10AA300002020202020202020202020202020202F6
+:10AA400002020202020202020202020202020202E6
+:10AA500002020202020202020202020202020202D6
+:10AA600002020202020202020202020202020200C8
+:10AA700000000000000000000000000000000002D4
+:10AA800002020202020202020202020202020200A8
+:10AA900000000000000000000000000000000000B6
+:10AAA00000000000000000000000000000000002A4
+:10AAB0000202020202020202020202020202020276
+:10AAC0000202020202020202020202020202020266
+:10AAD0000202020202020202020202020202020256
+:10AAE0000202020202020202020202020202020048
+:10AAF0000000000000000000000000000000000056
+:10AB00000000000000000000000000000000000045
+:10AB10000000000000000000000000000000000035
+:10AB20000000000000000000000000000000000025
+:10AB30000000000000000000000000000000000213
+:10AB400002020202020202020202020202020202E5
+:10AB500002020202020202020202020202020200D7
+:10AB600000000000000000000000000000000000E5
+:10AB700000000000000000000000000000000002D3
+:10AB800002020202020202020202020202020200A7
+:10AB900000000000000000000000000000000000B5
+:10ABA00000000000000000000000000000000000A5
+:10ABB0000000000000000000000000000000000095
+:10ABC0000000000000000000000000000000000085
+:10ABD0000000000000000000000000000000000075
+:10ABE0000000000000000000000000000000000065
+:10ABF0000000000000000000000000000000000055
+:10AC00000000000000000000000000000000000044
+:10AC10000000000000000000000000000000000034
+:10AC20000000000000000000000000000000000024
+:10AC30000000000000000000000000000000000014
+:10AC40000000000000000000000000000000000004
+:10AC500000000000000000000000000000000000F4
+:10AC600000000000000000000000000000000000E4
+:10AC700000000000000000000000000000000000D4
+:10AC800000000000000000000000000000000000C4
+:10AC90000000000000000000000000000000004272
+:10ACA00000000000000000000000000000000000A4
+:10ACB0000000000000000000000000000000000094
+:10ACC0000000000000000000000000000000000084
+:10ACD0000000000000000000000000000000000074
+:10ACE0000000000000000000000000000000000064
+:10ACF0000000000000000000000000000000000054
+:10AD00000000000000000000000000000000000043
+:10AD10000000000000000000000000000000000033
+:10AD20000001000000010000000000000000000021
+:10AD30000000000000000000010000000000000012
+:10AD40000000000000000000000100000000000002
+:10AD500000000000000000000000000000000000F3
+:10AD600000000000000000000000000000000000E3
+:10AD700000000000000000000000000000000000D3
+:10AD800000000000000000000000000000000000C3
+:10AD900000000000000000000000000000000000B3
+:10ADA00000000000000000000000000000000000A3
+:10ADB0000000000000000000000000000000000093
+:10ADC0000000000000000000000000000000000083
+:10ADD0000000000000000000000000000000000073
+:10ADE0000000000000000000000000000000000063
+:10ADF0000000000000000000000000000000000053
+:10AE00000000000000000000000000010000000041
+:10AE10000000000000000000000000000000010130
+:10AE2000000100000101000000000000000000001F
+:10AE3000000000000000000001010100000000000F
+:10AE40000000000000000000010100000000000000
+:10AE500000000000000000000000000000000000F2
+:10AE600000000000000000000000000000000000E2
+:10AE700000000000000000000000000000000000D2
+:10AE800000000000000000000000000000000000C2
+:10AE900000000000000000000000000000000000B2
+:10AEA00000000000000000000000000000000001A1
+:10AEB0000000000000000000000000000100000091
+:10AEC0000000000000000000000000000000000082
+:10AED0000000000000000000000000000000000072
+:10AEE0000000000000000000000000000000000062
+:10AEF0000000000000000000000000000000000052
+:10AF00000000000000000000000000010000000040
+:10AF1000000000000000000000000000000001012F
+:10AF2000000100000101010000000000000000001D
+:10AF3000000000000000000001010100000000000E
+:10AF400000000000000000000101010000000000FE
+:10AF500000000000010000000100000000000000EF
+:10AF600000000000000000000000000000000000E1
+:10AF700000000000000000000000000000000000D1
+:10AF800000000000000000000000000000000000C1
+:10AF900000000000000000000000000000000000B1
+:10AFA00000000000000000000000000000000001A0
+:10AFB0000000000000000000000000000100000090
+:10AFC0000000000000000000000000000000000081
+:10AFD0000000000000000000000000000000000071
+:10AFE0000000000000000000000000000000000061
+:10AFF0000000000000000000000000000000000051
+:10B00000000000000000000000000001000000003F
+:10B01000000000000000000000000000000001012E
+:10B02000010100000101010000000000000000001B
+:10B03000000000000000000001010100000000000D
+:10B0400000000000000000000101010000000000FD
+:10B0500000000000010000000101000000000000ED
+:10B0600000000000000000000000000000000000E0
+:10B0700000000000000000000000000000000000D0
+:10B0800000000000000000000000000000000000C0
+:10B0900000000000000000000000000000000000B0
+:10B0A000000000000000000000000000000000019F
+:10B0B000000000000000000000000000010000008F
+:10B0C0000000000000000000000000000000000080
+:10B0D0000000000000000000000000000000000070
+:10B0E000000000000000000001000000000000005F
+:10B0F000000000010000000000000000000000004F
+:10B10000000000000000000000000001000000003E
+:10B11000000000000000000000000000000001012D
+:10B120000101000101010100000000000000000019
+:10B13000000000000000000101010100000000000B
+:10B1400000000000000000000101010001000000FB
+:10B1500000000000010000000101000000000000EC
+:10B1600000000000000000000000000000000000DF
+:10B1700000000000000000000000000000000000CF
+:10B1800000000000000000000000000000000000BF
+:10B1900000000000000000000000000000000000AF
+:10B1A000000000000000000000000000000000019E
+:10B1B000000000000000000000000000010000008E
+:10B1C000000000000000000100000000000000007E
+:10B1D000000000000000000000000000000000006F
+:10B1E000000000000000000001000001010000015B
+:10B1F000000001010000000000000000000000004D
+:10B20000000000000000000000000001000000003D
+:10B21000000000000000000000000000000001012C
+:10B220000101010101010100000000000000000017
+:10B230000000000000000001010101010101000007
+:10B2400000000000000000010101010001000000F9
+:10B2500000000000010000000101010000000000EA
+:10B2600000000000000000000000000000000000DE
+:10B2700000000000000000000000000000000000CE
+:10B2800000000000000000000000000000000000BE
+:10B2900000000000000000000000000000000000AE
+:10B2A000000000000000000000000001000000019C
+:10B2B000000000000000000000000100010000008C
+:10B2C000000000000000000100000000000000007D
+:10B2D000000000000000000000000000000000006E
+:10B2E0000000000000000001010000010100000159
+:10B2F000000101010000000000000000000000004B
+:10B30000000000000000000100000001000000003B
+:10B31000000000000000000001000000000001012A
+:10B320000101010101010101000000000000000015
+:10B330000000000000000001010101010101000006
+:10B3400000000000000000010101010101010000F6
+:10B3500000000000010000000101010000000000E9
+:10B3600000000000000000000000000000000000DD
+:10B3700000000000000000000000000000000000CD
+:10B3800000000000000000000000000000000000BD
+:10B3900000000000000000000000000000000000AD
+:10B3A000000000000000000000000001000000019B
+:10B3B000000000000000000000000100010000008B
+:10B3C000000000000000000100000001000000007B
+:10B3D000000000000000000000000000000001016B
+:10B3E0000000000000000001010000010101000157
+:10B3F0000101010100000000000000000000000049
+:10B40000000000000000000100000001000000003A
+:10B410000000000000000000010100000000010128
+:10B420000101010101010101000000010000000013
+:10B430000000000000000001010101010101000005
+:10B4400000000000010000010101010101010000F4
+:10B4500000000000010000000101010101010000E5
+:10B4600000000000000000000100000000000000DB
+:10B4700000000000000000000000000000000000CC
+:10B4800000000000000000000000000000000000BC
+:10B4900000000000000000000000000000000000AC
+:10B4A000000000000000000000000001000000019A
+:10B4B0000100000000000000000001000101000187
+:10B4C0000100000000000001000000010000000178
+:10B4D0000000000000000001000000000000010169
+:10B4E0000001000000000101010000010101000154
+:10B4F0000101010100000000000000000000000048
+:10B500000000000000000001000000010000000039
+:10B510000000000000000001010100000000010126
+:10B520000101010101010101000000010000000012
+:10B530000000000000000001010101010101000004
+:10B5400000000000010100010101010101010100F1
+:10B5500000000000010000010101010101010000E3
+:10B5600000000000000000000101010000000000D8
+:10B5700000000000000000000000000000000000CB
+:10B5800000000000000000000000000000000000BB
+:10B5900000000000000000000000000000000000AB
+:10B5A0000000000000000000000000010000000199
+:10B5B0000101000000000000000001000101000185
+:10B5C0000101000000000001000000010000000176
+:10B5D0000000000000000001000000000000010168
+:10B5E0000101000000000101010100010101000151
+:10B5F0000101010100000000000000000000000047
+:10B600000000000000000001000000010000000038
+:10B610000000000000000001010100000000010125
+:10B62000010101010101010100000001010000010F
+:10B630000000000000000001010101010101010101
+:10B6400001000000010100010101010101010100EF
+:10B6500000000000010100010101010101010101DF
+:10B6600000000000010000010101010000000000D5
+:10B6700000000000000000000001010000000000C8
+:10B6800000000000000000000000000000000000BA
+:10B6900000000000000000000000000000000000AA
+:10B6A0000000000000000000000001010100000196
+:10B6B0000101000000000000000001000101010183
+:10B6C0000101010000000001010000010000000173
+:10B6D0000000000000000001010000000000010166
+:10B6E000010100000001010101010001010100014F
+:10B6F0000101010100000000000000000000000046
+:10B700000000000000000001000000010000000037
+:10B710000000000000000001010100000000010124
+:10B72000010101010101010100000001010000010E
+:10B730000000000000000001010101010101010100
+:10B7400001000001010101010101010101010101EB
+:10B7500001000000010100010101010101010101DD
+:10B7600000000000010100010101010000000000D3
+:10B7700000000000000000000001010000000000C7
+:10B7800000000000000000000000000000010101B6
+:10B7900000000000010000000000000000000000A8
+:10B7A0000000000000000000000001010100000195
+:10B7B0000101000000010001000001000101010180
+:10B7C0000101010000000001010100010000000171
+:10B7D0000000000000000001010000010000010164
+:10B7E000010100000001010101010001010101014D
+:10B7F0000101010100000000000000000000000045
+:10B800000000000000000001000000010000000036
+:10B810000000000000000001010101000000010122
+:10B82000010101010101010100000001010101010B
+:10B8300000000100010000010101010101010101FD
+:10B8400001000001010101010101010101010101EA
+:10B8500001000001010101010101010101010101DA
+:10B8600001000000010100010101010000000000D1
+:10B8700000000000000000000001010001000000C5
+:10B8800000000000000000000000000000010101B5
+:10B8900000000000010100000000000000000000A6
+:10B8A0000000000000000000000001010101000193
+:10B8B000010100000001000100000100010101017F
+:10B8C000010101010000000101010001000000016F
+:10B8D0000000000000000001010000010000010163
+:10B8E000010100000001010101010001010101014C
+:10B8F0000101010100000000000000000000000044
+:10B900000000000000000101000000010000000034
+:10B910000000000000000001010101000000010121
+:10B92000010101010101010100000001010101010A
+:10B9300000000100010000010101010101010101FC
+:10B9400001010001010101010101010101010101E8
+:10B9500001000101010101010101010101010101D8
+:10B9600001010001010101010101010101000000CB
+:10B9700000000000000000000001010001000000C4
+:10B9800000000000000000000000000000010101B4
+:10B9900001000100010100000000000000000000A3
+:10B9A0000000000000000001000001010101000191
+:10B9B000010100000001000101000100010101017D
+:10B9C000010101010000010101010001000001016C
+:10B9D0000000000000000001010100010000010161
+:10B9E0000101010000010101010101010101010149
+:10B9F0000101010100000000000000000000000043
+:10BA00000000000000000101000100010001000031
+:10BA10000000000000000001010101000000010120
+:10BA20000101010101010101000000010101010109
+:10BA300000000100010000010101010101010101FB
+:10BA400001010101010101010101010101010101E6
+:10BA500001010101010101010101010101010101D6
+:10BA600001010101010101010101010101000000C9
+:10BA700000000000000000000001010101000000C2
+:10BA800000000000000000000000000000010101B3
+:10BA9000010101010101010000000000000000009F
+:10BAA000000000000000000100010101010101018E
+:10BAB000010100000001000101010101010101017A
+:10BAC000010101010100010101010001000001016A
+:10BAD0000000000000000001010100010000010160
+:10BAE0000101010000010101010101010101010148
+:10BAF0000101010100000001010000000000000040
+:10BB00000000000000000101000100010001000030
+:10BB1000000000000100000101010100000001011E
+:10BB20000101010101010101000000010101010108
+:10BB300000000101010001010101010101010101F8
+:10BB400001010101010101010101010101010101E5
+:10BB500001010101010101010101010101010101D5
+:10BB600001010101010101010101010101010101C5
+:10BB700000000000010000000001010101000000C0
+:10BB800000000000000000000000000000010101B2
+:10BB9000010101010101010000000000000000009E
+:10BBA000000000000000000101010101010101018C
+:10BBB0000101000000010001010101010101010179
+:10BBC0000101010101000102010101010100010166
+:10BBD000000000000100000101010101010001015C
+:10BBE0000101010001010101010101010101010146
+:10BBF000010101010000000101010001000000003D
+:10BC0000000000000100010200010101000101002B
+:10BC1000000100000100000101010100000001011C
+:10BC20000101010101010101000100010101010106
+:10BC300001000101010001010101010101010101F6
+:10BC400001010101010101010101010101010101E4
+:10BC500001010101010101010101010101010101D4
+:10BC600001010101010101010101010101010101C4
+:10BC700000000000010100000001010101010101BB
+:10BC800000000000000000000000000000010101B1
+:10BC9000010101010101010000000000000000009D
+:10BCA000000000000000000101010101010101018B
+:10BCB0000101010000010001010101010201010176
+:10BCC0000101010101000102010101010100010165
+:10BCD0000000000101000002010101010100010159
+:10BCE0000101010001010102020101010101010143
+:10BCF000010101010000000101010001000000003C
+:10BD00000000000001010102000101010001010029
+:10BD1000000100000100000101010100000001011B
+:10BD20000101010101010101010100010101010104
+:10BD300001010101010001010101010101010101F4
+:10BD400001010101010101010101010101010101E3
+:10BD500001010101010101010101010101010101D3
+:10BD600001010101010101010101010101010101C3
+:10BD700001000000010100000001010101010101B9
+:10BD800000000000000000000000000000010101B0
+:10BD9000010101010101010000010000000000009B
+:10BDA000000000000000000101010101010101018A
+:10BDB0000101010000010001010102010201010174
+:10BDC0000101010101010102010101010100010163
+:10BDD0000000000101000002010101010100010158
+:10BDE0000101010001010102020101010101010142
+:10BDF0000101010100000001010101010100010137
+:10BE00000000000001010102000101020001010027
+:10BE10000001000001000001010101010000010119
+:10BE20000101010101010101010100010101010103
+:10BE300001010101010001010101010101010101F3
+:10BE400001010101010101010101010101010101E2
+:10BE500001010101010101010101010101010101D2
+:10BE600001010101010101010101010101010101C2
+:10BE700001010001010101000001010101010101B5
+:10BE800001000000000000000000000000010101AE
+:10BE90000101010101010100010100000000000099
+:10BEA0000000000000000001010101020101010287
+:10BEB0000101010000010002010102010201010172
+:10BEC0000101010101010102010101010100010162
+:10BED0000000000101000102020101010100010155
+:10BEE0000101010001010102020101020101010140
+:10BEF0000101010101000001010101010100010135
+:10BF00000000000001010102010101020001010025
+:10BF10000101010001000001010101010000010116
+:10BF20000101010101010101010100010101010102
+:10BF300001010101010001010101010101010101F2
+:10BF400001010101010101010101010101010101E1
+:10BF500001010101010101010101010101010101D1
+:10BF600001010101010101010101010101010101C1
+:10BF700001010101010101000001010101010101B3
+:10BF800001010000000100000000000000010101AB
+:10BF90000101010101010100010101000000000097
+:10BFA0000000000000000001010101020101010286
+:10BFB0000101010100010002010102010201010170
+:10BFC000010101010101010202010102010101015E
+:10BFD0000000000101000102020101010101020152
+:10BFE000010101000101010202010102020101013E
+:10BFF0000101010101000001010101010101010133
+:10C000000100010001010102010101020001010022
+:10C010000101010101000001010101010101010112
+:10C020000101010101010101010101010101010100
+:10C0300001010101010001010201010101010101F0
+:10C0400001010101010101010101010101010101E0
+:10C0500001010101010101010101010101010101D0
+:10C0600001010101010101010101010101010101C0
+:10C0700001010101010101000001010101010101B2
+:10C0800001010100010100000000000000010101A8
+:10C090000101010101010100010101000000000096
+:10C0A0000000000000000002010102020101010283
+:10C0B000010101010001000202010201020201016D
+:10C0C000020101010101010202010102010101015C
+:10C0D000000000010100010202010102010102024F
+:10C0E000010101000101010202020102020101023B
+:10C0F0000101010101000001010101010101010132
+:10C10000010101010101010201010102000101001F
+:10C11000010101010100000202010101010101010F
+:10C1200001010101010101020101010101010101FE
+:10C1300001010101010001020201010101010101EE
+:10C1400001010101010101010201010101010101DE
+:10C1500001010101010101010101010101010101CF
+:10C1600001010101010101010101010101010101BF
+:10C1700001010101010101000001010101010101B1
+:10C1800001010100010101000000000000010101A6
+:10C190000101010101010100010101010101010190
+:10C1A0000000000001000002010102020201010280
+:10C1B0000202010100010002020102010202020268
+:10C1C0000202020101010102020201020101010257
+:10C1D000000000010100010202020102010102024D
+:10C1E0000202010001010102020201020202010237
+:10C1F000020202020100000201010101010101012C
+:10C20000010101010101010201010102000101001E
+:10C21000010101010100000202010101010102010D
+:10C2200001010101010101020101010101010101FD
+:10C2300001010101010001020202020101010101EB
+:10C2400001010101010101020202010101010101DB
+:10C2500001010101010101010201010101010101CD
+:10C2600001010101010101010101010101010101BE
+:10C2700001010101010101000001010101010101B0
+:10C2800001010100010101000100000000010101A4
+:10C29000010101010101010001010101010101018F
+:10C2A000000000000101000202010202020101027D
+:10C2B0000202010100010002020202020202020265
+:10C2C0000202020201010102020201020101010255
+:10C2D000000001010100010202020202010102024A
+:10C2E0000202010001010102020202020202010235
+:10C2F000020202020100000202010101010101012A
+:10C30000010101010101010201010102000101001D
+:10C310000101010101000102020201010101020209
+:10C3200001020101010101020101010101010101FB
+:10C3300001010101010001020202020101010101EA
+:10C3400001010101010101020202020101010101D9
+:10C3500001010101010101010201010101010101CC
+:10C3600001010101010101010101010101010101BD
+:10C3700001010101010101000101010101010101AE
+:10C3800001010101010101000101000000010101A1
+:10C39000010101010101010001010101010101018E
+:10C3A0000100000001010002020202020202010279
+:10C3B0000202010100010002020202020202020264
+:10C3C0000202020201010102020202020101010253
+:10C3D0000100010101000102020202020201020247
+:10C3E0000202020001010102020202020202020232
+:10C3F0000202020201000002020101010101010129
+:10C400000101010101010102020201020101010118
+:10C410000101010101000102020201010101020208
+:10C4200002020101010101020101010101010101F9
+:10C4300001010101010001020202020101010101E9
+:10C4400001010101010101020202020101010101D8
+:10C4500001010101010101020202010101010101C9
+:10C4600001010101010101020201010101010101BA
+:10C4700001010101010101000101010101010101AD
+:10C4800001010101010101000101000000010101A0
+:10C49000010101010101010001010101010101018D
+:10C4A0000101000101010102020202020202020274
+:10C4B0000202010101010002020202020202020262
+:10C4C0000202020201010102020202020201020250
+:10C4D0000100010201010102020202020201020244
+:10C4E0000202020101010102020202020202020230
+:10C4F0000202020201000002020201020101010126
+:10C500000101010101010102020202020101010116
+:10C510000101010101000102020202010101020206
+:10C5200002020101010101020101010201010101F7
+:10C5300001010101010001020202020201010101E7
+:10C5400001010101010101020202020101010101D7
+:10C5500001010101010101020202020101010101C7
+:10C5600001010101010101020201010101010101B9
+:10C5700001010101010101000102020101010101AA
+:10C58000010101010101010001010100000101019E
+:10C59000010101010101010001010101010101018C
+:10C5A0000101010101010102020202020202020272
+:10C5B0000202020101010002020202020202020260
+:10C5C000020202020201010202020202020102024E
+:10C5D0000100010202010102020202020201020242
+:10C5E000020202010102020202020202020202022D
+:10C5F0000202020201000002020202020101010124
+:10C600000101010101010102020202020102010114
+:10C610000101010101000102020202010101020205
+:10C6200002020202020201020101010201010101F2
+:10C6300001010101010001020202020202010101E5
+:10C6400001010101010101020202020202010101D4
+:10C6500001010101010101020202020101010101C6
+:10C6600001010101010101020202020101010101B6
+:10C6700001010101010101000102020101010101A9
+:10C68000010101010101010101010100000101019C
+:10C69000010101010101010001010101010101018B
+:10C6A0000101010101010102020202020202020271
+:10C6B000020202010102000202020202020202025E
+:10C6C000020202020201020202020202020102024C
+:10C6D000010101020201010202020202020202023F
+:10C6E000020202010102020202020202020202022C
+:10C6F0000202020201000102020202020201020120
+:10C700000101010101010102020202020102020112
+:10C710000102010101010102020202010101020202
+:10C7200002020202020201020101010202010101F0
+:10C7300001010101010001020202020202020101E3
+:10C7400001010101010101020202020202010101D3
+:10C7500001010101010101020202020201010101C4
+:10C7600001010101010101020202020101010101B5
+:10C7700001010101010101010102020101010101A7
+:10C78000010101010101010101010100000101019B
+:10C79000010101010101010001010101010101018A
+:10C7A0000101010101010102020202020202020270
+:10C7B000020202020102000202020202020202025C
+:10C7C0000202020202020202020202020202020249
+:10C7D000010102020201010202020202020202023D
+:10C7E000020202010202020202020202020202022A
+:10C7F000020202020100010202020202020102021E
+:10C800000101010101010102020202020102020111
+:10C8100002020201010101020202020101010202FF
+:10C8200002020202020202020202010202010101EC
+:10C8300001010101010001020202020202020101E2
+:10C8400001010101010101020202020202020101D1
+:10C8500001010101010101020202020202010101C2
+:10C8600001010101010101020202020101010101B4
+:10C8700001010101010101010102020202010101A4
+:10C88000010101010101010101010100000101019A
+:10C890000101010101010100010101010101010189
+:10C8A000010101010101010202020202020202026F
+:10C8B000020202020102000202020202020202025B
+:10C8C0000202020202020202020202020202020248
+:10C8D000020102020201010202020202020202023B
+:10C8E0000202020102020202020202020202020229
+:10C8F000020202020100010202020202020202021C
+:10C90000020102010201010202020202010202010D
+:10C9100002020202010101020202020201010202FC
+:10C9200002020202020202020202010202020202E8
+:10C9300001010101010001020202020202020201E0
+:10C9400001010101010101020202020202020201CF
+:10C9500001010101010101020202020202020101C0
+:10C9600001010101010101020202020201010101B2
+:10C9700001010101010101010102020202010101A3
+:10C980000101010101010101010101010102020195
+:10C990000101010101010100020101010101010187
+:10C9A000010101010101010202020202020202026E
+:10C9B000020202020102000202020202020202025A
+:10C9C0000202020202020202020202020202020247
+:10C9D000020102020201010202020202020202023A
+:10C9E0000202020202020202020202020202020227
+:10C9F000020202020200010202020202020202021A
+:10CA00000202020202020202020202020102020108
+:10CA100002020202020101020202020201010202FA
+:10CA200002020202020202020202020202020202E6
+:10CA300001010101010101020202020202020202DD
+:10CA400002010101010101020202020202020201CD
+:10CA500001010101020101020202020202020201BD
+:10CA600001010101010101020202020202010101B0
+:10CA700001010101010101010102020202010101A2
+:10CA80000101010101010101010101010102020293
+:10CA90000101010101010100020201010101010185
+:10CAA000010101010101010202020202020202026D
+:10CAB0000202020201020002020202020202020259
+:10CAC0000202020202020202020202020202020246
+:10CAD0000202020202020202020202020202020236
+:10CAE0000202020202020202020202020202020226
+:10CAF0000202020202000102020202020202020219
+:10CB00000202020202020202020202020202020106
+:10CB100002020202020101020202020202010202F8
+:10CB200002020202020202020202020202020202E5
+:10CB300001010201010101020202020202020202DB
+:10CB400002010101010101020202020202020202CB
+:10CB500002010101020101020202020202020202BA
+:10CB600001010101010101020202020202010101AF
+:10CB7000010101010101010102020202020202019E
+:10CB80000101010101010101020101010102020291
+:10CB90000201010101010100020202010101010182
+:10CBA000010101010101010202020202020202026C
+:10CBB0000202020202020002020202020202020257
+:10CBC0000202020202020200020202020202020247
+:10CBD0000202020202020202020202020202020235
+:10CBE0000202020202020202020202020202020225
+:10CBF0000202020202000102020202020202020218
+:10CC00000202020202020202020202020202020204
+:10CC100002020202020101020202020202020202F6
+:10CC200002020202020202020202020202020202E4
+:10CC300002010201010101020202020202020202D9
+:10CC400002020102020101020202020202020202C7
+:10CC500002010101020101020202020202020202B9
+:10CC600002010101010101020202020202020201AB
+:10CC7000010101010101010202020202020202029B
+:10CC8000010101010101010202010101010202028F
+:10CC9000020202010101010002020201010101017F
+:10CCA000010101010101010202020202020202026B
+:10CCB0000202020202020002020202020202020256
+:10CCC0000202020202020202020202020202020046
+:10CCD0000202020000020202020202020202020238
+:10CCE0000202020202020202020202020202020224
+:10CCF0000202020202000102020202020202020217
+:10CD00000202020202020202020202020202020203
+:10CD100002020202020101020202020202020202F5
+:10CD200002020202020202020202020202020202E3
+:10CD300002020202020101020202020202020202D5
+:10CD400002020202020201020202020202020202C4
+:10CD500002020202020101020202020202020202B5
+:10CD600002020101010101020202020202020202A8
+:10CD7000010101010101010202020202020202029A
+:10CD8000020101010101010202020101010202028C
+:10CD9000020202020201010002020202010101017B
+:10CDA000010101010101010202020202020202026A
+:10CDB0000202020202020002020202020202020255
+:10CDC0000202020202020202020202020202020243
+:10CDD0000202020000020202020202020202020237
+:10CDE0000202020202020202020202020202020223
+:10CDF0000202020202000102020202020202020216
+:10CE00000202020202020202020202020202020202
+:10CE100002020202020101020202020202020202F4
+:10CE200002020202020202020202020202020202E2
+:10CE300002020202020101020202020202020202D4
+:10CE400002020202020201020202020202020202C3
+:10CE500002020202020201020202020202020202B3
+:10CE600002020202020101020202020202020202A4
+:10CE70000201010101010102020202020202020298
+:10CE80000202010101010102020202010102020289
+:10CE90000202020202020100020202020201010178
+:10CEA0000101010101010102020202020202020269
+:10CEB0000202020202020002020202020202020254
+:10CEC0000202020202020202020202020202020242
+:10CED0000202000200020202020202020202020236
+:10CEE0000202020202020202020202020202020222
+:10CEF0000202020202000202020202020202020214
+:10CF00000202020202020202020202020202020201
+:10CF100002020202020102020202020202020202F2
+:10CF200002020202020202020202020202020202E1
+:10CF300002020202020101020202020202020202D3
+:10CF400002020202020202020202020202020202C1
+:10CF500002020202020201020202020202020202B2
+:10CF600002020202020201020202020202020202A2
+:10CF70000202010101010102020202020202020296
+:10CF80000202020101010102020202010102020287
+:10CF90000202020202020100020202020202020175
+:10CFA0000101010101010102020202020202020268
+:10CFB0000202020202020002020202020202020253
+:10CFC0000202020202020202020202020202020241
+:10CFD0000202000202000202020202020202020235
+:10CFE0000202020202020202020202020202020221
+:10CFF0000202020202000202020202020202020213
+:10D000000202020202020202020202020202020200
+:10D0100002020202020202020202020202020202F0
+:10D0200002020202020202020202020202020202E0
+:10D0300002020202020102020202020202020202D1
+:10D0400002020202020202020202020202020202C0
+:10D0500002020202020202020202020202020202B0
+:10D0600002020202020201020202020202020202A1
+:10D070000202020202010102020202020202020292
+:10D080000202020101010102020202010102020286
+:10D090000202020202020200020202020202020272
+:10D0A0000101010101010102020202020202020267
+:10D0B0000202020202020002020202020202020252
+:10D0C0000202020202020202020202020202020240
+:10D0D0000202000202000202020202020202020234
+:10D0E0000202020202020202020202020202020220
+:10D0F0000202020202000202020202020202020212
+:10D1000002020202020202020202020202020202FF
+:10D1100002020202020202020202020202020202EF
+:10D1200002020202020202020202020202020202DF
+:10D1300002020202020102020202020202020202D0
+:10D1400002020202020202020202020202020202BF
+:10D1500002020202020202020202020202020202AF
+:10D16000020202020202020202020202020202029F
+:10D170000202020202020102020202020202020290
+:10D180000202020202020102020202020102020281
+:10D190000202020202020200020202020202020271
+:10D1A0000201010101010102020202020202020265
+:10D1B0000202020202020002020202020202020251
+:10D1C000020202020202020202020202020202023F
+:10D1D0000202020202000202020202020202020231
+:10D1E000020202020202020202020202020202021F
+:10D1F0000202020202000202020202020202020211
+:10D2000002020202020202020202020202020202FE
+:10D2100002020202020202020202020202020202EE
+:10D2200002020202020202020202020202020202DE
+:10D2300002020202020102020202020202020202CF
+:10D2400002020202020202020202020202020202BE
+:10D2500002020202020202020202020202020202AE
+:10D26000020202020202020202020202020202029E
+:10D27000020202020202010202020202020202028F
+:10D28000020202020202010202020202020202027F
+:10D290000202020202020200020202020202020270
+:10D2A0000202010101010102020202020202020263
+:10D2B0000202020202020002020202020202020250
+:10D2C000020202020202020202020202020202023E
+:10D2D0000202020202000202020202020202020230
+:10D2E000020202020202020202020202020202021E
+:10D2F0000202020202000202020202020202020210
+:10D3000002020202020202020202020202020202FD
+:10D3100002020202020202020202020202020202ED
+:10D3200002020202020202020202020202020202DD
+:10D3300002020202020102020202020202020202CE
+:10D3400002020202020202020202020202020202BD
+:10D3500002020202020202020202020202020202AD
+:10D36000020202020202020202020202020202029D
+:10D37000020202020202020202020202020202028D
+:10D38000020202020202020202020202020202027D
+:10D39000020202020202020202020202020202026D
+:10D3A000020202020201010202020202020202025F
+:10D3B000020202020202000202020202020202024F
+:10D3C000020202000202020202020202020202023F
+:10D3D000020202020202020202020202020202022D
+:10D3E000020202020202020202020202020202021D
+:10D3F000020202020200020202020202020202020F
+:10D4000002020202020202020202020202020202FC
+:10D4100002020202020202020202020202020202EC
+:10D4200002020202020202020202020202020202DC
+:10D4300002020202020102020202020202020202CD
+:10D4400002020202020202020202020202020202BC
+:10D4500002020202020202020202020202020202AC
+:10D46000020202020202020202020202020202029C
+:10D47000020202020202020202020202020202028C
+:10D48000020202020202020202020202020202027C
+:10D49000020202020202020202020202020202026C
+:10D4A000020202020202010202020202020202025D
+:10D4B000020202020202000202020202020202024E
+:10D4C0000202000002020202020202020202020240
+:10D4D000020202020202020202020202020202022C
+:10D4E000020202020202020202020202020202021C
+:10D4F000020202020201020202020202020202020D
+:10D5000002020202020202020202020202020202FB
+:10D5100002020202020202020202020202020202EB
+:10D5200002020202020202020202020202020202DB
+:10D5300002020202020102020202020202020202CC
+:10D5400002020202020202020202020202020202BB
+:10D5500002020202020202020202020202020202AB
+:10D56000020202020202020202020202020202029B
+:10D57000020202020202020202020202020202028B
+:10D58000020202020202020202020202020202027B
+:10D59000020202020202020202020202020202026B
+:10D5A000020202020202010202020202020202025C
+:10D5B000020202020202000202020202020202024D
+:10D5C0000202000001010102020202020202020242
+:10D5D000020202000002020202020202020202022F
+:10D5E000020202020202020202020202020202021B
+:10D5F000020202020202020202020202020202020B
+:10D6000002020202020202020202020202020202FA
+:10D6100002020202020202020202020202020202EA
+:10D6200002020202020202020202020202020202DA
+:10D6300002020202020202020202020202020202CA
+:10D6400002020202020202020202020202020202BA
+:10D6500002020202020202020202020202020202AA
+:10D66000020202020202020202020202020202029A
+:10D67000020202020202020202020202020202028A
+:10D68000020202020202020202020202020202027A
+:10D69000020202020202020202020202020202026A
+:10D6A000020202020202020202020202020202025A
+:10D6B0000201010101020002020202020202020250
+:10D6C0000101010101010102020202020202020241
+:10D6D000020202000002020202020202020202022E
+:10D6E000020201010202020202020202020202021C
+:10D6F000020202020202020202020202020202020A
+:10D7000002020202020202020202020202020202F9
+:10D7100002020202020202020202020202020202E9
+:10D7200002020202020202020202020202020202D9
+:10D7300002020202020202020202020202020202C9
+:10D7400002020202020202020202020202020202B9
+:10D7500002020202020202020202020202020202A9
+:10D760000202020202020202020202020202020299
+:10D770000202020202020202020202020202020289
+:10D780000202020202020202020202020202020279
+:10D790000202020202020202020202020202020269
+:10D7A000020202020202020202020202020202015A
+:10D7B0000101010101010102020202020101010154
+:10D7C0000101010101010102020202020202020240
+:10D7D000020202000002020202020202020201012F
+:10D7E0000101010101010102020202020202020220
+:10D7F0000202020202020202020202020202020209
+:10D8000002020202020202020202020202020202F8
+:10D8100002020202020202020202020202020202E8
+:10D8200002020202020202020202020202020202D8
+:10D8300002020202020202020202020202020202C8
+:10D8400002020202020202020202020202020202B8
+:10D8500002020202020202020202020202020202A8
+:10D860000202020202020202020202020202020298
+:10D870000202020202020202020202020202020288
+:10D880000202020202020202020202020202020278
+:10D890000202020202020202020202020202020268
+:10D8A000020202020202020202020201010101015D
+:10D8B0000101010101010102020201010101010155
+:10D8C0000101010101010102020202020202020041
+:10D8D0000101010000010102020202010101010136
+:10D8E000010101010101010202020202020202021F
+:10D8F000020202020002010202020202020202020B
+:10D9000002020202000002020202020202020202FB
+:10D9100002020202020202020202020202020202E7
+:10D9200002020202020202020202020202020202D7
+:10D9300002020202020202020202020202020202C7
+:10D9400002020202020202020202020202020202B7
+:10D9500002020202020202020202020202020202A7
+:10D960000202020202020202020202020202020297
+:10D970000202020202020202020202020202020287
+:10D980000202020202020202020202020202020277
+:10D990000202020202020202020202020202020267
+:10D9A000020202020202020202020101010101015D
+:10D9B0000101010101010101010101010101010157
+:10D9C0000101010101010102020202020202020040
+:10D9D0000101010100010101010101010101010138
+:10D9E000010101010101010202020202020202011F
+:10D9F000010101010101010202020202020202020E
+:10DA000002020202000002020202020202020202FA
+:10DA100002020000020202020202020202020202EA
+:10DA200002020202020202020202020202020202D6
+:10DA300002020202020202020202020202020202C6
+:10DA400002020202020202020202020202020202B6
+:10DA500002020202020202020202020202020202A6
+:10DA60000202020202020202020202020202020296
+:10DA70000202020202020202020202020202020286
+:10DA80000202020202020202020202020202020276
+:10DA90000202020202020202020202020202020266
+:10DAA000020202020202020101010101010101015F
+:10DAB0000101010101010101010101010101010156
+:10DAC0000101010101010102020202010101010142
+:10DAD0000101010101010101010101010101010136
+:10DAE0000101010101010102020202010101010122
+:10DAF000010101010101010202020202020202020D
+:10DB000002020101000002020202020202020202FB
+:10DB100000000000020202020202020202020202ED
+:10DB200002020202020202020202020202020202D5
+:10DB300002020202020202020202020202020202C5
+:10DB400002020202020202020202020202020202B5
+:10DB500002020202020202020202020202020202A5
+:10DB60000202020202020202020202020202020295
+:10DB70000202020202020202020202020202020285
+:10DB80000202020202020202020202020202020275
+:10DB90000202020202020202020202020202020265
+:10DBA000020202020202020101010101010101015E
+:10DBB0000101010101010101010101010101010155
+:10DBC0000101010101010101010101010101010145
+:10DBD0000101010101010101010101010101010135
+:10DBE0000101010101010101010101010101010125
+:10DBF000010101010101010202020202020201010E
+:10DC000001010101000001010202020202020202FE
+:10DC100000000000020202020202020202020202EC
+:10DC200002020202020202020202020202020202D4
+:10DC300002020202020202020202020202020202C4
+:10DC400002020202020202020202020202020202B4
+:10DC500002020202020202020202020202020202A4
+:10DC60000202020202020202020202020202020294
+:10DC70000202020202020202020202020202020284
+:10DC80000202020202020202020202020202020274
+:10DC90000202020202020202020202020202020264
+:10DCA000020202020202020101010101010101015D
+:10DCB0000101010101010101010101010101010154
+:10DCC0000101010101010101010101010101010144
+:10DCD0000101010101010101010101010101010134
+:10DCE0000101010101010101010101010101010124
+:10DCF0000101010101010102020202010101010110
+:10DD000001010101010101010102020202020202FC
+:10DD100000000101000101020202020202020202ED
+:10DD200002020202020202020202020202020202D3
+:10DD300002020202020202020202020202020202C3
+:10DD400002020202020202020202020202020202B3
+:10DD500002020202020202020202020202020202A3
+:10DD60000202020202020202020202020202020293
+:10DD70000202020202020202020202020202020283
+:10DD80000202020202020202020202020202020273
+:10DD90000202020202020202020202020202020263
+:10DDA000020202020202020101010101010101015C
+:10DDB0000101010101010101010101010101010153
+:10DDC0000101010101010101010101010101010143
+:10DDD0000101010101010101010101010101010133
+:10DDE0000101010101010101010101010101010123
+:10DDF0000101010101010101010101010101010113
+:10DE000001010101010101010102020102010101FF
+:10DE100001010101010101020202020202020202E9
+:10DE200002020202020202020202020202020202D2
+:10DE300002020202020202020202020202020202C2
+:10DE400002020202020202020202020202020202B2
+:10DE500002020202020202020202020202020202A2
+:10DE60000202020202020202020202020202020292
+:10DE70000202020202020202020202020202020282
+:10DE80000202020202020202020202020202020272
+:10DE90000202020202020202020202020202020262
+:10DEA000020202020202020101010101010101015B
+:10DEB0000101010101010101010101010101010152
+:10DEC0000101010101010101010101010101010142
+:10DED0000101010101010101010101010101010132
+:10DEE0000101010101010101010101010101010122
+:10DEF0000101010101010101010101010101010112
+:10DF00000101010101010101010101010101010101
+:10DF100001010101010101020202020202020202E8
+:10DF200002020202020202020202020202020202D1
+:10DF300002020202020202020202020202020202C1
+:10DF400002020202020202020202020202020202B1
+:10DF500002020202020202020202020202020202A1
+:10DF60000202020202020202020202020202020291
+:10DF70000202020202020202020202020202020281
+:10DF80000202020202020202020202020202020271
+:10DF90000202020202020202020202020202020261
+:10DFA000020202020202020101010101010101015A
+:10DFB0000101010101010101010101010101010151
+:10DFC0000101010101010101010101010101010141
+:10DFD0000101010101010101010101010101010131
+:10DFE0000101010101010101010101010101010121
+:10DFF0000101010101010101010101010101010111
+:10E000000101010101010101010101010101010100
+:10E0100001010101010101020202020202020202E7
+:10E0200002020202020202020202020202020202D0
+:10E0300002020202020202020202020202020202C0
+:10E0400002020202020202020202020202020202B0
+:10E0500002020202020202020202020202020202A0
+:10E060000202020202020202020202020202020290
+:10E070000202020202020202020202020202020280
+:10E080000202020202020202020202020202020270
+:10E090000202020202020202020202020202020260
+:10E0A0000202020202020201010101010101010159
+:10E0B0000101010101010101010101010101010150
+:10E0C0000101010101010101010101010101010140
+:10E0D0000101010101010101010101010101010130
+:10E0E0000101010101010101010101010101010120
+:10E0F0000101010101010101010101010101010110
+:10E1000001010101010101010101010101010101FF
+:10E1100001010101010101020202020202020101E8
+:10E1200001010101010101020202020202020202D6
+:10E1300002020202020202020202020202020202BF
+:10E1400002020202020202020202020202020202AF
+:10E15000020202020202020202020202020202029F
+:10E16000020202020202020202020202020202028F
+:10E17000020202020202020202020202020202027F
+:10E18000020202020202020202020202020202026F
+:10E19000020202020202020202020202020202025F
+:10E1A0000202020202020201010101010101010158
+:10E1B000010101010101010101010101010101014F
+:10E1C000010101010101010101010101010101013F
+:10E1D000010101010101010101010101010101012F
+:10E1E000010101010101010101010101010101011F
+:10E1F000010101010101010101010101010101010F
+:10E2000001010101010101010101010101010101FE
+:10E2100001010101010101010101010101010101EE
+:10E2200001010101010101020202020202020202D5
+:10E2300002020202020202020202020202020202BE
+:10E2400002020202020202020202020202020202AE
+:10E25000020202020202020202020202020202029E
+:10E26000020202020202020202020202020202028E
+:10E27000020202020202020202020202020202027E
+:10E28000020202020202020202020202020202026E
+:10E29000020202020202020202020202020202025E
+:10E2A0000202020202020201010101010101010157
+:10E2B000010101010101010101010101010101014E
+:10E2C000010101010101010101010101010101013E
+:10E2D000010101010101010101010101010101012E
+:10E2E000010101010101010101010101010101011E
+:10E2F000010101010101010101010101010101010E
+:10E3000001010101010101010101010101010101FD
+:10E3100001010101010101010101010101010101ED
+:10E3200001010101010101020202020202020202D4
+:10E3300002020202020002020202020202020202BF
+:10E3400002020202020202020202020202020202AD
+:10E35000020202020202020202020202020202029D
+:10E36000020202020202020202020202020202028D
+:10E37000020202020202020202020202020202027D
+:10E38000020202020202020202020202020202026D
+:10E39000020202020202020202020202020202025D
+:10E3A0000202020202020201010101010101010156
+:10E3B000010101010101010101010101010101014D
+:10E3C000010101010101010101010101010101013D
+:10E3D000010101010101010101010101010101012D
+:10E3E000010101010101010101010101010101011D
+:10E3F000010101010101010101010101010101010D
+:10E4000001010101010101010101010101010101FC
+:10E4100001010101010101010101010101010101EC
+:10E4200001010101010101020200000202020202D7
+:10E4300002020202020002020202020202020202BE
+:10E4400002020202020202020202020202020202AC
+:10E45000020202020202020202020202020202029C
+:10E46000020202020202020202020202020202028C
+:10E47000020202020202020202020202020202027C
+:10E48000020202020202020202020202020202026C
+:10E49000020202020202020202020202020202025C
+:10E4A0000202020202020201010101010101010155
+:10E4B000010101010101010101010101010101014C
+:10E4C000010101010101010101010101010101013C
+:10E4D000010101010101010101010101010101012C
+:10E4E000010101010101010101010101010101011C
+:10E4F000010101010101010101010101010101010C
+:10E5000001010101010101010101010101010101FB
+:10E5100001010101010101010101010101010101EB
+:10E5200001010101010101010200000101010101DC
+:10E5300001010101010001020202020202020202C3
+:10E5400002020202020202020202020202020202AB
+:10E55000020202020202020202020202020202029B
+:10E56000020202020202020202020202020202028B
+:10E57000020202020202020202020202020202027B
+:10E58000020202020202020202020202020202026B
+:10E59000020202020202020202020202020202025B
+:10E5A0000202020202020201010101010101010154
+:10E5B000010101010101010101010101010101014B
+:10E5C000010101010101010101010101010101013B
+:10E5D000010101010101010101010101010101012B
+:10E5E000010101010101010101010101010101011B
+:10E5F000010101010101010101010101010101010B
+:10E6000001010101010101010101010101010101FA
+:10E6100001010101010101010101010101010101EA
+:10E6200001010101010101010101010101010101DA
+:10E6300001010101010101010101010101010101CA
+:10E6400001010101010101020202020202020202B1
+:10E65000020202020202020202020202020202029A
+:10E66000020202020202020202020202020202028A
+:10E670000202020202020202020101010101010181
+:10E680000101010101010102020202020202020271
+:10E69000020202020202020202020202020202025A
+:10E6A0000202020202020201010101010101010153
+:10E6B000010101010101010101010101010101014A
+:10E6C000010101010101010101010101010101013A
+:10E6D000010101010101010101010101010101012A
+:10E6E000010101010101010101010101010101011A
+:10E6F000010101010101010101010101010101010A
+:10E7000001010101010101010101010101010101F9
+:10E7100001010101010101010101010101010101E9
+:10E7200001010101010101010101010101010101D9
+:10E7300001010101010101010101010101010101C9
+:10E7400001010101010101010101010101010101B9
+:10E7500001010101010101020202020202020202A0
+:10E760000202020202020201010101010101010192
+:10E770000101010101010101010101010101010189
+:10E780000101010101010102020202020201010173
+:10E790000101010101010102020202020202020260
+:10E7A0000202020202020201010101010101010152
+:10E7B0000101010101010101010101010101010149
+:10E7C0000101010101010101010101010101010139
+:10E7D0000101010101010101010101010101010129
+:10E7E0000101010101010101010101010101010119
+:10E7F0000101010101010101010101010101010109
+:10E8000001010101010101010101010101010101F8
+:10E8100001010101010101010101010101010101E8
+:10E8200001010101010101010101010101010101D8
+:10E8300001010101010101010101010101010101C8
+:10E8400001010101010101010101010101010101B8
+:10E8500001010101010101010101010101010101A8
+:10E860000101010101010101010101010101010198
+:10E870000101010101010101010101010101010188
+:10E880000101010101010101010101010101010178
+:10E89000010101010101010202020202020202025F
+:10E8A0000202020202020201010101010101010151
+:10E8B0000101010101010101010101010101010148
+:10E8C0000101010101010101010101010101010138
+:10E8D0000101010101010101010101010101010128
+:10E8E0000101010101010101010101010101010118
+:10E8F0000101010101010101010101010101010108
+:10E9000001010101010101010101010101010101F7
+:10E9100001010101010101010101010101010101E7
+:10E9200001010101010101010101010101010101D7
+:10E9300001010101010101010101010101010101C7
+:10E9400001010101010101010101010101010101B7
+:10E9500001010101010101010101010101010101A7
+:10E960000101010101010101010101010101010197
+:10E970000101010101010101010101010101010187
+:10E980000101010101010101010101010101010177
+:10E990000101010101010100010101010101010168
+:10E9A0000101010101010101010101010101010157
+:10E9B0000101010101010101010101010101010147
+:10E9C0000101010101010101010101010101010137
+:10E9D0000101010101010101010101010101010127
+:10E9E0000101010101010101010101010101010117
+:10E9F0000101010101010101010101010101010107
+:10EA000001010101010101010101010101010101F6
+:10EA100001010101010101010101010101010101E6
+:10EA200001010101010101010101010101010101D6
+:10EA300001010101010101010101010101010101C6
+:10EA400001010101010101010101010101010101B6
+:10EA500001010101010101010101010101010101A6
+:10EA60000101010101010101010101010101010196
+:10EA70000101010101010101010101010101010186
+:10EA80000101010101010101010101010101010176
+:10EA9000010101010101010000000000000000006F
+:10EAA000000000000000000101010101010101015D
+:10EAB0000101010101010101010101010101010146
+:10EAC0000101010101010101010101010101010136
+:10EAD0000101010101010101010101010101010126
+:10EAE0000101010101010101010101010101010116
+:10EAF0000101010101010101010101010101010106
+:10EB000001010101010101020201010101010101F3
+:10EB100001010101010101010101010101010101E5
+:10EB200001010101010101010101010101010101D5
+:10EB300001010101010101010101010101010101C5
+:10EB400001010101010101010101010101010101B5
+:10EB500001010101010101010101010101010101A5
+:10EB60000101010101010101010101010101010195
+:10EB70000101010101010101010101010101010185
+:10EB80000101010101010101010101010101010175
+:10EB9000010101010101010000000000000000006E
+:10EBA000000000000000000101010101010101015C
+:10EBB0000101010101010101010101010101010145
+:10EBC0000101010101010101010101010101010135
+:10EBD000010101010101010202020202020202021C
+:10EBE0000202020202020202020202020202020205
+:10EBF00002020202020202020202020202020202F5
+:10EC000002020202020202020202020202020202E4
+:10EC100002020202020202010101010101010101DD
+:10EC200001010101010101010101010101010101D4
+:10EC300001010101010101010101010101010101C4
+:10EC400001010101010101010101010101010101B4
+:10EC500001010101010101010101010101010101A4
+:10EC60000101010101010101010101010101010194
+:10EC7000010101010101010202020202020202027B
+:10EC80000202020202020202020202020202020264
+:10EC90000202020202020200000000000000000066
+:10ECA000000000000000000101010101010101015B
+:10ECB000010101010101010202020202020202023B
+:10ECC0000202020202020202020202020202020224
+:10ECD0000202020202020202020202020202020214
+:10ECE0000202020202020202020202020202020204
+:10ECF00002020202020202020202020202020202F4
+:10ED000002020202020202020202020202020202E3
+:10ED100002020202020202020202020202020202D3
+:10ED200002020202020202010101010101010101CC
+:10ED300001010101010101010101010101010101C3
+:10ED400001010101010101010101010101010101B3
+:10ED500001010101010101010101010101010101A3
+:10ED6000010101010101010202020202020202028A
+:10ED70000202020202020202020202020202020273
+:10ED80000202020202020202020202020202020263
+:10ED90000202020202020200000000000000000065
+:10EDA0000000000000000000000000000000000063
+:10EDB0000000000000000000000000000000000053
+:10EDC0000000000000000000000000000000000043
+:10EDD0000000000000000000000000000000000033
+:10EDE0000000000000000000000000000000000023
+:10EDF0000000000000000000000000000000000013
+:10EE00000000000000000000000000000000000002
+:10EE100000000000000000000000000000000000F2
+:10EE200000000000000000000000000000000000E2
+:10EE300000000000000000000000000000000000D2
+:10EE400000000000000000000000000000000000C2
+:10EE500000000000000000000000000000000000B2
+:10EE600000000000000000000000000000000000A2
+:10EE70000000000000000000000000000000000092
+:10EE80000000000000000000000000000000000082
+:10EE90000000000000000000000000000000000072
+:10EEA000000000000000004300000000000000001F
+:10EEB0000000000000000000000000000000000052
+:10EEC0000000000000000000000000000000000042
+:10EED0000000000000000000000000000000000032
+:10EEE0000000000000000000000000000000000022
+:10EEF0000000000000000000000000000000000012
+:10EF00000000000000000000000000000000000001
+:10EF100000000000000000000000000000000000F1
+:10EF200000000000000000000000000000000000E1
+:10EF300000000000000000000000000000000000D1
+:10EF400000000000010000000000000000000000C0
+:10EF500000000000010000000000000000000000B0
+:10EF6000010100010100000000000000000000009D
+:10EF70000000000000000000000000000000000091
+:10EF80000000000000000000000000000000000081
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB000010101010101000000000000000000004B
+:10EFC0000000000000000000000000000000000041
+:10EFD0000000000000000000000000000000000031
+:10EFE0000000000000000000000000000000000021
+:10EFF0000000000000000000000000000000000011
+:10F000000000000000000000000000000000000000
+:10F0100000000000000000000000000000000000F0
+:10F0200000000000000000000000000000000000E0
+:10F0300000000000000000000000000000000100CF
+:10F0400000000000010000000000000000000000BF
+:10F0500000000000010000000000000000000000AF
+:10F06000010100010100000000000000000001009B
+:10F070000000000000000000000000000000000090
+:10F080000000000000000000000000000000000080
+:10F090000000000000000000000000000000000070
+:10F0A000000000000000000000000000000000015F
+:10F0B0000101010101010100000000000000000049
+:10F0C0000000000000000000000000000000000040
+:10F0D0000000000000000000000000000000000030
+:10F0E0000000000000000000000000000000000020
+:10F0F0000000000000000000000000000000000010
+:10F1000000000000000000000000000000000000FF
+:10F1100000000000000000000000000000000000EF
+:10F1200000000000000000000000000000000000DF
+:10F1300000000001010100000000000000000100CB
+:10F1400000000000010000000000000000000000BE
+:10F1500000010001010100000000000000000000AB
+:10F160000101010101010000000000000000010098
+:10F17000000000000000000000000000000000008F
+:10F18000000000000000000000000000000000007F
+:10F19000000000000000000000000000000000006F
+:10F1A000000000000000000000000000000000015E
+:10F1B0000101010101010101010000010000000045
+:10F1C000000000000000000000000000000000003F
+:10F1D000000000000000000000000000000000002F
+:10F1E000000000000000000000000000000000001F
+:10F1F000000000000000010000000000000000000E
+:10F2000000000000000000000000000000000000FE
+:10F2100000000000000000000000000000000000EE
+:10F2200000000000000000000000000000000000DE
+:10F2300000000001010101000000000000000100C9
+:10F2400000000000010000000000000000000001BC
+:10F2500000010001010100000000000000000101A8
+:10F260000101010101010000000000000000010097
+:10F27000000000000000000000000000000000008E
+:10F28000000000000000000000000000000000007E
+:10F29000000000000000000000000000000000006E
+:10F2A000000000000000000000000000000000015D
+:10F2B0000101010101010101010001010001000042
+:10F2C000000000000100000000000000000000003D
+:10F2D000000000000000000000000000000000002E
+:10F2E000000000010000000000000000000000001D
+:10F2F000000000000000010000000000000000000D
+:10F3000000000000000000000000000000000000FD
+:10F3100000000000000000000000000000000000ED
+:10F3200000000000000000000000000000000000DD
+:10F3300000000001010101000000000000000100C8
+:10F3400000000001010100000000000000000001B9
+:10F3500000010101010100000000000000000101A6
+:10F360000101010101010000010000000000010095
+:10F37000000000000000000000000000000000008D
+:10F38000000000000000000000000000000000007D
+:10F39000000000000000000000000000000000006D
+:10F3A000000000000000000000000000000000015C
+:10F3B0000101010101010101010101010001000040
+:10F3C000000000000100000000000000000000003C
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000010000000000000000000000001C
+:10F3F000000000000000010000000100000000000B
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000001010101000000000000000100C7
+:10F4400000000001010100000000000000000101B7
+:10F4500000010101010100000000000000000101A5
+:10F460000101010101010100010000000001010092
+:10F47000000000000000000000000000000000008C
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000015B
+:10F4B000010101010101010101010101010100003E
+:10F4C000000000000100000000000000000000003B
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000010000000000000000000000001B
+:10F4F0000000010000000101010001010000000006
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000001010101010100000000000100C4
+:10F5400000000001010100000000000000000101B6
+:10F5500000010101010100000100000000000101A3
+:10F560000101010101010101010000000001010090
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000015A
+:10F5B000010101010101010101010101010100003D
+:10F5C000000000000100000000000000000000003A
+:10F5D000000000000000000000000000010000002A
+:10F5E000000000010000000000000000000000001A
+:10F5F0000000010000000101010001010000000005
+:10F6000000000000000000000000000000000000FA
+:10F6100000000000000000000000000000000000EA
+:10F6200000000001010000000000000000000000D8
+:10F6300000000001010101010100000000000100C3
+:10F6400000000001010101000000000000000101B4
+:10F6500000010101010101000100000000000101A1
+:10F66000010101010101010101000000000101008F
+:10F67000000000000000000000000000000000008A
+:10F68000000000000000000000000000000000007A
+:10F69000000000000000000000000000000000006A
+:10F6A0000000000000000000000000000000000159
+:10F6B000010101010101010101010101010100003C
+:10F6C0000000000001010000000000000000000038
+:10F6D0000000000000000000000000000100000029
+:10F6E0000000000100000000000000000000000019
+:10F6F0000100010000000101010001010000000003
+:10F7000000000000000000000000000000000000F9
+:10F7100000000000000000000000000000000000E9
+:10F7200000000001010000000000000000000000D7
+:10F7300000000001010101010101000000000100C1
+:10F7400000000001010101010100000000000101B1
+:10F75000000101010101010101000000000001019F
+:10F76000010101010101010101010001000101008C
+:10F770000000000001000000000000000000000088
+:10F780000000000000000000000000000000000079
+:10F790000000000000000000000000000000000069
+:10F7A0000000000000000000000000000000000158
+:10F7B000010101010101010101010101010100003B
+:10F7C0000000000001010000000000000000000037
+:10F7D0000000000000000000000000000100000028
+:10F7E0000000000100000000000000000000000018
+:10F7F0000100010000000101010001010100000001
+:10F8000000000000000000000000000000000000F8
+:10F8100000000000000000000000000000000000E8
+:10F8200000000001010100000000000000000000D5
+:10F8300000000001010101010101000000000100C0
+:10F8400000000001010101010100000000000101B0
+:10F85000000101010101010101000000000101019D
+:10F86000010101010101010101010101000101008A
+:10F870000000000001000000000000000000000087
+:10F880000000000000000000000000000000000078
+:10F890000000000000000000000000000000000068
+:10F8A0000000000000000000000000000000000157
+:10F8B000010101010101010101010101010100003A
+:10F8C0000100000001010000000000000000000035
+:10F8D0000000000000010000000000000100000026
+:10F8E0000000000100000000000000000000000017
+:10F8F00001010100000001010100010101000000FF
+:10F9000000000000000100000000000000000000F6
+:10F9100000000000000000000000000000000000E7
+:10F9200000000001010100000000000000000100D3
+:10F9300000000001010101010101000000000100BF
+:10F9400000000001010101010100000000000101AF
+:10F95000000101010101010101010000000101019B
+:10F960000101010101010101010101010001010089
+:10F970000100000001010000000000000000000084
+:10F980000000000001000000000000000000000076
+:10F990000000000000000000000000000000000067
+:10F9A0000000000000000000000000000000000156
+:10F9B0000101010101010101010101010101000039
+:10F9C0000100000001010000000000000000000034
+:10F9D0000000000000010000000000000100000025
+:10F9E0000000000100000000000000000000000016
+:10F9F00001010100000001010100010101000000FE
+:10FA000000000000000101000000000000000000F4
+:10FA100000000000000000000000000000000000E6
+:10FA200000000001010100000000000000000100D2
+:10FA300000000001010101010101000000010100BD
+:10FA400000000001010101010100000000000101AE
+:10FA5000000101010101010101010000000101019A
+:10FA60000101010101010101010101010101010087
+:10FA70000100000001010000000000000000000083
+:10FA80000000000001000000000000000000000075
+:10FA90000000000000000000000000000000000066
+:10FAA0000000000000000000000000000000000155
+:10FAB0000101010101010101010101010101000038
+:10FAC0000100000001010000000000000000000033
+:10FAD0000001000001010000000000000100000022
+:10FAE0000100000100000000000000000000000014
+:10FAF00001010101000001010101010101000000FB
+:10FB000000000000000101000000000000000000F3
+:10FB100000000000000000000000000000000000E5
+:10FB200000000001010100000000000000000100D1
+:10FB300000000001010101010101000100010100BB
+:10FB400000000001010101010101000000000101AC
+:10FB50000001010101010101010100010001010198
+:10FB60000101010101010101010101010101010086
+:10FB70000101000101010000000000000000000080
+:10FB80000100000001010000000000000000000072
+:10FB90000000000000000000000000000000000065
+:10FBA0000000000000000000000000000000000253
+:10FBB0000101010101010101010101010101000037
+:10FBC0000100000001010100000000000000010030
+:10FBD0000001000001010100000000000100000020
+:10FBE0000100000100000000000000000000000013
+:10FBF00001010101000001010101010101000000FA
+:10FC000000000000000101000000000000000000F2
+:10FC100000000000000000000000000000000000E4
+:10FC200000000001010100000000000000000100D0
+:10FC300000000001010101010101010100010100B9
+:10FC400000000001010101010101000000000101AB
+:10FC50000001010101010101010101010001010196
+:10FC60000101010101010101010101010101010184
+:10FC7000010100010101010000000000000001007D
+:10FC80000100000001010000000000000000010070
+:10FC90000000000000000000000000000000000064
+:10FCA0000000000000000000000000000000000252
+:10FCB0000101010101010101010101010101000036
+:10FCC000010101000101010000010000000001002C
+:10FCD000000101010101010000000000010000001D
+:10FCE0000100000101000000000000000000000011
+:10FCF00001010101000001010101010101000000F9
+:10FD000001000100000101010000000000000000EE
+:10FD100000000000000000000000000000000000E3
+:10FD200000000001010100000000000000000100CF
+:10FD300000000001010101010101010100010100B8
+:10FD400000000001010101010101000000000101AA
+:10FD50000001010101010101010101010001010195
+:10FD60000101010101010101010101010101010183
+:10FD7000010101010101010001000000000001007A
+:10FD8000010100010101000000000000000001006D
+:10FD90000100000000000000000000000000000062
+:10FDA0000000000000000000000000000000000251
+:10FDB0000202020101010101010101010101000032
+:10FDC000010101000101010000010100000001002A
+:10FDD000000101010101010000000000010000001C
+:10FDE0000100000101000000000000000000000010
+:10FDF00001010101000001010101010101010101F5
+:10FE000001000100000101010000000000000000ED
+:10FE100000000000000000000000000000000000E2
+:10FE200000000001010100000000000000000100CE
+:10FE300000000001010101010101010100010100B7
+:10FE400000000001010101010101000000010101A8
+:10FE50000001010101010101010101010101010193
+:10FE60000101010101010101010101010101010182
+:10FE70000101010101010100010000000000010178
+:10FE8000010100010101010000000000000001006B
+:10FE90000100000000000000000000000000000061
+:10FEA0000000000000000000000000000000000250
+:10FEB0000202020201010101010101010101000030
+:10FEC0000101010001010100000101000000010029
+:10FED000000101010101010000000000010000001B
+:10FEE000010101010100000000000000000000000D
+:10FEF00001010101000001010101010101010101F4
+:10FF000001010100000101010100000000000000EA
+:10FF100000000000000000000000000000000000E1
+:10FF200000000001010101000000000000000100CC
+:10FF300001000001010101010101010100010100B5
+:10FF400000000001010101010101000100010101A6
+:10FF50000001010101010101010101010101010192
+:10FF60000101010101010101010101010101010181
+:10FF70000101010101010100010000000000010177
+:10FF80000101010101010100010000000000010068
+:10FF90000100000000000000000000000000000060
+:10FFA000000000000000000000000000000000024F
+:10FFB000020202020202010101010101010100002D
+:10FFC0000101010001010100000101000101010125
+:10FFD000000101010101010000000000010000001A
+:10FFE000010101010100000000000000000000000C
+:10FFF00001010101000001010101010101010101F3
+:0200000270008C
+:1000000001010100000101010100000000000000E9
+:1000100000000000000000000000000000000000E0
+:1000200000000001010101010100000000000101C8
+:1000300001000001010101010101010101010100B3
+:1000400000000001010101010101010100010101A4
+:100050000001010101010101010101010101010191
+:100060000101010101010101010101010101010180
+:100070000101010101010100010000000001010175
+:100080000101010101010100010000000001010165
+:10009000010000000000000000000000000000005F
+:1000A000000000000000000000000000000000024E
+:1000B000020202020202020101010101010100002B
+:1000C0000101010101010100000101000101010123
+:1000D0000001010101010100000000000100000019
+:1000E000010101020100000000000000000000000A
+:1000F00001010101000001010101010101010101F2
+:1001000001010100000101010100000000000000E8
+:1001100000000000000000000000000000000000DF
+:1001200000000001010101010100000000000101C7
+:1001300001000001010101010101010101010100B2
+:1001400000000001010101010101010100010101A3
+:100150000001010101010101010101010101010190
+:10016000010101010101010101010101010101017F
+:100170000101010101010101010100010001010171
+:100180000101010101010101010100010001010161
+:10019000010100000100000000000000000000005C
+:1001A000000000000000000000000000000000024D
+:1001B0000202020202020202010101010101000128
+:1001C0000101010101010100000101000101010122
+:1001D0000001010101010100000000000100000117
+:1001E0000101010201000000000000000000000108
+:1001F00001010101000001010101010101010101F1
+:1002000001010100000101010100000000000000E7
+:1002100000000000000000000000000000000000DE
+:1002200000000001010101010100000000000101C6
+:1002300001000001010101010101010101010100B1
+:1002400000000001010101010101010101010101A1
+:10025000000101010101010101010101010101018F
+:10026000010101010101010101010101010101017E
+:10027000010101010101010101010101000101016F
+:10028000010101010101010101010101000101015F
+:10029000010100000100000000000000000000005B
+:1002A000000000000000000000000000000000024C
+:1002B0000202020202020202020102020101000124
+:1002C000010101010101010101010100010101011F
+:1002D0000101010101010100000000000100000115
+:1002E0000101010201000000000000000000000107
+:1002F00001010201000001010101010101010101EF
+:1003000001010101000101010100000000000000E5
+:1003100001000000000100000000000000000001DA
+:1003200000000001010101010100000000000101C5
+:1003300001010001010101010101010101010100AF
+:10034000000000010101010101010101010101029F
+:10035000000101010101010101010101010101018E
+:10036000010101010101010101010101010101017D
+:10037000010101010101010101010101000101016E
+:10038000010101010101010101010101000101015E
+:100390000101010101010000000000000000000057
+:1003A000000000000000000000000000000000024B
+:1003B0000202020202020202020202020101000122
+:1003C000010101010201010101010100010101011D
+:1003D0000101010101010100000000000100000114
+:1003E0000101010201000000000000000000000106
+:1003F00002010201000002010101010101010101EC
+:1004000001010101000101010100000000000101E2
+:1004100001000000000100000000000000000001D9
+:1004200001000001010101010100000000000101C3
+:1004300001010002010101010101010101010100AD
+:10044000000000010101010101010101010101029E
+:10045000000101010101010101010101010101028C
+:10046000010101010101010101010101010101017C
+:10047000010101010101010101010101010101016C
+:10048000010101010101010101010101010101015C
+:100490000101010101010000000000000000000056
+:1004A000000000000000000000000000000000024A
+:1004B000020202020202020202020202020200011F
+:1004C000020101010201010101010100010101011B
+:1004D0000101010101010100000000000100000113
+:1004E0000201010201010000000200000000000101
+:1004F00002020201010002010101010101010102E8
+:1005000001010101000101010101000000000101E0
+:1005100001000000000100000000000000000001D8
+:1005200001000001010101010100000000000101C2
+:1005300001010102010101010101010101010100AB
+:100540000101000202010101010101010101010299
+:100550000102010101010101010101010101010289
+:100560000202010101010101010101010101010179
+:10057000010101010101010101010101010101016B
+:10058000010101010101010101010101010101015B
+:100590000101010101010000000000000000000055
+:1005A0000000000000000000000000000000000249
+:1005B000020202020202020202020202020200011E
+:1005C0000201010102020101010101000101010119
+:1005D0000102010101010100000000000100000111
+:1005E00002010102010100000002000002000101FD
+:1005F00002020201010002020101020101010102E5
+:1006000001010101000101010101000000010101DE
+:1006100001000000000100000000000000000001D7
+:1006200001010102010101010101000000000101BD
+:1006300001010102020201010101010101010101A7
+:100640000101000202010101010101010101010298
+:100650000102020201010101010101010101010286
+:100660000202020201010101010101010101010176
+:10067000010101010101010101010101010101016A
+:10068000010101010101010101010101010101015A
+:100690000101010101010100000000000000010052
+:1006A0000000000000000000000000000000000248
+:1006B000020202020202020202020202020200011D
+:1006C0000202020102020101010101010101010214
+:1006D000010202010102010000000000010000020D
+:1006E00002020202010100000201000002000101F9
+:1006F00002020202010002020201020201010102E1
+:1007000002010201010201010101000000010101D9
+:1007100001010100000100010000000000000001D3
+:1007200001010102010101010101000000010101BB
+:1007300001010102020202010101010101010101A5
+:100740000101010202020101010101010101010295
+:100750000102020202010101010101010101010284
+:100760000202020201010101010101010101010175
+:100770000101010101010101010101010101010169
+:100780000101010101010101010101010101010159
+:10079000010101010101010101000000000001004F
+:1007A0000000000000000000000000000000000247
+:1007B000020202020202020202020202020200021B
+:1007C0000202020102020101010101010101010213
+:1007D000010202020102010000000000020000020A
+:1007E00002020202020100000101000001000102F8
+:1007F00002020202010002020201020201010102E0
+:1008000002020201010202010101010001010101D4
+:1008100001010100000100010000000000010001D1
+:1008200001010102020101010101000000010101B9
+:1008300001010102020202010101010101010101A4
+:100840000101010202020101010101010101010294
+:100850000102020202020101010101010101010282
+:100860000202020202010101010101010101010173
+:100870000101010101010101010101010101010168
+:100880000101010101010101010101010101010158
+:10089000010101010101010101000000000101004D
+:1008A0000000000000000000000000020000000244
+:1008B000020202020202020202020202020200021A
+:1008C0000202020102020201010101010101010211
+:1008D0000102020202020200000000000200000207
+:1008E00002020202020100020101000001000102F5
+:1008F00002020202010002020201020202010102DE
+:1009000002020201010202010101010101010101D2
+:1009100001010100000100010000000000010001D0
+:1009200001010102020201010101010000010102B5
+:1009300001010102020202020101010101010101A2
+:100940000101010202020201010101010101010292
+:100950000102020202020101010101010101010281
+:100960000202020202020101010101010101010171
+:100970000101010101010101010101010101010167
+:100980000101010101010101010101010101010157
+:10099000010101010101010101010001000101004A
+:1009A0000000000000000000000000020000000243
+:1009B0000202020202020202020202020202000219
+:1009C000020202020202020101020101010101020E
+:1009D0000102020202020200000002000201010202
+:1009E00002020202020100010101020001000102F3
+:1009F00002020202010002020202020202010102DC
+:100A000002020201010202020101010101010102CF
+:100A100001010100000101010000000000010102CC
+:100A200001010102020201010101010000010102B4
+:100A300001010102020202020201010101010101A0
+:100A40000101010202020202010101010101010290
+:100A50000102020202020101010101010101010280
+:100A6000020202020202010101010101010101026F
+:100A70000101010101010101010101010101010166
+:100A80000101010101010101010101010101010255
+:100A90000101010101010101010101010001010048
+:100AA0000000000201000000000000010000000240
+:100AB0000202020202020202020202020202000218
+:100AC000020202020202020101020201010101020C
+:100AD00002020202020202000202010202010102FB
+:100AE00002020202020100010101020001000102F2
+:100AF00002020202010002020202020202010102DB
+:100B000002020202010202020101010101010102CD
+:100B100001010100000101010000000000010102CB
+:100B200001010102020201010101010000010102B3
+:100B3000020101020202020202020101010102019C
+:100B4000010101020202020202010101010101028E
+:100B5000010202020202020101010101010101027E
+:100B6000020202020202020101010101010101026D
+:100B70000201010101010101010101010101010263
+:100B80000101010101010101010101010101010254
+:100B90000201010101010101010101010001010046
+:100BA000000000020100000000000001000000023F
+:100BB0000202020202020202020202020202000217
+:100BC000020202020202020101020201010101020B
+:100BD00002020202020202000101010102010102FD
+:100BE00002020202020201010101010001000102F0
+:100BF00002020202010002020202020202010102DA
+:100C000002020202010202020201010101010102CB
+:100C100002010100000101010000000001010102C8
+:100C200001010102020201010101010000010102B2
+:100C3000020101020202020202020101010102029A
+:100C4000010101020202020202010101010101028D
+:100C5000010202020202020202010101010101027B
+:100C6000020202020202020202010101010101026A
+:100C70000202010101010101010101010101010261
+:100C80000201010101010101010101010101010252
+:100C90000201010101010101010101010101010044
+:100CA000000000010100000000000001000000023F
+:100CB0000202020202020202020202020202000216
+:100CC0000202020202020202010202010201010208
+:100CD00002020202020202010101010102010102FB
+:100CE00002020202020201010101010001000102EF
+:100CF00002020202010102020202020202010102D8
+:100D000002020202010202020201010101010102CA
+:100D100002010101000101010100000001010102C5
+:100D200002010102020202010101010000010102AF
+:100D30000202010202020202020201010101020298
+:100D4000010101020202020202020101010102028A
+:100D5000010202020202020202010101010101027A
+:100D60000202020202020202020101010101010269
+:100D7000020202020201010101010101010101025D
+:100D80000202010101010101010101010101010250
+:100D90000202010101010101010101010101010042
+:100DA000010001010100000000000001000000023C
+:100DB0000202020202020202020202020202000215
+:100DC0000202020202020202020202010202020204
+:100DD00002020202020202010101010102010102FA
+:100DE00002020202020201010101010001000102EE
+:100DF00002020202020102020202020202020102D5
+:100E000002020202010202020201010101010102C9
+:100E100002020201000201010100010001010102C0
+:100E200002020202020202020101010200010102A9
+:100E30000202020202020202020202020101020294
+:100E40000202010202020202020201010101020287
+:100E50000102020202020202020201010101020277
+:100E60000202020202020202020201010101020266
+:100E7000020202020202010101010101010101025B
+:100E8000020202020201010101010101010101024C
+:100E90000202020101010101010101010101010040
+:100EA0000100000101000000020200010000010237
+:100EB0000202020202020202020202020202000214
+:100EC0000202020202020202020202010202020203
+:100ED00002020202020202010101010102010102F9
+:100EE00002020202020202020202010001000102E9
+:100EF00002020202020102020202020202020202D3
+:100F000002020202020202020202010101010102C6
+:100F100002020201000201010100010101010102BE
+:100F200002020202020202020201010200010202A6
+:100F30000202020202020202020202020102020292
+:100F40000202020202020202020201010101020285
+:100F50000102020202020202020201010101020276
+:100F60000202020202020202020202020102020262
+:100F7000020202020202010101010101010101025A
+:100F8000020202020202010101010101010101024A
+:100F9000020202020101010101010101010101003E
+:100FA0000100000000000200010202010000010235
+:100FB0000202020202020202020202020202000213
+:100FC0000202020202020202020202020202020201
+:100FD00002020202020202010101010102010102F8
+:100FE00002020202020202020202010002010202E5
+:100FF00002020202020102020202020202020202D2
+:1010000002020202020202020202020101010102C4
+:1010100002020201000201020100010101010102BC
+:1010200002020202020202020201010100010202A6
+:101030000202020202020202020202020102020291
+:101040000202020202020202020202020101020282
+:101050000202020202020202020202020102020271
+:101060000202020202020202020202020102020261
+:101070000202020202020201010101010101010258
+:101080000202020202020101010101010101010249
+:10109000020202020201010101010101010101003C
+:1010A0000001000000000100010102010200010234
+:1010B0000202020202020202020202020202000212
+:1010C0000202020202020202020202020202020200
+:1010D00002020202020202010101010102010102F7
+:1010E00002020202020202020202020002010202E3
+:1010F00002020202020102020202020202020202D1
+:1011000002020202020202020202020202020102C0
+:1011100002020201010201020100010101010102BA
+:1011200002020202020202020201010102010202A3
+:10113000020202020202020202020202020202028F
+:101140000202020202020202020202020102020280
+:101150000202020202020202020202020102020270
+:10116000020202020202020202020202020202025F
+:101170000202020202020201010101010101010257
+:101180000202020202020201010101010101010247
+:10119000020202020202010101010101010101003A
+:1011A0000000000000010100010101010100010235
+:1011B0000202020202020202020202020202000211
+:1011C00002020202020202020202020202020202FF
+:1011D00002020202020202020102020102010102F3
+:1011E00002020202020202020202020002010202E2
+:1011F00002020202020202020202020202020202CF
+:1012000002020202020202020202020202020202BE
+:1012100002020202010202020100010101010102B7
+:1012200002020202020202020202010102010202A1
+:10123000020202020202020202020202020202028E
+:10124000020202020202020202020202020202027E
+:10125000020202020202020202020202020202026E
+:10126000020202020202020202020202020202025E
+:101270000202020202020201020101010101010255
+:101280000202020202020201010101010101010246
+:101290000202020202020101010101010101010039
+:1012A0000000000000010102010101000100010233
+:1012B0000202020202020202020202020202000210
+:1012C00002020202020202020202020202020202FE
+:1012D00002020202020202020202020202020102EF
+:1012E00002020202020202020202020102020202DF
+:1012F00002020202020202020202020202020202CE
+:1013000002020202020202020202020202020202BD
+:1013100002020202010202020101010101010102B5
+:1013200002020202020202020202010102010202A0
+:10133000020202020202020202020202020202028D
+:10134000020202020202020202020202020202027D
+:10135000020202020202020202020202020202026D
+:10136000020202020202020202020202020202025D
+:101370000202020202020202020101010101010253
+:101380000202020202020202020101010101010243
+:101390000202020202020201010101010101010037
+:1013A0000000000000010101010101000102010231
+:1013B000020202020202020202020202020200020F
+:1013C00002020202020202020202020202020202FD
+:1013D00002020202020202020202020202020102EE
+:1013E00002020202020202020202020202020202DD
+:1013F00002020202020202020202020202020202CD
+:1014000002020202020202020202020202020202BC
+:1014100002020202010202020201020102020102B0
+:10142000020202020202020202020201010102029F
+:10143000020202020202020202020202020202028C
+:10144000020202020202020202020202020202027C
+:10145000020202020202020202020202020202026C
+:10146000020202020202020202020202020202025C
+:101470000202020202020202020201010101010251
+:101480000202020202020202020201010101010241
+:101490000202020202020202010101010101010035
+:1014A0000000000000000001010101000101010233
+:1014B000020202020202020202020202020200020E
+:1014C00002020202020202020202020202020202FC
+:1014D00002020202020202020202020202020202EC
+:1014E00002020202020202020202020202020202DC
+:1014F00002020202020202020202020202020202CC
+:1015000002020202020202020202020202020202BB
+:1015100002020202010202020201020202020102AE
+:10152000020202020202020202020201010202029D
+:10153000020202020202020202020202020202028B
+:10154000020202020202020202020202020202027B
+:10155000020202020202020202020202020202026B
+:10156000020202020202020202020202020202025B
+:10157000020202020202020202020202010102024D
+:10158000020202020202020202020202010102023D
+:101590000202020202020202020101010101010033
+:1015A0000000000000000001000101000101010233
+:1015B000020202020202020202020202020200020D
+:1015C00002020202020202020202020202020202FB
+:1015D00002020202020202020202020202020202EB
+:1015E00002020202020202020202020202020202DB
+:1015F00002020202020202020202020202020202CB
+:1016000002020202020202020202020202020202BA
+:1016100002020202020202020201020202020102AC
+:10162000020202020202020202020201010202029C
+:10163000020202020202020202020202020202028A
+:10164000020202020202020202020202020202027A
+:10165000020202020202020202020202020202026A
+:10166000020202020202020202020202020202025A
+:10167000020202020202020202020202010202024B
+:10168000020202020202020202020202010202023B
+:101690000202020202020202020201010101010031
+:1016A0000000000000000000000001000101010234
+:1016B000020202020202020202020202020200020C
+:1016C00002020202020202020202020202020202FA
+:1016D00002020202020202020202020202020202EA
+:1016E00002020202020202020202020202020202DA
+:1016F00002020202020202020202020202020202CA
+:1017000002020202020202020202020202020202B9
+:1017100002020202020202020202020202020202A9
+:10172000020202020202020202020201010202029B
+:101730000202020202020202020202020202020289
+:101740000202020202020202020202020202020279
+:101750000202020202020202020202020202020269
+:101760000202020202020202020202020202020259
+:101770000202020202020202020202020202020249
+:101780000202020202020202020202020202020239
+:10179000020202020202020202020202010101022C
+:1017A0000000000000000000000000000001010235
+:1017B000020202020202020202020202020200020B
+:1017C00002020202020202020202020202020202F9
+:1017D00002020202020202020202020202020202E9
+:1017E00002020202020202020202020202020202D9
+:1017F00002020202020202020202020202020202C9
+:1018000002020202020202020202020202020202B8
+:1018100002020202020202020202020202020202A8
+:10182000020202020202020202020201010202029A
+:101830000202020202020202020202020202020288
+:101840000202020202020202020202020202020278
+:101850000202020202020202020202020202020268
+:101860000202020202020202020202020202020258
+:101870000202020202020202020202020202020248
+:101880000202020202020202020202020202020238
+:101890000202020202020202020202020102020229
+:1018A0000000000000000000000000000001010234
+:1018B000020202020202020202020202020200020A
+:1018C00002020202020202020202020202020202F8
+:1018D00002020202020202020202020202020202E8
+:1018E00002020202020202020202020202020202D8
+:1018F00002020202020202020202020202020202C8
+:1019000002020202020202020202020202020202B7
+:1019100002020202020202020202020202020202A7
+:101920000202020202020202020202020102020298
+:101930000202020202020202020202020202020287
+:101940000202020202020202020202020202020277
+:101950000202020202020202020202020202020267
+:101960000202020202020202020202020202020257
+:101970000202020202020202020202020202020247
+:101980000202020202020202020202020202020237
+:101990000202020202020202020202020202020227
+:1019A0000200000000000000000000000001010231
+:1019B000020202020202020202020101010100020D
+:1019C00002020202020202020202020202020202F7
+:1019D00002020202020202020202020202020202E7
+:1019E00002020202020202020202020202010202D8
+:1019F00002020202020202020202020202020202C7
+:101A000002020202020202020202020202020202B6
+:101A100002020202020202020202020202020202A6
+:101A20000202020202020202020202020102020297
+:101A30000202020202020202020202020202020286
+:101A40000202020202020202020202020202020276
+:101A50000202020202020202020202020202020266
+:101A60000202020202020202020202020202020256
+:101A70000202020202020202020202020202020246
+:101A80000202020202020202020202020202020236
+:101A90000202020202020202020202020202020226
+:101AA0000200000000000000000000000001000231
+:101AB0000202020201010101010101010101010211
+:101AC00002020202020202020202020202020202F6
+:101AD00002020202020202020202020202020202E6
+:101AE00002020202020202020202010101010102DB
+:101AF00002020202020202020202020202020202C6
+:101B000002020202020202020202020202020202B5
+:101B100002020202020202020202020202020202A5
+:101B20000202020202020202020202020102020296
+:101B30000202020202020202020202020202020285
+:101B40000202020202020202020202020202020275
+:101B50000202020202020202020202020202020265
+:101B60000202020202020202020202020202020255
+:101B70000202020202020202020202020202020245
+:101B80000202020202020202020202020202020235
+:101B90000202020202020202020202020202020225
+:101BA000020202000000000000000000000100012D
+:101BB0000101010101010101010101010101010214
+:101BC00002020202020202020202020202020202F5
+:101BD00002020202020202020202020202020202E5
+:101BE00002020202020201010101010101010102DE
+:101BF00002020202020202020202020202020202C5
+:101C000002020202020202020202020202020202B4
+:101C100002020202020202020202020202020202A4
+:101C20000202020202020202020202020202020294
+:101C30000202020202020202020202020202020284
+:101C40000202020202020202020202020202020274
+:101C50000202020202020202020202020202020264
+:101C60000202020202020202020202020202020254
+:101C70000202020202020202020202020202020244
+:101C80000202020202020202020202020202020234
+:101C90000202020202020202020202020202020224
+:101CA000020202000000000000000000000000012D
+:101CB0000101010101010101010101010101010213
+:101CC00002020202020202020202020202020202F4
+:101CD00002020202020202020202020202020202E4
+:101CE00002020201010101010101010101010102E0
+:101CF00002020202020202020202020202020202C4
+:101D000002020202020202020202020202020202B3
+:101D100002020202020202020202020202020202A3
+:101D20000202020202020202020202020202020293
+:101D30000202020202020202020202020202020283
+:101D40000202020202020202020202020202020273
+:101D50000202020202020202020202020202020263
+:101D60000202020202020202020202020202020253
+:101D70000202020202020202020202020202020243
+:101D80000202020202020202020202020202020233
+:101D90000202020202020202020202020202020223
+:101DA0000202020202000000000000000000000128
+:101DB0000101010101010101010101010101010212
+:101DC00002020202020202020202020202020202F3
+:101DD00002020202020202020201010101010202E8
+:101DE00001010101010101010101010101010102E2
+:101DF00002020202020202020202010101020202C6
+:101E000002020202020202020202020202020202B2
+:101E100002020202020202020202020202020202A2
+:101E20000202020202020202020202020202020292
+:101E30000202020202020202020202020202020282
+:101E40000202020202020202020202020202020272
+:101E50000202020202020202020202020202020262
+:101E60000202020202020202020202020202020252
+:101E70000202020202020202020202020202020242
+:101E80000202020202020202020202020202020232
+:101E90000202020202020202020202020202020222
+:101EA0000202020202000000000000000000000127
+:101EB0000101010101010101010101010101010211
+:101EC00002020202020202020201010101010202F7
+:101ED00002020202020101010101010101010101ED
+:101EE00001010101010101010101010101010102E1
+:101EF00002020202020201010101010101010102CB
+:101F000002020202020202020202020202020202B1
+:101F100002020202020202020202020202020202A1
+:101F20000202020202020202020202020202020291
+:101F30000202020202020202020202020202020281
+:101F40000202020202020202020202020202020271
+:101F50000202020202020202020202020202020261
+:101F60000202020202020202020202020202020251
+:101F70000202020202020202020202020202020241
+:101F80000202020202020202020202020202020231
+:101F90000202020202020202020202020202020221
+:101FA0000202020202020000000000000000000124
+:101FB0000101010101010101010101010101010210
+:101FC00002020202010101010101010101010102FC
+:101FD00002010101010101010101010101010101F0
+:101FE00001010101010101010101010101010102E0
+:101FF00001010101010101010101010101010102D0
+:1020000002020202020202020202010101010202B4
+:1020100002020202020202020202020202020202A0
+:102020000202020202020202020202020202020290
+:102030000202020202020202020202020202020280
+:102040000202020202020202020202020202020270
+:102050000202020202020202020202020202020260
+:102060000202020202020202020202020202020250
+:102070000202020202020202020202020202020240
+:102080000202020202020202020202020202020230
+:102090000202020202020202020202020202020220
+:1020A0000202020202020200000000000000000121
+:1020B000010101010101010101010101010101020F
+:1020C0000101010101010101010101010101010100
+:1020D00001010101010101010101010101010101F0
+:1020E00001010101010101010101010101010101E0
+:1020F00001010101010101010101010101010102CF
+:1021000002020202020101010101010101010102B9
+:1021100002020202020202020202010101020202A2
+:10212000020202020202020202020202020202028F
+:10213000020202020202020202020202020202027F
+:10214000020202020202020202020202020202026F
+:10215000020202020202020202020202020202025F
+:10216000020202020202020202020202020202024F
+:10217000020202020202020202020202020202023F
+:10218000020202020202020202020202020202022F
+:10219000020202020202020202020202020202021F
+:1021A000020202020202020002000000000002011C
+:1021B000010101010101010101010101010101010F
+:1021C00001010101010101010101010101010101FF
+:1021D00001010101010101010101010101010101EF
+:1021E00001010101010101010101010101010101DF
+:1021F00001010101010101010101010101010101CF
+:1022000001010101010101010101010101010102BD
+:1022100002020202020202010101010101010202A5
+:10222000020202020202020202020202020202028E
+:10223000020202020202020202020202020202027E
+:10224000020202020202020202020202020202026E
+:10225000020202020202020202020202020202025E
+:10226000020202020202020202020202020202024E
+:10227000020202020202020202020202020202023E
+:10228000020202020202020202020202020202022E
+:10229000020202020202020202020202020202021E
+:1022A0000202020202020202020200020000020115
+:1022B000010101010101010101010101010101010E
+:1022C00001010101010101010101010101010101FE
+:1022D00001010101010101010101010101010101EE
+:1022E00001010101010101010101010101010101DE
+:1022F00001010101010101010101010101010101CE
+:1023000001010101010101010101010101010102BC
+:1023100002020202020101010101010101010102A7
+:10232000020202020202020202020202020202028D
+:10233000020202020202020202020202020202027D
+:10234000020202020202020202020202020202026D
+:10235000020202020202020202020202020202025D
+:10236000020202020202020202020202020202024D
+:10237000020202020202020202020202020202023D
+:10238000020202020202020202020202020202022D
+:10239000020202020202020202020202020202021D
+:1023A0000202020202020202020202020000020112
+:1023B000010101010101010101010101010101010D
+:1023C00001010101010101010101010101010101FD
+:1023D00001010101010101010101010101010101ED
+:1023E00001010101010101010101010101010101DD
+:1023F00001010101010101010101010101010101CD
+:1024000001010101010101010101010101010101BC
+:1024100001010101010101010101010101010102AB
+:102420000202020101010101010101010101010298
+:10243000020202020202020202020202020202027C
+:10244000020202020202020202020202020202026C
+:10245000020202020202020202020202020202025C
+:10246000020202020202020202020202020202024C
+:10247000020202020202020202020202020202023C
+:10248000020202020202020202020202020202022C
+:10249000020202020202020202020202020202021C
+:1024A000020202020202020202020202020202010D
+:1024B000010101010101010101010101010101010C
+:1024C00001010101010101010101010101010101FC
+:1024D00001010101010101010101010101010101EC
+:1024E00001010101010101010101010101010101DC
+:1024F00001010101010101010101010101010101CC
+:1025000001010101010101010101010101010101BB
+:1025100001010101010101010101010101010101AB
+:10252000010101010101010101010101010101029A
+:102530000202020101010101010101010101010287
+:10254000020202020202020202020202020202026B
+:10255000020202020202020202020202020202025B
+:10256000020202020202020202020202020202024B
+:10257000020202020202020202020202020202023B
+:10258000020202020202020202020202020202022B
+:10259000020202020202020202020202020202021B
+:1025A000020202020202020202020202020202010C
+:1025B000010101010101010101010101010101010B
+:1025C00001010101010101010101010101010101FB
+:1025D00001010101010101010101010101010101EB
+:1025E00001010101010101010101010101010101DB
+:1025F00001010101010101010101010101010101CB
+:1026000001010101010101010101010101010101BA
+:1026100001010101010101010101010101010101AA
+:10262000010101010101010101010101010101019A
+:102630000101010101010101010101010101010289
+:102640000202020101010101010101010101010276
+:10265000020202020202020202020202020202025A
+:10266000020202020202020202020202020202024A
+:10267000020202020202020202020202020202023A
+:10268000020202020202020202020202020202022A
+:10269000020202020202020202020202020202021A
+:1026A000020202020202020202020202020202010B
+:1026B000010101010101010101010101010101010A
+:1026C00001010101010101010101010101010101FA
+:1026D00001010101010101010101010101010101EA
+:1026E00001010101010101010101010101010101DA
+:1026F00001010101010101010101010101010101CA
+:1027000001010101010101010101010101010101B9
+:1027100001010101010101010101010101010101A9
+:102720000101010101010101010101010101010199
+:102730000101010101010101010101010101010189
+:102740000101010101010101010101010101010278
+:102750000202020202020202020202020202020259
+:102760000202020202020202020202020202020249
+:102770000202020202020202020202020202020239
+:102780000202020202020202020202020202020229
+:102790000202020202020202020202020202020219
+:1027A000020202020202020202020202020202010A
+:1027B0000101010101010101010101010101010109
+:1027C00001010101010101010101010101010101F9
+:1027D00001010101010101010101010101010101E9
+:1027E00001010101010101010101010101010101D9
+:1027F00001010101010101010101010101010101C9
+:1028000001010101010101010101010101010101B8
+:1028100001010101010101010101010101010101A8
+:102820000101010101010101010101010101010198
+:102830000101010101010101010101010101010188
+:102840000101010101010101010101010101010277
+:102850000202020202020202020202020202020258
+:102860000202020202020202020202020202020248
+:102870000202020202020202020202020202020238
+:102880000202020202020202020202020202020228
+:102890000202020202020202020202020202020218
+:1028A0000202020202020202020202020202020109
+:1028B0000101010101010101010101010101010108
+:1028C00001010101010101010101010101010101F8
+:1028D00001010101010101010101010101010101E8
+:1028E00001010101010101010101010101010101D8
+:1028F00001010101010101010101010101010101C8
+:1029000001010101010101010101010101010101B7
+:1029100001010101010101010101010101010101A7
+:102920000101010101010101010101010101010197
+:102930000101010101010101010101010101010187
+:102940000101010101010101010101010101010177
+:102950000201010101010101010101010101010265
+:102960000202020202020202020202020202020247
+:102970000202020202020202020202020202020237
+:102980000202020202020202020202020202020227
+:102990000202020202020202020202020202020217
+:1029A0000202020202020202020202020202020108
+:1029B0000101010101010101010101010101010107
+:1029C00001010101010101010101010101010101F7
+:1029D00001010101010101010101010101010101E7
+:1029E00001010101010101010101010101010101D7
+:1029F00001010101010101010101010101010101C7
+:102A000001010101010101010101010101010101B6
+:102A100001010101010101010101010101010101A6
+:102A20000101010101010101010101010101010196
+:102A30000101010101010101010101010101010186
+:102A40000101010101010101010101010101010176
+:102A50000101010101010101010101010101010265
+:102A60000202020202020202020202020202020246
+:102A70000202020202020202020202020202020236
+:102A80000202020202020202020202020202020028
+:102A90000000000000000000000000000000000234
+:102AA0000202020202020202020202020202020107
+:102AB0000101010101010101010101010101010106
+:102AC00001010101010101010101010101010101F6
+:102AD00001010101010101010101010101010101E6
+:102AE00001010101010101010101010101010101D6
+:102AF00001010101010101010101010101010101C6
+:102B000001010101010101010101010101010101B5
+:102B100001010101010101010101010101010101A5
+:102B20000101010101010101010101010101010195
+:102B30000101010101010101010101010101010185
+:102B40000101010101010101010101010101010175
+:102B50000101010101010101010101010101010066
+:102B60000000000000000000000000000000000263
+:102B70000202020202020202020202020202020235
+:102B80000202020202020202020202020202020027
+:102B90000000000000000000000000000000000233
+:102BA0000202020202020202020202020202020106
+:102BB0000101010101010101010101010101010105
+:102BC00001010101010101010101010101010101F5
+:102BD00001010101010101010101010101010101E5
+:102BE00001010101010101010101010101010101D5
+:102BF00001010101010101010101010101010101C5
+:102C000001010101010101010101010101010101B4
+:102C100001010101010101010101010101010101A4
+:102C20000101010101010101010101010101010194
+:102C30000101010101010101010101010101010184
+:102C40000101010101010101010101010101010174
+:102C50000101010101010101010101010101010164
+:102C60000101010101010101010101010101010253
+:102C70000202020202020202020202020202020234
+:102C80000202020202020202020202020202020026
+:102C90000000000000000000000000000000000232
+:102CA0000202020202020202020202020202020105
+:102CB0000101010101010101010101010101010104
+:102CC00001010101010101010101010101010101F4
+:102CD00001010101010101010101010101010101E4
+:102CE00001010101010101010101010101010101D4
+:102CF00001010101010101010101010101010101C4
+:102D000001010101010101010101010101010101B3
+:102D100001010101010101010101010101010101A3
+:102D20000101010101010101010101010101010193
+:102D30000101010101010101010101010101010183
+:102D40000101010101010101010101010101010173
+:102D50000101010101010101010101010101010163
+:102D60000101010101010101010101010101010153
+:102D70000101010101010101010101010101010044
+:102D80000000000000000000000000000000000142
+:102D90000101010101010101010101010101010024
+:102DA0000000000000000000000000000000000122
+:102DB0000101010101010101010101010101010103
+:102DC00001010101010101010101010101010101F3
+:102DD00001010101010101010101010101010101E3
+:102DE00001010101010101010101010101010101D3
+:102DF00001010101010101010101010101010101C3
+:102E000001010101010101010101010101010101B2
+:102E100001010101010101010101010101010101A2
+:102E20000101010101010101010101010101010192
+:102E30000101010101010101010101010101010182
+:102E40000101010101010101010101010101010172
+:102E50000101010101010101010101010101010162
+:102E60000101010101010101010101010101010152
+:102E70000101010101010101010101010101010142
+:102E80000101010101010101010101010101010132
+:102E90000101010101010101010101010101010023
+:102EA0000000000000000000000000000000000121
+:102EB0000101010101010101010101010101010102
+:102EC00001010101010101010101010101010101F2
+:102ED00001010101010101010101010101010102E1
+:102EE00002020202020202020202020202020202C2
+:102EF00002020202020202020202020202020202B2
+:102F000002020202020202020202020202020202A1
+:102F10000202020202020202020202020202020291
+:102F20000202020202020202020202020202020281
+:102F30000202020202020202020202020202020271
+:102F40000202020202020202020202020202020162
+:102F50000101010101010101010101010101010161
+:102F60000101010101010101010101010101010151
+:102F70000101010101010101010101010101010141
+:102F80000101010101010101010101010101010131
+:102F90000101010101010101010101010101010022
+:102FA0000000000000000000000000000000000120
+:102FB0000101010101010101010101010101010101
+:102FC00001010101010101010101010101010102F0
+:102FD00002020202020202020202020202020202D1
+:102FE00002020202020202020202020202020202C1
+:102FF00002020202020202020202020202020202B1
+:1030000002020202020202020202020202020202A0
+:103010000202020202020202020202020202020290
+:103020000202020202020202020202020202020280
+:103030000202020202020202020202020202020270
+:103040000202020202020202020202020202020260
+:103050000202020202020202020202020202020151
+:103060000101010101010101010101010101010150
+:103070000101010101010101010101010101010140
+:10308000010101010101010101010101010101022F
+:103090000202020202020202020202020202020012
+:1030A0000000000000000000000000000000000020
+:1030B0000000000000000000000000000000000010
+:1030C0000000000000000000000000000000000000
+:1030D00000000000000000000000000000000000F0
+:1030E00000000000000000000000000000000000E0
+:1030F00000000000000000000000000000000000D0
+:1031000000000000000000000000000000000000BF
+:1031100000000000000000000000000000000000AF
+:10312000000000000000000000000000000000009F
+:10313000000000000000000000000000000000008F
+:10314000000000000000000000000000000000007F
+:10315000000000000000000000000000000000006F
+:10316000000000000000000000000000000000005F
+:10317000000000000000000000000000000000004F
+:10318000000000000000000000000000000000003F
+:10319000000000000000000000000000000000002F
+:1031A00000000000000000000000000000000040DF
+:1031B000000000000000000000000000000000000F
+:1031C00000000000010100000000000000000000FD
+:1031D00000000000000000000000000000000000EF
+:1031E00000000000000000000000000000000000DF
+:1031F00000000000000000000000000000000000CF
+:1032000000000000000000000000000000000000BE
+:1032100000000000000000000000000000000000AE
+:10322000000000000000000000000000000000009E
+:10323000000000000000000000000000000000008E
+:10324000000000000000000000000000000000007E
+:10325000000000000000000000000000000000006E
+:10326000000000000000000000000000000000005E
+:10327000000000000000000000000000000000004E
+:10328000000000000000000000000000000000003E
+:10329000000000000000000000000000000000002E
+:1032A000000000000000000000000000000000001E
+:1032B0000000000000000001000000010101010009
+:1032C00000000000010100000000000000000000FC
+:1032D00000000000000000000000000000000000EE
+:1032E00000000000000000000000000000000000DE
+:1032F00000000000000000000000000000000000CE
+:1033000000000000000000000000000000000000BD
+:1033100000000000000000000000000000000000AD
+:10332000000000000000000000000000000000009D
+:10333000000000000000000000000000000000008D
+:10334000000000000000000000000000000000007D
+:10335000000000000000000000000000000000006D
+:10336000000000000000000000000000000000005D
+:10337000000000000000000000000101000000004B
+:10338000000000000000000000000000000000003D
+:10339000000000000000000000000000000000002D
+:1033A000000000000000000000000000000000001D
+:1033B0000000000000000001010000010101010007
+:1033C00000000000010100000000000000000000FB
+:1033D00000000000000000000000000000000000ED
+:1033E00000000000000000010000000000000000DC
+:1033F00000000000000000000000000000000000CD
+:1034000000000000000000010000000100000000BA
+:1034100000000000000001000000000000000000AB
+:10342000000000000000000000000000000000009C
+:10343000000000000000000000000000000000008C
+:10344000000000000000000000000000000000007C
+:10345000000000000000000000000000000000006C
+:10346000000000000000000000000000000000005C
+:10347000000000000000000000000101000000004A
+:103480000100000001010000000000000000000039
+:10349000000000000000000000000000000000002C
+:1034A000000000000000000000000000000000001C
+:1034B0000000000000000001010000010101010006
+:1034C00000000000010100000001000000000000F9
+:1034D00000000000000000000000000001000000EB
+:1034E00000000000000000010100000000000000DA
+:1034F00000000000000000000100000000000000CB
+:1035000000000000000000010101000100000000B7
+:1035100000000000000001000000000100000000A9
+:10352000000000000000000000000000000000009B
+:10353000000000000000000000000000000000008B
+:10354000000000000000000001000000000000007A
+:103550000000000000000000000000010100000069
+:10356000000000000000000000000000000000005B
+:103570000000000000000000000001010101000047
+:103580000100000001010100000000000000000037
+:10359000000000000000000000000000000000002B
+:1035A000000000000000000000000000000000001B
+:1035B0000000000000000001010100010101010004
+:1035C00001000000010100000001010000000000F6
+:1035D00000000000000000000000000001000000EA
+:1035E00000000000000000010100000000000000D9
+:1035F00000000000000000010100000000000000C9
+:1036000000000000000000010101010101000000B4
+:1036100000000000000001000101000100000000A6
+:10362000000000000000000000000000000000009A
+:10363000000000000000000000000000000000008A
+:103640000000000000000001010000000000000078
+:103650000000000000000000010100010100000066
+:103660000000000000000000010000000000000059
+:103670000000000000000000010101010101010043
+:103680000100000001010100000000000000000036
+:10369000000000000000000000000000000000002A
+:1036A000000000000000000000000000000000001A
+:1036B0000000000000000001010101010101010002
+:1036C00001000000010100000001010000000000F5
+:1036D00000000000000000010000000101000000E7
+:1036E00000000000000000010100000000000000D8
+:1036F00000000000000000010101000000000000C7
+:1037000000000000000000010101010101000000B3
+:1037100000000000000101010101010100000000A2
+:103720000000000000000000000000000000000099
+:103730000000000000000000010000000000000088
+:103740000000000000000001010100000000000076
+:103750000000000000000001010101010100000063
+:103760000000000000000101010001010100000053
+:103770000000000000000000010101010101010141
+:103780000100010101010100000000000000000033
+:103790000000000000000000000000000000000029
+:1037A0000000000000000000000000000000000019
+:1037B0000000000000000001010101010101010001
+:1037C00001010000010100000001010000000000F3
+:1037D00000000000000001010000000101000000E5
+:1037E00000000000000000010100000000000000D7
+:1037F00000000000000001010101010000000000C4
+:1038000000000000000000010101010101010000B1
+:1038100000000000000101010101010100000000A1
+:103820000000000000000000010000000000000097
+:103830000000000000000000010001010100000084
+:103840000000000000000001010100010100000073
+:103850000000000000000001010101010100000062
+:103860000000000000010101010101010100000050
+:103870000000000000000000010101010101010140
+:103880000101010101010100000000000000000031
+:103890000000000000000000000000000000000028
+:1038A0000000000000000000000000000000000018
+:1038B00000000000000000010101010101010101FF
+:1038C00001010100010100000001010000000000F1
+:1038D00000000000000001010000000101000000E4
+:1038E00000000000000001010101000000000000D4
+:1038F00000000000000001010101010000000000C3
+:1039000000000000000000010101010101010100AF
+:10391000010000000101010101010101000000009E
+:103920000000000000000100010000000000000095
+:103930000000000000000000010101010100000082
+:103940000000000000000001010100010100000072
+:103950000000000000000001010101010100000061
+:10396000000000000001010101010101010000004F
+:10397000000000000000000101010101010101013E
+:103980000101010101010100000000000000000030
+:103990000000000000000000000000000000000027
+:1039A0000000000000000000000000000000000017
+:1039B00000000000000000010101010101010101FE
+:1039C00001010100010100010001010101000000ED
+:1039D00000000000000001010000000101000000E3
+:1039E00000000000000001010101010000010000D1
+:1039F00000000000000001010101010101000000C0
+:103A000000000000000000010101010101010100AE
+:103A1000010000000101010101010101000000009D
+:103A20000000000000000100010100000000000093
+:103A30000000000000000001010101010100000080
+:103A4000000000000000010101010101010000006F
+:103A5000000000000000000101010101010001005F
+:103A6000010000000101010101010101010000004C
+:103A7000000000000000000101010101010101013D
+:103A8000010101010101010001000000000000002E
+:103A90000000000000000000000000000000000026
+:103AA0000000000000000000000000000000000016
+:103AB00000000000000000010101010101010101FD
+:103AC00001010101010100010001010101000000EB
+:103AD00000000000010101010000000101010000DF
+:103AE00000000000000001010101010000010100CF
+:103AF00001000000000001010101010101000000BE
+:103B000000000000000000010101010101010100AD
+:103B1000010000000101010101010101010000009B
+:103B2000000000000000010101010101010100008D
+:103B3000000000000000000101010101010000007F
+:103B4000000000000001010101010101010000006D
+:103B5000000000000000000101010101010101015C
+:103B60000100010101010101010101010100000049
+:103B7000000000000000010101010101010101013B
+:103B8000010101010101010101000000000000002C
+:103B90000000000000000000000000000000000025
+:103BA0000000000000000000000000000000000015
+:103BB00000000000000000010101010101010101FC
+:103BC00001010101010100010001010101000000EA
+:103BD00000000000010101010100000101010000DD
+:103BE00000000000000101010101010101010100CB
+:103BF00001000000000001010101010101000000BD
+:103C000000000000000001010101010101010101AA
+:103C10000100000001010101010101010100010099
+:103C2000000000000001010101010101010100008B
+:103C3000000000000000000101010101010100007D
+:103C4000000000000001010101010101010000006C
+:103C5000000000000000000101010101010101015B
+:103C60000100010101010101010101010100000048
+:103C70000100000001010101010101010101010137
+:103C8000010101010101010101000000000000002B
+:103C90000000000000000001000000000000000023
+:103CA0000000000000000000000000000000000014
+:103CB00000000000000000010101010101010101FB
+:103CC00001010101010100010001010101000000E9
+:103CD00000000000010101010100010101010000DB
+:103CE00000000000000101010101010101010100CA
+:103CF00001000000010101010101010101000000BA
+:103D000000000000000001010101010101010101A9
+:103D10000100000001010101010101010101010196
+:103D2000000000000001010101010101010100008A
+:103D3000000000000000010101010101010101007A
+:103D40000100000001010101010101010100000069
+:103D50000100000000000001010101010101010159
+:103D60000100010101010101010101010101000145
+:103D70000100010001010101010101010101010135
+:103D80000101010101010101010001010100000027
+:103D90000000000000000001010000000000000021
+:103DA0000000000000000000000000000000000013
+:103DB00000000000000000010101010101010101FA
+:103DC00001010101010100010001010101000000E8
+:103DD00000000000010101010101010101010000D9
+:103DE00001000000010101010101010101010101C6
+:103DF00001000100010101010101010101010000B7
+:103E000000000000000001010101010101010101A8
+:103E10000100010101010101010101010101010193
+:103E20000100000001010101010101010101010086
+:103E30000000000000000101010101010101010079
+:103E40000100000001010101010101010100000068
+:103E50000100000000000101010101010101010157
+:103E60000101010101010101010101010101010142
+:103E70000100010001010101010101010101010134
+:103E80000101010101010101010101010100000025
+:103E90000000000000000001010000000000000020
+:103EA0000000000000000000000000000000000012
+:103EB00000000000000000020101010101010101F8
+:103EC00001010101010100010101010101000000E6
+:103ED00001000000010101010101010101010000D7
+:103EE00001000000010101010101010101010101C5
+:103EF00001000100010101010101010101010100B5
+:103F000001000000000001010101010101010101A6
+:103F10000100010101010101010101010101010192
+:103F20000100010001010101010101010101010084
+:103F30000000000000000101010101010101010078
+:103F40000100000001010101010101010100000067
+:103F50000100000000000101010101010101010156
+:103F60000101010101010101010101010101010141
+:103F70000100010101010101010101010101010132
+:103F80000101010101010101010101010100000024
+:103F9000000000000000000101000000000000001F
+:103FA0000000000000000000000000000000000011
+:103FB00000000000000000020101010101010101F7
+:103FC00001010101010100010101010101010000E4
+:103FD00001000000010101010101010101010100D5
+:103FE00001000000010101010101010101010101C4
+:103FF00001000100010101010101010101010100B4
+:1040000001000000000001010101010101010101A5
+:104010000100010101010101010101010101010191
+:104020000100010001010101010101010101010083
+:104030000000000001010101010101010101010174
+:104040000100010101010101010101010101000063
+:104050000100000000000101010101010101010155
+:104060000101010101010101010101010101010140
+:104070000101010101010101010101010101010130
+:104080000101010101010101010101010100000023
+:10409000000000000000000101000100000000001D
+:1040A0000000000000000000000000000000000010
+:1040B00000000000000000020101010101010201F5
+:1040C00001010101010100010101010101010100E2
+:1040D00001000000010101010101010101010101D3
+:1040E00001000000010101020101010101010101C2
+:1040F00001000100010101010101010101010100B3
+:1041000001000000010101010101010101010101A2
+:104110000100010101010101010101010101010190
+:104120000100010101010101010101010101010081
+:104130000000000001010101010101010101010173
+:104140000100010101010101010101010101010061
+:104150000100000001010101010101010101010152
+:10416000010101010101010101010101010101013F
+:10417000010101010101010101010101010101012F
+:104180000101010101010101010101010101000021
+:10419000000000000000000101010100000000001B
+:1041A000000000000000000000000000000000000F
+:1041B00000000000000000020201010101010201F3
+:1041C00001010101010100010101010101010101E0
+:1041D00001000100010101020101010101010101D0
+:1041E00001000000010101020101010101010101C1
+:1041F00001000101010101010101010101010101B0
+:1042000001000000010101020101010101010101A0
+:10421000010001010101010101010101010101018F
+:104220000100010101010101010101010101010080
+:104230000100000001010101010101010101010171
+:10424000010001010101010101010101010101015F
+:10425000010001010101010101010101010101014F
+:10426000010101010101010101010101010101013E
+:10427000010101010101010101010101010101012E
+:10428000010101010101010101010101010101001F
+:104290000100000000000001010101010100000017
+:1042A000000000000000000000000000000000000E
+:1042B00000000000000000020202010201010201F0
+:1042C00001010101010100010102010101010101DE
+:1042D00001000100010101020101010101010101CF
+:1042E00001000100010101020101010101010101BF
+:1042F00001010101010101020101010101010101AD
+:10430000010000000101010201010101010101019F
+:10431000010001010101010101010101010101018E
+:10432000010001010101010101010101010101017E
+:10433000010001010101010101010101010101016E
+:10434000010101010101010101010101010101015D
+:10435000010001010101010101010101010101014E
+:10436000010101010101010101010101010101013D
+:10437000010101010101010101010101010101012D
+:10438000010101010101010101010101010101011D
+:104390000100000100000001010101010100000015
+:1043A000000000000000000000000000000000000D
+:1043B00000000000000000020202010202020201ED
+:1043C00001010101010100020102010101010101DC
+:1043D00001000101010101020101010101010101CD
+:1043E00001000100010101020201010101010101BD
+:1043F00001010101010101020101010101010101AC
+:10440000010000000101010201010101010101019E
+:10441000010001010101010201010101010101018C
+:10442000010101010101010101010101010101017C
+:10443000010001010101010101010101010101016D
+:10444000010101010101010201010101010101015B
+:10445000010001010101010101010101010101014D
+:10446000010101010101010101010101010101013C
+:10447000010101010101010101010101010101012C
+:10448000010101010101010101010101010101011C
+:104490000100000101010001010101010101000011
+:1044A000000000000000000000000000000000000C
+:1044B00000000000000000020202020202020201EB
+:1044C00001020101010100020102020101010101D9
+:1044D00001000101010101020101010101010101CC
+:1044E00001000100010101020201010101010101BC
+:1044F00001010101010101020201010101010101AA
+:10450000010000000101010202020101010101019B
+:10451000010001010101010201010101010101018B
+:10452000010101010101010101010101010101017B
+:10453000010001010101010101010101010101016C
+:10454000010101010101010201010101010101015A
+:10455000010101010101010201010101010101014A
+:10456000010101010101010101010101010101013B
+:10457000010101010101010101010101010101012B
+:10458000010101010101010101010101010101011B
+:10459000010001010101000101010101010101000E
+:1045A0000000000000000000000200000000000009
+:1045B00000000000000000020202020202020201EA
+:1045C00002020101010100020102020101010101D7
+:1045D00001000101010101020101010202010101C9
+:1045E00001000100010101020202010101010101BA
+:1045F00001010101010101020202010101010101A8
+:10460000010000000101010202020101010101019A
+:104610000100010101010102020201010101010188
+:104620000101010101010102010101010101010179
+:10463000010101010101010101010101010101016A
+:104640000101010101010102020101010101010158
+:104650000101010101010102010101010101010149
+:104660000101010101010102010101010101010139
+:10467000010101010101010101010101010101012A
+:104680000101010101010102010101010101010119
+:10469000010101010101000101010101010101010B
+:1046A0000000000000000000000200000000000008
+:1046B00000000000000000020202020202020202E8
+:1046C00002020101020200020102020101010101D4
+:1046D00001000101010101020201010202010101C7
+:1046E00001000100010101020202010101010101B9
+:1046F00001010101010101020202010101010101A7
+:104700000100000001010102020202020101010197
+:104710000100010101010102020201010101010187
+:104720000101010101010102020101010101010177
+:104730000101010101010102010101010101010168
+:104740000101010101010102020201010101010156
+:104750000101010101010102020201010101010146
+:104760000101010101010102010101010101010138
+:104770000101010101010102010101010101010128
+:104780000101010101010102010101010101010118
+:104790000101010101010102010101010101010108
+:1047A0000100000001000000000200000000000005
+:1047B00000000000000000020202020202020202E7
+:1047C00002020201020200020102020201010101D1
+:1047D00001000101010101020202010202010101C5
+:1047E00001000100010101020202020101010101B7
+:1047F00001010101010101020202020101010101A5
+:104800000100000001010102020202020101010196
+:104810000100010101010102020202020101010184
+:104820000101010101010102020201010101010175
+:104830000101010101010102020101010101010166
+:104840000101010101010102020201010101010155
+:104850000101010101010102020201010101010145
+:104860000101010101010102020101010101010136
+:104870000101010101010102020202010101010124
+:104880000101010101010102020101010101010116
+:104890000101010101010102010101010101010107
+:1048A0000100010101000000000200000000000002
+:1048B00000000000000000020202020202020202E6
+:1048C00002020201020200020202020202010101CE
+:1048D00001010101010101020202020202020101C1
+:1048E00001000100010101020202020101020101B5
+:1048F00001010101010101020202020101010101A4
+:104900000100000001010102020202020201010194
+:104910000101010101010102020202020101010182
+:104920000101010101010102020201010101010174
+:104930000101010101010102020201010101010164
+:104940000101010101010102020201010101010154
+:104950000101010101010102020202020101010142
+:104960000101010101010102020201010101010134
+:104970000101010101010102020202020101010122
+:104980000101010101010102020101010101010115
+:104990000101010101010102010101010101010106
+:1049A0000101010101010000000100000000000000
+:1049B00000000000010000020202020202020202E4
+:1049C00002020202020200020202020202010101CC
+:1049D00001010101010101020202020202020101C0
+:1049E00001000100010101020202020201020201B2
+:1049F00001010101010101020202020201010101A2
+:104A00000100000101010102020202020202010191
+:104A10000101010101010102020202020101010181
+:104A20000101010101010102020202010101010172
+:104A30000101010101010102020202010101010162
+:104A40000101010101010102020202020101010151
+:104A50000101010101010102020202020201010140
+:104A60000101010101010102020202010101010132
+:104A70000101010101010102020202020101010121
+:104A80000101010101010102020201010101010113
+:104A90000101010101010102020101010101010104
+:104AA00001010101010101000001010000000000FD
+:104AB00000000000010000020202020202020202E3
+:104AC00002020202020200020202020202010101CB
+:104AD00001010101010101020202020202020101BF
+:104AE00001000101010101020202020202020201AF
+:104AF000020101010101010202020202020101019F
+:104B0000010000010101010202020202020202018F
+:104B10000101010101010102020202020101010180
+:104B20000101010101010102020202020101010170
+:104B30000101010101010102020202020101010160
+:104B4000010101010101010202020202020101014F
+:104B5000010101010101010202020202020101013F
+:104B60000101010101010102020202020101010130
+:104B7000010101010101010202020202020201011E
+:104B80000101010101010102020202010101010111
+:104B90000101010101010102020101010101010103
+:104BA00001010101010101000001010000000000FC
+:104BB00000000000010000020202020202020202E2
+:104BC00002020202020200020202020202020101C9
+:104BD00001010101010102020202020202020201BC
+:104BE00002010101010102020202020202020202AA
+:104BF000020101010101020202020202020101019D
+:104C0000010000010101010202020202020202018E
+:104C1000020101010101020202020202020101017C
+:104C2000010101010101010202020202020201016D
+:104C3000010101010101010202020202020101015E
+:104C4000010101010101010202020202020101014E
+:104C5000010101010101010202020202020101013E
+:104C6000010101010101010202020202020101012E
+:104C7000010101010101010202020202020202011C
+:104C8000020101010101010202020202010101010E
+:104C90000101010101010102020201010101010101
+:104CA00001010101010101000001010000000000FB
+:104CB00000000000010000020202020202020202E1
+:104CC00002020202020200020202020202020201C7
+:104CD00002010101020202020202020202020202B7
+:104CE00002010101010202020202020202020202A8
+:104CF000020102010101020202020202020201019A
+:104D0000010000010101010202020202020202028C
+:104D10000201010101020202020202020202020178
+:104D2000010101010101010202020202020201016C
+:104D3000010101010101010202020202020101015D
+:104D4000010101010101010202020202020101014D
+:104D5000010101010101010202020202020202013B
+:104D6000010101010101010202020202020101012D
+:104D7000010101010101010202020202020202021A
+:104D8000020101010101010202020202020101010C
+:104D900001010101010101020202020101010101FF
+:104DA00001010101010101000101010000000000F9
+:104DB00000000000010100020202020202020202DF
+:104DC00002020202020200020202020202020202C5
+:104DD00002010101020202020202020202020202B6
+:104DE00002010101020202020202020202020202A6
+:104DF0000201020102020202020202020202020196
+:104E0000010001010101010202020202020202028A
+:104E10000201010102020202020202020202020275
+:104E2000010101010101010202020202020202016A
+:104E3000010101010101010202020202020201015B
+:104E4000010101010101010202020202020101014C
+:104E50000101010101010102020202020202020239
+:104E6000020101010101010202020202020101012B
+:104E70000101010101010102020202020202020219
+:104E80000202020102020102020202020201010107
+:104E900001010101010101020202020101010101FE
+:104EA00001010101010101000101000101000001F6
+:104EB00000000000010101020202020202020202DD
+:104EC00002020202020200020202020202020202C4
+:104ED00002010201020202020202020202020202B4
+:104EE00002010201020202020202020202020202A4
+:104EF0000202020102020202020202020202020194
+:104F00000202010101010102020202020202020286
+:104F10000201020102020202020202020202020273
+:104F20000201010101010202020202020202020167
+:104F30000101010101010102020202020202020159
+:104F4000010101010101010202020202020201014A
+:104F50000201010101010102020202020202020237
+:104F60000201020101020202020202020202010126
+:104F70000101010101010102020202020202020218
+:104F80000202020202020202020202020202010103
+:104F900001010101010101020202020201010101FC
+:104FA00001010101010101000100000101000001F6
+:104FB00000000000010101020202020202020202DC
+:104FC00002020202020200020202020202020202C3
+:104FD00002010201020202020202020202020202B3
+:104FE00002010201020202020202020202020202A3
+:104FF0000202020202020202020202020202020291
+:105000000201010101010202020202020202020285
+:105010000201020202020202020202020202020271
+:105020000201020101020202020202020202020164
+:105030000101010101010102020202020202020158
+:105040000201010101010102020202020202020147
+:105050000201010101010102020202020202020236
+:105060000202020202020202020202020202020220
+:105070000201010101010102020202020202020216
+:105080000202020202020202020202020202020101
+:1050900001010101010101020202020202010101FA
+:1050A00001010101010101000000000101000001F6
+:1050B00000000001010101020202020202020202DA
+:1050C00002020202020200020202020202020202C2
+:1050D00002010202020202020202020202020202B1
+:1050E00002010201020202020202020202020202A2
+:1050F0000202020202020202020202020202020290
+:105100000201010101010202020202020202020284
+:105110000201020202020202020202020202020270
+:105120000201020102020202020202020202020261
+:105130000201010101010202020202020202020254
+:105140000201010101020202020202020202020243
+:105150000201010101010102020202020202020235
+:10516000020202020202020202020202020202021F
+:105170000201020101010102020202020202020214
+:1051800002020202020202020202020202020202FF
+:1051900002010101010101020202020202020101F7
+:1051A00001010101010101000000000101000001F5
+:1051B00001000101010101020202020202020202D7
+:1051C00002020202020200020202020202020202C1
+:1051D00002020202020202020202020202020202AF
+:1051E00002010201020202020202020202020202A1
+:1051F000020202020202020202020202020202028F
+:105200000201010102020202020202020202020281
+:10521000020102020202020202020202020202026F
+:10522000020202020202020202020202020202025E
+:105230000201020102020202020202020202020250
+:105240000201020102020202020202020202020240
+:105250000201020101010202020202020202020232
+:10526000020202020202020202020202020202021E
+:10527000020202010202020202020202020202020F
+:1052800002020202020202020202020202020202FE
+:1052900002010101010101020202020202020201F5
+:1052A00001010101010101000000000101000001F4
+:1052B00001000101010101020202020202020202D6
+:1052C00002020202020200020202020202020202C0
+:1052D00002020202020202020202020202020202AE
+:1052E000020202010202020202020202020202029F
+:1052F000020202020202020202020202020202028E
+:105300000201010102020202020202020202020280
+:10531000020102020202020202020202020202026E
+:10532000020202020202020202020202020202025D
+:10533000020202020202020202020202020202024D
+:10534000020202020202020202020202020202023D
+:10535000020202020202020202020202020202022D
+:10536000020202020202020202020202020202021D
+:10537000020202020202020202020202020202020D
+:1053800002020202020202020202020202020202FD
+:1053900002020202010101020202020202020202F0
+:1053A00001010101010101000000000001000101F3
+:1053B00001000101010101020202020202020202D5
+:1053C00002020202020200020202020202020202BF
+:1053D00002020202020202020202020202020202AD
+:1053E000020202020202020202020202020202029D
+:1053F000020202020202020202020202020202028D
+:10540000020101010202020202020202020202027F
+:10541000020202020202020202020202020202026C
+:10542000020202020202020202020202020202025C
+:10543000020202020202020202020202020202024C
+:10544000020202020202020202020202020202023C
+:10545000020202020202020202020202020202022C
+:10546000020202020202020202020202020202021C
+:10547000020202020202020202020202020202020C
+:1054800002020202020202020202020202020202FC
+:1054900002020202020201020202020202020202ED
+:1054A00002010101010101000000000000000100F3
+:1054B00001010101000101020202020202020202D4
+:1054C00002020202020200020202020202020202BE
+:1054D00002020202020202020202020202020202AC
+:1054E000020202020202020202020202020202029C
+:1054F000020202020202020202020202020202028C
+:10550000020101010202020202020202020202027E
+:10551000020202020202020202020202020202026B
+:10552000020202020202020202020202020202025B
+:10553000020202020202020202020202020202024B
+:10554000020202020202020202020202020202023B
+:10555000020202020202020202020202020202022B
+:10556000020202020202020202020202020202021B
+:10557000020202020202020202020202020202020B
+:1055800002020202020202020202020202020202FB
+:1055900002020202020201020202020202020202EC
+:1055A00002020201010101000000000000000100F0
+:1055B00001010101000101020202020202020102D4
+:1055C00002020202020200020202020202020202BD
+:1055D00002020202020202020202020202020202AB
+:1055E000020202020202020202020202020202029B
+:1055F000020202020202020202020202020202028B
+:10560000020101020202020202020202020202027C
+:10561000020202020202020202020202020202026A
+:10562000020202020202020202020202020202025A
+:10563000020202020202020202020202020202024A
+:10564000020202020202020202020202020202023A
+:10565000020202020202020202020202020202022A
+:10566000020202020202020202020202020202021A
+:10567000020202020202020202020202020202020A
+:1056800002020202020202020202020202020202FA
+:1056900002020202020202020202020202020202EA
+:1056A00002020202020101000000000000010100EC
+:1056B00001010101000101020202020202020102D3
+:1056C00002010202020200020202020202020202BD
+:1056D00002020202020202020202020202020202AA
+:1056E000020202020202020202020202020202029A
+:1056F000020202020202020202020202020202028A
+:10570000020102020202020202020202020202027A
+:105710000202020202020202020202020202020269
+:105720000202020202020202020202020202020259
+:105730000202020202020202020202020202020249
+:105740000202020202020202020202020202020239
+:105750000202020202020202020202020202020229
+:105760000202020202020202020202020202020219
+:105770000202020202020202020202020202020209
+:1057800002020202020202020202020202020202F9
+:1057900002020202020202020202020202020202E9
+:1057A00002020202020201000000000000010100EA
+:1057B00000010101000001020202020202020102D4
+:1057C00002010202020200020202020202020202BC
+:1057D00002020202020202020202020202020202A9
+:1057E0000202020202020202020202020202020299
+:1057F0000202020202020202020202020202020289
+:105800000202020202020202020202020202020278
+:105810000202020202020202020202020202020268
+:105820000202020202020202020202020202020258
+:105830000202020202020202020202020202020248
+:105840000202020202020202020202020202020238
+:105850000202020202020202020202020202020228
+:105860000202020202020202020202020202020218
+:105870000202020202020202020202020202020208
+:1058800002020202020202020202020202020202F8
+:1058900002020202020202020202020202020202E8
+:1058A00002020202020202020000000000010000E7
+:1058B00000010001000001020202020202020102D4
+:1058C00002010202020200020202020202020202BB
+:1058D00002020202020202020202020202020202A8
+:1058E0000202020202020202020202020202020298
+:1058F0000202020202020202020202020202020288
+:105900000202020202020202020202020202020277
+:105910000202020202020202020202020202020267
+:105920000202020202020202020202020202020257
+:105930000202020202020202020202020202020247
+:105940000202020202020202020202020202020237
+:105950000202020202020202020202020202020227
+:105960000202020202020202020202020202020217
+:105970000202020202020202020202020202020207
+:1059800002020202020202020202020202020202F7
+:1059900002020202020202020202020202020202E7
+:1059A00002020202020202020000000000010000E6
+:1059B00000000000000000020202020202020102D6
+:1059C00002010202020200020202020202020202BA
+:1059D00002020202020202020202020202020202A7
+:1059E0000202020202020202020202020202020297
+:1059F0000202020202020202020202020202020287
+:105A00000202020202020202020202020202020276
+:105A10000202020202020202020202020202020266
+:105A20000202020202020202020202020202020256
+:105A30000202020202020202020202020202020246
+:105A40000202020202020202020202020202020236
+:105A50000202020202020202020202020202020226
+:105A60000202020202020202020202020202020216
+:105A70000202020202020202020202020202020206
+:105A800002020202020202020202020202020202F6
+:105A900002020202020202020202020202020202E6
+:105AA00002020202020202020200000000000000E4
+:105AB00000000000000000020202020202020101D6
+:105AC00001010101020201020202020202020202BB
+:105AD00002020202020202020202020202020202A6
+:105AE0000202020202020202020202020202020296
+:105AF0000202020202020202020202020202020286
+:105B00000202020202020202020202020202020275
+:105B10000202020202020202020202020202020265
+:105B20000202020202020202020202020202020255
+:105B30000202020202020202020202020202020245
+:105B40000202020202020202020202020202020235
+:105B50000202020202020202020202020202020225
+:105B60000202020202020202020202020202020215
+:105B70000202020202020202020202020202020205
+:105B800002020202020202020202020202020202F5
+:105B900002020202020202020202020202020202E5
+:105BA00002020202020202020202000000000000E1
+:105BB00000000000000000020202020101010101D8
+:105BC00001010101010101020202020202020202BC
+:105BD00002020202020202020202020202020202A5
+:105BE0000202020202020202020202020202020295
+:105BF0000202020202020202020202020202020285
+:105C00000202020202020202020202020202020274
+:105C10000202020202020202020202020202020264
+:105C20000202020202020202020202020202020254
+:105C30000202020202020202020202020202020244
+:105C40000202020202020202020202020202020234
+:105C50000202020202020202020202020202020224
+:105C60000202020202020202020202020202020214
+:105C70000202020202020202020202020202020204
+:105C800002020202020202020202020202020202F4
+:105C900002020202020202020202020202020202E4
+:105CA00002020202020202020202020000000000DE
+:105CB00000000000000000010101010101010101DB
+:105CC00001010101010101020202020202020202BB
+:105CD00002020202020202020202020202020202A4
+:105CE0000202020202020202020202020202020294
+:105CF0000202020202020202020202020202020284
+:105D00000202020202020202020202020202020273
+:105D10000202020202020202020202020202020263
+:105D20000202020202020202020202020202020253
+:105D30000202020202020202020202020202020243
+:105D40000202020202020202020202020202020233
+:105D50000202020202020202020202020202020223
+:105D60000202020202020202020202020202020213
+:105D70000202020202020202020202020202020203
+:105D800002020202020202020202020202020202F3
+:105D900002020202020202020202020202020202E3
+:105DA00002020202020202020202020200000000DB
+:105DB00000000000000000010101010101010101DA
+:105DC00001010101010101020202020202020202BA
+:105DD00002020202020202020202020000000000AD
+:105DE00000000000000000020202020202020202A1
+:105DF0000202020202020202020202020202020283
+:105E00000202020202020202020202020202020272
+:105E10000202020202020202020202020202020262
+:105E20000202020202020202020202020202020252
+:105E30000202020202020202020202020202020242
+:105E40000202020202020202020202020202020232
+:105E50000202020202020202020202020202020222
+:105E60000202020202020202020202020202020212
+:105E70000202020202020202020202020202020202
+:105E800002020202020202020202020202020202F2
+:105E900002020202020202020202020202020202E2
+:105EA00002020202020202020202020202000000D8
+:105EB00000000000000000010101010101010101D9
+:105EC00001010101010101020202020202020202B9
+:105ED00002020202020202000000000000000000B4
+:105EE00000000000000000020202020202010101A3
+:105EF0000101010101010102020202020202020289
+:105F00000202020202020202020202020202020271
+:105F10000202020202020202020202020202020261
+:105F20000202020202020202020202020202020251
+:105F30000202020202020202020202020202020241
+:105F40000202020202020202020202020202020231
+:105F50000202020202020202020202020202020221
+:105F60000202020202020202020202020202020211
+:105F70000202020202020202020202020202020201
+:105F800002020202020202020202020202020202F1
+:105F900002020202020202020202020202020202E1
+:105FA00002020202020202020202020202000000D7
+:105FB00000000000000000010101010101010001D9
+:105FC00001010101010101020201010101010101BF
+:105FD00001010101010101000000000101010101B5
+:105FE0000101010101010102020202020202020298
+:105FF0000202020202020202020202020202020281
+:106000000202020202020202020202020202020270
+:106010000202020202020202020202020202020260
+:106020000202020202020202020202020202020250
+:106030000202020202020202020202020202020240
+:106040000202020202020202020202020202020230
+:106050000202020202020202020202020202020220
+:106060000202020202020202020202020202020210
+:106070000202020202020202020202020202020200
+:1060800002020202020202020202020202020202F0
+:1060900002020202020202020202020202020202E0
+:1060A00002020202020202020202020202020202D0
+:1060B00000000000020000010101010101010001D6
+:1060C00001000101010101010101010101010101C1
+:1060D00001010101010101010101010101010101B0
+:1060E00001010101010101010101010101000000A3
+:1060F000000000000000000202020202020202028E
+:10610000020202020202020202020202020202026F
+:10611000020202020202020202020202020202025F
+:10612000020202020202020202020202020202024F
+:10613000020202020202020202020202020202023F
+:10614000020202020202020202020202020202022F
+:10615000020202020202020202020202020202021F
+:10616000020202020202020202020202020202020F
+:1061700002020202020202020202020202020202FF
+:1061800002020202020202020202020202020202EF
+:1061900002020202020202020202020202020202DF
+:1061A00002020202020202020202020202020202CF
+:1061B00002000202020202010101010101010001CB
+:1061C00001000101010101010101010101010101C0
+:1061D00001010101010101010101010101010101AF
+:1061E000010101010101010202020202020000009C
+:1061F000000000000000000202020202020202028D
+:10620000020202020202020202020202020202026E
+:10621000020202020202020202020202020202025E
+:10622000020202020202020202020202020202024E
+:10623000020202020202020202020202020202023E
+:10624000020202020202020202020202020202022E
+:10625000020202020202020202020202020202021E
+:10626000020202020202020202020202020202020E
+:1062700002020202020202020202020202020202FE
+:1062800002020202020202020202020202020202EE
+:1062900002020202020202020202020202020202DE
+:1062A00002020202020202020202020202020202CE
+:1062B00002020202020202010101010101010001C8
+:1062C00001000101010101010101010101010101BF
+:1062D00001010101010101010101010101010101AE
+:1062E000010101010101010101010101010101019E
+:1062F0000101010101010102020202020202020285
+:10630000020202020202020202020202020202026D
+:10631000020202020202020202020202020202025D
+:10632000020202020202020202020202020202024D
+:10633000020202020202020202020202020202023D
+:10634000020202020202020202020202020202022D
+:10635000020202020202020202020202020202021D
+:10636000020202020202020202020202020202020D
+:1063700002020202020202020202020202020202FD
+:1063800002020202020202020202020202020202ED
+:1063900002020202020202020202020202020202DD
+:1063A00002020202020202020202020202020202CD
+:1063B00002020202020202010101010101010001C7
+:1063C00001000101010101010101010101010101BE
+:1063D00001010101010101010101010101010101AD
+:1063E000010101010101010101010101010101019D
+:1063F000010101010101010101010101010101018D
+:106400000101010101010102020202020202020273
+:106410000202020202020201010101010101010165
+:10642000010101010101010101010101010101015C
+:106430000101010101010102020202020202020243
+:10644000020202020202020202020202020202022C
+:10645000020202020202020202020202020202021C
+:10646000020202020202020202020202020202020C
+:1064700002020202020202020202020202020202FC
+:1064800002020202020202020202020202020202EC
+:1064900002020202020202020202020202020202DC
+:1064A00002020202020202020202020202020202CC
+:1064B00002020202020202010101010101010101C5
+:1064C00001010101010101010101010101010101BC
+:1064D00001010101010101010101010101010101AC
+:1064E000010101010101010101010101010101019C
+:1064F000010101010101010101010101010101018C
+:10650000010101010101010101010101010101017B
+:106510000101010101010102020202020202020262
+:10652000020202020202020202020202020202024B
+:10653000020202020202020202020202020202023B
+:10654000020202020202020202020202020202022B
+:10655000020202020202020202020202020202021B
+:10656000020202020202020202020202020202020B
+:1065700002020202020202020202020202020202FB
+:1065800002020202020202020202020202020202EB
+:1065900002020202020202020202020202020202DB
+:1065A00002020202020202020202020202020202CB
+:1065B00002020202020202010101010101010101C4
+:1065C00001010101010101010101010101010101BB
+:1065D00001010101010101010101010101010101AB
+:1065E000010101010101010101010101010101019B
+:1065F000010101010101010101010101010101018B
+:10660000010101010101010101010101010101017A
+:106610000101010101010100000000000000000073
+:10662000000000000000000000000000000000006A
+:106630000000000000000002020202020202020248
+:106640000202020202020201010101010101010133
+:10665000010101010101010101010101010101012A
+:106660000101010101010102020202020202020211
+:1066700002020202020202020202020202020202FA
+:1066800002020202020202010101010101010101F3
+:1066900001010101010101010101010101010101EA
+:1066A00001010101010101020202020202020202D1
+:1066B00002020202020202010101010101010101C3
+:1066C00001010101010101010101010101010101BA
+:1066D00001010101010101010101010101010101AA
+:1066E000010101010101010101010101010101019A
+:1066F000010101010101010101010101010101018A
+:106700000101010101010101010101010101010179
+:106710000101010101010101010101010101010169
+:106720000101010101010100000000000000000062
+:106730000000000000000002020202020202020247
+:106740000202020202020202020202020202020229
+:106750000202020202020202020202020202020219
+:106760000202020202020202020202020202020209
+:1067700002020202020202020202020202020202F9
+:1067800002020202020202020202020202020202E9
+:1067900002020202020202020202020202020202D9
+:1067A00002020202020202020202020202020202C9
+:1067B00002020202020202010101010101010101C2
+:1067C00001010101010101010101010101010101B9
+:1067D00001010101010101010101010101010101A9
+:1067E0000101010101010101010101010101010199
+:1067F0000101010101010101010101010101010189
+:106800000101010101010101010101010101010178
+:106810000101010101010101010101010101010168
+:106820000101010101010101010101010101010158
+:106830000101010101010101010101010101010148
+:106840000101010101010101010101010101010138
+:106850000101010101010100000000000000000031
+:106860000000000000000002020202020202020216
+:1068700002020202020202020202020202020202F8
+:1068800002020202020202000000000000000000FA
+:1068900000000000000000000000000000000000F8
+:1068A00000000000000000020202020202020202D6
+:1068B00002020202020202010101010101010101C1
+:1068C00001010101010101010101010101010101B8
+:1068D00001010101010101010101010101010101A8
+:1068E0000101010101010101010101010101010198
+:1068F0000101010101010101010101010101010188
+:106900000101010101010101010101010101010177
+:106910000101010101010101010101010101010167
+:106920000101010101010101010101010101010157
+:106930000101010101010101010101010101010147
+:106940000101010101010101010101010101010137
+:106950000101010101010100000000000000000030
+:10696000000000000000000101010101010101011E
+:1069700001010101010101020202020202020202FE
+:1069800002020202020202000000000000000000F9
+:1069900000000000000000000000000000000000F7
+:1069A00000000000000000020202020202020202D5
+:1069B00002020202020202010101010101010101C0
+:1069C00001010101010101010101010101010101B7
+:1069D00001010101010101010101010101010101A7
+:1069E0000101010101010101010101010101010197
+:1069F0000101010101010101010101010101010187
+:106A00000101010101010101010101010101010176
+:106A10000101010101010101010101010101010166
+:106A20000101010101010101010101010101010156
+:106A30000101010101010101010101010101010146
+:106A40000101010101010101010101010101010136
+:106A50000101010101010101010101010101010126
+:106A60000101010101010101010101010101010116
+:106A70000101010101010101010101010101010106
+:106A800001010101010101000000000000000000FF
+:106A900000000000000000000000000000000000F6
+:106AA00000000000000000020202020202020202D4
+:106AB00002020202020202010101010101010101BF
+:106AC00001010101010101010101010101010101B6
+:106AD00001010101010101010101010101010101A6
+:106AE0000101010101010101010101010101010196
+:106AF0000101010101010101010101010101010186
+:106B00000101010101010101010101010101010175
+:106B10000101010101010101010101010101010165
+:106B20000101010101010101010101010101010155
+:106B30000101010101010101010101010101010145
+:106B40000101010101010101010101010101010135
+:106B50000101010101010101010101010101010125
+:106B60000101010101010101010101010101010115
+:106B700001010101010101020202020202020202FC
+:106B800002020202020202000000000000000000F7
+:106B900000000000000000000000000000000000F5
+:106BA00000000000000000020202020202020202D3
+:106BB00002020202020202010101010101010101BE
+:106BC00001010101010101010101010101010101B5
+:106BD00001010101010101010101010101010101A5
+:106BE0000101010101010101010101010101010195
+:106BF0000101010101010101010101010101010185
+:106C00000101010101010101010101010101010174
+:106C10000101010101010101010101010101010164
+:106C20000101010101010101010101010101010154
+:106C30000101010101010101010101010101010144
+:106C40000101010101010101010101010101010134
+:106C50000101010101010101010101010101010124
+:106C60000101010101010101010101010101010114
+:106C70000101010101010101010101010101010104
+:106C800001010101010101010101010101010101F4
+:106C900001010101010101010101010101010101E4
+:106CA00001010101010101000000000000000000DD
+:106CB00000000000000000010101010101010101CB
+:106CC00001010101010101010101010101010101B4
+:106CD00001010101010101010101010101010101A4
+:106CE0000101010101010101010101010101010194
+:106CF0000101010101010101010101010101010184
+:106D00000101010101010101010101010101010173
+:106D10000101010101010101010101010101010163
+:106D20000101010101010101010101010101010153
+:106D30000101010101010101010101010101010143
+:106D40000101010101010101010101010101010133
+:106D50000101010101010101010101010101010123
+:106D60000101010101010101010101010101010113
+:106D70000101010101010101010101010101010103
+:106D800001010101010101010101010101010101F3
+:106D900001010101010101010101010101010101E3
+:106DA00001010101010101000000000000000000DC
+:106DB00000000000000000010101010101010101CA
+:106DC00001010101010101010101010101010101B3
+:106DD00001010101010101010101010101010101A3
+:106DE0000101010101010101010101010101010193
+:106DF0000101010101010101010101010101010183
+:106E00000101010101010101010101010101010172
+:106E10000101010101010101010101010101010162
+:106E20000101010101010101010101010101010152
+:106E30000101010101010101010101010101010142
+:106E40000101010101010101010101010101010132
+:106E50000101010101010101010101010101010122
+:106E60000101010101010101010101010101010112
+:106E70000101010101010101010101010101010102
+:106E800001010101010101010101010101010101F2
+:106E900001010101010101010101010101010101E2
+:106EA00001010101010101000000000000000000DB
+:106EB00000000000000000000000000000000000D2
+:106EC00000000000000000000000000000000000C2
+:106ED00000000000000000020202020202020202A0
+:106EE0000202020202020202020202020202020282
+:106EF0000202020202020202020202020202020272
+:106F00000202020202020202020202020202020261
+:106F10000202020202020202020202020202020251
+:106F20000202020202020202020202020202020241
+:106F30000202020202020202020202020202020231
+:106F40000202020202020202020202020202020221
+:106F50000202020202020202020202020202020211
+:106F60000202020202020202020202020202020201
+:106F70000202020202020200000000000000000003
+:106F800000000000000000020202020202020202EF
+:106F900002020202020202020202020202020202D1
+:106FA00002020202020202000000000000000000D3
+:106FB00000000000000000000000000000000000D1
+:106FC00000000000000000000000000000000000C1
+:106FD00000000000000000000000000000000000B1
+:106FE00000000000000000000000000000000000A1
+:106FF0000000000000000000000000000000000091
+:107000000000000000000000000000000000000080
+:107010000000000000000000000000000000000070
+:107020000000000000000000000000000000000060
+:107030000000000000000000000000000000000050
+:10704000000000000000000202020202020202022E
+:107050000202020202020200000000000000000022
+:10706000000000000000000202020202020202020E
+:107070000202020202020200000000000000000002
+:107080000000000000000000000000000000000000
+:1070900000000000000000020202020202020202DE
+:1070A00002020202020202000000000000000000D2
+:1070B00000000000000000000000000000000000D0
+:1070C00000000000000000000000000000000000C0
+:1070D00000000000000000000000000000000000B0
+:1070E00000000000000000000000000000000000A0
+:1070F0000000000000000000000000000000000090
+:10710000000000000000000000000000000000007F
+:10711000000000000000000000000000000000006F
+:10712000000000000000000000000000000000005F
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000003F
+:10715000000000000000000000000000000000002F
+:10716000000000000000000000000000000000001F
+:10717000000000000000000000000000000000000F
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000000EF
+:1071A00000000000000000000000000000000000DF
+:1071B000000000000000003B000000000000000094
+:1071C00000000000000000000000000000000000BF
+:1071D00000000000000000000000000000000000AF
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000008F
+:10720000000000000000000000000000000001007D
+:10721000000000000000000000000000000000006E
+:10722000000000000000000000000000000000005E
+:10723000000000000000000000000000000000004E
+:10724000000000000000000000000000000000003E
+:10725000000000000000000000000000000000002E
+:10726000000000000000000000000000000000001E
+:10727000000000000000000000000000000000000E
+:1072800000000000000000000000000000000000FE
+:1072900000000000000000000000000000000000EE
+:1072A00000000000000000000000000000000000DE
+:1072B00000000000000000000000000000000000CE
+:1072C00000000001010000010000000101000000B9
+:1072D00000000000000000000000000000000000AE
+:1072E000000000000000000000000000000000009E
+:1072F000000000000000000000000000000000008E
+:10730000000000000000000000000000000001007C
+:10731000000000000000000000000000000000006D
+:10732000000000000000000000000000000000005D
+:10733000000000000000000000000000000000004D
+:10734000000000000000000000000000000000003D
+:10735000000000000000000000000000000000002D
+:10736000000000000000000000000000000000001D
+:10737000000000000000000000000000000000000D
+:1073800000000000000000000000000000000000FD
+:1073900000000000000000000000000000000000ED
+:1073A00000000000000000000000000000000000DD
+:1073B00000000000000000000000000000000000CD
+:1073C00000000001010000010000010101010000B6
+:1073D00000000000000000000000000000000000AD
+:1073E000000000000000000000000000000000009D
+:1073F000000000000000000000000000000000008D
+:10740000000000000000000000000000000101007A
+:10741000000000000000000000000000000000006C
+:10742000000000000000000000000000000000005C
+:10743000000000000000000000000000000000004C
+:10744000000000000000000000000000000000003C
+:10745000000000000000000000000000000000002C
+:10746000000000000000000000000000000000001C
+:10747000000000000000000000000000000000000C
+:1074800000000000000000000000000000000000FC
+:1074900000000000000000000000000000000000EC
+:1074A00000000000000000000000000000000000DC
+:1074B00000000000000000000000000000000000CC
+:1074C00000000001010000010100010101010000B4
+:1074D00000000000000000000000000000000000AC
+:1074E000000000000000000000000000000000009C
+:1074F000000000000000000000000000000000008C
+:107500000000000101000000000000000001010077
+:10751000000000000000000000000000000000006B
+:10752000000000000000000000000000000000005B
+:10753000000000000000000000000000000000004B
+:10754000000000000000000000000000000000003B
+:10755000000000000000000000000000000000002B
+:10756000000000000000000000000000000000001B
+:10757000000000000000000000000000000000000B
+:1075800000000000000000000000000000000000FB
+:1075900000000000000000000000000000000000EB
+:1075A00000000000000000000000000000000000DB
+:1075B00000000000000000000000000000000000CB
+:1075C00001010001010000010100010101010000B1
+:1075D00000000000000000000000000000000000AB
+:1075E000000000000000000000000000000000009B
+:1075F000000000000000000000000000000000008B
+:107600000000000101000000000000000001010076
+:10761000000000000000000000000000000000006A
+:10762000000000000000000000000000000000005A
+:10763000000000000000000000000000000000004A
+:107640000000000000000000000000000000010039
+:10765000000000000000000000000000000000002A
+:10766000000000000000000000000000000000001A
+:10767000000000000000000000000000000000000A
+:1076800000000000000000000000000000000000FA
+:1076900000000000000000000000000000000000EA
+:1076A00000000000000000000000000000000000DA
+:1076B00000000000000000000000000000000000CA
+:1076C00001010001010000010101010101010000AF
+:1076D00000000000000000000000000000000000AA
+:1076E000000000000000000000000000000000009A
+:1076F000000000000000000000000000000000008A
+:107700000000000101010000000000000001010074
+:107710000000000000000000000000000000000069
+:107720000000000000000000000000000000000059
+:107730000000000000000000000000000000000049
+:107740000000000000000000000000000000010038
+:107750000000000000000000000000000000000029
+:107760000000000000000000000000000000000019
+:107770000000000000000000000000000000000009
+:1077800000000000000000000000000000000000F9
+:1077900000000000000000000000000000000000E9
+:1077A00000000000000000000000000000000000D9
+:1077B00000000000000000000000000000000000C9
+:1077C00001010101010000010101010101010000AD
+:1077D00001000000000000000000000000000000A8
+:1077E0000000000000000000000000000000000099
+:1077F0000000000000000000000000000000000089
+:107800000000000101010100000000000001010072
+:107810000000000000000000000000000000000068
+:107820000000000000000000000000000000000058
+:107830000000000000000000000000000000000048
+:107840000101010000000000000000000001010033
+:107850000000000000000000000000000000000028
+:107860000000000000000000000000000000000018
+:107870000000000000000000000000000000000008
+:1078800000000000000000000000000000000000F8
+:1078900000000000000000000000000000000000E8
+:1078A00000000000000000000000000000000000D8
+:1078B00000000000000000000000000000000000C8
+:1078C00001010101010100010101010101010000AB
+:1078D00001000000000000000000000000000000A7
+:1078E0000000000000000000000000000000000098
+:1078F0000000000000000000000000000000000088
+:107900000000000101010101000000000001010070
+:107910000000000000000000000000000000000067
+:107920000000000000000000000000000000000057
+:107930000000000000000000000000000000010046
+:10794000010101010100000001000000000101002F
+:107950000000000000000000000000000000000027
+:107960000101010000000000000000000000010013
+:107970000000000000000000000000000000000007
+:1079800000000000000000000000000000000000F7
+:1079900000000000000000000000000000000000E7
+:1079A00000000000000000000000000000000000D7
+:1079B00000000000000000000000000000000001C6
+:1079C00001010101010101010101010101010001A8
+:1079D00001010000000000000000000000000000A5
+:1079E0000000000000000000000000000000000097
+:1079F0000000000000000000000000000000000087
+:107A0000000000010101010100000000000101006F
+:107A10000000000000000000000000000000000066
+:107A20000000000000000000000000000000010055
+:107A30000000000000000000000000000000010144
+:107A4000010101010100000001000000000101012D
+:107A50000101010000000000000000000000000023
+:107A60000101010101000000000000000000010010
+:107A70000000000000000000000000000000000006
+:107A800000000000000000000000000000000000F6
+:107A900000000000010000000000000000000000E5
+:107AA00000000000000000000000000000000000D6
+:107AB00000000000000000000000000000000001C5
+:107AC00001010101010101010101010101010001A7
+:107AD00001010000000000000000000000000000A4
+:107AE0000000000000000000000000000000000096
+:107AF0000000000000000000000000000000010085
+:107B0000000000010101010101020000000101006B
+:107B10000000000000000000000000000000000065
+:107B20000000000000000000000000000000010054
+:107B30000100000000000000000000000001010141
+:107B4000010101010101000001000000000101012B
+:107B5000010101010100000000000000000000011F
+:107B6000010101010100000000000000000001000F
+:107B70000000000000000000000000000000000005
+:107B800001000000000000000000000000000000F4
+:107B900000000000010000000000000000010100E2
+:107BA00000000000000000000000000000000000D5
+:107BB00000000000000000000000000000000001C4
+:107BC00001010101010101010101010101010001A6
+:107BD00001010100000000000000000000010100A0
+:107BE0000000000100000000000000000000000094
+:107BF0000000000101000000000000000000010082
+:107C0000010000010101010101010000000101006A
+:107C10000000000000000000000000000000000064
+:107C20000000000000000000000000000000010053
+:107C3000010000000000000001000000000101013F
+:107C40000101010101010100010001000001010128
+:107C5000010101010100000000000000000000011E
+:107C6000010101010101000101000000000001000B
+:107C70000000000000000000000000000000000004
+:107C800001000000000000000000000000000000F3
+:107C900000000000010000010100000000010100DF
+:107CA00000000000000000000000000000000000D4
+:107CB00000000000000000000000000000000001C3
+:107CC00001010101010101010101010101010001A5
+:107CD000010101000000000000000000000101009F
+:107CE0000000000100000000000000000000000093
+:107CF0000000000101000000000000000000010081
+:107D00000100000101010101010100020001010067
+:107D10000000000000000000000000000000000063
+:107D20000000000001000000000000000000010150
+:107D3000010101000000000001000000000101013C
+:107D40000101010101010101010101010001010124
+:107D5000010101010100000000000000000000011D
+:107D60000101010101010101010000000001010008
+:107D70000000000000000000000000000000000003
+:107D800001010100000000000000000000000000F0
+:107D900001000100010001010100010000010100DA
+:107DA00000000000000000000000000000000000D3
+:107DB00000000000000000000000000000000001C2
+:107DC00001010101010101010101010101010001A4
+:107DD000010101000000000000000000000101009E
+:107DE0000000000101000000000000000000000091
+:107DF000000000010101000000000000000001017E
+:107E00000101000101010101010102010001010064
+:107E10000000000000000000000000000000000062
+:107E2000010101000100000000000000000101014B
+:107E30000101010101000000010000000001010139
+:107E40000101010101010101010101010001010123
+:107E5000010101010100000000000000000001011B
+:107E60000101010101010101010100010001010005
+:107E70000000000001000000000000000000000001
+:107E800001010101010000000000000000000000ED
+:107E900001000101010101010101010100010100D5
+:107EA00000000000000000000000000000000000D2
+:107EB00000000000000000000000000000000001C1
+:107EC00001010101010101010101010101010001A3
+:107ED000010101000100000000000000010101019A
+:107EE000010000010100000000000000000000008F
+:107EF000000000010101000000000000000001017D
+:107F00000101000101010101010101010001010064
+:107F10000000000000000000000000000000000061
+:107F2000010101000100000000000000000101014A
+:107F30000101010101000100010000000001010137
+:107F40000101010101010101010101010001010122
+:107F50000101010101010001000000000000010118
+:107F60000101010101010101010101010001010003
+:107F700001010100010000000000000000000001FC
+:107F800001010101010000000000000000010100EA
+:107F900001010101010101010101010100010100D3
+:107FA00001000000000000000000000000000000D0
+:107FB00000000000000000000000000000000001C0
+:107FC00001010101010101010101010101010001A2
+:107FD0000101010001000000000001000101010198
+:107FE000010000010100000000000000000000008E
+:107FF000000000010101000000000000000001017C
+:108000000101010101010101010101010001010062
+:10801000000000000000000000000000000000015F
+:108020000101010001000100000000000001010148
+:108030000101010101010101010100000001010133
+:108040000101010101010101010101010001010121
+:108050000101010101010101000000000000010116
+:108060000101010101010101010101010001010002
+:1080700001010101010000000000000000000001FA
+:1080800001010101010100010100000000010100E6
+:1080900001010101010101010101010100010100D2
+:1080A00001000000010000000000000000000000CE
+:1080B00000000000000000000000000000000001BF
+:1080C00001010101010101010101010101010001A1
+:1080D0000101010101000000000101010101010194
+:1080E000010000010100000000000000000000008D
+:1080F000000000010101000000000000000001017B
+:108100000101010101010101010101010001010061
+:10811000000000000000000000000000000000015E
+:108120000101010101010101010000000001010143
+:108130000101010101010101010101000001010131
+:10814000010101010101010101010101010101011F
+:108150000101010101010101010000000000010114
+:108160000101010101010101010101010001010001
+:1081700001010101010000000000000000010101F7
+:1081800001010101010101010100000000010100E4
+:1081900001010101010101010101010100010100D1
+:1081A00001010000010000000000000000000000CC
+:1081B00000000000000000000000000000000002BD
+:1081C000010101020101010101010101020100029D
+:1081D0000101010101000000000101010101010193
+:1081E000010000010100000000000000000000008C
+:1081F000000000010101000000000000000001017A
+:108200000101010101010101010101010001010060
+:10821000000000000000000000000000000000015D
+:108220000101010101010101010000000001010142
+:10823000010101010101010101010101000101012F
+:10824000010101010101010101010101010101011E
+:108250000101010101010101010000000001010112
+:108260000101010101010101010101010001010000
+:1082700001010101010100010100000100010101F2
+:1082800001010101010101010101000100010100E1
+:1082900001010101010101010101010100010100D0
+:1082A00001010001010000000000000000000000CA
+:1082B00001000000000000000000000000000002BB
+:1082C0000202010202010102010102020201000296
+:1082D0000101010101000000000101010101010192
+:1082E0000101000101000000000000000000010089
+:1082F0000000000101010100000000000000010178
+:10830000010101010101010101010101020101005D
+:10831000000000000000000000000000000000015C
+:108320000101010101010101010000010001010140
+:10833000010101010101010101010101000101012E
+:10834000010101010101010101010101010101011D
+:10835000010101010101010101010001000101010F
+:1083600001010101010101010101010100010101FE
+:1083700001010101010101010100000100010101F0
+:1083800001010101010101010101010100010101DE
+:1083900001010101010101010101010100010101CE
+:1083A00001010101010000000000000000000000C8
+:1083B00001000000000000000000000000000002BA
+:1083C0000202010202010102020102020201000294
+:1083D0000201010101000000000101010101010190
+:1083E0000101000101010000000000000000010087
+:1083F0000000000101010101000000000000010176
+:10840000010101010101010101010101020101005C
+:108410000101010000000000000000000000010157
+:10842000010101010101010101000101000101013E
+:10843000010101010101010101010101000101012D
+:10844000010101010101010101010101010101011C
+:10845000010101010101010101010101000101010D
+:1084600001010101010101010101010101010101FC
+:1084700001010101010101010101000100010101EE
+:1084800001010101010101010101010100010101DD
+:1084900001010101010101010101010101010101CC
+:1084A00001010101010100010000000000000000C5
+:1084B00001000000000000000000000000000002B9
+:1084C0000202020202010102020202020202000290
+:1084D000020201010100000001010101010101018D
+:1084E0000101010101010000000000000000010184
+:1084F0000100000101010101000000000000010174
+:10850000010101010101010101010101010101005C
+:108510000101010000000000000000000000010156
+:10852000010101010101010101010101000101013C
+:10853000010101010101010101010101000101012C
+:10854000010101010101010101010101010101021A
+:10855000010101010101010101010101000101010C
+:1085600001010101010101010101010101010101FB
+:1085700001010101010101010101010100010101EC
+:1085800001010101010101010101010100010101DC
+:1085900001010101010101010101010101010101CB
+:1085A00001010101010101010000000000010000C2
+:1085B00001010000000000000000000000000002B7
+:1085C000020202020202010202020202020200028E
+:1085D000020201010100010001010101010101028A
+:1085E0000101010101010000000000000000010183
+:1085F000010000010101010100020002020001016D
+:10860000010101020101010101010101010101005A
+:108610000101010000000000000000000001010154
+:10862000010101010101010101010101000101013B
+:10863000010101010101010101010101000101022A
+:108640000101010101010101010101010101010219
+:10865000010101010101010101010101000101010B
+:1086600001010101010101010101010101010101FA
+:1086700001010101010101010101010100010101EB
+:1086800001010101010101010101010100010101DB
+:1086900001010101010101010101010101010101CA
+:1086A00001010101010101010100000000010000C0
+:1086B00001010000000100000000000000010002B4
+:1086C000020202020202020202020202020200028C
+:1086D0000202020101010101010101010101010286
+:1086E0000101010101010000000000000002010180
+:1086F0000100000101010101000202020201010268
+:108700000101010202010101010101010101010058
+:108710000101010000000000000000000001010153
+:108720000101010101010101010101010001010239
+:108730000101010101010101010101010001010229
+:108740000101010101010101010101010101010218
+:108750000101010101010101010101010001010209
+:1087600001010101010101010101010101010101F9
+:1087700001010101010101010101010100010101EA
+:1087800001010101010101010101010100010101DA
+:1087900001010101010101010101010101010101C9
+:1087A00001010101010101010100010000010100BD
+:1087B00001010001010100000000000000010002B1
+:1087C000020202020202020202020202020200028B
+:1087D0000202020101010101010101010101010285
+:1087E0000101010201010000000200020201010179
+:1087F0000100000101010101010102010201010268
+:108800000101010202020101010101010101010056
+:108810000101010000000000000000000001010152
+:108820000101010101010101010101010001010238
+:108830000101010101010101010101010101010227
+:108840000202010101010101010101010101010215
+:108850000202010101010101010101010001010206
+:1088600001010101010101010101010101010101F8
+:1088700001010101010101010101010100010101E9
+:1088800001010101010101010101010101010101D8
+:1088900001010101010101010101010101010101C8
+:1088A00001010101010101010101010000010100BB
+:1088B00000010101010100000000000000010002B0
+:1088C000020202020202020202020202020200028A
+:1088D0000202020101010101010101010101010284
+:1088E0000201010201010100000202020201010174
+:1088F0000101000201010101010101010101010267
+:108900000201010202020201010101010101020052
+:10891000010101010100000000000000000101024E
+:108920000101010101010101010101010101010236
+:108930000201010101010101010101010101010225
+:108940000202020101010101010101010101010213
+:108950000202020101010101010101010101010203
+:1089600002020101010101010101010101010101F5
+:1089700001010101010101010101010100010102E7
+:1089800001010101010101010101010101010101D7
+:1089900001010101010101010101010101010101C7
+:1089A00001010101010101010101010000010100BA
+:1089B00000010101010100010000000001010002AD
+:1089C0000202020202020202020202020202000289
+:1089D0000202020202010101010101010101010281
+:1089E0000201010202010101020102010201010270
+:1089F0000101000202010101010101010101010265
+:108A0000020201020202020201010101010202004E
+:108A1000010101010100000000000000000101024D
+:108A20000101010101010101010101010101010235
+:108A30000202010101010101010101010101010223
+:108A40000202020201010101010101010101010211
+:108A50000202020201010101010101010101010201
+:108A600002020201010101010101010101010101F3
+:108A700001010101010101010101010101010102E5
+:108A800002010101010101010101010101010101D5
+:108A900001010101010101010101010101010101C6
+:108AA00001010101010101010101010100010100B8
+:108AB00000000101010101010000000001010002AC
+:108AC0000202020202020202020202020202000288
+:108AD000020202020201010101020201020101027D
+:108AE0000202010202010101010101010201010270
+:108AF0000101010202020101010101010101010262
+:108B0000020201020202020202010101010202004C
+:108B1000010101010100000000000000000101024C
+:108B20000202010101010101010101010101010232
+:108B30000202020101010101010101010101010221
+:108B4000020202020201010101010101010101020F
+:108B500002020202020101010101010101010102FF
+:108B600002020202010101010101010101010101F1
+:108B700001010101010101010101010101010102E4
+:108B800002020101010101010101010101010101D3
+:108B900001010101010101010101010101010102C4
+:108BA00001010101010101010101010100010100B7
+:108BB00000000101010101010100000101010002A9
+:108BC0000202020202020202020202020202000287
+:108BD0000202020202010101010202020202020279
+:108BE0000202010202010101010101010101010270
+:108BF0000101010202020101010101010101010261
+:108C00000202020202020202020201010102020148
+:108C1000010101010100000000000000000101024B
+:108C20000202020101010101010101010101010230
+:108C3000020202020101010101010101010101021F
+:108C4000020202020202010102010101010101020C
+:108C500002020202020101010101010101010102FE
+:108C600002020202020101010101010101010102EE
+:108C700001010101010101010101010101010102E3
+:108C800002020201010101010101010101010101D1
+:108C900001010101010101010101010101010102C3
+:108CA00002010101010101010101010100010100B5
+:108CB00000000101010001010100010101010002A8
+:108CC0000202020202020202020202020202000286
+:108CD0000202020202010101010202020202020278
+:108CE000020202020202010101010101010101026D
+:108CF000020101020202010101010101010102025E
+:108D00000202020202020202020201010102020147
+:108D10000202010101010000000000000001010247
+:108D2000020202010201010101010101010101022E
+:108D3000020202020201010102010101010101021C
+:108D40000202020202020201020101010101020209
+:108D500002020202020201010101010101010102FC
+:108D600002020202020201010101010101010102EC
+:108D700002020101010101010101010101010102E0
+:108D800002020202010101010101010101010102CE
+:108D900002010101010101010101010101010102C1
+:108DA00002020101010101010101010100010100B3
+:108DB00000000000010001010101010101010002A8
+:108DC0000202020202020202020202020202000285
+:108DD0000202020202020201020202020202020274
+:108DE000020202020202010101010101010101026C
+:108DF000020101020202020101010101010102025C
+:108E00000202020202020202020202020102020144
+:108E10000202020101010100000000000001010244
+:108E2000020202020201010101010101010101022C
+:108E30000202020202020201020101010101020218
+:108E40000202020202020202020202010102020204
+:108E500002020202020202020101010101010102F9
+:108E600002020202020202020201010101010102E8
+:108E700002020201010101010101010101010102DE
+:108E800002020202020101010101010101010102CC
+:108E900002020201020101010101010101010102BD
+:108EA00002020101010101010101010100010100B2
+:108EB00000000000000001010101010101010002A8
+:108EC0000202020202020202020202020202000284
+:108ED0000202020202020202020202020202020272
+:108EE000020202020202010101010101010101026B
+:108EF0000202010202020202010101010101020259
+:108F00000202020202020202020202020102020242
+:108F10000202020101010101000000000001010242
+:108F20000202020202020201010101010101020228
+:108F30000202020202020202020201010102020214
+:108F40000202020202020202020202020102020202
+:108F500002020202020202020201010101010102F7
+:108F600002020202020202020202010101010202E5
+:108F700002020202020101010101010101010102DB
+:108F800002020202020201010101010101010102CA
+:108F900002020202020101010101010101010102BB
+:108FA00002020202020101010101010100010100AE
+:108FB00000000000000001010101010101010002A7
+:108FC0000202020202020202020202020202000283
+:108FD0000202020202020202020202020202020271
+:108FE0000202020202020201010101010101020268
+:108FF0000202010202020202010101010101020258
+:109000000202020202020202020202020102020241
+:109010000202020101010101000000000001010241
+:109020000202020202020202020101010101020225
+:109030000202020202020202020202010102020212
+:109040000202020202020202020202020102020201
+:1090500002020202020202020202010101010202F4
+:1090600002020202020202020202020201010202E2
+:1090700002020202020101010101010101010102DA
+:1090800002020202020202020201010101010102C6
+:1090900002020202020202020201010101010102B6
+:1090A00002020202020101010101010101010100AC
+:1090B00000000000000000000101010100010002A9
+:1090C0000202020202020202020202020202000282
+:1090D0000202020202020202020202020202020270
+:1090E0000202020202020202010101010101020266
+:1090F0000202020202020202020101010101020255
+:109100000202020202020202020202020102020240
+:10911000020202020101010101000000000101023E
+:109120000202020202020202020101010102020223
+:109130000202020202020202020202020102020210
+:1091400002020202020202020202020202020202FF
+:1091500002020202020202020202020201010202F1
+:1091600002020202020202020202020201020202E0
+:1091700002020202020201010101010101010102D8
+:1091800002020202020202020202010101010102C4
+:1091900002020202020202020202020101010102B3
+:1091A00002020202020201010101010101010100AA
+:1091B00000000000000000000001010100000002AA
+:1091C0000202020202020202020202020202000281
+:1091D000020202020202020202020202020202026F
+:1091E0000202020202020202020201010101020263
+:1091F0000202020202020202020201010101020253
+:10920000020202020202020202020202020202023E
+:10921000020202020201010101000000000101023C
+:10922000020202020202020202020202010202021F
+:10923000020202020202020202020202010202020F
+:1092400002020202020202020202020202020202FE
+:1092500002020202020202020202020201020202EF
+:1092600002020202020202020202020201020202DF
+:1092700002020202020202020201010101010102D4
+:1092800002020202020202020202020201020202BF
+:1092900002020202020202020202020201020202AF
+:1092A00002020202020202020101010101010100A7
+:1092B00000000000000000000000000000000002AC
+:1092C0000202020202020202020202020202000280
+:1092D000020202020202020202020202020202026E
+:1092E000020202020202020202020202010202025F
+:1092F000020202020202020202020202010202024F
+:10930000020202020202020202020202020202023D
+:109310000202020202010101010000020201020236
+:10932000020202020202020202020202010202021E
+:10933000020202020202020202020202010202020E
+:1093400002020202020202020202020202020202FD
+:1093500002020202020202020202020201020202EE
+:1093600002020202020202020202020202020202DD
+:1093700002020202020202020202010201010102D1
+:1093800002020202020202020202020201020202BE
+:1093900002020202020202020202020201020202AE
+:1093A00002020202020202020201010101010100A5
+:1093B00000000000000000000000000000000002AB
+:1093C000020202020202020202020202020200027F
+:1093D000020202020202020202020202020202026D
+:1093E000020202020202020202020202010202025E
+:1093F000020202020202020202020202020202024D
+:10940000020202020202020202020202020202023C
+:109410000202020202020101010002010202020232
+:10942000020202020202020202020202010202021D
+:10943000020202020202020202020202020202020C
+:1094400002020202020202020202020202020202FC
+:1094500002020202020202020202020202020202EC
+:1094600002020202020202020202020202020202DC
+:1094700002020202020202020202020201020202CD
+:1094800002020202020202020202020201020202BD
+:1094900002020202020202020202020201020202AD
+:1094A00002020202020202020202020101010100A2
+:1094B00000000000000000000000000000000002AA
+:1094C000020202020202020202020202020200027E
+:1094D000020202020202020202020202020202026C
+:1094E000020202020202020202020202020202025C
+:1094F000020202020202020202020202020202024C
+:10950000020202020202020202020202020202023B
+:109510000202020202020201010201010102020230
+:10952000020202020202020202020202020202021B
+:10953000020202020202020202020202020202020B
+:1095400002020202020202020202020202020202FB
+:1095500002020202020202020202020202020202EB
+:1095600002020202020202020202020202020202DB
+:1095700002020202020202020202020201020202CC
+:1095800002020202020202020202020202020202BB
+:1095900002020202020202020202020202020202AB
+:1095A000020202020202020202020201010201029E
+:1095B00002000000000000000000000000000102A6
+:1095C000020202020202020202020202010200027E
+:1095D000020202020202020202020202020202026B
+:1095E000020202020202020202020202020202025B
+:1095F000020202020202020202020202020202024B
+:10960000020202020202020202020202020202023A
+:10961000020202020202020201010101010202022F
+:10962000020202020202020202020202020202021A
+:10963000020202020202020202020202020202020A
+:1096400002020202020202020202020202020202FA
+:1096500002020202020202020202020202020202EA
+:1096600002020202020202020202020202020202DA
+:1096700002020202020202020202020201020202CB
+:1096800002020202020202020202020202020202BA
+:1096900002020202020202020202020202020202AA
+:1096A000020202020202020202020202010202029B
+:1096B00002020000000000000000000000000102A3
+:1096C0000202020202020202020201010101000280
+:1096D000020202020202020202020202020202026A
+:1096E000020202020202020202020202020202025A
+:1096F000020202020202020202020202020202024A
+:109700000202020202020202020202020202020239
+:10971000020202020202020202010101010202022D
+:109720000202020202020202020202020202020219
+:109730000202020202020202020202020202020209
+:1097400002020202020202020202020202020202F9
+:1097500002020202020202020202020202020202E9
+:1097600002020202020202020202020202020202D9
+:1097700002020202020202020202020202020202C9
+:1097800002020202020202020202020202020202B9
+:1097900002020202020202020202020202020202A9
+:1097A000020202020202020202020202010202029A
+:1097B00002020000000000000000000000000102A2
+:1097C0000202020202020201010101010101010281
+:1097D0000202020202020202020202020202020269
+:1097E0000202020202020202020202020202020259
+:1097F0000202020202020202020202020202020249
+:109800000202020202020202020202020202020238
+:10981000020202020202020202010101010202022C
+:109820000202020202020202020202020202020218
+:109830000202020202020202020202020202020208
+:1098400002020202020202020202020202020202F8
+:1098500002020202020202020202020202020202E8
+:1098600002020202020202020202020202020202D8
+:1098700002020202020202020202020202020202C8
+:1098800002020202020202020202020202020202B8
+:1098900002020202020202020202020202020202A8
+:1098A0000202020202020202020202020102020299
+:1098B000020202020000000000000000000001029D
+:1098C0000202020101010101010101010101010284
+:1098D0000202020202020202020202020202020268
+:1098E0000202020202020202020202020202020258
+:1098F0000202020202020202020202020202020248
+:109900000202020202020202020202020202020237
+:10991000020202020202020202010101010202022B
+:109920000202020202020202020202020202020217
+:109930000202020202020202020202020202020207
+:1099400002020202020202020202020202020202F7
+:1099500002020202020202020202020202020202E7
+:1099600002020202020202020202020202020202D7
+:1099700002020202020202020202020202020202C7
+:1099800002020202020202020202020202020202B7
+:1099900002020202020202020202020202020202A7
+:1099A0000202020202020202020202020202020297
+:1099B000020202020200000000000000000001019B
+:1099C0000101010101010101010101010101010286
+:1099D0000202020202020202020202020202020267
+:1099E0000202020202020202020202020202020257
+:1099F0000202020202020202020202020202020247
+:109A00000202020202020202020202020202020236
+:109A10000202020202020202020202020102020227
+:109A20000202020202020202020202020202020216
+:109A30000202020202020202020202020202020206
+:109A400002020202020202020202020202020202F6
+:109A500002020202020202020202020202020202E6
+:109A600002020202020202020202020202020202D6
+:109A700002020202020202020202020202020202C6
+:109A800002020202020202020202020202020202B6
+:109A900002020202020202020202020202020202A6
+:109AA0000202020202020202020202020202020296
+:109AB0000202020202020000000000000000010198
+:109AC0000101010101010101010101010101010285
+:109AD0000202020202020202020202020202020266
+:109AE0000202020202020202020202020202020256
+:109AF0000202020202020202020202020202020246
+:109B00000202020202020202020202020202020235
+:109B10000202020202020202020202020202020225
+:109B20000202020202020202020202020202020215
+:109B30000202020202020202020202020202020205
+:109B400002020202020202020202020202020202F5
+:109B500002020202020202020202020202020202E5
+:109B600002020202020202020202020202020202D5
+:109B700002020202020202020202020202020202C5
+:109B800002020202020202020202020202020202B5
+:109B900002020202020202020202020202020202A5
+:109BA0000202020202020202020202020202020295
+:109BB0000202020202020202000000000000010193
+:109BC0000101010101010101010101010101010284
+:109BD0000202020202020202020101010102020269
+:109BE0000202020202020202020202020202020255
+:109BF0000202020202020202020202020202020245
+:109C00000202020202020202020202020202020234
+:109C10000202020202020202020202020202020224
+:109C20000202020202020202020202020202020214
+:109C30000202020202020202020202020202020204
+:109C400002020202020202020202020202020202F4
+:109C500002020202020202020202020202020202E4
+:109C600002020202020202020202020202020202D4
+:109C700002020202020202020202020202020202C4
+:109C800002020202020202020202020202020202B4
+:109C900002020202020202020202020202020202A4
+:109CA0000202020202020202020202020202020294
+:109CB000020202020202020202000000000201018E
+:109CC0000101010101010101010101010101010184
+:109CD0000101010101010101010101010101010273
+:109CE0000202020101010101010101010101010260
+:109CF0000202020202020202020202020202020244
+:109D00000202020202020202020202020202020233
+:109D10000202020202020202020202020202020223
+:109D20000202020202020202020202020202020213
+:109D30000202020202020202020202020202020203
+:109D400002020202020202020202020202020202F3
+:109D500002020202020202020202020202020202E3
+:109D600002020202020202020202020202020202D3
+:109D700002020202020202020202020202020202C3
+:109D800002020202020202020202020202020202B3
+:109D900002020202020202020202020202020202A3
+:109DA0000202020202020202020202020202020293
+:109DB0000202020202020202020202020202010185
+:109DC0000101010101010101010101010101010183
+:109DD0000101010101010101010101010101010173
+:109DE0000101010101010101010101010101010262
+:109DF0000202020202020202020202020202020243
+:109E00000202020202020202020202020202020232
+:109E10000202020202020202020202020202020222
+:109E20000202020202020202020202020202020212
+:109E30000202020202020202020202020202020202
+:109E400002020202020202020202020202020202F2
+:109E500002020202020202020202020202020202E2
+:109E600002020202020202020202020202020202D2
+:109E700002020202020202020202020202020202C2
+:109E800002020202020202020202020202020202B2
+:109E900002020202020202020202020202020202A2
+:109EA0000202020202020202020202020202020292
+:109EB0000202020202020202020202020202020183
+:109EC0000101010101010101010101010101010182
+:109ED0000101010101010101010101010101010172
+:109EE0000101010101010101010101010101010261
+:109EF000020202010101010101010101010101024E
+:109F0000020202010101010101010101010101023D
+:109F10000202020202020202020202020202020221
+:109F20000202020202020202020202020202020211
+:109F30000202020202020202020202020202020201
+:109F400002020202020202020202020202020202F1
+:109F500002020202020202020202020202020202E1
+:109F600002020202020202020202020202020202D1
+:109F700002020202020202020202020202020202C1
+:109F800002020202020202020202020202020202B1
+:109F900002020202020202020202020202020202A1
+:109FA0000202020202020202020202020202020291
+:109FB0000202020202020202020202020202020182
+:109FC0000101010101010101010101010101010181
+:109FD0000101010101010101010101010101010171
+:109FE0000101010101010101010101010101010161
+:109FF0000101010101010101010101010101010250
+:10A000000202020202020202020202020202020230
+:10A010000202020202020202020202020202020220
+:10A020000202020202020202020202020202020210
+:10A030000202020202020202020202020202020200
+:10A0400002020202020202020202020202020202F0
+:10A0500002020202020202020202020202020202E0
+:10A0600002020202020202020202020202020202D0
+:10A0700002020202020202020202020202020202C0
+:10A0800002020202020202020202020202020202B0
+:10A0900002020202020202020202020202020202A0
+:10A0A0000202020202020202020202020202020290
+:10A0B0000202020202020202020202020202020181
+:10A0C0000101010101010101010101010101010180
+:10A0D0000101010101010101010101010101010170
+:10A0E0000101010101010101010101010101010160
+:10A0F0000101010101010101010101010101010150
+:10A10000010101010101010101010101010101023E
+:10A11000010101010101010101010101010101022E
+:10A12000020202020202020202020202020202020F
+:10A1300002020202020202020202020202020202FF
+:10A1400002020202020202020202020202020201F0
+:10A1500001010101010101010101010101010102EE
+:10A1600002020202020202020202020202020202CF
+:10A1700002020202020202020202020202020202BF
+:10A1800002020202020202020202020202020202AF
+:10A19000020202020202020202020202020202029F
+:10A1A000020202020202020202020202020202028F
+:10A1B0000202020202020202020202020202020180
+:10A1C000010101010101010101010101010101017F
+:10A1D000010101010101010101010101010101016F
+:10A1E000010101010101010101010101010101015F
+:10A1F000010101010101010101010101010101014F
+:10A20000010101010101010101010101010101023D
+:10A21000020202020202020202020202020202021E
+:10A22000020202020202020202020202020202010F
+:10A23000010101010101010101010101010101020D
+:10A2400002020202020202020202020202020202EE
+:10A2500002020202020202020202020202020202DE
+:10A2600002020202020202020202020202020202CE
+:10A2700002020202020202020202020202020202BE
+:10A2800002020202020202020202020202020202AE
+:10A29000020202020202020202020202020202029E
+:10A2A000020202020202020202020202020202028E
+:10A2B000020202020202020202020202020202017F
+:10A2C000010101010101010101010101010101017E
+:10A2D000010101010101010101010101010101016E
+:10A2E000010101010101010101010101010101015E
+:10A2F000010101010101010101010101010101014E
+:10A30000010101010101010101010101010101013D
+:10A31000010101010101010101010101010101012D
+:10A32000010101010101010101010101010101021C
+:10A3300002020202020202020202020202020202FD
+:10A3400002020202020202020202020202020200EF
+:10A3500000000000000000000000000000000002FB
+:10A3600002020202020202020202020202020202CD
+:10A3700002020202020202020202020202020202BD
+:10A3800002020202020202020202020202020202AD
+:10A39000020202020202020202020202020202029D
+:10A3A000020202020202020202020202020202028D
+:10A3B000020202020202020202020202020202017E
+:10A3C000010101010101010101010101010101017D
+:10A3D000010101010101010101010101010101016D
+:10A3E000010101010101010101010101010101015D
+:10A3F000010101010101010101010101010101014D
+:10A40000010101010101010101010101010101013C
+:10A41000010101010101010101010101010101012C
+:10A42000010101010101010101010101010101011C
+:10A43000010101010101010101010101010101010C
+:10A4400001010101010101010101010101010101FC
+:10A4500001010101010101010101010101010101EC
+:10A4600001010101010101010101010101010102DB
+:10A4700002020202020202020202020202020201BD
+:10A4800001010101010101010101010101010102BB
+:10A49000020202020202020202020202020202029C
+:10A4A000020202020202020202020202020202028C
+:10A4B000020202020202020202020202020202017D
+:10A4C000010101010101010101010101010101017C
+:10A4D000010101010101010101010101010101016C
+:10A4E000010101010101010101010101010101015C
+:10A4F000010101010101010101010101010101014C
+:10A50000010101010101010101010101010101013B
+:10A51000010101010101010101010101010101012B
+:10A52000010101010101010101010101010101011B
+:10A53000010101010101010101010101010101010B
+:10A5400001010101010101010101010101010101FB
+:10A5500001010101010101010101010101010101EB
+:10A5600001010101010101010101010101010102DA
+:10A5700002020202020202020202020202020202BB
+:10A5800002020202020202020202020202020202AB
+:10A59000020202020202020202020202020202029B
+:10A5A000020202020202020202020202020202028B
+:10A5B000020202020202020202020202020202017C
+:10A5C000010101010101010101010101010101017B
+:10A5D000010101010101010101010101010101016B
+:10A5E000010101010101010101010101010101015B
+:10A5F000010101010101010101010101010101014B
+:10A60000010101010101010101010101010101013A
+:10A61000010101010101010101010101010101012A
+:10A62000010101010101010101010101010101011A
+:10A63000010101010101010101010101010101010A
+:10A6400001010101010101010101010101010101FA
+:10A6500001010101010101010101010101010101EA
+:10A6600001010101010101010101010101010101DA
+:10A6700001010101010101010101010101010100CB
+:10A6800000000000000000000000000000000002C8
+:10A69000020202020202020202020202020202009C
+:10A6A00000000000000000000000000000000002A8
+:10A6B000020202020202020202020202020202017B
+:10A6C000010101010101010101010101010101017A
+:10A6D000010101010101010101010101010101016A
+:10A6E000010101010101010101010101010101015A
+:10A6F000010101010101010101010101010101014A
+:10A700000101010101010101010101010101010139
+:10A710000101010101010101010101010101010129
+:10A720000101010101010101010101010101010119
+:10A730000101010101010101010101010101010109
+:10A7400001010101010101010101010101010101F9
+:10A7500001010101010101010101010101010101E9
+:10A7600001010101010101010101010101010101D9
+:10A7700001010101010101010101010101010101C9
+:10A7800001010101010101010101010101010102B8
+:10A79000020202020202020202020202020202009B
+:10A7A00000000000000000000000000000000000A9
+:10A7B0000000000000000000000000000000000198
+:10A7C0000101010101010101010101010101010179
+:10A7D0000101010101010101010101010101010169
+:10A7E0000101010101010101010101010101010159
+:10A7F0000101010101010101010101010101010149
+:10A800000101010101010101010101010101010138
+:10A810000101010101010101010101010101010128
+:10A820000101010101010101010101010101010118
+:10A830000101010101010101010101010101010108
+:10A8400001010101010101010101010101010101F8
+:10A8500001010101010101010101010101010101E8
+:10A8600001010101010101010101010101010101D8
+:10A8700001010101010101010101010101010101C8
+:10A8800001010101010101010101010101010101B8
+:10A8900001010101010101010101010101010101A8
+:10A8A0000101010101010101010101010101010099
+:10A8B0000000000000000000000000000000000197
+:10A8C0000101010101010101010101010101010178
+:10A8D0000101010101010101010101010101010168
+:10A8E0000101010101010101010101010101010158
+:10A8F0000101010101010101010101010101010148
+:10A900000101010101010101010101010101010137
+:10A910000101010101010101010101010101010127
+:10A920000101010101010101010101010101010117
+:10A930000101010101010101010101010101010107
+:10A9400001010101010101010101010101010101F7
+:10A9500001010101010101010101010101010101E7
+:10A9600001010101010101010101010101010101D7
+:10A9700001010101010101010101010101010101C7
+:10A9800001010101010101010101010101010101B7
+:10A9900001010101010101010101010101010101A7
+:10A9A0000101010101010101010101010101010098
+:10A9B0000000000000000000000000000000000097
+:10A9C0000000000000000000000000000000000087
+:10A9D0000000000000000000000000000000000275
+:10A9E0000202020202020202020202020202020247
+:10A9F0000202020202020202020202020202020237
+:10AA00000202020202020202020202020202020226
+:10AA10000202020202020202020202020202020216
+:10AA20000202020202020202020202020202020206
+:10AA300002020202020202020202020202020202F6
+:10AA400002020202020202020202020202020202E6
+:10AA500002020202020202020202020202020202D6
+:10AA600002020202020202020202020202020202C6
+:10AA700002020202020202020202020202020202B6
+:10AA800002020202020202020202020202020200A8
+:10AA900000000000000000000000000000000002B4
+:10AAA0000202020202020202020202020202020088
+:10AAB0000000000000000000000000000000000096
+:10AAC0000000000000000000000000000000000086
+:10AAD0000000000000000000000000000000000076
+:10AAE0000000000000000000000000000000000066
+:10AAF0000000000000000000000000000000000056
+:10AB00000000000000000000000000000000000045
+:10AB10000000000000000000000000000000000035
+:10AB20000000000000000000000000000000000025
+:10AB30000000000000000000000000000000000015
+:10AB40000000000000000000000000000000000203
+:10AB500002020202020202020202020202020202D5
+:10AB600002020202020202020202020202020200C7
+:10AB700000000000000000000000000000000000D5
+:10AB800000000000000000000000000000000000C5
+:10AB900000000000000000000000000000000000B5
+:10ABA00000000000000000000000000000000000A5
+:10ABB0000000000000000000000000000000000095
+:10ABC0000000000000000000000000000000000085
+:10ABD0000000000000000000000000000000000075
+:10ABE0000000000000000000000000000000000065
+:10ABF0000000000000000000000000000000000055
+:10AC00000000000000000000000000000000000044
+:10AC10000000000000000000000000000000000034
+:10AC20000000000000000000000000000000000024
+:10AC30000000000000000000000000000000000014
+:10AC40000000000000000000000000000000000004
+:10AC500000000000000000000000000000000000F4
+:10AC600000000000000000000000000000000000E4
+:10AC700000000000000000000000000000000000D4
+:10AC800000000000000000000000000000000000C4
+:10AC900000000000000000000000000000000000B4
+:10ACA00000000000000000000000000000000000A4
+:10ACB0000000000000000000000000000000003361
+:10ACC0000000000000000000000000000000000084
+:10ACD0000000000000000000000000000000000074
+:10ACE0000000000000000000000000000000000064
+:10ACF0000000000000000000000000000000000054
+:10AD00000000000000000100000000000000000042
+:10AD10000000000000000000000000000000000033
+:10AD20000000000000000000000000000000000023
+:10AD30000000000000000000000000000000000013
+:10AD40000000000000000000000000000000000003
+:10AD500000000000000000000000000000000000F3
+:10AD600000000000000000000000000000000000E3
+:10AD700000000000000000000000000000000000D3
+:10AD800000000000000000000000000000000000C3
+:10AD900000000000000000000000000000000000B3
+:10ADA00000000000000000000000000000000000A3
+:10ADB0000000000000000000000000000000000093
+:10ADC0000000000000000000000000000000000083
+:10ADD0000000000000000000000000000000000073
+:10ADE0000000000000000000000000000000000063
+:10ADF0000000000000000000000000000000000053
+:10AE00000000000000000100000000000000000041
+:10AE10000000000000000000000000000000000032
+:10AE20000000000000000000000000000000000022
+:10AE30000000000000000000000000000000000012
+:10AE40000000000000000000000000000000000002
+:10AE500000000000000000000000000000000000F2
+:10AE600000000000000000000000000000000000E2
+:10AE700000000000000000000000000000000000D2
+:10AE800000000000000000000000000000000000C2
+:10AE900000000000000000000000000000000000B2
+:10AEA00000000000000000000000000000000000A2
+:10AEB0000000000000000000000000000000000092
+:10AEC0000000000000000000000000000000000082
+:10AED0000000000000000000000000000000000072
+:10AEE0000000000000000000000000000000000062
+:10AEF0000000000000000000000000000000000052
+:10AF0000000000000001010000000000000000003F
+:10AF10000000000000000000000000000000000031
+:10AF20000000000000000000000000000000000021
+:10AF30000000000000000000000000000000000011
+:10AF40000000000000000000000000000000000001
+:10AF500000000000000000000000000000000000F1
+:10AF600000000000000000000000000000000000E1
+:10AF700000000000000000000000000000000000D1
+:10AF800000000000000000000000000000000000C1
+:10AF900000000000000000000000000000000000B1
+:10AFA00000000000000000000000000000000000A1
+:10AFB0000000000000000000000000000000000091
+:10AFC0000000000000000000000000000000000081
+:10AFD0000000000000000000000000000000000071
+:10AFE0000000000000000000000000000000000061
+:10AFF0000000000000000100000000000000000050
+:10B00000000000000001010000000000000000003E
+:10B010000000000000000000000000000000000030
+:10B020000000000000000000000000000000000020
+:10B030000000000000000000000000000000000010
+:10B040000000000000000000000000000000000000
+:10B0500000000000000000000000000000000000F0
+:10B0600000000000000000000000000000000000E0
+:10B0700000000000000000000000000000000000D0
+:10B0800000000000000000000000000000000000C0
+:10B0900000000000000000000000000000000000B0
+:10B0A00000000000000000000000000000000000A0
+:10B0B0000000000000000000000000000000000090
+:10B0C0000000000000000000000000000000000080
+:10B0D000000000000001000000000000000000006F
+:10B0E0000000000000000000000000000000000060
+:10B0F000000000000000010001000000000000004E
+:10B10000000000000001010000000000000000003D
+:10B11000000000000000000000000000000000002F
+:10B12000000000000000000000000000000000001F
+:10B13000000000000000010000000000000000000E
+:10B1400000000000000000000000000000000000FF
+:10B1500000000000000000000000000000000000EF
+:10B1600000000000000000000000000000000000DF
+:10B1700000000000000000000000000000000000CF
+:10B1800000000000000000000000000000000000BF
+:10B1900000000000000000000000000000000000AF
+:10B1A000000000000000000000000000000000009F
+:10B1B000000000000000000000000000000000008F
+:10B1C000000000000000000000000000000001007E
+:10B1D000000101000001000001000000000000006B
+:10B1E000000000000000000000000000000000005F
+:10B1F000000000000001010001000100000000004B
+:10B20000000000000001010000000000000000003C
+:10B21000000000000000010000000000000000002D
+:10B22000000000000000000000000000000000001E
+:10B23000000000000000010000000000000000000D
+:10B2400000000000000000000000000000000000FE
+:10B2500000000000000000000000000000000000EE
+:10B2600000000000000000000000000000000000DE
+:10B2700000000000000000000000000000000000CE
+:10B2800000000000000000000000000000000000BE
+:10B2900000000000000000000000000000000000AE
+:10B2A000000000000000000000000000000000009E
+:10B2B000000000000000000000000000000000008E
+:10B2C000000000000000000000000000000101017B
+:10B2D0000101010101010000010000000000000067
+:10B2E000000000000000000000000000000000005E
+:10B2F0000000000000010100010101000000000049
+:10B30000000000000001010000000000000000003B
+:10B31000000000000000010000000000000000002C
+:10B32000000000000000000001010000000000001B
+:10B33000000000000001010000000100000000000A
+:10B3400000000000000000000000000000000000FD
+:10B3500000000000000000000000000000000000ED
+:10B3600000000000000000000000000000000000DD
+:10B3700000000000000000000000000000000000CD
+:10B3800000000000000000000000000000000000BD
+:10B3900000000000000000000000000000000000AD
+:10B3A000000000000000000001010001000000009A
+:10B3B000000000000000000000000000000000008D
+:10B3C000000000000000000000000000000101017A
+:10B3D0000101010101010000010100000000000065
+:10B3E000000000000000010001010000000000005A
+:10B3F0000000000000010101010101010000000046
+:10B40000000000000001010000000000000000003A
+:10B41000000000000001010000000000000000002A
+:10B420000000000000000000010101000000000019
+:10B430000000000000010100010101000000000007
+:10B4400000000000000101000000000000000000FA
+:10B4500000000000000000000000000000000000EC
+:10B4600000000000000000000000000000000000DC
+:10B4700000000000000101000000000000000000CA
+:10B4800000000000000000000000000000000000BC
+:10B4900000000000000000000000000000000000AC
+:10B4A0000000000000000001010101010000000097
+:10B4B000000000000000000000000000000000008C
+:10B4C0000000000000000000000000000001010179
+:10B4D0000101010101010001010101000000000062
+:10B4E0000000000000000101010101010000000056
+:10B4F0000000000000010101010101010000000045
+:10B500000000000001010100000000000000000038
+:10B510000000000000010100000000000000000029
+:10B520000000000000000000010101000000000018
+:10B530000000000000010101010101010000000004
+:10B5400000000000000101000000000000000000F9
+:10B5500000000000000101000000000000000000E9
+:10B5600000000000000101000000000000000000D9
+:10B5700000000000000101000000000000000000C9
+:10B5800000000000000000000000000000000000BB
+:10B5900000000000000000000000000000000000AB
+:10B5A0000000000000000001010101010100000095
+:10B5B000000000000000000000000000000000008B
+:10B5C0000000000000000000000001010001010176
+:10B5D0000101010101010001010101000000000061
+:10B5E0000000000000000101010101010000000055
+:10B5F0000000000000010101010101010000000044
+:10B600000000000001010100000000000000000037
+:10B610000000000000010100010100000000000026
+:10B620000000000000010101010101010000010012
+:10B630000000000000010101010101010000000003
+:10B6400000000000000101000000000000000000F8
+:10B6500000000000000101000000010000000000E7
+:10B6600000000000000101000101000000000000D6
+:10B6700000000000000101000000000000000000C8
+:10B6800000000000000000000000000000000000BA
+:10B6900000000000000000000000000000000000AA
+:10B6A0000000000000000001010101010101000093
+:10B6B000000000000000000000000000000000008A
+:10B6C0000000000000000000000001010001010175
+:10B6D000010101010101000101010101000000005F
+:10B6E0000000000000000101010101010000000054
+:10B6F0000000000000010101010101010000000142
+:10B700000000000101010100000000000000000035
+:10B710000000000000010100010101000000000024
+:10B720000000000000010101010101010000010110
+:10B730000100000100010101010101010000000000
+:10B7400000000000000101000000000000000000F7
+:10B7500000000000000101000101010000000000E4
+:10B7600000000000000101000101010000000000D4
+:10B7700000000000000101000000000000000000C7
+:10B7800000000000000000000000000000000000B9
+:10B7900000000000000100000000000000000000A8
+:10B7A0000000000000000001010101010101010091
+:10B7B0000000000000000000000000000000000089
+:10B7C0000000000000000000000001010101010173
+:10B7D000010101010101000101010101000000005E
+:10B7E0000000000001000101010101010000000052
+:10B7F000000000000001010101010101010001013F
+:10B800000001000101010100000000000000000033
+:10B810000000000000010100010101000000000023
+:10B82000000000000001010101010101010001010E
+:10B8300001000101000101010101010100000000FE
+:10B8400000000000000101000000010000000000F5
+:10B8500000000000000101000101010100000000E2
+:10B8600000000000000101000101010000000001D2
+:10B8700000000001000101000000000000000000C5
+:10B8800000000000000000000000000000000000B8
+:10B8900000000000000100000000000000000000A7
+:10B8A000000000000000000101010101010101018F
+:10B8B0000100000000000000000000000000000087
+:10B8C0000000000000000000010101010101010170
+:10B8D000010101010101000101010101000000005D
+:10B8E0000000000001000101010101010000000051
+:10B8F000000000000001010101010101010101013D
+:10B900000001000101010100000000000100000031
+:10B910000000000000010101010101000000000021
+:10B92000000000000001010101010101010101010C
+:10B9300001000101010101010101010101000100FA
+:10B9400000000000000101000101010000000000F2
+:10B9500000000000000101000101010100000000E1
+:10B9600000000000000101010101010100000101CE
+:10B9700000010101000101000000000000000000C2
+:10B9800000000000000000000101000000000000B5
+:10B9900000000000000101000101000000000000A3
+:10B9A000000000000000000101010101010101018E
+:10B9B0000100000000000000000000000000000086
+:10B9C000000000000000000101010101010101016E
+:10B9D000010101010101000101010101000000005C
+:10B9E000010000000101010101010101000000004E
+:10B9F000000000000001010101010101010101013C
+:10BA00000001000101010100000000000100000030
+:10BA10000000000000010101010101000000000020
+:10BA2000000000000001010101010101010101010B
+:10BA300001010101010101010101010101010101F6
+:10BA400000000000000101010101010100000000EF
+:10BA500000000000000101010101010101000000DE
+:10BA600000000000000101010101010100010101CC
+:10BA700001010101010101000100000000000000BE
+:10BA800000000000000100000101010000000000B2
+:10BA9000000101000001010001010100000000009F
+:10BAA000000000000000000101010101010101018D
+:10BAB0000100000000000100000000000000000084
+:10BAC000000000000000000101010101010101016D
+:10BAD000010101010101000201010101000000005A
+:10BAE000010101000101010101010101000000004B
+:10BAF000000000000001010101010101010101013B
+:10BB0000000100010101010000000000010000002F
+:10BB1000000000000001010101010101000000001E
+:10BB2000000000000001010101010101010101010A
+:10BB300001010101010101010101010101010101F5
+:10BB400000010000000101010101010100000001EC
+:10BB500000000001010101010101010101010001D9
+:10BB600000000001010101010101010101010101C8
+:10BB700001010101010101000100010000000000BC
+:10BB800000000000000100000101010000000001B0
+:10BB9000010101010001010001010100000000009C
+:10BBA000000000000001000101010101010101018B
+:10BBB0000101010000000100000000000000000081
+:10BBC000000000000000000101010101010101016C
+:10BBD0000101010101010002020101010000000157
+:10BBE0000101010101010102010101010000000048
+:10BBF0000000000000010102010101010101010139
+:10BC0000000101010101010000000000010100002C
+:10BC1000000000000001010101010101000000001D
+:10BC20000000000000010101010101010101010109
+:10BC300001010101010101020101010101010101F3
+:10BC400001010001010101010101010101000101E6
+:10BC500000010101010101010101010101010101D5
+:10BC600000010101010101010101010101010101C5
+:10BC700001010101010101000101010000000000BA
+:10BC800000000000000101000101010100000101AC
+:10BC90000101010100010101010101010000000099
+:10BCA000000000000001000101010101010101018A
+:10BCB000010101010001010000000000000000007E
+:10BCC000000000000000000101010101010101016B
+:10BCD0000101010101010002020101010000000156
+:10BCE0000101010101010102010101010000010046
+:10BCF0000000000000010102020101010101010137
+:10BD0000010101010101010000000000010100002A
+:10BD1000000000000001010101010101000000001C
+:10BD20000000000000010102010101010101010107
+:10BD300001010101010101020101010101010101F2
+:10BD400001010101010101010101010101010101E3
+:10BD500001010101010101010101010101010101D3
+:10BD600001010101010101010101010101010101C3
+:10BD700001010101010101010101010100000000B7
+:10BD800000010000000101000101010100010101A9
+:10BD90000101010101010101010101010000000097
+:10BDA0000000000000010002010101010101010188
+:10BDB000010101010001010000000000000000007D
+:10BDC0000000000000000001010101010102020168
+:10BDD0000101010101010002020201010000000154
+:10BDE0000101010101010102020101010000010143
+:10BDF0000000000000010102020101010101010136
+:10BE00000101010101010100000000000101000029
+:10BE1000000000000001010101010101000000001B
+:10BE20000000000100010102020101010101010104
+:10BE300001010101010101020201010101010101F0
+:10BE400001010101010101010101010101010101E2
+:10BE500001010101010101010101010101010101D2
+:10BE600001010101010101010101010101010101C2
+:10BE700001010101010101010101010100000001B5
+:10BE800001010000000101010101010101010101A5
+:10BE90000101010101010101010101010000000096
+:10BEA0000000000000010002010101010101010187
+:10BEB0000101010101010100000100000001000079
+:10BEC0000000000000000002010101010102020265
+:10BED000020202010101000202020201000000014F
+:10BEE0000101010101010102020201010100010140
+:10BEF0000000000000010102020202010101010133
+:10BF00000101010101010100000000000101010027
+:10BF10000000000000010101010101010100000019
+:10BF20000000000100010102020201010101010102
+:10BF300001010101010101020202020101010101ED
+:10BF400001010101010101010101010101010101E1
+:10BF500001010101010101010101010101010101D1
+:10BF600001010101010101010101010101010101C1
+:10BF700001010101010101010101010101000101B2
+:10BF800001010100000101010101010101010101A3
+:10BF90000101010101010101010101010001000193
+:10BFA0000000000000010102020101010101010184
+:10BFB0000101010101010100010101010001000174
+:10BFC0000000000100000002010102020102020261
+:10BFD000020202020202000202020202000000014A
+:10BFE000010101010101010202020202010101013C
+:10BFF0000000000000010102020202020101010131
+:10C000000101010101010201000000000101010024
+:10C010000000000202010102010101010101000111
+:10C020000000000100010102020202010101010100
+:10C0300001010101010101020202020201010101EB
+:10C0400001010101010101010101010101010101E0
+:10C0500001010101010101010101010101010101D0
+:10C0600001010101010101010101010101010101C0
+:10C0700001010101010101010101010101010101B0
+:10C0800001010101010101010101010101010101A0
+:10C090000101010101010101010101010101010190
+:10C0A000000101000001010202020102010101017F
+:10C0B0000101010101010100010101010001010172
+:10C0C000000100010100000202010202020202025C
+:10C0D0000202020202020002020202020000010148
+:10C0E000010101010101010202020202010101013B
+:10C0F000000000000001020202020202010101012F
+:10C100000101010101020201010000000101010021
+:10C11000000200010101010202010101010101010E
+:10C1200000010101000101020202020201010101FC
+:10C1300001010101010101020202020201010101EA
+:10C1400001010101010101020101010101010101DE
+:10C1500001010101010101020101010101010101CE
+:10C1600001010101010101020101010101010101BE
+:10C1700001010101010101010101010101010101AF
+:10C18000010101010101010101010101010101019F
+:10C19000010101010101010101010101010101018F
+:10C1A000010101010001010202020202020101017A
+:10C1B0000101010101010100010101010101010170
+:10C1C0000101000101000002020202020202020259
+:10C1D0000202020202020002020202020001010146
+:10C1E0000201010102010202020202020101010137
+:10C1F000000000000002020202020202020101012C
+:10C20000010101010102020201000000020101011D
+:10C21000020100010101020202020101010101010A
+:10C2200000010101000101020202020202010201F9
+:10C2300001010101010102020202020202010101E7
+:10C2400001010101010101020101010101010101DD
+:10C2500001010101010101020201010101010101CC
+:10C2600001010101010101020201010101010101BC
+:10C2700001010101010101010101010101010101AE
+:10C28000010101010101010101010101010101019E
+:10C29000010101010101010201010101010101018D
+:10C2A0000101010100010102020202020202010178
+:10C2B0000101010101010100010001010100010171
+:10C2C0000101010101000002020202020202020257
+:10C2D0000202020202020002020202020101010243
+:10C2E0000202020102010202020202020101010134
+:10C2F0000000000000020202020202020202020228
+:10C30000010101010202020201010000020101011A
+:10C310000101020101020202020202010101010106
+:10C3200000010101000101020202020202020202F6
+:10C3300002010101010202020202020202020201E2
+:10C3400001010101010202020201010101010101D9
+:10C3500001010101010101020202020101010101C9
+:10C3600001010101010101020202010101010101BA
+:10C3700001010101010101020101010101010101AC
+:10C38000010101010101010101010101010101019D
+:10C39000010101010101010202010101010101018B
+:10C3A0000101010101010102020202020202020175
+:10C3B0000101010101010100000000000100010173
+:10C3C0000101010101000002020202020202020256
+:10C3D0000202020202020002020202020101010242
+:10C3E0000202020202010202020202020101010132
+:10C3F0000100000101020202020202020202020224
+:10C400000102010202020202010101000202010115
+:10C410000101010101020202020202010101010106
+:10C4200001010101010101020202020202020202F3
+:10C4300002010202010202020202020202020202DE
+:10C4400001010101010202020202020101010101D6
+:10C4500001010101010101020202020201010101C7
+:10C4600001010101010101020202020101010101B8
+:10C4700001010101010101020201010101010101AA
+:10C48000010101010101010202010101010101019A
+:10C490000101010101010102020201010101010189
+:10C4A0000101010101010102020202020202020273
+:10C4B0000201010101010100000000000000010172
+:10C4C0000101010101000002020202020202020255
+:10C4D0000202020202020002020202020101010241
+:10C4E000020202020202020202020202020102012E
+:10C4F0000101010101020202020202020202020221
+:10C500000102010202020202020101000202010113
+:10C510000101010101020202020202020101010104
+:10C5200001010101010101020202020202020202F2
+:10C5300002020202020202020202020202020202DB
+:10C5400002020101010202020202020201010101D2
+:10C5500001010101010101020202020202010101C5
+:10C5600001010101010101020202020201010101B6
+:10C5700001010101010101020201010101010101A9
+:10C580000101010101010102020201010101010198
+:10C590000101010101010102020202010101010187
+:10C5A0000101010101010102020202020202020272
+:10C5B0000201010101010100000000000000000073
+:10C5C0000101010101000002020202020202020254
+:10C5D000020202020202000202020202020202023D
+:10C5E000020202020202020202020202020202022B
+:10C5F0000101010101020202020202020202020220
+:10C60000020202020202020202010101020202010E
+:10C610000101010101020202020202020101010103
+:10C6200001010101010202020202020202020202EF
+:10C6300002020202020202020202020202020202DA
+:10C6400002020202020202020202020202010101CD
+:10C6500001010101010202020202020202020101C1
+:10C6600001010101010202020202020202020202AF
+:10C6700001010101010202020202020101010101A4
+:10C680000101010101010102020202010101010196
+:10C690000101010101010102020202020101010185
+:10C6A0000101010101010102020202020202020271
+:10C6B0000202020101010100000000000000000070
+:10C6C0000000010001000002020202020202020256
+:10C6D000020202020202000202020202020202023C
+:10C6E000020202020202020202020202020202022A
+:10C6F000010101010102020202020202020202021F
+:10C70000020202020202020202020101020202010C
+:10C710000101010101020202020202020201010101
+:10C7200001010101010202020202020202020202EE
+:10C7300002020202020202020202020202020202D9
+:10C7400002020202020202020202020202020202C9
+:10C7500001010101010202020202020202020202BE
+:10C7600001010101010202020202020202020202AE
+:10C77000020202020102020202020202010101019E
+:10C780000101010101010102020202020101010194
+:10C790000101010101010102020202020101010184
+:10C7A0000101010101010102020202020202020270
+:10C7B000020202020101020000000000000000006D
+:10C7C0000000000000010002020202020202020256
+:10C7D000020202020202000202020202020202023B
+:10C7E0000202020202020202020202020202020229
+:10C7F000010101010102020202020202020202021E
+:10C800000202020202020202020202010202020209
+:10C8100001010101010202020202020202020101FF
+:10C8200001010101010202020202020202020202ED
+:10C8300002020202020202020202020202020202D8
+:10C8400002020202020202020202020202020202C8
+:10C8500002020202020202020202020202020202B8
+:10C8600002020202020202020202020202020202A8
+:10C87000020202020202020202020202020101019B
+:10C88000010101010101010202020202020202028F
+:10C89000020202010102010202020202020201017D
+:10C8A000010101010101010202020202020202026F
+:10C8B000020202020202020000000000000000006A
+:10C8C0000000000000010002020202020202020255
+:10C8D000020202020202000202020202020202023A
+:10C8E0000202020202020202020202020202020228
+:10C8F000020101010102020202020202020202021C
+:10C900000202020202020202020202020202020207
+:10C9100002020102020202020202020202020202F8
+:10C9200001010102010202020202020202020202EB
+:10C9300002020202020202020202020202020202D7
+:10C9400002020202020202020202020202020202C7
+:10C9500002020202020202020202020202020202B7
+:10C9600002020202020202020202020202020202A7
+:10C970000202020202020202020202020202020297
+:10C98000020201010102010202020202020202028B
+:10C990000202020201020202020202020202020278
+:10C9A000010101010102010202020202020202026D
+:10C9B0000202020202020200000000000000000069
+:10C9C0000000000000010002020202020202020254
+:10C9D0000202020202020002020202020202020239
+:10C9E0000202020202020202020202020202020227
+:10C9F0000202020202020202020202020202020217
+:10CA00000202020202020202020202020202020206
+:10CA100002020202020202020202020202020202F6
+:10CA200001020202010202020202020202020202E8
+:10CA300002020202020202020202020202020202D6
+:10CA400002020202020202020202020202020202C6
+:10CA500002020202020202020202020202020202B6
+:10CA600002020202020202020202020202020202A6
+:10CA70000202020202020202020202020202020296
+:10CA80000202020101020202020202020202020288
+:10CA90000202020202020202020202020202020276
+:10CAA0000202020101020102020202020202020269
+:10CAB0000202020202020202000000000000000066
+:10CAC0000000000000010002020202020202020253
+:10CAD0000202020202020002020202020202020238
+:10CAE0000202020202020202020202020202020226
+:10CAF0000202020202020202020202020202020216
+:10CB00000202020202020202020202020202020205
+:10CB100002020202020202020202020202020202F5
+:10CB200002020202010202020202020202020202E6
+:10CB300002020202020202020202020202020202D5
+:10CB400002020202020202020202020202020202C5
+:10CB500002020202020202020202020202020202B5
+:10CB600002020202020202020202020202020202A5
+:10CB70000202020202020202020202020202020295
+:10CB80000202020202020202020202020202020285
+:10CB90000202020202020202020202020202020275
+:10CBA0000202020201020202020202020202020266
+:10CBB0000202020202020202020000000000000063
+:10CBC0000000000000010102020202020202020251
+:10CBD0000202020202020002020202020202020237
+:10CBE0000202020202020202020202020202020225
+:10CBF0000202020202020202020202020202020215
+:10CC00000202020202020202020202020202020204
+:10CC100002020202020202020202020202020202F4
+:10CC200002020202020202020202020202020202E4
+:10CC300002020202020202020202020202020202D4
+:10CC400002020202020202020202020202020202C4
+:10CC500002020202020202020202020202020202B4
+:10CC600002020202020202020202020202020202A4
+:10CC70000202020202020202020202020202020294
+:10CC80000202020202020202020202020202020284
+:10CC90000202020202020202020202020202020274
+:10CCA0000202020202020202020202020202020264
+:10CCB0000202020202020202020000000000000062
+:10CCC0000000000000010102020202020202020250
+:10CCD0000202020202020102020202020202020235
+:10CCE0000202020202020202020202020202020224
+:10CCF0000202020202020202020202020202020214
+:10CD00000202020202020202020202020202020203
+:10CD100002020202020202020202020202020202F3
+:10CD200002020202020202020202020202020202E3
+:10CD300002020202020202020202020202020202D3
+:10CD400002020202020202020202020202020202C3
+:10CD500002020202020202020202020202020202B3
+:10CD600002020202020202020202020202020202A3
+:10CD70000202020202020202020202020202020293
+:10CD80000202020202020202020202020202020283
+:10CD90000202020202020202020202020202020273
+:10CDA0000202020202020202020202020202020263
+:10CDB000020202020202020202020000000000005F
+:10CDC0000000000000010102020202020201010152
+:10CDD000010101010101010202020202020202023A
+:10CDE0000202020202020202020202020202020223
+:10CDF0000202020202020202020202020202020213
+:10CE00000202020202020202020202020202020202
+:10CE100002020202020202020202020202020202F2
+:10CE200002020202020202020202020202020202E2
+:10CE300002020202020202020202020202020202D2
+:10CE400002020202020202020202020202020202C2
+:10CE500002020202020202020202020202020202B2
+:10CE600002020202020202020202020202020202A2
+:10CE70000202020202020202020202020202020292
+:10CE80000202020202020202020202020202020282
+:10CE90000202020202020202020202020202020272
+:10CEA0000202020202020202020202020202020262
+:10CEB000020202020202020202020202000000005A
+:10CEC0000000000000000102020201010101010155
+:10CED0000101010101010102020202020202020239
+:10CEE0000202020202020202020202020202020222
+:10CEF0000202020202020202020202020202020212
+:10CF00000202020202020202020202020202020201
+:10CF100002020202020202020202020202020202F1
+:10CF200002020202020202020202020202020202E1
+:10CF300002020202020202020202020202020202D1
+:10CF400002020202020202020202020202020202C1
+:10CF500002020202020202020202020202020202B1
+:10CF600002020202020202020202020202020202A1
+:10CF70000202020202020202020202020202020291
+:10CF80000202020202020202020202020202020281
+:10CF90000202020202020202020202020202020271
+:10CFA0000202020202020202020202020202020261
+:10CFB0000202020202020202020202020202020251
+:10CFC0000000000000000101010101010101010157
+:10CFD0000101010101010102020202020202020139
+:10CFE0000101010101020202020202020202020226
+:10CFF0000202020202020202020202020202020211
+:10D000000202020202020202020202020202020200
+:10D0100002020202020202020202020202020202F0
+:10D0200002020202020202020202020202020202E0
+:10D0300002020202020202020202020202020202D0
+:10D0400002020202020202020202020202020202C0
+:10D0500002020202020202020202020202020202B0
+:10D0600002020202020202020202020202020202A0
+:10D070000202020202020202020202020202020290
+:10D080000202020202020202020202020202020280
+:10D090000202020202020202020202020202020270
+:10D0A0000202020202020202020202020202020260
+:10D0B0000202020202020202020202020202020250
+:10D0C000020200020200010101010101010101014E
+:10D0D0000101010101010101010101010101010140
+:10D0E0000101010101010102020202020202020227
+:10D0F0000202020202020202020202020202020210
+:10D1000002020202020202020202020202020202FF
+:10D1100002020202020202020202020202020202EF
+:10D1200002020202020202020202020202020202DF
+:10D1300002020202020202010101010101010101D8
+:10D1400001010101010101020202020202020202C6
+:10D1500002020202020202020202020202020202AF
+:10D16000020202020202020202020202020202029F
+:10D17000020202020202020202020202020202028F
+:10D18000020202020202020202020202020202027F
+:10D19000020202020202020202020202020202026F
+:10D1A000020202020202020202020202020202025F
+:10D1B000020202020202020202020202020202024F
+:10D1C000020202020200010101010101010101014B
+:10D1D000010101010101010101010101010101013F
+:10D1E0000101010101010102020202020202020226
+:10D1F000020202020202020202020202020202020F
+:10D200000202020202020201010101010101010107
+:10D2100001010101010101020202020202020202F5
+:10D2200002020202020202000000000000000000F0
+:10D2300000000000000000020202020202020202DC
+:10D2400002020202020202020202020202020202BE
+:10D2500002020202020202020202020202020202AE
+:10D26000020202020202020202020202020202029E
+:10D27000020202020202020202020202020202028E
+:10D28000020202020202020202020202020202027E
+:10D29000020202020202020202020202020202026E
+:10D2A000020202020202020202020202020202025E
+:10D2B000020202020202020202020202020202024E
+:10D2C0000202020202020201010101010101010147
+:10D2D000010101010101010101010101010101013E
+:10D2E000010101010101010101010101010101012E
+:10D2F000010101010101010101010101010101011E
+:10D300000101010101010102020202020202020204
+:10D3100002020202020202020202020202020202ED
+:10D3200002020202020202000000000000000000EF
+:10D3300000000000000000000000000000000000ED
+:10D3400000000000000000020202020202020202CB
+:10D3500002020202020202020202020202020202AD
+:10D36000020202020202020202020202020202029D
+:10D37000020202020202020202020202020202028D
+:10D38000020202020202020202020202020202027D
+:10D39000020202020202020202020202020202026D
+:10D3A000020202020202020202020202020202025D
+:10D3B000020202020202020202020202020202024D
+:10D3C0000202020202020201010101010101010146
+:10D3D000010101010101010101010101010101013D
+:10D3E000010101010101010101010101010101012D
+:10D3F0000101010101010102020202020202020214
+:10D40000020202020202020000000000010101010A
+:10D4100001010101010101020202020202020202F3
+:10D4200002020202020202000000000000000000EE
+:10D4300000000000000000000000000000000000EC
+:10D4400000000000000000020202020202020202CA
+:10D4500002020202020202020202020202020202AC
+:10D46000020202020202020202020202020202029C
+:10D47000020202020202020202020202020202028C
+:10D48000020202020202020202020202020202027C
+:10D49000020202020202020202020202020202026C
+:10D4A000020202020202020202020202020202025C
+:10D4B000020202020202020202020202020202024C
+:10D4C0000202020202020201010101010101010145
+:10D4D000010101010101010101010101010101013C
+:10D4E000010101010101010101010101010101012C
+:10D4F000010101010101010101010101010101011C
+:10D50000010101010101010101010101010101010B
+:10D5100001010101010101010101010101010101FB
+:10D5200001010101010101000000000000000000F4
+:10D5300000000000000000000000000000000000EB
+:10D5400000000000000000020202020202020202C9
+:10D5500002020202020202020202020202020202AB
+:10D56000020202020202020202020202020202029B
+:10D57000020202020202020202020202020202028B
+:10D58000020202020202020202020202020202027B
+:10D59000020202020202020202020202020202026B
+:10D5A0000202020202020202020202000000000065
+:10D5B0000000000000000002020202020202020259
+:10D5C0000202020202020201010101010101010144
+:10D5D000010101010101010101010101010101013B
+:10D5E000010101010101010101010101010101012B
+:10D5F000010101010101010101010101010101011B
+:10D60000010101010101010101010101010101010A
+:10D6100001010101010101010101010101010101FA
+:10D6200001010101010101010101010101010101EA
+:10D6300001010101010101000000000000000000E3
+:10D6400000000000000000020202020202020202C8
+:10D6500002020202020202010101010101010101B3
+:10D6600001010101010101020202020202020202A1
+:10D67000020202020202020202020202020202028A
+:10D68000020202020202020202020202020202027A
+:10D690000202020202020201010101010101010173
+:10D6A0000101010101010100000000000000000073
+:10D6B0000000000000000002020202020202020258
+:10D6C0000202020202020201010101010101010143
+:10D6D000010101010101010101010101010101013A
+:10D6E000010101010101010101010101010101012A
+:10D6F000010101010101010101010101010101011A
+:10D700000101010101010101010101010101010109
+:10D7100001010101010101010101010101010101F9
+:10D7200001010101010101010101010101010101E9
+:10D7300001010101010101010101010101010101D9
+:10D7400001010101010101010101010101010101C9
+:10D7500001010101010101020202020202020202B0
+:10D760000202020202020202020202020202020299
+:10D770000202020202020201010101010101010192
+:10D780000101010101010102020202020202020280
+:10D790000202020202020202020202020202020269
+:10D7A000020202020202020000000000000000006B
+:10D7B0000000000000000002020202020202020257
+:10D7C0000202020202020201010101010101010142
+:10D7D0000101010101010101010101010101010139
+:10D7E0000101010101010101010101010101010129
+:10D7F0000101010101010101010101010101010119
+:10D800000101010101010101010101010101010108
+:10D8100001010101010101010101010101010101F8
+:10D8200001010101010101010101010101010101E8
+:10D8300001010101010101010101010101010101D8
+:10D8400001010101010101010101010101010101C8
+:10D8500001010101010101010101010101010101B8
+:10D8600001010101010101010101010101010101A8
+:10D87000010101010101010202020202020202028F
+:10D880000202020202020202020202020202020278
+:10D89000020202020202020000000000000000007A
+:10D8A000000000000000000101010101010101016F
+:10D8B000010101010101010202020202020202024F
+:10D8C0000202020202020201010101010101010141
+:10D8D0000101010101010101010101010101010138
+:10D8E0000101010101010101010101010101010128
+:10D8F0000101010101010101010101010101010118
+:10D900000101010101010101010101010101010107
+:10D9100001010101010101010101010101010101F7
+:10D9200001010101010101010101010101010101E7
+:10D9300001010101010101010101010101010101D7
+:10D9400001010101010101010101010101010101C7
+:10D9500001010101010101010101010101010101B7
+:10D9600001010101010101010101010101010101A7
+:10D970000101010101010101010101010101010197
+:10D980000101010101010101010101010101010187
+:10D990000101010101010100000000000000000080
+:10D9A000000000000000000101010101010101016E
+:10D9B0000101010101010100000000000000000060
+:10D9C000000000000000000101010101010101014E
+:10D9D0000101010101010101010101010101010137
+:10D9E0000101010101010101010101010101010127
+:10D9F0000101010101010101010101010101010117
+:10DA00000101010101010101010101010101010106
+:10DA100001010101010101010101010101010101F6
+:10DA200001010101010101010101010101010101E6
+:10DA300001010101010101010101010101010101D6
+:10DA400001010101010101010101010101010101C6
+:10DA500001010101010101010101010101010101B6
+:10DA600001010101010101010101010101010101A6
+:10DA70000101010101010101010101010101010196
+:10DA80000101010101010101010101010101010186
+:10DA90000101010101010101010101010101010176
+:10DAA0000101010101010101010101010101010166
+:10DAB000010101010101010000000000000000005F
+:10DAC000000000000000000101010101010101014D
+:10DAD0000101010101010101010101010101010136
+:10DAE0000101010101010101010101010101010126
+:10DAF0000101010101010101010101010101010116
+:10DB00000101010101010101010101010101010105
+:10DB100001010101010101010101010101010101F5
+:10DB200001010101010101010101010101010101E5
+:10DB300001010101010101010101010101010101D5
+:10DB400001010101010101010101010101010101C5
+:10DB500001010101010101010101010101010101B5
+:10DB600001010101010101010101010101010101A5
+:10DB70000101010101010101010101010101010195
+:10DB80000101010101010101010101010101010185
+:10DB90000101010101010101010101010101010175
+:10DBA0000101010101010101010101010101010165
+:10DBB000010101010101010000000000000000005E
+:10DBC0000000000000000000000000000000000055
+:10DBD0000000000000000000000000000000000045
+:10DBE0000000000000000000000000000000000035
+:10DBF0000000000000000000000000000000000025
+:10DC00000000000000000002020202020202020202
+:10DC100002020202020202020202020202020202E4
+:10DC200002020202020202020202020202020202D4
+:10DC300002020202020202020202020202020202C4
+:10DC400002020202020202020202020202020202B4
+:10DC500002020202020202020202020202020202A4
+:10DC60000202020202020202020202020202020294
+:10DC70000202020202020202020202020202020284
+:10DC80000202020202020202020202020202020274
+:10DC90000202020202020202020202020202020264
+:10DCA0000202020202020202020202020202020254
+:10DCB0000202020202020200000000000000000056
+:10DCC0000000000000000000000000000000000054
+:10DCD0000000000000000000000000000000000044
+:10DCE0000000000000000000000000000000000034
+:10DCF0000000000000000000000000000000000024
+:10DD00000000000000000000000000000000000013
+:10DD10000000000000000000000000000000000003
+:10DD200000000000000000000000000000000000F3
+:10DD300000000000000000000000000000000000E3
+:10DD400000000000000000000000000000000000D3
+:10DD500000000000000000000000000000000000C3
+:10DD600000000000000000000000000000000000B3
+:10DD700000000000000000000000000000000000A3
+:10DD80000000000000000000000000000000000093
+:10DD90000000000000000000000000000000000083
+:10DDA0000000000000000002020202020202020261
+:10DDB0000202020202020200000000000000000055
+:10DDC0000000000000000000000000000000000053
+:10DDD0000000000000000000000000000000000043
+:10DDE0000000000000000000000000000000000033
+:10DDF0000000000000000000000000000000000023
+:10DE00000000000000000000000000000000000012
+:10DE10000000000000000000000000000000000002
+:10DE200000000000000000000000000000000000F2
+:10DE300000000000000000000000000000000000E2
+:10DE400000000000000000000000000000000000D2
+:10DE500000000000000000000000000000000000C2
+:10DE600000000000000000000000000000000000B2
+:10DE700000000000000000000000000000000000A2
+:10DE80000000000000000000000000000000000092
+:10DE90000000000000000000000000000000000082
+:10DEA0000000000000000002020202020202020260
+:10DEB0000202020202020200000000000000000054
+:10DEC0000000000000000000000000000000000052
+:10DED0000000000000000000000000000000000042
+:10DEE0000000000000000000000000000000000032
+:10DEF0000000000000000000000000000000000022
+:10DF00000000000000000000000000000000000011
+:10DF10000000000000000000000000000000000001
+:10DF200000000000000000000000000000000000F1
+:10DF300000000000000000000000000000000000E1
+:10DF400000000000000000000000000000000000D1
+:10DF500000000000000000000000000000000000C1
+:10DF600000000000000000000000000000000000B1
+:10DF700000000000000000000000000000000000A1
+:10DF80000000000000000000000000000000000091
+:10DF90000000000000000000000000000000000081
+:10DFA0000000000000000000000000000000000071
+:10DFB0000000000000000000000000000000000061
+:10DFC0000000000000000031000000000000000020
+:10DFD0000000000100000000000000000000000040
+:10DFE0000000000000000000000000000000000031
+:10DFF0000000000000000000000000000000000021
+:10E000000000000000000000000000000000000010
+:10E010000000000000000000000000000000000000
+:10E0200000000000000000000000000000000000F0
+:10E0300000000000000000000000000000000000E0
+:10E0400000000000000000000000000000000000D0
+:10E0500000000000000000000000000000000000C0
+:10E0600000000000000000000000000000000000B0
+:10E0700000000000000000000000000000000000A0
+:10E080000000000000000000000000000000000090
+:10E09000000000010100000000000000000001007D
+:10E0A0000000000000000000000000000000000070
+:10E0B0000000000000000000000000000000000060
+:10E0C0000000000000000000000000000000000050
+:10E0D000000000010001000000000000010100003C
+:10E0E000000000000000000000000000010000002F
+:10E0F0000000000000000000000000000000000020
+:10E10000000000000000000000000000000001000E
+:10E1100000000000000000000000000000000000FF
+:10E1200000000000000000000000000000000000EF
+:10E1300000000000000000000000000000000000DF
+:10E1400000000000000000000000000000000000CF
+:10E1500000000000000000000000000000000000BF
+:10E1600000000000000000000000000000000000AF
+:10E17000000000000000000000000000000000009F
+:10E18000000000000000000000000000000000008F
+:10E190000000010101010000000000000101010078
+:10E1A000000000000000000000000000000000006F
+:10E1B000000101000000000000000000000000005D
+:10E1C000000000000000000000000000000000004F
+:10E1D000000000010101000000000000010100003A
+:10E1E000000000000000000000000000010000002E
+:10E1F000000000000000000000000000000001001E
+:10E20000000000000000000000000000000001000D
+:10E2100000000000000000000000000000000000FE
+:10E2200000000000000000000000000000000000EE
+:10E2300000000000000000000000000000000000DE
+:10E2400000000000000000000000000000000000CE
+:10E2500000000000000000000000000000000000BE
+:10E2600000000000000000000000000000000000AE
+:10E27000000000000000000000000000000000009E
+:10E28000000000000000000000000000000000008E
+:10E290000000010101010001000000010101010075
+:10E2A000000000000000000000000000000000006E
+:10E2B000010101010000000000000000000000005A
+:10E2C000000000000000000000000000000000004E
+:10E2D0000000000101010100000000000101000038
+:10E2E000000000000000000000000000010100002C
+:10E2F000000000000000000000000000000001001D
+:10E30000000000010000000000000000000001000B
+:10E3100000000000000000000000000000000000FD
+:10E3200000000000000000000000000001010000EB
+:10E3300000000000000000000000000000000000DD
+:10E3400000000000000000000000000000000000CD
+:10E3500000000001000000000000000100000100BA
+:10E3600000000000000000000000000000010000AC
+:10E37000000000000000000000000000000000009D
+:10E38000000000000000000000000000000000008D
+:10E390000000010101010101000100010101010072
+:10E3A000000000000000000000000000000000006D
+:10E3B0000101010100000000000000000000000059
+:10E3C000000000000000000000000000000000004D
+:10E3D0000000000101010101000000010101000035
+:10E3E000000000000000000000000000010101002A
+:10E3F000000000010000000000000000000001001B
+:10E400000000000100010000000000000001010008
+:10E4100000000000000000000000000000000000FC
+:10E4200000000001000000000000000001010100E8
+:10E4300000000000000000000000000000000000DC
+:10E4400000000000000000000000000000000000CC
+:10E4500000000001000000000000000101010100B7
+:10E4600000000000000000000000000100010100A9
+:10E47000000000000000000000000000000000009C
+:10E48000000000000000000000000000000000008C
+:10E490000000010101010101010100010101010070
+:10E4A000000000000000000000000000000000006C
+:10E4B0000101010101000000000000000000000057
+:10E4C000000000000000000000000000000000004C
+:10E4D000010101010101010100010101010100002F
+:10E4E0000000000000000000000000000101010029
+:10E4F0000000000100010000000000000101010017
+:10E500000000000100010000000000010001010006
+:10E5100000000001000000000000000000000000FA
+:10E5200000000001000000000000000001010100E7
+:10E5300000000000000000000000000000000000DB
+:10E5400000000000000000000000000000000100CA
+:10E5500000000001000000000000000101010100B6
+:10E5600000000000000000000000000100010100A8
+:10E57000000000000000000000000000000100009A
+:10E58000000000000000000000000000000001008A
+:10E59000000101010101010101010101010101006D
+:10E5A000000000000000000000000000000000006B
+:10E5B0000101010101000000000000000000000056
+:10E5C000000000000000000000000000000000004B
+:10E5D000010101010101010101010101010100002D
+:10E5E0000000000100000000000000000101010027
+:10E5F0000000000100010000000000010101010015
+:10E600000000000100010000000000010101010004
+:10E6100000000001000000000000000000000000F9
+:10E6200000000001000000000000000001010100E6
+:10E6300000000001000000000000000000000000D9
+:10E6400000000000000000000000000001010100C7
+:10E6500000010101000100000001000101010100B1
+:10E6600000000001000000000000000100010100A6
+:10E670000000000100000000000000000001010097
+:10E680000000000000000000000000000101010087
+:10E69000000101010101010101010101010101006C
+:10E6A000000000000000000000000000000000006A
+:10E6B0000101010101000000000000000000000055
+:10E6C0000000000000000000000000000000000149
+:10E6D000010101010101010101010101010100002C
+:10E6E0000000000100000000000000000101010125
+:10E6F0000000000100010000000000010101010014
+:10E700000000000101010001000000010101010001
+:10E7100000000001000000000000000000000000F8
+:10E7200000000001000100000000000001010100E4
+:10E7300000000001000000000000000000000000D8
+:10E7400000000001000000000000000001010100C5
+:10E7500000010101010100000001000101010100AF
+:10E7600000000001000100000001000101010100A2
+:10E770000000000100000000000000000101010095
+:10E780000000000100000000000000010101010084
+:10E79000010101010101010101010101010101006A
+:10E7A0000000000000000000000000000000000069
+:10E7B0000101010101010100000000000000000052
+:10E7C0000000000000000000000000000000000148
+:10E7D000010101010101010101010101010100002B
+:10E7E0000000000100000000000000000101010124
+:10E7F0000000000100010001000000010101010012
+:10E8000000000101010101010001000101010100FD
+:10E8100000000001000000000000000001010000F5
+:10E8200000000001010100000000000001010100E2
+:10E8300000000001000000000000000000000000D7
+:10E8400000000001000100000001000001010100C2
+:10E8500001010101010101000001000101010100AC
+:10E86000000000010101000100010001010101009F
+:10E870000000000101000000000000010101010092
+:10E880000000000100010000000100010101010081
+:10E890000101010101010101010101010101010069
+:10E8A0000000000000000000000000000000000167
+:10E8B0000101010101010100000000000000010050
+:10E8C0000000000000000000000000000000000147
+:10E8D000010101010101010101010101010100002A
+:10E8E0000100000100010000000000000101010121
+:10E8F0000000010100010001000000010101010010
+:10E9000000000101010101010101000101010100FB
+:10E9100000000001000000000000000001010101F2
+:10E9200001000101010100000000000001010100DF
+:10E9300000000101000000000000000000010000D4
+:10E9400000000001010100000001000101010100BF
+:10E9500001010101010101010101000101010100A9
+:10E96000000101010101010100010001010101009B
+:10E97000010101010101000000000001010101008D
+:10E98000000000010101000101010001010101017C
+:10E990000101010101010101010101010101010068
+:10E9A0000000000000000000000000000000000166
+:10E9B000010101010101010000000000000001004F
+:10E9C0000000000000000000000000000000000146
+:10E9D0000101010101010101010101010101000029
+:10E9E0000100000100010000000000000101010120
+:10E9F000000001010101000100000001010101000E
+:10EA000000000101010101010101010101010101F8
+:10EA100000000101000000000000000001010101F0
+:10EA200001000101010100010000000101010100DC
+:10EA300000000101010000000000000000010100D1
+:10EA400000000001010101000001000101010101BC
+:10EA500001010101010101010101000101010100A8
+:10EA60000001010101010101010100010101010099
+:10EA7000010101010101000000000001010101008C
+:10EA80000101010101010101010101010101010176
+:10EA90000101010101010101010101010101010067
+:10EAA0000000000000000000000000000000000165
+:10EAB000010101010101010100000001000001004C
+:10EAC0000000000000000000000000000000000145
+:10EAD0000101010101010101010101010101000127
+:10EAE000010101010001000000010000010101011C
+:10EAF0000101010101010101000100010101010009
+:10EB000000000101010101010101010101010101F7
+:10EB100000000101000000000000000001010101EF
+:10EB200001010101010101010001000101010101D7
+:10EB300001000101010100000000000001010100CD
+:10EB400000000001010101010101000101010101B9
+:10EB500001010101010101010101000101010100A7
+:10EB60000101010101010101010100010101010196
+:10EB70000101010101010100000100010101010089
+:10EB80000101010101010101010101010101010175
+:10EB90000101010101010101010101010101010066
+:10EBA0000000000000000000000000000000000164
+:10EBB0000101010101010101000000010101010049
+:10EBC0000000000000000000000000000000000144
+:10EBD0000101010101010101010101010101000126
+:10EBE0000101010101010001000100010101010118
+:10EBF0000101010101010101010100010101010106
+:10EC000001010101010101010101010101010101F4
+:10EC100001000101000100000000000001010101EC
+:10EC200001010101010101010001000101010101D6
+:10EC300001000101010100000000000001010100CC
+:10EC400000000101010101010101010101010101B6
+:10EC500001010101010101010101010101010100A5
+:10EC60000101010101010101010100010101010195
+:10EC70000101010101010101010100010101010086
+:10EC80000101010101010101010101010101010174
+:10EC90000101010101010101010101010101010065
+:10ECA0000000000000000000000000000000000163
+:10ECB0000101010101010101010000010101010047
+:10ECC0000000000000000000000000000000000242
+:10ECD0000101010101010101010101010101000125
+:10ECE0000101010101010001000100010101010117
+:10ECF0000101010101010101010101010101010104
+:10ED000001010101010101010101010101010101F3
+:10ED100001000101010100000000000001010101EA
+:10ED200001010101010101010001000101010101D5
+:10ED300001010101010100000000000001010100CA
+:10ED400000000101010101010101010101010101B5
+:10ED500001010101010101010101010101010101A3
+:10ED60000101010101010101010101010101010193
+:10ED70000101010101010101010101010101010084
+:10ED80000101010101010101010101010101010173
+:10ED90000101010101010101010101010101010064
+:10EDA0000000000000000000000000000000000162
+:10EDB0000101010101010101010101010101010044
+:10EDC0000000000000000000000000000000000241
+:10EDD0000201010201010101010101010101000122
+:10EDE0000101010101010001000100010101010116
+:10EDF0000101010101010101010101010101010103
+:10EE000001010101010101010101010101010101F2
+:10EE100001010101010100000000000001010101E8
+:10EE200001010101010101010101000101010101D3
+:10EE300001010101010100000000000001010100C9
+:10EE400001000101010101010101010101010101B3
+:10EE500001010101010101010101010101010101A2
+:10EE60000101010101010101010101010101010192
+:10EE70000101010101010101010101010101010182
+:10EE80000101010101010101010101010101010172
+:10EE90000101010101010101010101010101010063
+:10EEA0000000000000000000000000000000000161
+:10EEB0000101010101010101010101010101010043
+:10EEC000000000010000000000000000000000023F
+:10EED000020201020202010101010101010100021D
+:10EEE0000101010101010001000100010101010214
+:10EEF0000101010101010101010101010101010102
+:10EF000001010101010101010101010101010101F1
+:10EF100001010101010100000000000001010101E7
+:10EF200001010101010101010101010101010101D1
+:10EF300001010101010101000000000001010100C7
+:10EF400001000101010101010101010101010101B2
+:10EF500001010101010101010101010101010101A1
+:10EF60000101010101010101010101010101010191
+:10EF70000101010101010101010101010101010181
+:10EF80000101010101010101010101010101010171
+:10EF90000101010101010101010101010101010062
+:10EFA000000001000000000000000000000000015F
+:10EFB0000202010101010101010101010101010040
+:10EFC000000001010000000000000000000000023D
+:10EFD000020202020202020101010101010100021A
+:10EFE0000201010101010001000100010101010212
+:10EFF0000101010101010101010101010101010101
+:10F0000001010101010101010101010101010102EF
+:10F0100001010101010100000000000001010102E5
+:10F0200001010101010101010101010101010102CF
+:10F0300001010101010101000000000101010101C4
+:10F0400001010101010101010101010101010101B0
+:10F0500001010101010101010101010101010101A0
+:10F060000101010101010101010101010101010190
+:10F070000101010101010101010101010101010180
+:10F080000101010101010101010101010101010170
+:10F090000101010101010101010101010101010061
+:10F0A000000001010000000000000000000000025C
+:10F0B000020202010101010101010101010101003E
+:10F0C000000001010000000000000000000000023C
+:10F0D0000202020202020202010101010202000216
+:10F0E000020101020101010100010101020101020D
+:10F0F00001010101010101010101010101010102FF
+:10F1000001010102010101010101010101010102ED
+:10F1100001010101010100000000000001010102E4
+:10F1200001010101010101010101010101010102CE
+:10F1300001010101010101000001000101010101C2
+:10F1400001010101010101010101010101010102AE
+:10F15000010101010101010101010101010101019F
+:10F16000010101010101010101010101010101028E
+:10F17000010101010101010101010101010101017F
+:10F18000010101010101010101010101010101016F
+:10F190000101010101010101010101010101010060
+:10F1A0000101010100000000000000000000000259
+:10F1B000020202020101010101010101010101003C
+:10F1C000000101010000000000000000000000023A
+:10F1D0000202020202020202020202020202000211
+:10F1E0000202010201010101010101010202010209
+:10F1F00001010102010101010101010101010102FD
+:10F2000001010102010201010101010101010102EB
+:10F2100001010102010100000000000001010102E2
+:10F2200002010102010101010101010101010102CB
+:10F2300002010102010101010001000101010101BE
+:10F2400001010101010101010101010101010102AD
+:10F25000020201020101010101010101010101019B
+:10F26000010101010101010101010101010101028D
+:10F27000020101010101010101010101010101017D
+:10F28000010101010101010101010101010101026D
+:10F29000010102020201010101010101010101005C
+:10F2A0000101010100000000000000000000000258
+:10F2B000020202020201010101010101010101003A
+:10F2C0000001010100000000000000000000000239
+:10F2D0000202020202020202020202020202000210
+:10F2E0000202020201020101010101010202020205
+:10F2F00002010102010201010101010101010102FA
+:10F3000002010202020201010101010101010202E6
+:10F3100002010102010100000000000001010102E0
+:10F3200002010102010101010101010101010102CA
+:10F3300002010202010101010001000101010101BC
+:10F3400001010101010101010101010101010102AC
+:10F350000202020201010101010101010101010199
+:10F36000010101010101010101010101010101028C
+:10F37000020201020101010101010101010101017A
+:10F38000010101010101010101010101010101026C
+:10F390000202020202020101010101010101010157
+:10F3A0000101010100000000000000000000000257
+:10F3B0000202020202010101010101010101010039
+:10F3C0000001010100000000000000000000000238
+:10F3D000020202020202020202020202020200020F
+:10F3E0000202020202020101010101010202020203
+:10F3F00002020202010201010101010101010202F6
+:10F4000002020202020202020101010201020202E0
+:10F4100002010202010100000002020001010102DA
+:10F4200002020202020201010101010102020102C3
+:10F4300002020202020101010001000101010101B9
+:10F4400001010101010101010101010101010102AB
+:10F450000202020202020101010101020101010294
+:10F46000010101010101010101010101010101028B
+:10F470000202020202010101010101010101010276
+:10F48000020101010101010101010101010101026A
+:10F490000202020202020202010101010101010154
+:10F4A0000101010101000000000000000000000255
+:10F4B0000202020202020201010101010101010036
+:10F4C0000001010001000000000000000000000237
+:10F4D000020202020202020202020202020200020E
+:10F4E0000202020202020102010201010202020200
+:10F4F00002020202020201020101010202020202F0
+:10F5000002020202020202020202010202020202DC
+:10F5100002020202010100020201010201010102D4
+:10F5200002020202020201010101010102020202C1
+:10F5300002020202020201010001020101010102B4
+:10F5400001010102010101010101010101010102A9
+:10F55000020202020202020101020102020202028E
+:10F560000202010201010101010101010101010287
+:10F570000202020202020101010101010102010273
+:10F580000202010201010101010101010101010267
+:10F59000020202020202020202020102020202014D
+:10F5A0000101010101010000000000000101000251
+:10F5B0000202020202020201010101010101010035
+:10F5C0000101000001010100000000000000000234
+:10F5D000020202020202020202020202020200020D
+:10F5E00002020202020201020102010202020202FE
+:10F5F00002020202020202020101010202020202EE
+:10F6000002020202020202020202020202020202DA
+:10F6100002020202020201010101010102020102D1
+:10F6200002020202020202020101010102020202BE
+:10F6300002020202020201010101010101020102B2
+:10F6400002010102020201010101010101010102A5
+:10F65000020202020202020202020102020202028B
+:10F660000202020202020101010101020102010281
+:10F67000020202020202020101010102020202026E
+:10F680000202020202020101010101010101010263
+:10F69000020202020202020202020202020202024A
+:10F6A000010101010101000000000001010101024E
+:10F6B0000202020202020202010101010101010033
+:10F6C0000100000001010101010000000000000232
+:10F6D000020202020202020202020202020200020C
+:10F6E00002020202020202020102010202020202FC
+:10F6F00002020202020202020202010202020202EB
+:10F7000002020202020202020202020202020202D9
+:10F7100002020202020201010101010102020202CF
+:10F7200002020202020202020102010202020202BB
+:10F7300002020202020202010101010102020202AE
+:10F74000020102020202020101020101020202029E
+:10F75000020202020202020202020102020202028A
+:10F76000020202020202020201020102010202027C
+:10F77000020202020202020202020102020202026A
+:10F78000020202020202020202020102020202025A
+:10F790000202020202020202020202020202020249
+:10F7A000020101010101010000000001010101024B
+:10F7B000020202020202020202010102010102002F
+:10F7C000010000000101010101000000010101022E
+:10F7D000020202020202020202020202020200020B
+:10F7E00002020202020202020202020202020202F9
+:10F7F00002020202020202020202020202020202E9
+:10F8000002020202020202020202020202020202D8
+:10F8100002020202020201010101010102020202CE
+:10F8200002020202020202020202010202020202B9
+:10F8300002020202020202010101010102020202AD
+:10F840000202020202020202020201020202020299
+:10F850000202020202020202020202020202020288
+:10F860000202020202020202020201020202020279
+:10F870000202020202020202020202020202020268
+:10F880000202020202020202020202020202020258
+:10F890000202020202020202020202020202020248
+:10F8A0000202020101010101000000010101010247
+:10F8B000020202020202020202020202020202002A
+:10F8C000000000000101010101000000010101022E
+:10F8D000020202020202020202020202020200020A
+:10F8E00002020202020202020202020202020202F8
+:10F8F00002020202020202020202020202020202E8
+:10F9000002020202020202020202020202020202D7
+:10F9100002020202020201010101010102020202CD
+:10F9200002020202020202020202020202020202B7
+:10F9300002020202020202020102010202020202A9
+:10F940000202020202020202020202020202020297
+:10F950000202020202020202020202020202020287
+:10F960000202020202020202020201020202020278
+:10F970000202020202020202020202020202020267
+:10F980000202020202020202020202020202020257
+:10F990000202020202020202020202020202020247
+:10F9A0000202020201010101000100010101010244
+:10F9B0000202020202020202020202020202020029
+:10F9C000000000000001010101010000010101022D
+:10F9D0000202020202020202020202020202000209
+:10F9E00002020202020202020202020202020202F7
+:10F9F00002020202020202020202020202020202E7
+:10FA000002020202020202020202020202020202D6
+:10FA100002020202020201010101010102020202CC
+:10FA200002020202020202020202020202020202B6
+:10FA300002020202020202020102010202020202A8
+:10FA40000202020202020202020202020202020296
+:10FA50000202020202020202020202020202020286
+:10FA60000202020202020202020202020202020276
+:10FA70000202020202020202020202020202020266
+:10FA80000202020202020202020202020202020256
+:10FA90000202020202020202020202020202020246
+:10FAA0000202020201010101010100010101010242
+:10FAB0000202020202020202020202020202020028
+:10FAC000000000000000000101010001010101022D
+:10FAD0000202020202020202020202020202000208
+:10FAE00002020202020202020202020202020202F6
+:10FAF00002020202020202020202020202020202E6
+:10FB000002020202020202020202020202020202D5
+:10FB100002020202020202010101010102020202CA
+:10FB200002020202020202020202020202020202B5
+:10FB300002020202020202020202010202020202A6
+:10FB40000202020202020202020202020202020295
+:10FB50000202020202020202020202020202020285
+:10FB60000202020202020202020202020202020275
+:10FB70000202020202020202020202020202020265
+:10FB80000202020202020202020202020202020255
+:10FB90000202020202020202020202020202020245
+:10FBA000020202020201010101010101010101023F
+:10FBB0000202020202020202020202020202020027
+:10FBC000000000000000000000010001010101022E
+:10FBD0000202020202020202020202020202000207
+:10FBE00002020202020202020202020202020202F5
+:10FBF00002020202020202020202020202020202E5
+:10FC000002020202020202020202020202020202D4
+:10FC100002020202020202020202020102020202C5
+:10FC200002020202020202020202020202020202B4
+:10FC300002020202020202020202020202020202A4
+:10FC40000202020202020202020202020202020294
+:10FC50000202020202020202020202020202020284
+:10FC60000202020202020202020202020202020274
+:10FC70000202020202020202020202020202020264
+:10FC80000202020202020202020202020202020254
+:10FC90000202020202020202020202020202020244
+:10FCA000020202020202010101010101010101023D
+:10FCB0000202020202020202020202020202020224
+:10FCC000000000000000000000010001010101022D
+:10FCD0000202020202020202020202020202000206
+:10FCE00002020202020202020202020202020202F4
+:10FCF00002020202020202020202020202020202E4
+:10FD000002020202020202020202020202020202D3
+:10FD100002020202020202020202020202020202C3
+:10FD200002020202020202020202020202020202B3
+:10FD300002020202020202020202020202020202A3
+:10FD40000202020202020202020202020202020293
+:10FD50000202020202020202020202020202020283
+:10FD60000202020202020202020202020202020273
+:10FD70000202020202020202020202020202020263
+:10FD80000202020202020202020202020202020253
+:10FD90000202020202020202020202020202020243
+:10FDA000020202020202020101010101010101023B
+:10FDB0000202020202020202020202020202020223
+:10FDC0000202000000000000000001010101010228
+:10FDD0000202020202020202020202020202010204
+:10FDE00002020202020202020202020202020202F3
+:10FDF00002020202020202020202020202020202E3
+:10FE000002020202020202020202020202020202D2
+:10FE100002020202020202020202020202020202C2
+:10FE200002020202020202020202020202020202B2
+:10FE300002020202020202020202020202020202A2
+:10FE40000202020202020202020202020202020292
+:10FE50000202020202020202020202020202020282
+:10FE60000202020202020202020202020202020272
+:10FE70000202020202020202020202020202020262
+:10FE80000202020202020202020202020202020252
+:10FE90000202020202020202020202020202020242
+:10FEA0000202020202020202010101020202010236
+:10FEB0000202020202020202020202020202020222
+:10FEC0000202020000000000000001010101010225
+:10FED0000202020202020202020202020202010203
+:10FEE00002020202020202020202020202020202F2
+:10FEF00002020202020202020202020202020202E2
+:10FF000002020202020202020202020202020202D1
+:10FF100002020202020202020202020202020202C1
+:10FF200002020202020202020202020202020202B1
+:10FF300002020202020202020202020202020202A1
+:10FF40000202020202020202020202020202020291
+:10FF50000202020202020202020202020202020281
+:10FF60000202020202020202020202020202020271
+:10FF70000202020202020202020202020202020261
+:10FF80000202020202020202020202020202020251
+:10FF90000202020202020202020202020202020241
+:10FFA0000202020202020202020201020202020232
+:10FFB0000202020202020202020202020202020221
+:10FFC0000202020200000000000001010000010125
+:10FFD0000101010101010101010101010101010210
+:10FFE00002020202020202020202020202020202F1
+:10FFF00002020202020202020202020202020202E1
+:0200000280007C
+:1000000002020202020202020202020202020202D0
+:1000100002020202020202020202020202020202C0
+:1000200002020202020202020202020202020202B0
+:1000300002020202020202020202020202020202A0
+:100040000202020202020202020202020202020290
+:100050000202020202020202020202020202020280
+:100060000202020202020202020202020202020270
+:100070000202020202020202020202020202020260
+:100080000202020202020202020202020202020250
+:100090000202020202020202020202020202020240
+:1000A0000202020202020202020202020202020230
+:1000B0000202020202020202020202020202020220
+:1000C0000202020202000000000001000000000124
+:1000D0000101010101010101010101010101010011
+:1000E000000000000000000000000000000000020E
+:1000F00002020202020202020202020202020202E0
+:1001000002020202020202020202020202020202CF
+:1001100002020202020202020202020202020202BF
+:1001200002020202020202020202020202020202AF
+:10013000020202020202020202020202020202029F
+:10014000020202020202020202020202020202028F
+:10015000020202020202020202020202020202027F
+:10016000020202020202020202020202020202026F
+:10017000020202020202020202020202020202025F
+:10018000020202020202020202020202020202024F
+:10019000020202020202020202020202020202023F
+:1001A000020202020202020202020202020202022F
+:1001B000020202020202020202020202020202021F
+:1001C0000202020202020200000000000000000120
+:1001D0000101010101010101010101010101010010
+:1001E000000000000000000000000000000000020D
+:1001F00002020202020202020202020202020202DF
+:1002000002020202020202020202020202020202CE
+:1002100002020202020202020202020202020202BE
+:1002200002020202020202020202020202020202AE
+:10023000020202020202020202020202020202029E
+:10024000020202020202020202020202020202028E
+:10025000020202020202020202020202020202027E
+:10026000020202020202020202020202020202026E
+:10027000020202020202020202020202020202025E
+:10028000020202020202020202020202020202024E
+:10029000020202020202020202020202020202023E
+:1002A000020202020202020202020202020202022E
+:1002B000020202020202020202020202020202021E
+:1002C0000202020202020202020000000202020115
+:1002D000010101010101010101010101010101010E
+:1002E00001010101010101010101010101010102FD
+:1002F00002020202020202020202020202020202DE
+:1003000002020202020202020202020202020202CD
+:1003100002020202020202020202020202020202BD
+:1003200002020202020202020202020202020201AE
+:1003300001010101010101010101010101010102AC
+:10034000020202020202020202020202020202028D
+:10035000020202020202020202020202020202027D
+:10036000020202020202020202020202020202026D
+:10037000020202020202020202020202020202025D
+:10038000020202020202020202020202020202024D
+:10039000020202020202020202020202020202023D
+:1003A000020202020202020202020202020202022D
+:1003B000020202020202020202020202020202021D
+:1003C0000202020202020202020000020202020112
+:1003D000010101010101010101010101010101010D
+:1003E00001010101010101010101010101010102FC
+:1003F00002020202020202020202020202020201DE
+:1004000001010101010101010101010101010102DB
+:1004100002020202020202020202020202020202BC
+:1004200002020202020202020202020202020202AC
+:10043000020202020202020202020202020202029C
+:10044000020202020202020202020202020202028C
+:10045000020202020202020202020202020202027C
+:10046000020202020202020202020202020202026C
+:10047000020202020202020202020202020202025C
+:10048000020202020202020202020202020202024C
+:10049000020202020202020202020202020202023C
+:1004A000020202020202020202020202020202022C
+:1004B000020202020202020202020202020202021C
+:1004C000020202020202020202020202020202010D
+:1004D000010101010101010101010101010101010C
+:1004E00001010101010101010101010101010101FC
+:1004F00001010101010101010101010101010102EB
+:1005000002020202020202020202020202020200CD
+:1005100000000000000000000000000000000001DA
+:1005200001010101010101010101010101010100BC
+:1005300000000000000000000000000000000002B9
+:10054000020202020202020202020202020202028B
+:10055000020202020202020202020202020202027B
+:10056000020202020202020202020202020202016C
+:10057000010101010101010101010101010101026A
+:10058000020202020202020202020202020202024B
+:10059000020202020202020202020202020202023B
+:1005A000020202020202020202020202020202022B
+:1005B000020202020202020202020202020202021B
+:1005C000020202020202020202020202020202010C
+:1005D000010101010101010101010101010101010B
+:1005E00001010101010101010101010101010101FB
+:1005F00001010101010101010101010101010100EC
+:1006000000000000000000000000000000000001E9
+:1006100001010101010101010101010101010102C9
+:1006200002020202020202020202020202020200AC
+:1006300000000000000000000000000000000002B8
+:10064000020202020202020202020202020202018B
+:100650000101010101010101010101010101010289
+:10066000020202020202020202020202020202026A
+:10067000020202020202020202020202020202025A
+:10068000020202020202020202020202020202024A
+:10069000020202020202020202020202020202023A
+:1006A000020202020202020202020202020202022A
+:1006B0000200000000000000000000000000000236
+:1006C000020202020202020202020202020202010B
+:1006D000010101010101010101010101010101010A
+:1006E00001010101010101010101010101010101FA
+:1006F00001010101010101010101010101010101EA
+:1007000001010101010101010101010101010101D9
+:1007100001010101010101010101010101010101C9
+:1007200001010101010101010101010101010100BA
+:1007300000000000000000000000000000000002B7
+:100740000202020202020202020202020202020289
+:100750000202020202020202020202020202020279
+:10076000020202020202020202020202020202006B
+:100770000000000000000000000000000000000277
+:100780000202020202020202020202020202020249
+:100790000202020202020202020202020202020239
+:1007A000020202020202020202020202020202002B
+:1007B0000000000000000000000000000000000237
+:1007C000020202020202020202020202020202010A
+:1007D0000101010101010101010101010101010109
+:1007E00001010101010101010101010101010101F9
+:1007F00001010101010101010101010101010101E9
+:1008000001010101010101010101010101010101D8
+:1008100001010101010101010101010101010101C8
+:1008200001010101010101010101010101010101B8
+:1008300001010101010101010101010101010101A8
+:100840000101010101010101010101010101010099
+:100850000000000000000000000000000000000296
+:10086000020202020202020202020202020202006A
+:100870000000000000000000000000000000000078
+:100880000000000000000000000000000000000266
+:10089000020202020202020202020202020202003A
+:1008A0000000000000000000000000000000000048
+:1008B0000000000000000000000000000000000236
+:1008C0000202020202020202020202020202020109
+:1008D0000101010101010101010101010101010108
+:1008E00001010101010101010101010101010101F8
+:1008F00001010101010101010101010101010101E8
+:1009000001010101010101010101010101010101D7
+:1009100001010101010101010101010101010101C7
+:1009200001010101010101010101010101010101B7
+:1009300001010101010101010101010101010101A7
+:100940000101010101010101010101010101010197
+:100950000101010101010101010101010101010187
+:100960000101010101010101010101010101010078
+:100970000000000000000000000000000000000077
+:100980000000000000000000000000000000000265
+:100990000202020202020202020202020202020039
+:1009A0000000000000000000000000000000000146
+:1009B0000101010101010101010101010101010226
+:1009C0000202020202020202020202020202020108
+:1009D0000101010101010101010101010101010107
+:1009E00001010101010101010101010101010101F7
+:1009F00001010101010101010101010101010101E7
+:100A000001010101010101010101010101010101D6
+:100A100001010101010101010101010101010101C6
+:100A200001010101010101010101010101010101B6
+:100A300001010101010101010101010101010101A6
+:100A40000101010101010101010101010101010196
+:100A50000101010101010101010101010101010186
+:100A60000101010101010101010101010101010176
+:100A70000101010101010101010101010101010166
+:100A80000101010101010101010101010101010156
+:100A90000101010101010101010101010101010047
+:100AA0000000000000000000000000000000000145
+:100AB0000101010101010101010101010101010225
+:100AC0000202020202020202020202020202020107
+:100AD0000101010101010101010101010101010106
+:100AE00001010101010101010101010101010101F6
+:100AF00001010101010101010101010101010101E6
+:100B000001010101010101010101010101010101D5
+:100B100001010101010101010101010101010101C5
+:100B200001010101010101010101010101010101B5
+:100B300001010101010101010101010101010101A5
+:100B40000101010101010101010101010101010195
+:100B50000101010101010101010101010101010185
+:100B60000101010101010101010101010101010175
+:100B70000101010101010101010101010101010165
+:100B80000101010101010101010101010101010155
+:100B90000101010101010101010101010101010145
+:100BA0000101010101010101010101010101010135
+:100BB0000101010101010101010101010101010026
+:100BC0000000000000000000000000000000000124
+:100BD0000101010101010101010101010101010105
+:100BE00001010101010101010101010101010101F5
+:100BF00001010101010101010101010101010101E5
+:100C000001010101010101010101010101010101D4
+:100C100001010101010101010101010101010101C4
+:100C200001010101010101010101010101010101B4
+:100C300001010101010101010101010101010101A4
+:100C40000101010101010101010101010101010194
+:100C50000101010101010101010101010101010184
+:100C60000101010101010101010101010101010174
+:100C70000101010101010101010101010101010164
+:100C80000101010101010101010101010101010154
+:100C90000101010101010101010101010101010144
+:100CA0000101010101010101010101010101010134
+:100CB0000101010101010101010101010101010025
+:100CC0000000000000000000000000000000000024
+:100CD0000000000000000000000000000000000014
+:100CE0000000000000000000000000000000000004
+:100CF00000000000000000000000000000000000F4
+:100D000000000000000000000000000000000002E1
+:100D100002020202020202020202020202020202B3
+:100D200002020202020202020202020202020202A3
+:100D30000202020202020202020202020202020293
+:100D40000202020202020202020202020202020283
+:100D50000202020202020202020202020202020273
+:100D60000202020202020202020202020202020263
+:100D70000202020202020202020202020202020253
+:100D80000202020202020202020202020202020243
+:100D90000202020202020202020202020202020233
+:100DA0000202020202020202020202020202020223
+:100DB0000202020202020202020202020202020015
+:100DC0000000000000000000000000000000000023
+:100DD0000000000000000000000000000000000013
+:100DE0000000000000000000000000000000000003
+:100DF00000000000000000000000000000000000F3
+:100E000000000000000000000000000000000000E2
+:100E100000000000000000000000000000000000D2
+:100E200000000000000000000000000000000000C2
+:100E300000000000000000000000000000000000B2
+:100E400000000000000000000000000000000000A2
+:100E50000000000000000000000000000000000092
+:100E60000000000000000000000000000000000082
+:100E70000000000000000000000000000000000072
+:100E80000000000000000000000000000000000062
+:100E90000000000000000000000000000000000052
+:100EA0000000000000000000000000000000000240
+:100EB0000202020202020202020202020202020014
+:100EC0000000000000000000000000000000000022
+:100ED0000000000000000000000000000000000012
+:100EE0000000000000000000000000000000000002
+:100EF00000000000000000000000000000000000F2
+:100F000000000000000000000000000000000000E1
+:100F100000000000000000000000000000000000D1
+:100F200000000000000000000000000000000000C1
+:100F300000000000000000000000000000000000B1
+:100F400000000000000000000000000000000000A1
+:100F50000000000000000000000000000000000091
+:100F60000000000000000000000000000000000081
+:100F70000000000000000000000000000000000071
+:100F80000000000000000000000000000000000061
+:100F90000000000000000000000000000000000051
+:100FA000000000000000000000000000000000023F
+:100FB0000202020202020202020202020202020013
+:100FC0000000000000000000000000000000000021
+:100FD0000000000000000000000000000000000011
+:100FE0000000000000000000000000000000000001
+:100FF00000000000000000000000000000000000F1
+:1010000000000000000000000000000000000000E0
+:1010100000000000000000000000000000000000D0
+:1010200000000000000000000000000000000000C0
+:1010300000000000000000000000000000000000B0
+:1010400000000000000000000000000000000000A0
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000000000000000000000070
+:101080000000000000000000000000000000000060
+:101090000000000000000000000000000000000050
+:1010A0000000000000000000000000000000000040
+:1010B0000000000000000000000000000000000030
+:1010C00000000000000000000000000000000031EF
+:1010D000000000000000000000000000000000010F
+:1010E0000000000000000000000000000000000000
+:1010F00000000000000000000000000000000000F0
+:1011000001000001000000000000000000000000DD
+:1011100000000000000000000000000000000000CF
+:1011200000000000000000000000000000000000BF
+:1011300000000000000000000000000000000000AF
+:10114000000000000000000000000000000000009F
+:10115000000000000000000000000000000000008F
+:10116000000000000000000000000000000000007F
+:10117000000000000000000000000000000000006F
+:10118000000000000000000000000000000000005F
+:10119000000000000000000000000000000000004F
+:1011A000000000000000000000000000000000003F
+:1011B000000000000000000000000000000000002F
+:1011C000000000000000000000000000000000001F
+:1011D000000000000000000000000100010100010B
+:1011E00001000101010100000000000000000000FA
+:1011F00000000000000000000000000000000000EF
+:1012000001000001000001000000000000000000DB
+:1012100000000000000001000000000000000000CD
+:1012200000000000000000000000000000000000BE
+:1012300000000000000000000000000000000000AE
+:10124000000000000000000000000000000000009E
+:10125000000000000000000000000000000000008E
+:10126000000000000000000000000000000000007E
+:10127000000000000000000000000000000000006E
+:10128000000000000000000000000000000000005E
+:10129000000000000000000000000000000000004E
+:1012A000000000000000000000000000000000003E
+:1012B000000000000000000000000000000000002E
+:1012C000000000000000000000000000000000001E
+:1012D0000000000000000000010101010101010106
+:1012E00001000101010100010000000000000000F8
+:1012F00000000101000100010000000000000000EA
+:1013000001000101010101000000000000000000D7
+:1013100001000101010101000000000000000000C7
+:1013200000000000000001000000000000000000BC
+:1013300000000000000000000000000000000000AD
+:10134000000000000000000000000000000000009D
+:10135000000000000000000000000000000000008D
+:10136000000000000000010000000000000000007C
+:10137000000000000000000000000000000000006D
+:10138000000000000000000000000000000000005D
+:10139000000000000000000000000000000000004D
+:1013A000000000000000000000000000000000003D
+:1013B000000000000000000000000000000000002D
+:1013C000000000000000000000000000000000001D
+:1013D0000000000000000000010101010101010105
+:1013E00001010101010100010000000000000000F6
+:1013F00000000101000101010000000000000100E7
+:1014000001000101010101000000000000000000D6
+:1014100001000101010101000000000000000000C6
+:1014200001000101010101000000000000000000B6
+:1014300000000101000100000000000000000000A9
+:10144000000000000000000000000000000000009C
+:10145000000000000000000000000000000000008C
+:101460000100010101010100000000000000000076
+:10147000000000000000000000000000000000006C
+:10148000000000000000000000000000000000005C
+:10149000000000000000000000000000000000004C
+:1014A000000000000000000000000000000000003C
+:1014B000000000000000000000000000000000002C
+:1014C000000000000000000000000000000000001C
+:1014D0000001000000000000010101010101010103
+:1014E00001010101010100010000000000000000F5
+:1014F00001000101010101010000000000000100E4
+:1015000001010101010101000000000000000000D4
+:1015100001010101010101000000000000000000C4
+:1015200001000101010101000000000000000000B5
+:1015300000000101000101000000000000000000A7
+:10154000000000000000000000000000000000009B
+:10155000000000000000000000000001000000008A
+:101560000100010101010100000000000000000075
+:10157000000000000000000000000000000000006B
+:10158000000000000000000000000000000000005B
+:101590000000000100010000000000000000000049
+:1015A000000000000000000000000000000000003B
+:1015B000000000000000000000000000000000002B
+:1015C0000000000000000000000100000001000019
+:1015D0000101000000000001010101010101010100
+:1015E00001010101010100010000000000000000F4
+:1015F00001000101010101010000000100000100E2
+:1016000001010101010101000000000000000100D2
+:1016100001010101010101000000000000000000C3
+:1016200001000101010101000000000000000000B4
+:1016300001000101010101000000000000000000A4
+:10164000000000000000000000000000000000009A
+:101650000000000000000000000000010000000089
+:101660000101010101010100000000000000000073
+:10167000000000000000000000000000000000006A
+:10168000000000000000000000000000000000005A
+:101690000000000100010100000000000000000047
+:1016A000000000000000000000000000000000003A
+:1016B000000000000000000000000000000000002A
+:1016C0000000000000000000000100000001000018
+:1016D00001010000010000010101010101010101FE
+:1016E00001010101010100010000000001000000F2
+:1016F00001000101010101010000000101000100E0
+:1017000001010101010101000000000001010100CF
+:1017100001010101010101000101000100000100BE
+:1017200001000101010101000000000000000000B3
+:1017300001000101010101000000000000000000A3
+:101740000000010100010000000000000000000096
+:101750000000000000000000010100010000010085
+:101760000101010101010100000000000000000072
+:101770000000000000000000000000000000000069
+:101780000000000000000000000000000000000059
+:101790000100010101010100000000000000000043
+:1017A0000000000000000000000000000000000039
+:1017B0000000000100010001000000000000000026
+:1017C0000000000000000000000100000001000017
+:1017D00001010000010000010101010101010101FD
+:1017E00001010101010100010000000101000100EF
+:1017F00001000101010101010000000101000101DE
+:1018000001010101010101000000000101010101CC
+:1018100001010101010101010101010101000100BA
+:1018200001010101010101000000000000000000B1
+:1018300001000101010101000000000000000000A2
+:101840000000010100010100000000000000000094
+:101850000000000100000000010101010101010080
+:101860000101010101010100000000000000000071
+:101870000000000000000000000000000000000068
+:101880000000000100010000000000000000010055
+:101890000100010101010100000000000000000042
+:1018A0000000000000000000000000000000000038
+:1018B0000000000100010101000000000000000024
+:1018C0000000000000000000000100000001000016
+:1018D00001010000010000010101010101010101FC
+:1018E00001010101010100010000000101000100EE
+:1018F00001010101010101010000000101010101DB
+:1019000001010101010101000000000101010101CB
+:1019100001010101010101010101010101000100B9
+:1019200001010101010101000000000100000100AE
+:1019300001000101010101000000000000000000A1
+:101940000100010101010100000000000000000091
+:10195000000000010000000001010101010101017E
+:101960000101010101010100000000000000000070
+:101970000000000000000000000000000000000067
+:101980000000000100010100000000000000010053
+:101990000101010101010100000000000000000040
+:1019A0000000000000000000000000000000000037
+:1019B0000100010101010101000000000000000020
+:1019C0000000000000000000000100000001010014
+:1019D00001010100010000010101010101010101FA
+:1019E00001010101010100010100000101000100EC
+:1019F00001010101010101010001000101010101D9
+:101A000001010101010101000001000101010101C9
+:101A100001010101010101010101010101010100B7
+:101A200001010101010101000000000101000100AC
+:101A3000010101010101010000000000000000009F
+:101A40000100010101010100000000000000000090
+:101A5000000001010001000001010101010101017B
+:101A6000010101010101010000000000000000006F
+:101A70000000000000000000000000000000000066
+:101A8000000001010101010001010001000001004D
+:101A9000010101010101010000000000000000003F
+:101AA0000000000000000000000000000000010035
+:101AB000010001010101010101000000000000001E
+:101AC0000000000000000000000100000101010111
+:101AD00001010100010000020101010101010101F8
+:101AE00001010101010100020100000101010100E9
+:101AF00001010101010101010001010101010101D7
+:101B000001010101010101000001010101010101C7
+:101B100001010101010101010101010101010101B5
+:101B200001010101010101000101000101000100A9
+:101B3000010101010101010000000000000000009E
+:101B4000010001010101010000000001000000008E
+:101B50000000010100010100010101010101010179
+:101B6000010101010101010000000000000000006E
+:101B70000000000000000000000000000000000065
+:101B80000000010101010100010101010101010049
+:101B9000010101010101010000000000000000003E
+:101BA0000000000000000000000000000100010033
+:101BB000010001010101010101000000000000001D
+:101BC0000000000000000000000100000101010110
+:101BD00001010100010100020101010101010101F6
+:101BE00001010101010100020101000101010100E7
+:101BF00001010101010101020101010101010101D4
+:101C000001010101010101000101010101010101C5
+:101C100001010101010101010101010101010101B4
+:101C200001010101010101010101010101010100A5
+:101C30000101010101010100010100010000010099
+:101C4000010001010101010000000001010000008C
+:101C50000000010101010101010101010101010176
+:101C6000010101010101010000000000000000006D
+:101C70000000000000000000000000000100000063
+:101C80000100010101010100010101010101010146
+:101C9000010101010101010000000000000000003D
+:101CA0000000000000000000000100010100010030
+:101CB000010001010101010101010001000000001A
+:101CC000000000000000010000010001010101010D
+:101CD00001010100010100020201010101010101F4
+:101CE00001010101010100020101010101010100E5
+:101CF00001010101010101020101010101010101D3
+:101D000001010101010101010101010101010101C3
+:101D100001010101010101010101010101010101B3
+:101D200001010101010101010101010101010101A3
+:101D30000101010101010100010101010100010096
+:101D40000101010101010100000100010100000089
+:101D50000000010101010101010101010101010175
+:101D6000010101010101010000000000000000006C
+:101D7000000000000000000001010001010001005E
+:101D80000100010101010100010101010101010145
+:101D9000010101010101010000000000000000003C
+:101DA000000000000000000000010101010101002D
+:101DB0000101010101010101010101010100000016
+:101DC0000000000100010100010100010101010109
+:101DD00001010100010100020202020101010102F0
+:101DE00001010101010100020101010101010101E3
+:101DF00001010101010101020101010101010101D2
+:101E000001010101010101010101010101010101C2
+:101E100001010101010101010101010101010101B2
+:101E200001010101010101010101010101010101A2
+:101E30000101010101010100010101010100010194
+:101E40000101010101010100000101010100000087
+:101E50000100010101010101010101010101010173
+:101E6000010101010101010000000000000000006B
+:101E7000000000000000000001010101010101005B
+:101E80000101010101010100010101010101010143
+:101E9000010101010101010000000000000000003B
+:101EA0000000000100000000010101010101010129
+:101EB0000101010101010101010101010100010014
+:101EC0000000000100010100010101010101010107
+:101ED00001010100010100020202020202020102EC
+:101EE00001010101010100020101010101010101E2
+:101EF00001010101010101020101010101010101D1
+:101F000001010101010101010101010101010101C1
+:101F100001010101010101020101010101010101B0
+:101F200001010101010101010101010101010101A1
+:101F30000101010101010101010101010101010191
+:101F40000101010101010100010101010100010084
+:101F50000100010101010101010101010101010172
+:101F6000010101010101010000000000000000006A
+:101F70000000000000000000010101010101010159
+:101F80000101010101010101010101010101010141
+:101F90000101010101010100010100010000000037
+:101FA0000000000100000001010101010101010127
+:101FB0000101010101010101010101010101010012
+:101FC0000100010100010100010101010101010104
+:101FD00001010101010100020202020202020202E9
+:101FE00002020101020200020101010101010101DD
+:101FF00001010101010101020101010101010101D0
+:1020000001010101010101010101010101010101C0
+:1020100001010101010101020101010101010101AF
+:1020200001010101010101010101010101010101A0
+:102030000101010101010101010101010101010190
+:102040000101010101010101010101010100010082
+:102050000101010101010101010101010101010170
+:102060000101010101010100000000000000000069
+:102070000000010100010001010101010101010154
+:102080000101010101010101010101010101010140
+:102090000101010101010101010101010000000034
+:1020A0000000010100010001010101010101010124
+:1020B0000101010101010102010101010101010010
+:1020C0000100010100010100010101010101010103
+:1020D00001010101010100020202020202020202E8
+:1020E00002020202020200020101010101010101DA
+:1020F00001010101010101020101010101010101CF
+:1021000001010101010101010101010101010101BF
+:1021100001010101010101020201010101010101AD
+:10212000010101010101010201010101010101019E
+:10213000010101010101010101010101010101018F
+:102140000101010101010101010101010100010081
+:10215000010101010101010101010101010101016F
+:102160000101010101010100000000000000000068
+:102170000000010100010101010101010101010152
+:10218000010101010101010101010101010101013F
+:102190000101010101010101010101010000000033
+:1021A0000000010100010101010101010101010122
+:1021B000010101010101010201010101010101000F
+:1021C0000101010101010100010001010101010101
+:1021D00001010101010100020202020202020202E7
+:1021E00002020202020200020201010101010101D8
+:1021F00001010101010101020101010101010101CE
+:1022000002010101010101010101010101010101BD
+:1022100001010101010101020202010101010101AB
+:10222000010101010101010201010101010101019D
+:10223000010101010101010101010101010101018E
+:10224000010101010101010101010101010101007F
+:10225000010101010101010202010101010101016C
+:102260000101010101010100000000000000000067
+:102270000000010101010101010101010101010150
+:10228000010101010101010101010101010101013E
+:102290000101010101010101010101010100000031
+:1022A0000000010101010101010101010101010120
+:1022B000010101010101010201010101010101010D
+:1022C0000101010101010100010001010101010100
+:1022D00001010101010101020202020202020202E5
+:1022E00002020202020200020201010202010101D5
+:1022F00002010202010201020101010201010201C7
+:1023000002010102010101020101010101010101BA
+:1023100001010101010101020202020201010101A8
+:10232000020101010101010202010101010101019A
+:10233000010101010101010201010101010101018C
+:10234000010101010101010101010101010101017D
+:102350000101010101010102020201020101010169
+:102360000101010101010100010100000000000064
+:10237000000001010101010101010101010101014F
+:10238000010101010101010101010101010101013D
+:10239000010101010101010101010101010001002F
+:1023A000000001010101010101010101010101011F
+:1023B000010101010101010201010101010101010C
+:1023C0000101010101010100010001010100010100
+:1023D00001010101010101020202020202020202E4
+:1023E00002020202020200020202010202010201D2
+:1023F00002010202020202020202010202010201C1
+:1024000002020202020202020101010101010101B4
+:1024100002010101010101020202020202010201A4
+:102420000201020202020202020201020101010192
+:102430000201020201020102020101010101010186
+:10244000010101010101010201010101010101017B
+:102450000101010101010102020202020101010167
+:10246000020101010101010101010100010000005F
+:10247000010001010101010101010101010101014D
+:10248000010101010101010101010101010101013C
+:10249000010101010101010101010101010001002E
+:1024A000010001010101010101010101010101011D
+:1024B000010101010101010202010101010101010A
+:1024C00001010101010101000100010101000101FF
+:1024D00000000101010101020202020202020202E5
+:1024E00002020202020200020202020202020201CF
+:1024F00002020202020202020202020202020202BC
+:1025000002020202020202020202010202020201AD
+:10251000020202020202020202020202020202019C
+:10252000020202020202020202020202020102018D
+:102530000201020202020202020201010101010182
+:10254000010101010101010201010101010101017A
+:102550000101010101010102020202020202020163
+:102560000202020202020201010101010100010056
+:10257000010001010101010201010101010101014B
+:102580000101010101010102020101010101010139
+:10259000010101010101010201010101010001012B
+:1025A000010001010101010201010101010101011B
+:1025B0000101010101010102020101010101010109
+:1025C00001010101010101000000010101000101FF
+:1025D00000000101010101020202020202020202E4
+:1025E00002020202020200020202020202020201CE
+:1025F00002020202020202020202020202020202BB
+:1026000002020202020202020202020202020202AA
+:10261000020202020202020202020202020202029A
+:10262000020202020202020202020202020202018B
+:10263000020202020202020202020202010101017E
+:102640000201020201020102020201020101010172
+:102650000101010101010102020202020202020261
+:102660000202020202020202010101010100010054
+:102670000100010101010102020101010101010149
+:102680000101010101010102020201010101010137
+:102690000101010101010102010101010101010129
+:1026A000010001010101010201010101010101011A
+:1026B0000101010101010102020201010101010107
+:1026C00001010101010101000000010101000101FE
+:1026D00000000101010101020202020202020202E3
+:1026E00002020202020200020202020202020202CC
+:1026F00002020202020202020202020202020202BA
+:1027000002020202020202020202020202020202A9
+:102710000202020202020202020202020202020299
+:102720000202020202020202020202020202020289
+:10273000020202020202020202020202020102017B
+:10274000020102020202020202020202020101016D
+:10275000010101020101010202020202020202025F
+:102760000202020202020202010101010100010053
+:102770000100010101010102020201010101010147
+:102780000101010101010102020202020101020133
+:102790000201010201020102020101010101010124
+:1027A0000100010101010102020201010101010117
+:1027B0000101010101010102020202020101010104
+:1027C0000101010101010100000001010000000000
+:1027D00000000101000101020202020202020202E3
+:1027E00002020202020200020202020202020202CB
+:1027F00002020202020202020202020202020202B9
+:1028000002020202020202020202020202020202A8
+:102810000202020202020202020202020202020298
+:102820000202020202020202020202020202020288
+:102830000202020202020202020202020202020278
+:10284000020202020202020202020202020101016B
+:10285000010102020102010202020202020202025C
+:102860000202020202020202020101010101010050
+:102870000101010101010102020202020201010142
+:10288000010101020102010202020202020202012E
+:10289000020202020202020202020101010101011E
+:1028A0000101010101010102020202020201020111
+:1028B00002010102010201020202020202010101FF
+:1028C0000101010101010100000001000000000000
+:1028D00000000101000101020202020202020202E2
+:1028E00002020202020200020202020202020202CA
+:1028F00002020202020202020202020202020202B8
+:1029000002020202020202020202020202020202A7
+:102910000202020202020202020202020202020297
+:102920000202020202020202020202020202020287
+:102930000202020202020202020202020202020277
+:102940000202020202020202020202020201020169
+:102950000201020202020202020202020202020258
+:10296000020202020202020202020101010101014D
+:10297000010101010101010202020202020202013F
+:102980000201020202020202020202020202020228
+:10299000020202020202020202020202010101011B
+:1029A000010101010101010202020202020202010F
+:1029B00002010202020202020202020202020201F9
+:1029C0000101010101010100000000000000000000
+:1029D00000000101000101020202020202020202E1
+:1029E00002020202020200020202020202020202C9
+:1029F00002020202020202020202020202020202B7
+:102A000002020202020202020202020202020202A6
+:102A10000202020202020202020202020202020296
+:102A20000202020202020202020202020202020286
+:102A30000202020202020202020202020202020276
+:102A40000202020202020202020202020202020167
+:102A50000202020202020202020202020202020256
+:102A6000020202020202020202020201010101014B
+:102A7000010101010101010202020202020202023D
+:102A80000202020202020202020202020202020226
+:102A9000020202020202020202020202010101011A
+:102AA000010101010101010202020202020202020D
+:102AB00002020202020202020202020202020201F7
+:102AC00002010102010202000002000000000000F9
+:102AD00000000001000101020202020202020202E1
+:102AE00002020202020200020202020202020202C8
+:102AF00002020202020202020202020202020202B6
+:102B000002020202020202020202020202020202A5
+:102B10000202020202020202020202020202020295
+:102B20000202020202020202020202020202020285
+:102B30000202020202020202020202020202020275
+:102B40000202020202020202020202020202020265
+:102B50000202020202020202020202020202020255
+:102B60000202020202020202020202020201010148
+:102B70000101020201020102020202020202020239
+:102B80000202020202020202020202020202020225
+:102B90000202020202020202020202020201010118
+:102BA000010101020101010202020202020202020B
+:102BB00002020202020202020202020202020202F5
+:102BC00002020202010202000002000000020000F4
+:102BD00000020001000001020202020202020202DF
+:102BE00002020202020200020202020202020202C7
+:102BF00002020202020202020202020202020202B5
+:102C000002020202020202020202020202020202A4
+:102C10000202020202020202020202020202020294
+:102C20000202020202020202020202020202020284
+:102C30000202020202020202020202020202020274
+:102C40000202020202020202020202020202020264
+:102C50000202020202020202020202020202020254
+:102C60000202020202020202020202020201020146
+:102C70000201020202020202020202020202020235
+:102C80000202020202020202020202020202020224
+:102C90000202020202020202020202020201020116
+:102CA0000101020201020102020202020202020208
+:102CB00002020202020202020202020202020202F4
+:102CC00002020202020202000202020202020200E8
+:102CD00002020201020001020202020202020202D8
+:102CE00002020202020200020202020202020202C6
+:102CF00002020202020202020202020202020202B4
+:102D000002020202020202020202020202020202A3
+:102D10000202020202020202020202020202020293
+:102D20000202020202020202020202020202020283
+:102D30000202020202020202020202020202020273
+:102D40000202020202020202020202020202020263
+:102D50000202020202020202020202020202020253
+:102D60000202020202020202020202020202020144
+:102D70000201020202020202020202020202020234
+:102D80000202020202020202020202020202020223
+:102D90000202020202020202020202020202020213
+:102DA0000201020202020202020202020202020204
+:102DB00002020202020202020202020202020202F3
+:102DC00002020202020202000202020202020202E5
+:102DD00002020200020201020202020202020202D6
+:102DE00002020202020200020202020202020202C5
+:102DF00002020202020202020202020202020202B3
+:102E000002020202020202020202020202020202A2
+:102E10000202020202020202020202020202020292
+:102E20000202020202020202020202020202020282
+:102E30000202020202020202020202020202020272
+:102E40000202020202020202020202020202020262
+:102E50000202020202020202020202020202020252
+:102E60000202020202020202020202020202020242
+:102E70000202020202020202020202020202020232
+:102E80000202020202020202020202020202020222
+:102E90000202020202020202020202020202020212
+:102EA0000201020202020202020202020202020203
+:102EB00002020202020202020202020202020202F2
+:102EC00002020202020202000202020202020202E4
+:102ED00002020200020201010202020202020201D7
+:102EE00002010202010101020202020202020202C6
+:102EF00002020202020202020202020202020202B2
+:102F000002020202020202020202020202020202A1
+:102F10000202020202020202020202020202020291
+:102F20000202020202020202020202020202020281
+:102F30000202020202020202020202020202020271
+:102F40000202020202020202020202020202020261
+:102F50000202020202020202020202020202020251
+:102F60000202020202020202020202020202020241
+:102F70000202020202020202020202020202020231
+:102F80000202020202020202020202020202020221
+:102F90000202020202020202020202020202020211
+:102FA0000202020202020202020202020202020201
+:102FB00002020202020202020202020202020202F1
+:102FC00002020202020202020202020202020202E1
+:102FD00002020202020200010101010101010101DC
+:102FE00001010101010101020202020202020202C8
+:102FF00002020202020202020202020202020202B1
+:1030000002020202020202020202020202020202A0
+:103010000202020202020202020202020202020290
+:103020000202020202020202020202020202020280
+:103030000202020202020202020202020202020270
+:103040000202020202020202020202020202020260
+:103050000202020202020202020202020202020250
+:103060000202020202020202020202020202020240
+:103070000202020202020202020202020202020230
+:103080000202020202020202020202020202020220
+:103090000202020202020202020202020202020210
+:1030A0000202020202020202020202020202020200
+:1030B00002020202020202020202020202020202F0
+:1030C00002020202020202020202020202020202E0
+:1030D00002020202020200010101010101010101DB
+:1030E00001010101010101020202020202020202C7
+:1030F00002020202020202020202020202020202B0
+:10310000020202020202020202020202020202029F
+:10311000020202020202020202020202020202028F
+:10312000020202020202020202020202020202027F
+:10313000020202020202020202020202020202026F
+:10314000020202020202020202020202020202025F
+:10315000020202020202020202020202020202024F
+:10316000020202020202020202020202020202023F
+:10317000020202020202020202020202020202022F
+:10318000020202020202020202020202020202021F
+:10319000020202020202020202020202020202020F
+:1031A00002020202020202020202020202020202FF
+:1031B00002020202020202020202020202020202EF
+:1031C00002020202020202020202020202020202DF
+:1031D00002020202020202010101010101010101D8
+:1031E00001010101010101010202020202020202C7
+:1031F00002020202020202020202020202020202AF
+:10320000020202020202020202020202020202029E
+:10321000020202020202020202020202020202028E
+:10322000020202020202020202020202020202027E
+:10323000020202020202020202020202020202026E
+:10324000020202020202020202020202020202025E
+:10325000020202020202020202020202020202024E
+:10326000020202020202020202020202020202023E
+:10327000020202020202020202020202020202022E
+:10328000020202020202020202020202020202021E
+:10329000020202020202020202020202020202020E
+:1032A00002020202020202020202020202020202FE
+:1032B00002020202020202020202020202020202EE
+:1032C00002020202020202020202020202020202DE
+:1032D00002020202020202010101010101010101D7
+:1032E00001010101010101020101010101010101CD
+:1032F00001010101010101020202020202020202B5
+:10330000020202020202020202020202020202029D
+:10331000020202020202020202020202020202028D
+:10332000020202020202020202020202020202027D
+:10333000020202020202020202020202020202026D
+:10334000020202020202020202020202020202025D
+:10335000020202020202020202020202020202024D
+:10336000020202020202020202020202020202023D
+:10337000020202020202020202020202020202022D
+:10338000020202020202020202020202020202021D
+:10339000020202020202020202020202020202020D
+:1033A00002020202020202020202020202020202FD
+:1033B00002020202020202020202020202020202ED
+:1033C00002020202020202020202020202020202DD
+:1033D00002020202020202010101010101010101D6
+:1033E00001010101010101010202020202020202C5
+:1033F00002020202020202010202020202020202AE
+:10340000020202020202020202020202020202029C
+:10341000020202020202020202020202020202028C
+:10342000020202020202020202020202020202027C
+:10343000020202020202020202020202020202026C
+:10344000020202020202020202020202020202025C
+:10345000020202020202020202020202020202024C
+:10346000020202020202020202020202020202023C
+:10347000020202020202020202020202020202022C
+:10348000020202020202020202020202020202021C
+:10349000020202020202020202020202020202020C
+:1034A00002020202020202020202020202020202FC
+:1034B00002020202020202020202020202020202EC
+:1034C00002020202020202020202020202020202DC
+:1034D00002020202020202010101010101010101D5
+:1034E00001010101010101010101010101010101CC
+:1034F00001010101010101020101010101010101BB
+:1035000001010101010101020202020202020202A2
+:103510000202020202020201010101010101010194
+:103520000101010101010100000000000000000094
+:10353000000000000000000000000000000000008B
+:103540000000000000000002020202020202020269
+:10355000020202020202020202020202020202024B
+:10356000020202020202020202020202020202023B
+:10357000020202020202020202020202020202022B
+:10358000020202020202020202020202020202021B
+:10359000020202020202020202020202020202020B
+:1035A00002020202020202020202020202020202FB
+:1035B00002020202020202020202020202020202EB
+:1035C00002020202020202020202020202020202DB
+:1035D00002020202020202010101010101010101D4
+:1035E00001010101010101010101010101010101CB
+:1035F00001010101010101010202020202020202B3
+:10360000020202020202020202020202020202029A
+:10361000020202020202020202020202020202028A
+:10362000020202020202020000000000000000008C
+:10363000000000000000000000000000000000008A
+:103640000000000000000001010101010101010171
+:103650000101010101010100000000000000000063
+:103660000000000000000001010101010101010151
+:103670000101010101010102020202020202020231
+:10368000020202020202020202020202020202021A
+:10369000020202020202020202020202020202020A
+:1036A00002020202020202020202020202020202FA
+:1036B00002020202020202020202020202020202EA
+:1036C00002020202020202020202020202020202DA
+:1036D00002020202020202010101010101010101D3
+:1036E00001010101010101010101010101010101CA
+:1036F00001010101010101010101010101010101BA
+:1037000001010101010101000000000000000000B2
+:1037100000000000000000010101010101010101A0
+:103720000101010101010100000000000000000092
+:103730000000000000000000000000000000000089
+:103740000000000000000002020202020202020267
+:10375000020202020202020000000000000000005B
+:103760000000000000000002020202020202020247
+:103770000202020202020202020202020202020229
+:103780000202020202020202020202020202020219
+:103790000202020202020202020202020202020209
+:1037A00002020202020202020202020202020202F9
+:1037B00002020202020202020202020202020202E9
+:1037C00002020202020202020202020202020202D9
+:1037D00002020202020202010101010101010101D2
+:1037E00001010101010101010101010101010101C9
+:1037F00001010101010101010101010101010101B9
+:1038000001010101010101010101010101010101A8
+:103810000101010101010101010101010101010198
+:103820000101010101010101010101010101010188
+:103830000101010101010100000000000000000081
+:103840000000000000000000000000000000000078
+:103850000000000000000000000000000000000068
+:103860000000000000000000000000000000000058
+:103870000000000000000000000000000000000048
+:103880000000000000000002020202020202020226
+:103890000202020202020202020202020202020208
+:1038A00002020202020202020202020202020202F8
+:1038B00002020202020202000000000000000000FA
+:1038C00000000000000000020202020202020202E6
+:1038D00002020202020202010101010101010101D1
+:1038E00001010101010101010101010101010101C8
+:1038F00001010101010101010101010101010101B8
+:1039000001010101010101010101010101010101A7
+:103910000101010101010101010101010101010197
+:103920000101010101010101010101010101010187
+:103930000101010101010101010101010101010177
+:103940000101010101010100000000000000000070
+:103950000000000000000000000000000000000067
+:103960000000000000000000000000000000000057
+:103970000000000000000000000000000000000047
+:103980000000000000000002020202020202020225
+:103990000202020202020201010101010101010110
+:1039A00001010101010101020202020202020202FE
+:1039B00002020202020202000000000000000000F9
+:1039C00000000000000000020202020202020202E5
+:1039D00002020202020202010101010101010101D0
+:1039E00001010101010101010101010101010101C7
+:1039F00001010101010101010101010101010101B7
+:103A000001010101010101010101010101010101A6
+:103A10000101010101010101010101010101010196
+:103A20000101010101010101010101010101010186
+:103A30000101010101010101010101010101010176
+:103A40000101010101010101010101010101010166
+:103A50000101010101010101010101010101010156
+:103A6000010101010101010000000000000000004F
+:103A70000000000000000000000000000000000046
+:103A80000000000000000002020202020202020224
+:103A90000202020202020202020202020202020206
+:103AA0000202020202020200000000000000000008
+:103AB00000000000000000010101010101010101FD
+:103AC00001010101010101020202020202020202DD
+:103AD00002020202020202010101010101010101CF
+:103AE00001010101010101010101010101010101C6
+:103AF00001010101010101010101010101010101B6
+:103B000001010101010101010101010101010101A5
+:103B10000101010101010101010101010101010195
+:103B20000101010101010101010101010101010185
+:103B30000101010101010101010101010101010175
+:103B40000101010101010101010101010101010165
+:103B50000101010101010101010101010101010155
+:103B60000101010101010101010101010101010145
+:103B70000101010101010101010101010101010135
+:103B80000101010101010101010101010101010125
+:103B9000010101010101010000000000000000001E
+:103BA0000000000000000000000000000000000015
+:103BB00000000000000000010101010101010101FC
+:103BC00001010101010101020202020202020202DC
+:103BD00002020202020202010101010101010101CE
+:103BE00001010101010101010101010101010101C5
+:103BF00001010101010101010101010101010101B5
+:103C000001010101010101010101010101010101A4
+:103C10000101010101010101010101010101010194
+:103C20000101010101010101010101010101010184
+:103C30000101010101010101010101010101010174
+:103C40000101010101010101010101010101010164
+:103C50000101010101010101010101010101010154
+:103C60000101010101010101010101010101010144
+:103C70000101010101010101010101010101010134
+:103C80000101010101010101010101010101010124
+:103C90000101010101010101010101010101010114
+:103CA0000101010101010101010101010101010104
+:103CB00001010101010101010101010101010101F4
+:103CC00001010101010101020202020202020202DB
+:103CD00002020202020202010101010101010101CD
+:103CE00001010101010101010101010101010101C4
+:103CF00001010101010101010101010101010101B4
+:103D000001010101010101010101010101010101A3
+:103D10000101010101010101010101010101010193
+:103D20000101010101010101010101010101010183
+:103D30000101010101010101010101010101010173
+:103D40000101010101010101010101010101010163
+:103D50000101010101010101010101010101010153
+:103D60000101010101010101010101010101010143
+:103D70000101010101010101010101010101010133
+:103D80000101010101010101010101010101010123
+:103D90000101010101010101010101010101010113
+:103DA0000101010101010101010101010101010103
+:103DB00001010101010101010101010101010101F3
+:103DC00001010101010101020202020202020202DA
+:103DD00002020202020202000000000000000000D5
+:103DE00000000000000000000000000000000000D3
+:103DF00000000000000000000000000000000000C3
+:103E000000000000000000000000000000000000B2
+:103E10000000000000000002020202020202020290
+:103E20000202020202020202020202020202020272
+:103E30000202020202020202020202020202020262
+:103E40000202020202020202020202020202020252
+:103E50000202020202020202020202020202020242
+:103E60000202020202020202020202020202020232
+:103E70000202020202020202020202020202020222
+:103E80000202020202020202020202020202020212
+:103E90000202020202020202020202020202020202
+:103EA00002020202020202020202020202020202F2
+:103EB00002020202020202020202020202020202E2
+:103EC00002020202020202000000000000000000E4
+:103ED00000000000000000000000000000000000E2
+:103EE00000000000000000000000000000000000D2
+:103EF00000000000000000000000000000000000C2
+:103F000000000000000000000000000000000000B1
+:103F100000000000000000000000000000000000A1
+:103F20000000000000000000000000000000000091
+:103F30000000000000000000000000000000000081
+:103F40000000000000000000000000000000000071
+:103F50000000000000000000000000000000000061
+:103F60000000000000000000000000000000000051
+:103F70000000000000000000000000000000000041
+:103F80000000000000000000000000000000000031
+:103F90000000000000000000000000000000000021
+:103FA0000000000000000000000000000000000011
+:103FB00000000000000000020202020202020202EF
+:103FC00002020202020202000000000000000000E3
+:103FD00000000000000000000000000000000000E1
+:103FE00000000000000000000000000000000000D1
+:103FF00000000000000000000000000000000000C1
+:1040000000000000000000000000000000000000B0
+:1040100000000000000000000000000000000000A0
+:104020000000000000000000000000000000000090
+:104030000000000000000000000000000000000080
+:104040000000000000000000000000000000000070
+:104050000000000000000000000000000000000060
+:104060000000000000000000000000000000000050
+:104070000000000000000000000000000000000040
+:104080000000000000000000000000000000000030
+:104090000000000000000000000000000000000020
+:1040A0000000000000000000000000000000000010
+:1040B00000000000000000020202020202020202EE
+:1040C00002020202020202000000000000000000E2
+:1040D00000000000000000000000000000000000E0
+:1040E00000000000000000000000000000000000D0
+:1040F00000000000000000000000000000000000C0
+:1041000000000000000000000000000000000000AF
+:10411000000000000000000000000000000000009F
+:10412000000000000000000000000000000000008F
+:10413000000000000000000000000000000000007F
+:10414000000000000000000000000000000000006F
+:10415000000000000000000000000000000000005F
+:10416000000000000000000000000000000000004F
+:10417000000000000000000000000000000000003F
+:10418000000000000000000000000000000000002F
+:10419000000000000000000000000000000000001F
+:1041A000000000000000000000000000000000000F
+:1041B00000000000000000000000000000000000FF
+:1041C00000000000000000000000000000000000EF
+:1041D00000000000000000310000000000000000AE
+:1041E00000000000000000000100000000000000CE
+:1041F00000000000000000000000000000010000BE
+:1042000000000000000000000000000000010000AD
+:10421000000000000000000000000100000001009C
+:10422000000000000000000000000000000000008E
+:10423000000000000000000000000000000100007D
+:10424000000000000000000000000000000000006E
+:10425000000000000000000000000000000000005E
+:10426000000000000000000000000000000100004D
+:10427000000000000000000000000000000000003E
+:10428000000000000000000000000000000100002D
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000100000D
+:1042B00000000000000000000000000000000000FE
+:1042C00000000000000000000000000000000000EE
+:1042D00000000000000000000000000000000000DE
+:1042E00000000000000000010100000000000000CC
+:1042F00000000000000000000000000000010000BD
+:1043000000000000000000000000010000010100AA
+:10431000000000000000000000000100000001009B
+:10432000000000000000000000000000000100008C
+:10433000000000000000000000000000000100007C
+:10434000000000000000000000000000000100006C
+:10435000000000000000000000000000000100005C
+:10436000000000000000000000000000000100004C
+:10437000000000000000000000000000000100003C
+:10438000000000000000000000000000000100002C
+:10439000000000000000000000000000000000001D
+:1043A000000000000000000000000000000100000C
+:1043B00000000000000000000000000000000000FD
+:1043C00000000000000000000000000000000000ED
+:1043D00000000000000000000000000000000000DD
+:1043E00000000000000000010101000000000000CA
+:1043F00000000000000000000000000000010000BC
+:1044000000000000000000000000010000010100A9
+:104410000000000000000000000001010100010098
+:104420000000000000000000000001000001010089
+:10443000000000000000000000000000000100007B
+:10444000000000000000000000000000000100006B
+:10445000000000000000000000000000000100005B
+:10446000000000000000000000000000000100004B
+:10447000000000000000000000000000000100003B
+:104480000000000000000000000001000001010029
+:10449000000000000000000000000000000000001C
+:1044A000000000000000000000000000000100000B
+:1044B00000000000000000000000000000000000FC
+:1044C00000000000000000000000000000000000EC
+:1044D00000000000000000000000000000000000DC
+:1044E00000000000000000010101010100000000C7
+:1044F00000000000000000000000000000010000BB
+:1045000000000000000000000000010101010100A6
+:104510000000000001010000010001010100010094
+:104520000000000000000000000001000001010088
+:104530000000000000000000000001000001010078
+:10454000000000000000000000000000000100006A
+:104550000000000000000000000001000001010058
+:10456000000000000000000000000000000100004A
+:104570000000000000000000000000000001010039
+:104580000000000000000000000001000001010028
+:10459000000000000000000000000000000000001B
+:1045A000000000000000000000000000000100000A
+:1045B00000000000000000000000000000000000FB
+:1045C00000000000000000000000000000000000EB
+:1045D00000000000000000000000000000000000DB
+:1045E00000000000010100010101010100000000C4
+:1045F00000000000000000000000010000010100B8
+:1046000000000000000000000100010101010100A4
+:104610000000000001010100010001010100010092
+:104620000000000000000000000001010101010085
+:104630000000000000000000000001000001010077
+:104640000000000000000000000000000001000069
+:104650000000000000000000000001000001010057
+:104660000000000000000000000001000001010047
+:104670000000000000000000000000000001010038
+:104680000000000000000000000001010101010025
+:10469000000000000000000000000000000000001A
+:1046A0000000000000000000000000000001000009
+:1046B00000000000000000000000000000010000F9
+:1046C00000000000000000000000000000000000EA
+:1046D00000000000000000000000000000000000DA
+:1046E00000000000010101010101010100000000C2
+:1046F00000000000000000000000010000010100B7
+:1047000000000000000000000100010101010100A3
+:10471000000000010101010001010101010001008F
+:104720000000000001000000000001010101010083
+:104730000000000000000000000001010101010074
+:104740000000000000000000000000000001000068
+:104750000000000000000000000001010101010054
+:104760000000000000000000000001000001010046
+:104770000000000000000000000001010101010034
+:104780000000000000000000010101010101010022
+:104790000000000000000000000000000000000019
+:1047A0000000000000000000000000000001000008
+:1047B00000000000000000000000000000010000F8
+:1047C00000000000000000000000000000000000E9
+:1047D00000000000000000000000000000000000D9
+:1047E00000000000010101010101010100000000C1
+:1047F00000000000000000000000010100010100B5
+:10480000000100000100000001010101010101009F
+:10481000000000010101010101010101010001008D
+:104820000000000001000000000001010101010082
+:104830000000000001000000000001010101010072
+:104840000000000000000000000000000001000067
+:104850000000000001010000000001010101010051
+:104860000000000000000000000001010101010043
+:104870000000000000000000010001010101010032
+:10488000000000000000010101010101010101001F
+:104890000000000000000000000000000000000018
+:1048A0000000000000000000000001000001010005
+:1048B00000000000000000000000000000010000F7
+:1048C00000000000000000000000000000000000E8
+:1048D00000000000000000000000000000000000D8
+:1048E00000000000010101010101010100000000C0
+:1048F00000000000000000000000010100010100B4
+:10490000000100000100010001010101010101009D
+:10491000000101010101010101010101010001008A
+:10492000000100010101000001010101010101007C
+:104930000000000001000000000001010101010071
+:104940000000000000000000000001000001010064
+:104950000000000001010000000001010101010050
+:104960000000000001000000010001010101010040
+:10497000000000000000010101000101010101002F
+:10498000000000000101010101010101010101001C
+:104990000000000000000000000000000000000017
+:1049A0000000000000000000000001000001010004
+:1049B00000000000000000000000000000010000F6
+:1049C00000000000000000000000000000000000E7
+:1049D00000000000000000000000000000000000D7
+:1049E00000010101010101010101010100000000BC
+:1049F00000000000000000000000010101010100B2
+:104A0000000101000101010001010101010101009A
+:104A10000001010101010101010101010101010088
+:104A20000001000101010101010101010101010079
+:104A3000000100000101000001010101010101006C
+:104A40000000000000000000000001000001010063
+:104A5000000100010101000001010101010101004B
+:104A6000000000000100010001000101010101003E
+:104A7000000000000101010101010101010101002B
+:104A8000000000000101010101010101010101001B
+:104A90000000000000000000000000000000000016
+:104AA0000000000000000000000001010101010001
+:104AB00000000000000000000000000000010100F4
+:104AC00000000000000000000000000000000000E6
+:104AD00000000000000000000000000000010000D5
+:104AE00000010101010101010101010101000000BA
+:104AF00000000000000000000000010101010100B1
+:104B00000001010001010101010101010101010098
+:104B10000001010101010101010101010101010087
+:104B20000001010101010101010101010101010077
+:104B3000000100000101010001010101010101006A
+:104B40000000000000000000000001010101010060
+:104B50000001000101010101010101010101010048
+:104B6000000000000101010001010101010101003B
+:104B7000000000000101010101010101010101002A
+:104B80000001010101010101010101010101010017
+:104B90000000000000000000000000000001000014
+:104BA00000000000000000000100010101010100FF
+:104BB00000000000000000000000000000010100F3
+:104BC00000000000000000000000000000000000E5
+:104BD00000000000000000000000000000010000D4
+:104BE00000010101010101010101010101000000B9
+:104BF00000000000000000000000010101010100B0
+:104C00000001010101010101010101010101010096
+:104C10000101010101010101010101010101010085
+:104C20000101010101010101010101010101010075
+:104C30000001010101010100010101010101010067
+:104C4000000000000000000000000101010101005F
+:104C50000001010101010101010101010101010046
+:104C60000000000001010101010101010101010039
+:104C70000001000101010101010101010101010027
+:104C80000001010101010101010101010101010016
+:104C90000000000000000000000000000001000013
+:104CA00000000000000001000100010101010100FD
+:104CB00000000000000001000000010101010101ED
+:104CC00000000000000000000000000000000000E4
+:104CD00000000000000000000000010101010000D0
+:104CE00001010101010101010101010101010000B6
+:104CF00000010000010000000101010101010100AB
+:104D00000001010101010101010101010101010095
+:104D10000101010101010101010101010101010084
+:104D20000101010101010101010101010101010074
+:104D30000101010101010101010101010101010064
+:104D4000000000000000000000000101010101005E
+:104D50000001010101010101010101010101010045
+:104D60000001010101010101010101010101010035
+:104D70000001000101010101010101010101010026
+:104D80000001010101010101010101010101010015
+:104D90000000000000000000000000000001000012
+:104DA00000010000010101000101010101010100F8
+:104DB00000000000000001000100010101010101EB
+:104DC00000000000000000000000000000000000E3
+:104DD00000000000000000000101010101010000CD
+:104DE00001010101010101010101010101010001B4
+:104DF00000010000010000000101010101010100AA
+:104E00000001010101010101010101010101010094
+:104E10000101010101010101010101010101010083
+:104E20000101010101010101010101010101010073
+:104E30000101010101010101010101010101010063
+:104E4000000000000100000001010101010101005A
+:104E50000001010101010101010101010101010044
+:104E60000001010101010101010101010101010034
+:104E70000001010101010101010101010101010024
+:104E80000101010101010101010101010101010013
+:104E90000000000000000000000000000001000011
+:104EA00000010000010101010101010101010100F6
+:104EB00000000000000001000100010101010101EA
+:104EC00000000000000000010000000000000000E1
+:104ED00000000000000001000101010101010000CB
+:104EE00001010101010101010101010101010001B3
+:104EF00000010100010000000101010101010100A8
+:104F00000101010101010101010101010101010092
+:104F10000101010101010101010101010101010082
+:104F20000101010101010101010101010101010171
+:104F30000101010101010101010101010101010062
+:104F40000000000001000101010101010101010057
+:104F50000101010101010101010101010101010042
+:104F60000001010101010101010101010101010033
+:104F70000101010101010101010101010101010022
+:104F80000101010101010101010101010101010012
+:104F90000000000000000000000000000001000010
+:104FA00000010101010101010101010101010100F3
+:104FB00000010100010101000101010101010101E4
+:104FC00000000000000000010000000000000000E0
+:104FD00000000000010101000101010101010000C8
+:104FE00001010101010101020201010101010001B0
+:104FF00000010100010001000101010101010100A6
+:105000000101010101010101010101010101010190
+:105010000101010101010101010101010101010180
+:105020000101010101010101010101010101010170
+:105030000101010101010101010101010101010061
+:105040000001010001010101010101010101010053
+:105050000101010101010101010101010101010041
+:105060000101010101010101010101010101010031
+:105070000101010101010101010101010101010120
+:105080000101010101010101010101010101010011
+:10509000000000000000000000000000000100000F
+:1050A00001010101010101010101010101010100F1
+:1050B00000010100010101010101010101010101E2
+:1050C00001000000000000010000000000010000DD
+:1050D00000000000010101000101010101010101C5
+:1050E00001010101020201020202010101010001AC
+:1050F00000010100010101000101010101010101A3
+:10510000010101010101010101010101010101018F
+:10511000010101010101010101010101010101017F
+:10512000010101010101010101010101010101016F
+:105130000101010101010101010101010101010060
+:105140000001010001010101010101010101010151
+:105150000101010101010101010101010101010040
+:10516000010101010101010101010101010101012F
+:10517000010101010101010101010101010101011F
+:105180000101010101010101010101010101010010
+:10519000000000000000000000000000000100000E
+:1051A00001010101010101010101010101010100F0
+:1051B00000010101010101010101010101010101E0
+:1051C00001000000000000010000000000010000DC
+:1051D00001010101010101000101010101010102BF
+:1051E00002020202020202020202010101010002A5
+:1051F00000010100010101010101010101010101A1
+:10520000010101010101010101010101010101018E
+:10521000010101010101010101010101010101017E
+:10522000010101010101010101010101010101016E
+:10523000010101010101010101010101010101005F
+:10524000000101010101010101010101010101014F
+:10525000010101010101010101010101010101003F
+:10526000010101010101010101010101010101012E
+:10527000010101010101010101010101010101011E
+:10528000010101010101010101010101010101000F
+:10529000000000000000000000000000000100000D
+:1052A00001010101010101010101010101010100EF
+:1052B00000010101010101010101010101010102DE
+:1052C00001000000000000010000000000010000DB
+:1052D00001010101010101000101010101010102BE
+:1052E00002020202020202020202020201010002A2
+:1052F000000101010101010101010101010101019F
+:10530000010101010101010101010101010101018D
+:10531000010101010101010101010101010101017D
+:10532000010101010101010101010101010101026C
+:10533000010101010101010101010101010101005E
+:10534000010101010101010101010101010101014D
+:10535000010101010101010101010101010101003E
+:10536000010101010101010101010101010101012D
+:10537000010101010101010101010101010101011D
+:10538000010101010101010101010101010101000E
+:10539000000000000000000000000000000101000B
+:1053A00001010101010101010101010101010100EE
+:1053B00000010101010101010101010101010102DD
+:1053C00001010101000000010000000000010000D7
+:1053D00001010101010101000101010101010102BD
+:1053E00002020202020202020202020201010002A1
+:1053F000010101010101010101010101010201019C
+:10540000010201010101010101010201010101018A
+:10541000010101010101010101010101010101017C
+:10542000010101010101010101010101010101026B
+:105430000202010102010101010102010101010059
+:10544000010101010101010101010101010101014C
+:10545000010101010101010101010101010101013C
+:10546000010101010101010101010101010101012C
+:10547000010101010101010101010101010101011C
+:10548000010101010101010101010101010101000D
+:105490000001000000000000000000000001010108
+:1054A00001010101010101010101010101010101EC
+:1054B00001010101010101010101010101010102DB
+:1054C00001010101000000010000000000010100D5
+:1054D00001010101010101000101010101010102BC
+:1054E00002020202020202020202020201010002A0
+:1054F0000101010101010101010102010102010299
+:105500000102020102010101020102020202020182
+:105510000101010202020101010102010101010276
+:105520000202010202010101010102010101010265
+:105530000202020202020101010102020202020051
+:10554000010101010101010101010101010101014B
+:10555000010101010101010101010101010101013B
+:10556000010101010101010101010101010101012B
+:10557000010101010101010101010101010101011B
+:10558000010101010101010101010101010101000C
+:105590000101000000000000000000000001010106
+:1055A00001010101010101010101010101010101EB
+:1055B00001010101010101010101010101010102DA
+:1055C00001010101010100010000000000010100D2
+:1055D00001010101010101000101010101010102BB
+:1055E000020202020202020202020202020100029E
+:1055F0000102010101010101010102020102020295
+:10560000020202020202020102020202020202027B
+:10561000020202020202020102010202020102026D
+:10562000020202020202010101010202020202025E
+:10563000020202020202020102020202020202004D
+:105640000101010101010101010101010101010249
+:105650000102010202020101010102010102010134
+:105660000101010101010101010101010101010229
+:105670000101010101010101010101010102010119
+:10568000010101010101010101010101010101000B
+:105690000101010001000000010000000001010102
+:1056A00001010101010101010101010101010101EA
+:1056B00001010101010101010101010101010102D9
+:1056C00002010101010101010000010100010100CD
+:1056D00001010101010101000101010101010102BA
+:1056E000020202020202020202020202020100029D
+:1056F0000102020102010101010102020202020291
+:105700000202020202020202020202020202020279
+:10571000020202020202020202020202020102026A
+:105720000202020202020202020202020202020259
+:10573000020202020202020202020202020202014A
+:105740000101010101010101010101010102010247
+:10575000020202020202010101010202020202012E
+:105760000101010101010101010101010102010227
+:10577000020201020202020202010202020202020B
+:105780000101010101010101010102010102010107
+:1057900001010100010001010100010100010101FD
+:1057A00001010101010101010101010101020101E8
+:1057B00001010101010101010101010101010102D8
+:1057C00002010101010101010000010100010100CC
+:1057D00001010101010101000101010101010102B9
+:1057E000020202020202020202020202020100029C
+:1057F000020202010201010102020202020202028D
+:105800000202020202020202020202020202020278
+:105810000202020202020202020202020201020269
+:105820000202020202020202020202020202020258
+:105830000202020202020202020202020202020149
+:105840000101010101010101010101010102010246
+:105850000202020202020202020202020202020129
+:105860000101010102010101010102010102010224
+:105870000202020202020202020202020202020208
+:1058800002020202020202020202020202020201F9
+:1058900001010101010101010101010100010101F9
+:1058A00001010101010101010101010101020101E7
+:1058B00001010101010101010101010101010102D7
+:1058C00002010101010101020000010101010100C9
+:1058D00000010101010101000101010101010102B9
+:1058E000020202020202020202020202020200029A
+:1058F0000202020202020201020202020202020289
+:105900000202020202020202020202020202020277
+:105910000202020202020202020202020201020268
+:105920000202020202020202020202020202020257
+:105930000202020202020202020202020202020148
+:105940000101010101010101010102010102010244
+:105950000202020202020202020202020202020227
+:105960000202020202020201020102020202020219
+:105970000202020202020202020202020202020207
+:1059800002020202020202020202020202020202F7
+:1059900001010101010101010101010101010102F6
+:1059A00002020101010101010101020101020101E3
+:1059B00001010101010101010101010101010102D6
+:1059C00002020202010101020101010101010100C3
+:1059D00000010101010101000101010101010102B8
+:1059E0000202020202020202020202020202000299
+:1059F0000202020202020202020202020202020287
+:105A00000202020202020202020202020202020276
+:105A10000202020202020202020202020201020267
+:105A20000202020202020202020202020202020256
+:105A30000202020202020202020202020202020246
+:105A4000020202010201010101010202020202023C
+:105A50000202020202020202020202020202020226
+:105A60000202020202020202020202020202020216
+:105A70000202020202020202020202020202020206
+:105A800002020202020202020202020202020202F6
+:105A900002010101010101010101010101020102F3
+:105AA00002020202020202010201020202020202D8
+:105AB00001010101010101010101010101020102D4
+:105AC00002020202010101020101010101010100C2
+:105AD00000010101010101010101010101010102B6
+:105AE0000202020202020202020202020202000298
+:105AF0000202020202020202020202020202020286
+:105B00000202020202020202020202020202020275
+:105B10000202020202020202020202020202020265
+:105B20000202020202020202020202020202020255
+:105B30000202020202020202020202020202020245
+:105B40000202020202020202020202020202020235
+:105B50000202020202020202020202020202020225
+:105B60000202020202020202020202020202020215
+:105B70000202020202020202020202020202020205
+:105B800002020202020202020202020202020202F5
+:105B900002020101010101010101010101020102F1
+:105BA00002020202020202020202020202020202D5
+:105BB00001020201010102010101010101020102D0
+:105BC00002020202020201020101010101020100BE
+:105BD00000000000000000010000000000000102C1
+:105BE0000202020202020202020202020202000297
+:105BF0000202020202020202020202020202020285
+:105C00000202020202020202020202020202020274
+:105C10000202020202020202020202020202020264
+:105C20000202020202020202020202020202020254
+:105C30000202020202020202020202020202020244
+:105C40000202020202020202020202020202020234
+:105C50000202020202020202020202020202020224
+:105C60000202020202020202020202020202020214
+:105C70000202020202020202020202020202020204
+:105C800002020202020202020202020202020202F4
+:105C900002020201010101010101010101020102EF
+:105CA00002020202020202020202020202020202D4
+:105CB00002020202020202010201020202020202C6
+:105CC00002020202020202020101010101020100BC
+:105CD00002020202020202010202020202020102A6
+:105CE0000202020202020202020202020202000296
+:105CF0000202020202020202020202020202020284
+:105D00000202020202020202020202020202020273
+:105D10000202020202020202020202020202020263
+:105D20000202020202020202020202020202020253
+:105D30000202020202020202020202020202020243
+:105D40000202020202020202020202020202020233
+:105D50000202020202020202020202020202020223
+:105D60000202020202020202020202020202020213
+:105D70000202020202020202020202020202020203
+:105D800002020202020202020202020202020202F3
+:105D900002020202020101010101010101020102EC
+:105DA00002020202020202020202020202020202D3
+:105DB00002020202020202020202020202020202C3
+:105DC00002020202020202020101020201020200B8
+:105DD00002020202020202010202020202020102A5
+:105DE0000202020202020202020202020202000295
+:105DF0000202020202020202020202020202020283
+:105E00000202020202020202020202020202020272
+:105E10000202020202020202020202020202020262
+:105E20000202020202020202020202020202020252
+:105E30000202020202020202020202020202020242
+:105E40000202020202020202020202020202020232
+:105E50000202020202020202020202020202020222
+:105E60000202020202020202020202020202020212
+:105E70000202020202020202020202020202020202
+:105E800002020202020202020202020202020202F2
+:105E900002020202020202020201010101020202E6
+:105EA00002020202020202020202020202020202D2
+:105EB00002020202020202020202020202020202C2
+:105EC00002020202020202020202020202020200B4
+:105ED00002020202020202010202020202020002A5
+:105EE0000202020202020202020202020202000294
+:105EF0000202020202020202020202020202020282
+:105F00000202020202020202020202020202020271
+:105F10000202020202020202020202020202020261
+:105F20000202020202020202020202020202020251
+:105F30000202020202020202020202020202020241
+:105F40000202020202020202020202020202020231
+:105F50000202020202020202020202020202020221
+:105F60000202020202020202020202020202020211
+:105F70000202020202020202020202020202020201
+:105F800002020202020202020202020202020202F1
+:105F900002020202020202020202020201020202E2
+:105FA00002020202020202020202020202020202D1
+:105FB00002020202020202020202020202020202C1
+:105FC00002020202020202020202020202020202B1
+:105FD00002020202020202010202020202020202A2
+:105FE0000202020202020202020202020202000293
+:105FF0000202020202020202020202020202020281
+:106000000202020202020202020202020202020270
+:106010000202020202020202020202020202020260
+:106020000202020202020202020202020202020250
+:106030000202020202020202020202020202020240
+:106040000202020202020202020202020202020230
+:106050000202020202020202020202020202020220
+:106060000202020202020202020202020202020210
+:106070000202020202020202020202020202020200
+:1060800002020202020202020202020202020202F0
+:1060900002020202020202020202020202020202E0
+:1060A00002020202020202020202020202020202D0
+:1060B00002020202020202020202020202020202C0
+:1060C00002020202020202020202020202020202B0
+:1060D00002020202020202010202020202020201A2
+:1060E000010101010101010101010202020201029B
+:1060F0000202020202020202020202020202020280
+:10610000020202020202020202020202020202026F
+:10611000020202020202020202020202020202025F
+:10612000020202020202020202020202020202024F
+:10613000020202020202020202020202020202023F
+:10614000020202020202020202020202020202022F
+:10615000020202020202020202020202020202021F
+:10616000020202020202020202020202020202020F
+:1061700002020202020202020202020202020202FF
+:1061800002020202020202020202020202020202EF
+:1061900002020202020202020202020202020202DF
+:1061A00002020202020202020202020202020202CF
+:1061B00002020202020202020202020202020202BF
+:1061C00002020202020202020202020202020202AF
+:1061D00002020202020202000202020202020201A2
+:1061E000010101010101010101010101010201029D
+:1061F000020202020202020202020202020202027F
+:10620000020202020202020202020202020202026E
+:10621000020202020202020202020202020202025E
+:10622000020202020202020202020202020202024E
+:10623000020202020202020202020202020202023E
+:10624000020202020202020202020202020202022E
+:10625000020202020202020202020202020202021E
+:10626000020202020202020202020202020202020E
+:1062700002020202020202020202020202020202FE
+:1062800002020202020202020202020202020202EE
+:1062900002020202020202020202020202020202DE
+:1062A00002020202020202020202020202020202CE
+:1062B00002020202020202020202020202020202BE
+:1062C00002020202020202020202020202020202AE
+:1062D000020202020202020202020202020202019F
+:1062E000010101010101010101010101010101029D
+:1062F000020202020202020202020202020202027E
+:10630000020202020202020202020202020202026D
+:10631000020202020202020202020202020202025D
+:10632000020202020202020202020202020202024D
+:10633000020202020202020202020202020202023D
+:10634000020202020202020202020202020202022D
+:10635000020202020202020202020202020202021D
+:10636000020202020202020202020202020202020D
+:1063700002020202020202020202020202020202FD
+:1063800002020202020202020202020202020202ED
+:1063900002020202020202020202020202020202DD
+:1063A00002020202020202020202020202020202CD
+:1063B00002020202020202020202020202020202BD
+:1063C00002020202020202020202020202020202AD
+:1063D000020202020202020202020202020202019E
+:1063E000010101010101010101010101010101009E
+:1063F000020202020202020202020202020202027D
+:10640000020202020202020202020202020202026C
+:10641000020202020202020202020202020202025C
+:10642000020202020202020202020202020202024C
+:10643000020202020202020202020202020202023C
+:10644000020202020202020202020202020202022C
+:10645000020202020202020202020202020202021C
+:10646000020202020202020202020202020202020C
+:1064700002020202020202020202020202020202FC
+:1064800002020202020202020202020202020202EC
+:1064900002020202020202020202020202020202DC
+:1064A00002020202020202020202020202020202CC
+:1064B00002020202020202020202020202020202BC
+:1064C00002020202020202020202020202020202AC
+:1064D000020202020202020202020202020202019D
+:1064E000010101010101010101010101010101019C
+:1064F000000000000000000000000000000000029A
+:10650000020202020202020202020202020202026B
+:10651000020202020202020202020202020202025B
+:10652000020202020202020202020202020202004D
+:106530000000000000000000000000000002000257
+:10654000020202020202020202020202020202022B
+:10655000020202020202020202020202020202021B
+:10656000020202020202020202020202020202020B
+:1065700002020202020202020202020202020202FB
+:1065800002020202020202020202020202020202EB
+:1065900002020202020202020202020202020202DB
+:1065A00002020202020202020202020202020202CB
+:1065B00002020202020202020202020202020202BB
+:1065C00002020202020202020202020202020202AB
+:1065D000020202020202020202020202020202019C
+:1065E000010101010101010101010101010101019B
+:1065F000010101010101010101010101010101028A
+:10660000020202020202020202020202020202026A
+:10661000020202020202020202020202020202025A
+:10662000020202020202020202020202020202004C
+:106630000000000000000000000000000002000256
+:10664000020202020202020202020202020202022A
+:10665000020202020202020202020202020202021A
+:10666000020202020202020202020202020202020A
+:1066700002020202020202020202020202020202FA
+:1066800002020202020202020202020202020202EA
+:1066900002020202020202020202020202020202DA
+:1066A00002020202020202020202020202020202CA
+:1066B00002020202020202020202020202020202BA
+:1066C00002020202020202020202020202020202AA
+:1066D000020202020202020202020202020202019B
+:1066E000010101010101010101010101010101019A
+:1066F000010101010101010101010101010101008B
+:106700000000000000000000000000000002000285
+:10671000020202020202020202020202020202005B
+:106720000000000000000000000000000002000067
+:106730000000000000000000000000000002000255
+:106740000202020202020202020202020202020229
+:106750000202020202020202020202020202020219
+:106760000202020202020202020202020202020209
+:1067700002020202020202020202020202020202F9
+:1067800002020202020202020202020202020202E9
+:1067900002020202020202020202020202020202D9
+:1067A00002020202020202020202020202020202C9
+:1067B00002020202020202020202020202020201BA
+:1067C00001010101010101010101010101010102B8
+:1067D000020202020202020202020202020202019A
+:1067E0000101010101010101010101010101010199
+:1067F0000101010101010101010101010101010189
+:106800000101010101010101010101010101010277
+:106810000202020202020202020202020202020159
+:106820000101010101010101010101010101010059
+:106830000000000000000000000000000000000256
+:106840000202020202020202020202020202020129
+:106850000101010101010101010101010101010227
+:106860000202020202020202020202020202020109
+:106870000101010101010101010101010101010207
+:1068800002020202020202020202020202020201E9
+:1068900001010101010101010101010101010102E7
+:1068A00002020202020202020202020202020202C8
+:1068B00002020202020202020202020202020202B8
+:1068C00002020202020202020202020202020202A8
+:1068D0000202020202020202020202020202020199
+:1068E0000101010101010101010101010101010198
+:1068F0000101010101010101010101010101010188
+:106900000101010101010101010101010101010177
+:106910000101010101010101010101010102010166
+:106920000101010101010101010101010101010157
+:106930000101010101010101010101010101010246
+:106940000202020202020202020202020202020227
+:106950000202020202020202020202020202020217
+:106960000202020202020202020202020202020207
+:1069700002020202020202020202020202020202F7
+:1069800002020202020202020202020202020202E7
+:1069900002020202020202020202020202020202D7
+:1069A00002020202020202020202020202020202C7
+:1069B00002020202020202020202020202020200B9
+:1069C00000000000000000000000000000000002C5
+:1069D0000202020202020202020202020202020198
+:1069E0000101010101010101010101010101010197
+:1069F0000101010101010101010101010101010187
+:106A00000101010101010101010101010101010176
+:106A10000101010101010101010101010101010166
+:106A20000101010101010101010101010101010156
+:106A30000101010101010101010101010101010146
+:106A40000101010101010101010101010101010037
+:106A50000000000000000000000000000000000234
+:106A60000202020202020202020202020202020008
+:106A70000000000000000000000000000000000214
+:106A800002020202020202020202020202020200E8
+:106A900000000000000000000000000000000002F4
+:106AA00002020202020202020202020202020202C6
+:106AB00002020202020202020202020202020200B8
+:106AC00000000000000000000000000000000002C4
+:106AD0000202020202020202020202020202020197
+:106AE0000101010101010101010101010101010196
+:106AF0000101010101010101010101010101010186
+:106B00000101010101010101010101010101010175
+:106B10000101010101010101010101010101010165
+:106B20000101010101010101010101010101010155
+:106B30000101010101010101010101010101010145
+:106B40000101010101010101010101010101010135
+:106B50000101010101010101010101010101010125
+:106B60000101010101010101010101010101010016
+:106B70000000000000000000000000000000000015
+:106B80000000000000000000000000000000000005
+:106B900000000000000000000000000000000001F4
+:106BA00001010101010101010101010101010102D4
+:106BB00002020202020202020202020202020201B6
+:106BC00001010101010101010101010101010102B4
+:106BD0000202020202020202020202020202020196
+:106BE0000101010101010101010101010101010195
+:106BF0000101010101010101010101010101010185
+:106C00000101010101010101010101010101010174
+:106C10000101010101010101010101010101010164
+:106C20000101010101010101010101010101010154
+:106C30000101010101010101010101010101010144
+:106C40000101010101010101010101010101010134
+:106C50000101010101010101010101010101010124
+:106C60000101010101010101010101010101010114
+:106C70000101010101010101010101010101010104
+:106C800001010101010101010101010101010100F5
+:106C900000000000000000000000000000000002F2
+:106CA00002020202020202020202020202020202C4
+:106CB00002020202020202020202020202020201B5
+:106CC00001010101010101010101010101010102B3
+:106CD0000202020202020202020202020202020195
+:106CE0000101010101010101010101010101010194
+:106CF0000101010101010101010101010101010184
+:106D00000101010101010101010101010101010173
+:106D10000101010101010101010101010101010163
+:106D20000101010101010101010101010101010153
+:106D30000101010101010101010101010101010143
+:106D40000101010101010101010101010101010133
+:106D50000101010101010101010101010101010123
+:106D60000101010101010101010101010101010113
+:106D70000101010101010101010101010101010103
+:106D800001010101010101010101010101010101F3
+:106D900001010101010101010101010101010101E3
+:106DA00001010101010101010101010101010101D3
+:106DB00001010101010101010101010101010101C3
+:106DC00001010101010101010101010101010100B4
+:106DD00000000000000000000000000000000001B2
+:106DE0000101010101010101010101010101010193
+:106DF0000101010101010101010101010101010183
+:106E00000101010101010101010101010101010172
+:106E10000101010101010101010101010101010162
+:106E20000101010101010101010101010101010152
+:106E30000101010101010101010101010101010142
+:106E40000101010101010101010101010101010132
+:106E50000101010101010101010101010101010122
+:106E60000101010101010101010101010101010112
+:106E70000101010101010101010101010101010102
+:106E800001010101010101010101010101010101F2
+:106E900001010101010101010101010101010101E2
+:106EA00001010101010101010101010101010101D2
+:106EB00001010101010101010101010101010101C2
+:106EC00001010101010101010101010101010100B3
+:106ED00000000000000000000000000000000000B2
+:106EE00000000000000000000000000000000000A2
+:106EF0000000000000000000000000000000000092
+:106F00000000000000000000000000000000000081
+:106F1000000000000000000000000000000000026F
+:106F20000202020202020202020202020202020241
+:106F30000202020202020202020202020202020231
+:106F40000202020202020202020202020202020221
+:106F50000202020202020202020202020202020211
+:106F60000202020202020202020202020202020201
+:106F700002020202020202020202020202020202F1
+:106F800002020202020202020202020202020202E1
+:106F900002020202020202020202020202020202D1
+:106FA00002020202020202020202020202020202C1
+:106FB00002020202020202020202020202020202B1
+:106FC00002020202020202020202020202020200A3
+:106FD00000000000000000000000000000000000B1
+:106FE00000000000000000000000000000000000A1
+:106FF0000000000000000000000000000000000091
+:107000000000000000000000000000000000000080
+:107010000000000000000000000000000000000070
+:107020000000000000000000000000000000000060
+:107030000000000000000000000000000000000050
+:107040000000000000000000000000000000000040
+:107050000000000000000000000000000000000030
+:107060000000000000000000000000000000000020
+:107070000000000000000000000000000000000010
+:107080000000000000000000000000000000000000
+:1070900000000000000000000000000000000000F0
+:1070A00000000000000000000000000000000000E0
+:1070B00000000000000000000000000000000002CE
+:1070C00002020202020202020202020202020200A2
+:1070D00000000000000000000000000000000000B0
+:1070E00000000000000000000000000000000000A0
+:1070F0000000000000000000000000000000000090
+:10710000000000000000000000000000000000007F
+:10711000000000000000000000000000000000006F
+:10712000000000000000000000000000000000005F
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000003F
+:10715000000000000000000000000000000000002F
+:10716000000000000000000000000000000000001F
+:10717000000000000000000000000000000000000F
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000000EF
+:1071A00000000000000000000000000000000000DF
+:1071B00000000000000000000000000000000002CD
+:1071C00002020202020202020202020202020200A1
+:1071D00000000000000000000000000000000000AF
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000008F
+:10720000000000000000000000000000000000007E
+:10721000000000000000000000000000000000006E
+:10722000000000000000000000000000000000005E
+:10723000000000000000000000000000000000004E
+:10724000000000000000000000000000000000003E
+:10725000000000000000000000000000000000002E
+:10726000000000000000000000000000000000001E
+:10727000000000000000000000000000000000000E
+:1072800000000000000000000000000000000000FE
+:1072900000000000000000000000000000000000EE
+:1072A00000000000000000000000000000000000DE
+:1072B00000000000000000000000000000000000CE
+:1072C00000000000000000000000000000000000BE
+:1072D000000000000000000000000000000000317D
+:1072E000000000000000000000000000000000009E
+:1072F000000000000000000000000000000000008E
+:10730000000000000000000000000000000000007D
+:10731000000000000000000000000000000000006D
+:10732000000000000000000000000000000000005D
+:10733000000000000000000000000000000000004D
+:10734000000000000000000000000000000000003D
+:10735000000000000000000000000000000000002D
+:10736000000000000000000000000000000000001D
+:10737000000000000000000000000000000000000D
+:1073800000000000000000000000000000000000FD
+:1073900000000000000001000000000000000000EC
+:1073A00000000000000000000000000000000000DD
+:1073B00000000000000000000000000000000000CD
+:1073C00000000000000000000000000000000000BD
+:1073D00000000000000000000000000000000000AD
+:1073E000000000000000000000000000000000009D
+:1073F000000000000000000000000000000000008D
+:10740000000000000001000000000000000000007B
+:10741000000000000001000000000000000000006B
+:10742000000000000000010000000000000000005B
+:10743000000000000000000000000000000000004C
+:10744000000000000000000000000000000000003C
+:10745000000000000000000000000000000000002C
+:10746000000000000000000000000000000000001C
+:10747000000000000000000000000000000000000C
+:1074800000000000000000000000000000000001FB
+:1074900000000000000101000000000000000000EA
+:1074A00000000000000000000000000000000000DC
+:1074B00000000000000000000000000000000000CC
+:1074C00000000000000100000000000000000000BB
+:1074D00000000000000001000000000000000000AB
+:1074E000000000000000000000000000000000009C
+:1074F000000000000000000000000000000000008C
+:107500000000000000010100000000000000000079
+:107510000000010000010100000000000000000068
+:107520000000000000010100000000000000000059
+:10753000000000000000000000000000000000004B
+:10754000000000000000000000000000000000003B
+:10755000000000000000000000000000000000002B
+:10756000000000000000000000000000000000001B
+:10757000000000000000000000000000000000000B
+:1075800000000000000000000000000000000001FA
+:1075900000000101010101000000000000000000E6
+:1075A00000000000000000000000000000000000DB
+:1075B00000000000000000000000000000000000CB
+:1075C00000000000000101000000000000000000B9
+:1075D00000000000000001000000000000000000AA
+:1075E000000000000000000000000000000000009B
+:1075F000000000000000000000000000000000008B
+:107600000000000000010100000000000000000078
+:107610000000010000010100000000000000000067
+:107620000000010100010100000000000000000056
+:10763000000000000000000000000000000000004A
+:10764000000000000000000000000000000000003A
+:10765000000000000000000000000000000000002A
+:10766000000000000000000000000000000000001A
+:10767000000000000000000000000000000000000A
+:1076800000000000000000000000000000000001F9
+:1076900001000101010101000000000000000000E4
+:1076A00000000000000000000000000000000000DA
+:1076B00000000000000000000000000000000000CA
+:1076C00000000000000101000000000000000000B8
+:1076D00000000000000001000000000000000000A9
+:1076E0000000000000000000000000000000000199
+:1076F0000100000000000000000000000000000089
+:107700000000010100010100000000000000000075
+:107710000000010101010100000000000000000163
+:107720000100010100010100000000000000000054
+:107730000000000000000000000000000000000049
+:107740000000000000010000000000000000000038
+:107750000000000000000100000000000000000028
+:107760000000000000000000000000000000000019
+:107770000000000000000000000000000000000009
+:1077800000000000000000000000000000010001F7
+:1077900001000101010101000000000000000000E3
+:1077A00000000000000000000000000000000000D9
+:1077B00000000000000000000000000000000000C9
+:1077C00000000101000101000000000000000000B5
+:1077D00000000000000101000000000000000000A7
+:1077E0000000000000000000000000000001000197
+:1077F0000100000000000000000000000000000187
+:107800000100010100010100000000000000000172
+:107810000100010101010100000000000000010160
+:107820000100010101010100000000000000000052
+:107830000000000000010000000000000000000047
+:107840000000000000010100000000000000000036
+:107850000000000000010100000000000000000026
+:107860000000000000000000000000000000000018
+:107870000000000000000000000000000000000008
+:1078800000000000000000000000000001010001F5
+:1078900001010101010101000000000000000000E1
+:1078A00000000000000000000000000000000000D8
+:1078B00000000000000000000000000000000001C7
+:1078C00001000101000101000000000000000000B3
+:1078D00000000101000101000000000000000000A4
+:1078E0000000000000000000000000000001000196
+:1078F0000100000000000000000000010000000185
+:107900000100010101010100000000000000000170
+:10791000010001010101010000000000010001015E
+:107920000101010101010100000000000000000050
+:107930000000000000010100000000000000000045
+:107940000000000000010100000000000000000035
+:107950000000010101010100000000000000000022
+:107960000000000000010000000000000000000016
+:107970000000000000000000000000000000000007
+:1079800000000000000000000000000101010101F2
+:1079900001010101010101000000000000000000E0
+:1079A00000000000000000000000000000000000D7
+:1079B00000000000000000000000000000000101C5
+:1079C00001000101010101000000000000000000B1
+:1079D00000000101000101000000000000000000A3
+:1079E0000000000000000000000000000001010194
+:1079F0000100000001000000000000010000000183
+:107A0000010101010101010000000000010000016D
+:107A1000010101010101010000000001010101015A
+:107A2000010101010101010000000000000000004F
+:107A30000000000000010100000000000000000044
+:107A40000000010000010100000000000000000132
+:107A50000100010101010100000000000000000020
+:107A60000000000000010100000000000000000014
+:107A70000000000000000000000000000000000006
+:107A800000000000000000000000000101010101F1
+:107A900001010101010101000000000000000000DF
+:107AA00000000000000000000000000000000000D6
+:107AB00000000000000000000000000001000101C3
+:107AC00001010101010101000000000100000000AE
+:107AD00000000101010101000000000000000000A1
+:107AE0000000000000000000000000000101010192
+:107AF0000100000001000000000000010001010180
+:107B00000101010101010100000000010101010169
+:107B10000101010101010100000000010101010159
+:107B2000010101010101010000000000000000004E
+:107B30000000000000010100000000000000000043
+:107B40000000010000010100000000000000000131
+:107B5000010001010101010000000000000000001F
+:107B60000000000000010100000000000000000013
+:107B70000000000000000000000000000000000005
+:107B800000000000000000000000010101010101EF
+:107B900001010101010101000000000000000000DE
+:107BA00000000000000000000000000000000000D5
+:107BB00000000000000000000000000101010101C0
+:107BC00001010101010101000000000101000001AB
+:107BD000010001010101010000000000000000009F
+:107BE000000000000000000000000101010101018F
+:107BF000010000000100000000000001010101017E
+:107C00000101010101010100000000010101010168
+:107C10000101010101010101000000010101010157
+:107C2000010101010101010000000000000000004D
+:107C30000000000000010100000000000000000042
+:107C4000000001010001010000000000010000012E
+:107C5000010101010101010000000000000000001D
+:107C60000000010100010100000000000000000010
+:107C70000000000000000000000000000000000004
+:107C800000000000000100000001010101010101EC
+:107C900001010101010101000000000000000000DD
+:107CA00000000000000100000000000000000000D3
+:107CB00000000000000000000000000101010101BF
+:107CC00001010101010101010000000101010101A7
+:107CD000010001010101010000000000000000009E
+:107CE000000000000000000000010101010101018D
+:107CF000010100000100000000000001010101017C
+:107D00000101010101010101000000010101010166
+:107D10000101010101010101000100010101010155
+:107D2000010101010101010000000000000000004C
+:107D30000000000000010100000000000000000041
+:107D4000000001010001010000000001010101012A
+:107D5000010101010101010000000000000000011B
+:107D6000000001010001010000000000000000000F
+:107D70000000000000000000000000000000000003
+:107D800000000000000101010001010101010101E9
+:107D900001010101010101000000000000000000DC
+:107DA00000000000000101000000000000000000D1
+:107DB00000000000000100000000010101010101BC
+:107DC00001010101010101010101000101010101A4
+:107DD000010101010101010000000000000000009C
+:107DE000000000000000000000010101010101018C
+:107DF000010100010100000000000001010101017A
+:107E00000101010101010101000000010101010165
+:107E10000101010101010101000101010101010153
+:107E2000010101010101010000000000000000004B
+:107E3000000000000001010000000000000100003F
+:107E40000000010101010100000000010101010128
+:107E5000010101010101010000000000000000011A
+:107E6000000001010101010000000000000000000D
+:107E70000000000000000000000000000000000002
+:107E800000000000000101010101010101010101E7
+:107E900001010101010101000000000000000000DB
+:107EA00000000000000101000000000000000000D0
+:107EB00000000000000101000001010101010101B9
+:107EC00001010101010101010101010101010101A2
+:107ED000010101010101010000000000000000009B
+:107EE000000000000000000100010101010101018A
+:107EF0000101000101010000000001010101010177
+:107F00000101010101010101000001010101010163
+:107F10000101010101010101000101010101010152
+:107F2000010101010101010000000000000000004A
+:107F3000000000000001010000000000000100013D
+:107F40000100010101010100000000010101010126
+:107F50000101010101010100000000000100000118
+:107F6000010001010101010000000000000000000B
+:107F70000000000000000000000000000000000001
+:107F800000000100000101010101010101010101E5
+:107F900001010101010101000000000000000000DA
+:107FA00000000100000101000000000000000000CE
+:107FB00000000000000101010001010101010101B7
+:107FC00001010101010101010101010101010101A1
+:107FD000010101010101010000000000000000009A
+:107FE0000000000000000001000101010101010189
+:107FF0000101000101010000000001010101010176
+:108000000101010101010101000101010101010161
+:108010000101010101010101000101010101010151
+:108020000101010101010100000000000000000148
+:10803000010000000001010100000000000100013A
+:108040000100010101010100000100010101010124
+:108050000101010101010100000000010101010114
+:10806000010001010101010000000000000000000A
+:108070000000000000000000000000000000000000
+:1080800000000100000101010101010101010101E4
+:1080900001010101010101000000000000000000D9
+:1080A00000000100000101000000000000000000CD
+:1080B00000000100000101010101010101010101B4
+:1080C00001010101010101010101010101010101A0
+:1080D0000101010101010100000000000000000099
+:1080E0000000000000000001000101010101010188
+:1080F0000101000101010001000001010101010174
+:108100000101010101010101000101010101010160
+:10811000010101010101010101010101010101014F
+:108120000101010101010100000000000000010146
+:108130000100010001010101000000000101000136
+:108140000100010101010100000101010101010122
+:108150000101010101010100000000010101010113
+:108160000101010101010100000000000000000008
+:1081700000000000000100000000000000000000FE
+:1081800000000101010101010101010101010101E1
+:1081900001010101010101000000000000000000D8
+:1081A00000000101000101000000000000000000CB
+:1081B00000000100000101010101010101010101B3
+:1081C000010101010101010101010101010101019F
+:1081D0000101010101010100000000000000000098
+:1081E0000000000000000001000202010102010283
+:1081F0000201000101010001000101010101010171
+:10820000010101010101010100010101010101015F
+:10821000010101010101010101010101010101014E
+:108220000101010101010100000000000000010145
+:108230000101010001010101000000010101010132
+:108240000100010101010100000101010101010121
+:108250000101010101010101000001010101010110
+:108260000101010101010100000000000000000007
+:1082700000000000000101000000000000000001FB
+:1082800001000101010101010101010101010101DF
+:1082900001010101010101000000000000000001D6
+:1082A00000000101000101000000000000000000CA
+:1082B00000000101010101010101010101010101B0
+:1082C000010101010101010101010101010101019E
+:1082D0000101010101010100000000000000000097
+:1082E000000000000000000201020202020202027D
+:1082F0000201000101010001000101010101010170
+:10830000010101010101010100010101010101015E
+:10831000010101010101010101010101010101014D
+:108320000101010101010101000000000001010142
+:10833000010101010101010101010001010101012E
+:10834000010101010101010100010101010101011E
+:10835000010101010101010100010101010101010E
+:108360000101010101010100000000000000000006
+:1083700000000000000101000000000000010001F9
+:1083800001000101010101010101010101010101DE
+:1083900001010101010101000000000100010001D3
+:1083A00000000101010101000000000000000001C7
+:1083B00000000101010101010101010101010101AF
+:1083C000010101010101010101010101010101019D
+:1083D0000101010101010100020000000000000094
+:1083E000000000000000000201020202020202027C
+:1083F000020100010201000100010101010101016E
+:10840000010101010101010101010101010101015C
+:10841000010101010101010101010101010101014C
+:10842000010101010101010101000000010101013F
+:10843000010101010101010101010101010101012C
+:10844000010101010101010101010101010101011C
+:10845000010101010101010100010101010101010D
+:108460000101010101010100000000000000000005
+:1084700000000100000101000001000001010001F5
+:1084800001010101010101010101010101010101DC
+:1084900001010101010101000000000101010001D1
+:1084A00000010101010101000000000000010001C4
+:1084B00000000101010101010101010101010101AE
+:1084C000010101010101010101010101010101019C
+:1084D0000101010101010100020000000000000093
+:1084E0000000010100000002020202020202020278
+:1084F000020200010201000100010102010101016B
+:10850000010101010102010101010101010101015A
+:10851000010101010101010101010101010101014B
+:10852000010101010101010101000000010101013E
+:10853000010101010101010101010101010101012B
+:10854000010101010101010101010101010101011B
+:10855000010101010101010101010101010101010B
+:108560000101010101010100000000000000000004
+:1085700000000100000101000001000101010101F2
+:1085800001010101010101010101010101010101DB
+:1085900001010101010101010000010101010101CD
+:1085A00000010101010101000000000001010001C2
+:1085B00001010101010101010101010101010101AB
+:1085C000010101010101010201010101010101019A
+:1085D0000101010101010100020000000000000191
+:1085E0000101010100000002020202020202020275
+:1085F0000202000102010001010101020101010268
+:108600000201020201020202010101010101010154
+:108610000101020101020102010101010101010147
+:10862000010101010101010101000000010101013D
+:10863000010101010101010101010101010101012A
+:10864000010101010101010101010101010101011A
+:10865000010101010101010101010101010101010A
+:108660000101010101010100000000000000000003
+:1086700000000101010101000101000101010101EE
+:1086800001010101010101010101010101010101DA
+:1086900001010101010101010101010101010101CA
+:1086A00001010101010101010000010101010101BC
+:1086B00001010101010101010101010101010101AA
+:1086C0000101010101010102020101020101010197
+:1086D000010101010101020001000000000101018E
+:1086E0000101010101000002020202020202020273
+:1086F0000202010102010002010101020202020262
+:10870000020202020202020201010102020101024E
+:10871000020102020202020201010102020102023E
+:108720000201020201020201010001010101010135
+:108730000101010101020102010101010101010127
+:108740000101010101020101010101010101010118
+:108750000101010101010101010101010101010109
+:108760000101010101010100000000000000000101
+:1087700000000101010101010101010101010101EB
+:1087800001010101010101010101010101010102D8
+:1087900001010101010101010101010101010101C9
+:1087A00001010101010101010101010101010101B9
+:1087B00001010101010101010101010101010101A9
+:1087C0000101010101010102020201020201010194
+:1087D0000101020201020200010000000101010189
+:1087E0000101010101000002020202020202020272
+:1087F000020201020201000201010202020202025F
+:10880000020202020202020201010102020202024B
+:10881000020202020202020201020102020202023A
+:108820000202020202020202010101010101010130
+:108830000101010101020202010101010101010125
+:108840000101020101020201010101010101010115
+:108850000101010101010101010101010101010108
+:1088600001010101010101010000000000010001FE
+:1088700000000101010101010101010101010101EA
+:1088800001010101010101020101010202020102D3
+:1088900002010202020202010101010101010101C2
+:1088A00001010101010101010101010101010101B8
+:1088B00001010101010101010101010101010101A8
+:1088C000010101010101010202020202020202028F
+:1088D0000201020202020200010001010101010184
+:1088E0000101010101000002020202020202020271
+:1088F000020201020201000201020202020202025D
+:108900000202020202020202010202020202020248
+:108910000202020202020202020202020202020237
+:10892000020202020202020202010101010101012E
+:108930000101010101020202020101010102010122
+:108940000101020201020201010101020201010210
+:108950000201020202020202010101010101010100
+:1089600001010101010201010000000001010001FB
+:1089700001010101010101010101010101010101E7
+:1089800001010101010101020202020202020202CE
+:1089900002020202020202010101010101010101C0
+:1089A00001010101010101010101010101010101B7
+:1089B00001010101010101010101010101010101A7
+:1089C000010101010102010202020202020202028D
+:1089D0000202020202020200010001010101010182
+:1089E0000101010101000002020202020202020270
+:1089F000020201020202000202020202020202025A
+:108A00000202020202020202020202020202020246
+:108A10000202020202020202020202020202020236
+:108A2000020202020202020202010101010102022B
+:108A3000020101010102020202020102020201021C
+:108A40000201020202020202010201020202020209
+:108A500002020202020202020101010202010102FB
+:108A600001010202010202010000010101010101F4
+:108A700001010101010101010101010101010101E6
+:108A800001010101010101020202020202020202CD
+:108A900002020202020202010101010101010101BF
+:108AA00001010101010101010101010101010101B6
+:108AB00001010101010101020101010202010202A1
+:108AC0000201020201020202020202020202020288
+:108AD0000202020202020200000101010101010181
+:108AE000010101010100000202020202020202026F
+:108AF0000202010202020002020202020202020259
+:108B00000202020202020202020202020202020245
+:108B10000202020202020202020202020202020235
+:108B20000202020202020202020101010202020228
+:108B30000202020102020202020202020202020216
+:108B40000201020202020202020202020202020206
+:108B500002020202020202020202020202020202F5
+:108B600002010202020202010001010101010101F0
+:108B700001010101010101010101010101010101E5
+:108B800001010101010201020202020202020202CB
+:108B900002020202020202020101010101010101BD
+:108BA00001010101010201010101010101010101B4
+:108BB000010101010101010202020202020202029C
+:108BC0000202020202020202020202020202020285
+:108BD0000202020202020200000101010100000083
+:108BE0000000000001010002020202020202020271
+:108BF0000202010202020002020202020202020258
+:108C00000202020202020202020202020202020244
+:108C10000202020202020202020202020202020234
+:108C20000202020202020202020202020202020224
+:108C30000202020202020202020202020202020214
+:108C40000202020202020202020202020202020204
+:108C500002020202020202020202020202020202F4
+:108C600002020202020202020001010101010101ED
+:108C700001010101010101020202010101010101E1
+:108C800001010201010202020202020202020202C8
+:108C900002020202020202020201010201010101BA
+:108CA00001010201010202020101010101010101B0
+:108CB000010101010102010202020202020202029A
+:108CC0000202020202020202020202020202020284
+:108CD0000202020202020200000100000000000085
+:108CE000000000000101010202020202020202026F
+:108CF0000202020202020002020202020202020256
+:108D00000202020202020202020202020202020243
+:108D10000202020202020202020202020202020233
+:108D20000202020202020202020202020202020223
+:108D30000202020202020202020202020202020213
+:108D40000202020202020202020202020202020203
+:108D500002020202020202020202020202020202F3
+:108D600002020202020202020101010101010101EB
+:108D700001010101010201020202010202020102DB
+:108D800002010202020202020202020202020202C4
+:108D900002020202020202020202020202020102B4
+:108DA00001010202010202020201010101010101AD
+:108DB0000101020101020202020202020202020297
+:108DC0000202020202020202020202020202020283
+:108DD0000202020202020200000000000000000085
+:108DE0000000000000010102020101020202020271
+:108DF0000202020202020002020202020202020255
+:108E00000202020202020202020202020202020242
+:108E10000202020202020202020202020202020232
+:108E20000202020202020202020202020202020222
+:108E30000202020202020202020202020202020212
+:108E40000202020202020202020202020202020202
+:108E500002020202020202020202020202020202F2
+:108E600002020202020202020101010101010101EA
+:108E700001010201010202020202020202020202D6
+:108E800002020202020202020202020202020202C2
+:108E900002020202020202020202020202020202B2
+:108EA00001020202020202020202020202020102A4
+:108EB0000101020202020202020202020202020294
+:108EC0000202020202020202020202020202020282
+:108ED0000202020202020200000000000000000084
+:108EE0000000000000010102020101020202020270
+:108EF0000202020202020002020202020202020254
+:108F00000202020202020202020202020202020241
+:108F10000202020202020202020202020202020231
+:108F20000202020202020202020202020202020221
+:108F30000202020202020202020202020202020211
+:108F40000202020202020202020202020202020201
+:108F500002020202020202020202020202020202F1
+:108F600002020202020202020202020202020102E2
+:108F700001010202020202020202020202020202D3
+:108F800002020202020202020202020202020202C1
+:108F900002020202020202020202020202020202B1
+:108FA00002020202020202020202020202020202A1
+:108FB0000202020202020202020202020202020291
+:108FC0000202020202020202020202020202020281
+:108FD0000202020202020200000000000000000083
+:108FE0000000000000010102010101010101010175
+:108FF0000101020201020002020202020202020256
+:109000000202020202020202020202020202020240
+:109010000202020202020202020202020202020230
+:109020000202020202020202020202020202020220
+:109030000202020202020202020202020202020210
+:109040000202020202020202020202020202020200
+:1090500002020202020202020202020202020202F0
+:1090600002020202020202020202020202020202E0
+:1090700002020202020202020202020202020202D0
+:1090800002020202020202020202020202020202C0
+:1090900002020202020202020202020202020202B0
+:1090A00002020202020202020202020202020202A0
+:1090B0000202020202020202020202020202020290
+:1090C0000202020202020202020202020202020280
+:1090D0000202020202020200000000000000000082
+:1090E0000000000000010101010101010101010175
+:1090F0000101020201020002020202020202020255
+:10910000020202020202020202020202020202023F
+:10911000020202020202020202020202020202022F
+:10912000020202020202020202020202020202021F
+:10913000020202020202020202020202020202020F
+:1091400002020202020202020202020202020202FF
+:1091500002020202020202020202020202020202EF
+:1091600002020202020202020202020202020202DF
+:1091700002020202020202020202020202020202CF
+:1091800002020202020202020202020202020202BF
+:1091900002020202020202020202020202020202AF
+:1091A000020202020202020202020202020202029F
+:1091B000020202020202020202020202020202028F
+:1091C000020202020202020202020202020202027F
+:1091D0000202020202020200000000000000000081
+:1091E0000000000000010101010101010101010174
+:1091F0000101020201020002020202020202020254
+:10920000020202020202020202020202020202023E
+:10921000020202020202020202020202020202022E
+:10922000020202020202020202020202020202021E
+:10923000020202020202020202020202020202020E
+:1092400002020202020202020202020202020202FE
+:1092500002020202020202020202020202020202EE
+:1092600002020202020202020202020202020202DE
+:1092700002020202020202020202020202020202CE
+:1092800002020202020202020202020202020202BE
+:1092900002020202020202020202020202020202AE
+:1092A000020202020202020202020202020202029E
+:1092B000020202020202020202020202020202028E
+:1092C000020202020202020202020202020202027E
+:1092D0000202020202020200000000000000000080
+:1092E0000000000000010101010000010101010175
+:1092F0000101020201020002020202020202020253
+:10930000020202020202020202020202020202023D
+:10931000020202020202020202020202020202022D
+:10932000020202020202020202020202020202021D
+:10933000020202020202020202020202020202020D
+:1093400002020202020202020202020202020202FD
+:1093500002020202020202020202020202020202ED
+:1093600002020202020202020202020202020202DD
+:1093700002020202020202020202020202020202CD
+:1093800002020202020202020202020202020202BD
+:1093900002020202020202020202020202020202AD
+:1093A000020202020202020202020202020202029D
+:1093B000020202020202020202020202020202028D
+:1093C000020202020202020202020202020202027D
+:1093D000020202020202020000000000000000007F
+:1093E0000000000000000101010000010101010175
+:1093F0000101020101020002020202020202020253
+:10940000020202020202020202020202020202023C
+:10941000020202020202020202020202020202022C
+:10942000020202020202020202020202020202021C
+:10943000020202020202020202020202020202020C
+:1094400002020202020202020202020202020202FC
+:1094500002020202020202020202020202020202EC
+:1094600002020202020202020202020202020202DC
+:1094700002020202020202020202020202020202CC
+:1094800002020202020202020202020202020202BC
+:1094900002020202020202020202020202020202AC
+:1094A000020202020202020202020202020202029C
+:1094B000020202020202020202020202020202028C
+:1094C000020202020202020202020202020202027C
+:1094D0000202020202020202020202020200000072
+:1094E000000000000000000100000000000000007B
+:1094F0000000010100020002020202020202020256
+:10950000020202020202020202020202020202023B
+:10951000020202020202020202020202020202022B
+:10952000020202020202020202020202020202021B
+:10953000020202020202020202020202020202020B
+:1095400002020202020202020202020202020202FB
+:1095500002020202020202020202020202020202EB
+:1095600002020202020202020202020202020202DB
+:1095700002020202020202020202020202020202CB
+:1095800002020202020202020202020202020202BB
+:1095900002020202020202020202020202020202AB
+:1095A000020202020202020202020202020202029B
+:1095B000020202020202020202020202020202028B
+:1095C000020202020202020202020202020202027B
+:1095D000020202020202020202020202020202026B
+:1095E000020202020202000000000000000000006F
+:1095F0000000010100010100000000000000000067
+:109600000000000000000002020202020202020248
+:10961000020202020202020202020202020202022A
+:109620000202020202020201010101010101010123
+:109630000101010101010102020202020202020211
+:1096400002020202020202020202020202020202FA
+:1096500002020202020202020202020202020202EA
+:1096600002020202020202020202020202020202DA
+:1096700002020202020202020202020202020202CA
+:1096800002020202020202020202020202020202BA
+:1096900002020202020202020202020202020202AA
+:1096A000020202020202020202020202020202029A
+:1096B000020202020202020202020202020202028A
+:1096C000020202020202020202020202020202027A
+:1096D000020202020202020202020202020202026A
+:1096E000020202020202020000000000000000006C
+:1096F0000000010100010100000000000000000066
+:109700000000000000000002020202020202020247
+:109710000202020202020202020202020202020229
+:109720000202020202020202020202020202020219
+:109730000202020202020201010101010101010112
+:109740000101010101010102020202020202020200
+:1097500002020202020202020202020202020202E9
+:1097600002020202020202020202020202020202D9
+:1097700002020202020202020202020202020202C9
+:1097800002020202020202020202020202020202B9
+:1097900002020202020202020202020202020202A9
+:1097A0000202020202020202020202020202020299
+:1097B0000202020202020202020202020202020289
+:1097C0000202020202020202020202020202020279
+:1097D0000202020202020202020202020202020269
+:1097E000020202020202020000000000000000006B
+:1097F000000001010001010101010101010101015C
+:109800000101010101010100000000000000000051
+:109810000000000000000002020202020202020236
+:10982000020202020202020000000000000000002A
+:109830000000000000000002020202020202020216
+:1098400002020202020202020202020202020202F8
+:1098500002020202020202020202020202020202E8
+:1098600002020202020202020202020202020202D8
+:1098700002020202020202020202020202020202C8
+:1098800002020202020202020202020202020202B8
+:1098900002020202020202020202020202020202A8
+:1098A0000202020202020202020202020202020298
+:1098B0000202020202020202020202020202020288
+:1098C0000202020202020202020202020202020278
+:1098D0000202020202020202020202020202020268
+:1098E000020202020202020000000000000000006A
+:1098F000000001000001010101010101010101015C
+:109900000101010101010100000000000000000050
+:109910000000000000000000000000000000000047
+:109920000000000000000000000000000000000037
+:109930000000000000000000000000000000000027
+:109940000000000000000002020202020202020205
+:1099500002020202020202000000000000000000F9
+:1099600000000000000000010101010101010101EE
+:1099700001010101010101020202020202020202CE
+:1099800002020202020202020202020202020202B7
+:1099900002020202020202020202020202020202A7
+:1099A0000202020202020202020202020202020297
+:1099B0000202020202020202020202020202020287
+:1099C0000202020202020201010101010101010180
+:1099D000010101010101010202020202020202026E
+:1099E0000202020202020200000000000000000069
+:1099F000000000000001010101010101010101015C
+:109A00000101010101010101010101010101010146
+:109A1000010101010101010000000000000000003F
+:109A2000000000000000000101010101010101012D
+:109A3000010101010101010000000000000000001F
+:109A40000000000000000002020202020202020204
+:109A500002020202020202000000000000000000F8
+:109A600000000000000000020202020202020202E4
+:109A700002020202020202000000000000000000D8
+:109A800000000000000000020202020202020202C4
+:109A900002020202020202010101010101010101AF
+:109AA000010101010101010202020202020202029D
+:109AB0000202020202020202020202020202020286
+:109AC0000202020202020202020202020202020276
+:109AD0000202020202020202020202020202020266
+:109AE000020202020202020101010101010101015F
+:109AF0000101010101010101010101010101010156
+:109B00000101010101010101010101010101010145
+:109B10000101010101010101010101010101010135
+:109B20000101010101010101010101010101010125
+:109B30000101010101010101010101010101010115
+:109B40000101010101010101010101010101010105
+:109B500001010101010101000000000000000000FE
+:109B600000000000000000000000000000000000F5
+:109B700000000000000000000000000000000000E5
+:109B800000000000000000020202020202020202C3
+:109B900002020202020202020202020202020202A5
+:109BA00002020202020202000000000000000000A7
+:109BB0000000000000000002020202020202020293
+:109BC000020202020202020101010101010101017E
+:109BD000010101010101010202020202020202026C
+:109BE000020202020202020101010101010101015E
+:109BF0000101010101010101010101010101010155
+:109C00000101010101010101010101010101010144
+:109C10000101010101010101010101010101010134
+:109C20000101010101010101010101010101010124
+:109C30000101010101010101010101010101010114
+:109C40000101010101010101010101010101010104
+:109C500001010101010101010101010101010101F4
+:109C600001010101010101000000000000000000ED
+:109C700000000000000000000000000000000000E4
+:109C800000000000000000000000000000000000D4
+:109C900000000000000000000000000000000000C4
+:109CA00000000000000000000000000000000000B4
+:109CB0000000000000000002020202020202020292
+:109CC000020202020202020101010101010101017D
+:109CD000010101010101010202020202020202026B
+:109CE000020202020202020101010101010101015D
+:109CF0000101010101010101010101010101010154
+:109D00000101010101010101010101010101010143
+:109D10000101010101010101010101010101010133
+:109D20000101010101010101010101010101010123
+:109D30000101010101010101010101010101010113
+:109D40000101010101010101010101010101010103
+:109D500001010101010101010101010101010101F3
+:109D600001010101010101010101010101010101E3
+:109D700001010101010101010101010101010101D3
+:109D800001010101010101010101010101010101C3
+:109D900001010101010101000000000000000000BC
+:109DA00000000000000000000000000000000000B3
+:109DB0000000000000000002020202020202020291
+:109DC000020202020202020101010101010101017C
+:109DD000010101010101010202020202020202026A
+:109DE000020202020202020101010101010101015C
+:109DF0000101010101010101010101010101010153
+:109E00000101010101010101010101010101010142
+:109E10000101010101010101010101010101010132
+:109E20000101010101010101010101010101010122
+:109E30000101010101010101010101010101010112
+:109E40000101010101010101010101010101010102
+:109E500001010101010101010101010101010101F2
+:109E600001010101010101010101010101010101E2
+:109E700001010101010101010101010101010101D2
+:109E800001010101010101010101010101010101C2
+:109E900001010101010101010101010101010101B2
+:109EA00001010101010101010101010101010101A2
+:109EB0000101010101010101010101010101010192
+:109EC0000101010101010101010101010101010182
+:109ED000010101010101010000000000000000007B
+:109EE0000000000000000001010101010101010169
+:109EF0000101010101010101010101010101010152
+:109F00000101010101010101010101010101010141
+:109F10000101010101010101010101010101010131
+:109F20000101010101010101010101010101010121
+:109F30000101010101010101010101010101010111
+:109F40000101010101010101010101010101010101
+:109F500001010101010101010101010101010101F1
+:109F600001010101010101010101010101010101E1
+:109F700001010101010101010101010101010101D1
+:109F800001010101010101010101010101010101C1
+:109F900001010101010101010101010101010101B1
+:109FA00001010101010101010101010101010101A1
+:109FB0000101010101010101010101010101010191
+:109FC0000101010101010101010101010101010181
+:109FD000010101010101010000000000000000007A
+:109FE0000000000000000000000000000000000071
+:109FF0000000000000000000000000000000000061
+:10A000000000000000000000000000000000000050
+:10A010000000000000000000000000000000000040
+:10A02000000000000000000202020202020202021E
+:10A030000202020202020202020202020202020200
+:10A0400002020202020202020202020202020202F0
+:10A0500002020202020202020202020202020202E0
+:10A0600002020202020202020202020202020202D0
+:10A0700002020202020202020202020202020202C0
+:10A0800002020202020202020202020202020202B0
+:10A0900002020202020202020202020202020202A0
+:10A0A0000202020202020202020202020202020290
+:10A0B0000202020202020202020202020202020280
+:10A0C0000202020202020202020202020202020270
+:10A0D0000202020202020200000000000000000072
+:10A0E0000000000000000000000000000000000070
+:10A0F0000000000000000000000000000000000060
+:10A10000000000000000000000000000000000004F
+:10A11000000000000000000000000000000000003F
+:10A12000000000000000000000000000000000002F
+:10A13000000000000000000000000000000000001F
+:10A14000000000000000000000000000000000000F
+:10A1500000000000000000000000000000000000FF
+:10A1600000000000000000000000000000000000EF
+:10A1700000000000000000000000000000000000DF
+:10A1800000000000000000000000000000000000CF
+:10A1900000000000000000000000000000000000BF
+:10A1A00000000000000000000000000000000000AF
+:10A1B000000000000000000000000000000000009F
+:10A1C000000000000000000202020202020202027D
+:10A1D0000202020202020200000000000000000071
+:10A1E000000000000000000000000000000000006F
+:10A1F000000000000000000000000000000000005F
+:10A20000000000000000000000000000000000004E
+:10A21000000000000000000000000000000000003E
+:10A22000000000000000000000000000000000002E
+:10A23000000000000000000000000000000000001E
+:10A24000000000000000000000000000000000000E
+:10A2500000000000000000000000000000000000FE
+:10A2600000000000000000000000000000000000EE
+:10A2700000000000000000000000000000000000DE
+:10A2800000000000000000000000000000000000CE
+:10A2900000000000000000000000000000000000BE
+:10A2A00000000000000000000000000000000000AE
+:10A2B000000000000000000000000000000000009E
+:10A2C000000000000000000202020202020202027C
+:10A2D0000202020202020200000000000000000070
+:10A2E000000000000000000000000000000000006E
+:10A2F000000000000000000000000000000000005E
+:10A30000000000000000000000000000000000004D
+:10A31000000000000000000000000000000000003D
+:10A32000000000000000000000000000000000002D
+:10A33000000000000000000000000000000000001D
+:10A34000000000000000000000000000000000000D
+:10A3500000000000000000000000000000000000FD
+:10A3600000000000000000000000000000000000ED
+:10A3700000000000000000000000000000000000DD
+:10A3800000000000000000000000000000000000CD
+:10A3900000000000000000000000000000000000BD
+:10A3A00000000000000000000000000000000000AD
+:10A3B000000000000000000000000000000000009D
+:10A3C000000000000000000000000000000000008D
+:10A3D000000000000000000000000000000000007D
+:10A3E000000000000000003100000000000000003C
+:10A3F000000000000000000000000000000000005D
+:10A40000000000000000000000000000000000004C
+:10A41000000000000000000000000000000000003C
+:10A42000000000000000000000000000000000002C
+:10A43000000000000000000000000000000000001C
+:10A44000000000000000000000000000000000000C
+:10A4500000000000000000000001000000000000FB
+:10A4600000000000000000000000000000000000EC
+:10A4700000000000000000000000000000000000DC
+:10A4800000000000000000000000000000000000CC
+:10A4900000000000000000000000000000000000BC
+:10A4A00000000000000000000000000000000000AC
+:10A4B000000000000000000000000000000000009C
+:10A4C000000000000000000000000000000000008C
+:10A4D000000000000000000000000000000000007C
+:10A4E000000000000000000000000000000000006C
+:10A4F000000000000000000000000000000000005C
+:10A50000000000000000000000000000000000004B
+:10A51000000000000000000000000000000000003B
+:10A52000000000000000000000000000000000002B
+:10A53000000000000000000000000000000000001B
+:10A54000000000000000000000000000000000000B
+:10A5500000000000000000000001010000000000F9
+:10A5600000000000000000000000010000000000EA
+:10A5700000000000000000000000000000000000DB
+:10A5800000000000000000000000000000000000CB
+:10A5900000000000000000000000000000000000BB
+:10A5A00000000000000000000000000000000000AB
+:10A5B000000000000000000000000000000000009B
+:10A5C000000000000000000000000000000000008B
+:10A5D000000000000000000000000000000000007B
+:10A5E000000000000000000000000000000000006B
+:10A5F000000000000000000000000000000000005B
+:10A60000000000000000000000000000000000004A
+:10A610000000000000000000000000000100000039
+:10A62000000000000000000000000000000000002A
+:10A63000000000000000000000000000000000001A
+:10A64000000000000000000000000000000000000A
+:10A6500000000000000000000001010000010000F7
+:10A6600000000000000000000001010000000000E8
+:10A6700000000000000000000001000000000000D9
+:10A6800000000000000000000000000000000000CA
+:10A6900000000000000000000000000000000000BA
+:10A6A00000000000000000000000000000000000AA
+:10A6B000000000000000000000000000000000009A
+:10A6C000000000000000000000000000000000008A
+:10A6D000000000000000000000000000000000007A
+:10A6E000000000000000000000000000000000006A
+:10A6F000000000000000000000000000000000005A
+:10A700000000000000000000000000000000000049
+:10A710000000000000000000000000000100000038
+:10A720000000000000000000000000000000000029
+:10A730000000000000000000000000000000000019
+:10A740000000000000000000000000000000000009
+:10A7500000000000000000000001010000010000F6
+:10A7600000000000000000000001010001000000E6
+:10A7700000000000000000000001010000000000D7
+:10A7800000000000000000000000000000000000C9
+:10A7900000000000000000000000000000000000B9
+:10A7A00000000000000000000000000000000000A9
+:10A7B0000000000000000000000000000000000099
+:10A7C0000000000000000000000000000000000089
+:10A7D0000000000000000000000000000000000079
+:10A7E0000000000000000000000000000000000069
+:10A7F0000000000000000000000000000000000059
+:10A800000000000000000000000000000100000047
+:10A810000000000000000000000001000100010035
+:10A820000000000000000000000000000000000028
+:10A830000000000000000000000000000000000018
+:10A840000000000000000000000000000000000008
+:10A8500000000000000000000001010000010000F5
+:10A8600000000000000000000001010001010000E4
+:10A8700000000000000000000001010000000000D6
+:10A8800000000000000000000000000000000000C8
+:10A8900000000000000000000000000000000000B8
+:10A8A00000000000000000000000000001000100A6
+:10A8B0000000000000000000000000000000000098
+:10A8C0000000000000000000000000000000000088
+:10A8D0000000000000000000000000000100010076
+:10A8E0000000000000000000000000000000000068
+:10A8F0000000000000000000000000000000000058
+:10A900000000000000000000000000000100000046
+:10A910000000000000000000000101010101010031
+:10A920000000000000000000000000000000000027
+:10A930000000000000000000000000000100000016
+:10A940000000000000000000000000000000000007
+:10A9500000000000000000000001010001010000F3
+:10A9600000000000000000000001010001010000E3
+:10A9700000000000000000000001010001000000D4
+:10A9800000000000000000000000000000000000C7
+:10A9900000000000000000000000000001000000B6
+:10A9A00000000000000000000001000001000100A4
+:10A9B0000000000000000000000000000000000097
+:10A9C0000000000000000000000000000000000087
+:10A9D0000000000000000000000000000100010075
+:10A9E0000000000000000000000000000000000067
+:10A9F0000000000000000000000000000000000057
+:10AA00000000000000000000000000000100000045
+:10AA10000000000000000000000101010101010030
+:10AA20000000000000000000000000000000000026
+:10AA30000000000000000000000000000100000015
+:10AA40000000000000000000000100000000000005
+:10AA500000000000000000000001010001010000F2
+:10AA600000000000000000000001010001010000E2
+:10AA700000000000000000000001010101000000D2
+:10AA800000000000000000000000000000000000C6
+:10AA900000000000000000000001000001000000B4
+:10AAA00000000000000000000001010001000100A2
+:10AAB0000000000000000000000000000000000096
+:10AAC0000000000000000000000000000000000086
+:10AAD0000000000000000000000000000100010074
+:10AAE0000000000000000000000000000000000066
+:10AAF0000000000000000000000000000000000056
+:10AB00000000000000000000000000000100000044
+:10AB1000000000000000000001010101010101002E
+:10AB20000000000000000000000000000000000025
+:10AB30000000000000000000000000000100000014
+:10AB40000000000000000000000100000100000003
+:10AB500000010001000000000001010001010000EF
+:10AB600000000000000000000001010001010000E1
+:10AB700000000000000000000001010101000000D1
+:10AB800000000000000000000000000000000000C5
+:10AB900000000000000000000001000001000100B2
+:10ABA000000000000000000000010101010101009F
+:10ABB0000000000000000000000000000000000095
+:10ABC0000000000000000000000000000000000085
+:10ABD0000000000000000100000000010101010070
+:10ABE0000000000000000000000000000000000065
+:10ABF0000000000000000000000000000000000055
+:10AC00000000000000000000000001000100010041
+:10AC1000000000010000000001010101010101002C
+:10AC20000000000000000000000000000000000024
+:10AC30000000000000000000000000010100000012
+:10AC40000000000000000000000100000100000002
+:10AC500000010001000000000001010001010000EE
+:10AC600000000000000000000001010001010000E0
+:10AC700000000000000000000001010101000000D0
+:10AC800000000000000000000000000000000000C4
+:10AC900000000000000000000101000101010100AE
+:10ACA000000100010000000000010101010101009C
+:10ACB0000000000000000000000000000000000094
+:10ACC0000000000000000000000000000000000084
+:10ACD000000000010000010000000101010101006D
+:10ACE0000000000000000000000000000000000064
+:10ACF0000000000000000000000000000100000053
+:10AD0000000000000000000000010101010101003D
+:10AD1000000000010000000101010101010101002A
+:10AD20000000000000000000000000000000000023
+:10AD3000000000000000000000000101010001000F
+:10AD40000000000000000000000100000100010000
+:10AD500000010001000000000001010001010100EC
+:10AD600000010000000000000001010001010000DE
+:10AD700000000000000000000001010101000000CF
+:10AD800000000000000000000000000000000000C3
+:10AD900000000000000000000101010101010100AC
+:10ADA000000100010100000000010101010101009A
+:10ADB0000000000000000000000000000000000093
+:10ADC0000000000000000000000000000000000083
+:10ADD000000000010000010100010101010101006A
+:10ADE0000000000000000000000000000000000063
+:10ADF0000000000000000000000000000100000052
+:10AE0000000000000000000000010101010101003C
+:10AE10000001010100000001010101010101010027
+:10AE20000000000000000000000000000000000022
+:10AE3000000000000000000200010101010101000A
+:10AE400000000000000000000001000101010100FD
+:10AE500000010001000000000101010001010100EA
+:10AE600000010000000102000201010001010000D8
+:10AE700000000000000000000001010101000000CE
+:10AE800000000000000000000000000000000000C2
+:10AE900000000000000000000101010101010100AB
+:10AEA0000101010101000000000101010101010097
+:10AEB0000000000000000000000000000000000092
+:10AEC0000000000000000000000000000000000181
+:10AED0000000010100000101000101010101010068
+:10AEE0000000000000000000000000000000000062
+:10AEF0000000000000000000000000010100000050
+:10AF0000000000000000000001010101010101003A
+:10AF10000001010101000001010101010101010025
+:10AF20000000000000000000000000000100000020
+:10AF3000000000000000000100010101010101000A
+:10AF400000010001000000000001010101010100F9
+:10AF500000010001000000000101010001010100E9
+:10AF600000010000000102000101010001010000D8
+:10AF700000010000000000000001010101000000CC
+:10AF800000000000000000000000000000000000C1
+:10AF900000010001000000000101010101010100A8
+:10AFA0000101010101000000000101010101010096
+:10AFB0000000000000000000000000000000000091
+:10AFC0000000000000000000000000000000000180
+:10AFD0000000010101010101010101010101010064
+:10AFE0000000000000000000000000000000000061
+:10AFF000000000000000000000000001010000004F
+:10B000000000000100000000010101010101010038
+:10B010000001010101000001010101010101010024
+:10B02000000000000000000000000000010000001F
+:10B030000000000000000001000101010101010009
+:10B0400000010001000000000001010101010100F8
+:10B0500000010001010000000101010101010100E6
+:10B0600000010000000102000101010101010000D6
+:10B0700000010000000000000101010101000000CA
+:10B0800000000000000000000000000000000000C0
+:10B0900000010001000000010101010101010101A5
+:10B0A0000101010101000000000101010101010095
+:10B0B0000000000000000000000000000000000090
+:10B0C000000000000000000000000000000000017F
+:10B0D0000101010101010101010101010101010061
+:10B0E0000000000000000000000000000000000060
+:10B0F000000000000000000000000001010000004E
+:10B100000000000100000000010101010101010037
+:10B110000001010101000001010101010101010023
+:10B12000000000000000000000000000010000001E
+:10B130000000000100000001000101010101010007
+:10B1400000010101000000000001010101010100F6
+:10B1500001010101010000000101010101010100E3
+:10B1600000010000000102000101010101010000D5
+:10B1700000010001000000000101010101000000C8
+:10B1800000000000000000000000000000000000BF
+:10B1900001010101000000010101010101010101A2
+:10B1A0000101010101010001000101010101010092
+:10B1B000000000000000000000000000000000008F
+:10B1C000000000000000000000000000000000017E
+:10B1D0000101010101010101010101010101010060
+:10B1E000000000000000020000000000000000005D
+:10B1F000000000000000000000000001010000004D
+:10B200000001010100000000010101010101010133
+:10B210000101010101000001010101010101010021
+:10B22000000000000000000000000000010000001D
+:10B230000000000101000001000101010101010005
+:10B2400000010101010000000001010101010100F4
+:10B2500001010101010001020101010101010100DF
+:10B2600000010000010101020101010101010000D2
+:10B2700000010001010000000101010101000000C6
+:10B2800000000000000000000000000001000000BD
+:10B29000010101010101010101010101010101019E
+:10B2A0000101010101010001000101010101010091
+:10B2B000000000000000000000000000000000008E
+:10B2C000000000000000000000000000000000017D
+:10B2D000010101010101010101010101010101005F
+:10B2E000000000000000020000000000000000005C
+:10B2F000000000000000000000000001010000004C
+:10B300000001010100000000010101010101010132
+:10B310000101010101000001010101010101010020
+:10B32000000000000000000000000000010000001C
+:10B330000001000101000001000101010101010003
+:10B3400001010101010000000001010101010100F2
+:10B3500001010101010001020101010101010100DE
+:10B3600000010001010101010101010101010000D1
+:10B3700000010101010000000101010101000000C4
+:10B3800000000000000000000000000001000001BB
+:10B39000010101010101010101010101010101019D
+:10B3A000010101010101010100010101010101008F
+:10B3B000000000000000000000000000000000008D
+:10B3C000000000000000000000000000000000017C
+:10B3D000010101010101010101010101010101005E
+:10B3E0000000000000020200000000000100000058
+:10B3F000000000000000000000000001010000004B
+:10B400000001010100000000010101010101010131
+:10B41000010101010100000101010101010101001F
+:10B420000000000000020200000000000100000017
+:10B430000001000101020001000101010101010000
+:10B4400001010101010000000001010101010100F1
+:10B4500001010101010101010101010101010100DD
+:10B4600000010001010101010101010101010000D0
+:10B4700000010101010202000101010101000000BF
+:10B4800000000000000000000000000001000101B9
+:10B49000010101010101010101010101010101019C
+:10B4A000010101010101010100010101010101008E
+:10B4B000000000000000000000000000010000008B
+:10B4C000000000000000000000000000000000017B
+:10B4D000010101010101010101010101010101005D
+:10B4E0000000000000020200000100000100000056
+:10B4F000000000000000000000000001010000004A
+:10B500000001010100000000010101010101010130
+:10B51000010101010100000101010101010101001E
+:10B520000000000000020200000000000100010114
+:10B530000001000101010001000101010101010000
+:10B5400001010101010000000001010101010100F0
+:10B5500001010101010101010102020101010100DA
+:10B5600000010001010101010101010101010000CF
+:10B5700000010101010202000101010101000000BE
+:10B5800000000000000000000001000101010101B5
+:10B59000010101010101010101010101010101019B
+:10B5A000010101010101010100010101010101008D
+:10B5B000000000000000000000000000010000008A
+:10B5C000000000000000000000000000000000017A
+:10B5D000010101010101010101010101010101005C
+:10B5E000000102000002020200010100010000014E
+:10B5F0000000000000000000000000010100000148
+:10B60000010101010000000001010101010101012E
+:10B61000010101010100000101010101010101001D
+:10B62000000000000002020202000000010001010F
+:10B6300000010001010102010101010101010100FC
+:10B6400001010101010000000001010101010100EF
+:10B6500001010101010102010102020101020100D7
+:10B6600000010001010101010101020101010000CD
+:10B6700000010101010101010101010101000000BE
+:10B6800000010000000000000001010101010101B2
+:10B69000010101010101010101010101010101019A
+:10B6A000010101010101010100010101010101008C
+:10B6B0000000000000000000000000000100010088
+:10B6C0000001000100000000000000000100010175
+:10B6D000010101010101010101010101010101005B
+:10B6E000000102000002010200010101010100014C
+:10B6F0000000000000000000000000010100000147
+:10B70000010101010000000001010101010101012D
+:10B71000010101010100000101010201020101001A
+:10B72000000000000002020202000000010001010E
+:10B7300001010101010101010101010101010101F9
+:10B7400001010101010000000001010101010100EE
+:10B7500001020102010102010102020101020100D4
+:10B7600001010001010201010102020101010100C8
+:10B7700001010101010101010102020101000100B9
+:10B7800000010000000000000001010101010101B1
+:10B790000101010101010101010101010101010199
+:10B7A000010101010101010100010101010101008B
+:10B7B0000000000000000000000100010101010084
+:10B7C0000001000100000000000000000100010174
+:10B7D000010101010101010101010101010101005A
+:10B7E000000101000001010100010101010100024D
+:10B7F0000000000000000000000000010100000146
+:10B80000010101010000000001010101020101012B
+:10B810000101020201000002020202020202020011
+:10B82000000000000201010201000001010001010D
+:10B8300001010101010101010101010102010101F7
+:10B8400001010101010000000101010101010100EC
+:10B8500001020102010202010102020102020100D1
+:10B8600001010001010201010102020102020100C5
+:10B8700001010101010101010102020101000100B8
+:10B8800000010001000000000001010101010101AF
+:10B890000101010101010101010101010101010198
+:10B8A000010101010101010100010101010101008A
+:10B8B000000100010000000000010101010101017F
+:10B8C0000101010100000000000000000100010171
+:10B8D0000101010101010201010101010101010058
+:10B8E000000101010001010101010101010100024A
+:10B8F0000000000000000000000000020100000144
+:10B900000101010100000000010102010201010228
+:10B91000010202020200000202020202020202000E
+:10B92000000100000201010201000001010001010B
+:10B9300001010101010101020101020202010101F3
+:10B9400001010101010000000101010101010100EB
+:10B9500002020202020202010202020102020100CC
+:10B9600001020001010201010102020102020100C3
+:10B9700001010101010101010102020202000100B5
+:10B9800000010001000000000001010101010101AE
+:10B990000101010101010101010101010101010296
+:10B9A0000202020202010101000202010201020080
+:10B9B000000100010000000000010101010101017E
+:10B9C000010101010001010000000000010001026D
+:10B9D0000101010101010201010101010101010057
+:10B9E0000101010100010101010101010101000248
+:10B9F000000101000000000000010002020000013F
+:10BA00000101020200000000020202020202020220
+:10BA1000020202020200000202020202020202000C
+:10BA2000000100000101010101000001010101020A
+:10BA300001010102020201020102020202020201EC
+:10BA400001010101010000000102010101010100E9
+:10BA500002020202020202010202020102020200CA
+:10BA600001020001010202020102020102020100C0
+:10BA700001020101010101010102020202000100B3
+:10BA800001010101000000000001010101010101AB
+:10BA90000101010101010101010101010101010295
+:10BAA000020202020202010100020202020202007C
+:10BAB000010100010000000000010101010101017C
+:10BAC000010101010001010000000100010001026B
+:10BAD0000101020201020202010101010201020050
+:10BAE0000100000100010101010101010101000249
+:10BAF000010101000000000101010002020000023A
+:10BB0000010202020000010002020202020202021D
+:10BB1000020202020200000202020202020202010A
+:10BB20000101000001010101010001010101010207
+:10BB300001020102020202020102020202020201E9
+:10BB400001020202010000000102010102010100E4
+:10BB500002020202020202010202020202020200C8
+:10BB600001020001020202020202020102020100BD
+:10BB700001020202020101010202020202000100AE
+:10BB800001010101000000000101010101010101A9
+:10BB90000101010101010101020201010201010291
+:10BBA0000202020202020202000202020202020079
+:10BBB000010100010000000000010101010101017B
+:10BBC0000101010101010101000101010101010265
+:10BBD000020102020202020201010202020202004A
+:10BBE000010000000100000001010101010100024B
+:10BBF0000101020000000001010101020200000237
+:10BC0000020202020000010002020202020202021B
+:10BC10000202020202000002020202020202020109
+:10BC20000101000001010101010101010201010204
+:10BC300002020202020202020102020202020201E6
+:10BC400002020202020000000102020202020200DD
+:10BC500002020202020202020202020202020200C6
+:10BC600001020002020202020202020202020100BA
+:10BC700001020202020202020202020202010101A8
+:10BC800001010101000000000101010101010102A7
+:10BC90000202020201020202020202020202020285
+:10BCA0000202020202020202000202020202020177
+:10BCB0000101000100000000000101010101010279
+:10BCC0000101010101010101000101010101010264
+:10BCD0000202020202020202020202020202020046
+:10BCE000000000000000000000000001000101024F
+:10BCF0000101020101000202020101020200000230
+:10BD00000202020201000100020202020202020219
+:10BD10000202020202000002020202020202020108
+:10BD200001010101010202010101010102010102FF
+:10BD300002020202020202020202020202020202E3
+:10BD400002020202020000000102020202020200DC
+:10BD500002020202020202020202020202020201C4
+:10BD600002020002020202020202020202020101B7
+:10BD700002020202020202020202020202010101A6
+:10BD800001010101010000000101010101010102A5
+:10BD90000202020202020202020202020202020283
+:10BDA0000202020202020202000202020202020176
+:10BDB0000101000100000000000101010101010278
+:10BDC000020202020102020101010101010101025C
+:10BDD0000202020202020202020202020202020045
+:10BDE0000000000000000000000000000000010250
+:10BDF000020102010200020202010102020100022C
+:10BE00000202020201000200020202020202020217
+:10BE10000202020202000002020202020202020206
+:10BE200001010101010202010101010102010102FE
+:10BE300002020202020202020202020202020202E2
+:10BE400002020202020000000102020202020200DB
+:10BE500002020202020202020202020202020201C3
+:10BE600002020002020202020202020202020101B6
+:10BE700002020202020202020202020202010101A5
+:10BE800001010101010000000101010101010102A4
+:10BE90000202020202020202020202020202020282
+:10BEA0000202020202020202000202020202020175
+:10BEB0000101010100000000000101010101010276
+:10BEC000020202020102020101010101010101025B
+:10BED0000202020202020202020202020202020044
+:10BEE000000000000000000000000000000001024F
+:10BEF000020202010200020202010102020100022A
+:10BF00000202020201000201020202020202020215
+:10BF10000202020202010102020202020202020203
+:10BF200002020201020202010101010102010202F8
+:10BF300002020202020202020202020202020202E1
+:10BF400002020202020000000102020202020202D8
+:10BF500002020202020202020202020202020202C1
+:10BF600002020102020202020202020202020102B3
+:10BF700002020202020202020202020202010101A4
+:10BF8000010201010102020101010101020101029C
+:10BF90000202020202020202020202020202020281
+:10BFA0000202020202020202000202020202020174
+:10BFB0000101010100000000010101010101010274
+:10BFC0000202020202020202010101010201020256
+:10BFD0000202020202020202020202020202020043
+:10BFE000000000000000000000000000000001024E
+:10BFF0000202020202020202020101020201000226
+:10C000000202020202000201020202020202020213
+:10C010000202020202020202020202020202020200
+:10C0200002020201020202010201010202010202F5
+:10C0300002020202020202020202020202020202E0
+:10C0400002020202020100010202020202020202D4
+:10C0500002020202020202020202020202020202C0
+:10C0600002020102020202020202020202020202B1
+:10C0700002020202020202020202020202010202A1
+:10C080000202020201010101010202020202020295
+:10C090000202020202020202020202020202020280
+:10C0A0000202020202020202000202020202020272
+:10C0B000020201020000000001010101020101026F
+:10C0C0000202020202020202010102010201020254
+:10C0D0000202020202020202020202020202020042
+:10C0E000000000000000000000000000000001024D
+:10C0F0000202020202020202020202020201000223
+:10C10000020202020202020202020202020202020F
+:10C1100002020202020202020202020202020202FF
+:10C1200002020202020202020201020202020202F0
+:10C1300002020202020202020202020202020202DF
+:10C1400002020202020100010202020202020202D3
+:10C1500002020202020202020202020202020202BF
+:10C1600002020202020202020202020202020202AF
+:10C1700002020202020202020202020202010202A0
+:10C180000202020201010101010202020202020294
+:10C19000020202020202020202020202020202027F
+:10C1A0000202020202020202010202020202020270
+:10C1B0000202010201000000010202020202020268
+:10C1C000020202020202020202020202020202024F
+:10C1D0000202020202020202020202020202020041
+:10C1E000000000000000000000000000000001014D
+:10C1F0000202020202020202010202020201000223
+:10C20000020202020202020202020202020202020E
+:10C2100002020202020202020202020202020202FE
+:10C2200002020202020202020202020202020202EE
+:10C2300002020202020202020202020202020202DE
+:10C2400002020202020201010202020202020202D0
+:10C2500002020202020201020202020202020202BF
+:10C2600002020202020202020202020202020202AE
+:10C27000020202020202020202020202020202029E
+:10C280000202020202010101020202020202020291
+:10C29000020202020202020202020202020202027E
+:10C2A000020202020202020201020202020202026F
+:10C2B0000202020201000000010202020202020266
+:10C2C000020202020202020202020202020202024E
+:10C2D0000202020202020202020202020202020040
+:10C2E000000000000000000000000000000001014C
+:10C2F0000202020202020202010202020202000221
+:10C30000020202020202020202020202020202020D
+:10C3100002020202020202020202020202020202FD
+:10C3200002020202020202020202020202020202ED
+:10C3300002020202020202020202020202020202DD
+:10C3400002020202020202020202020202020202CD
+:10C3500002020202020201020202020202020202BE
+:10C3600002020202020202020202020202020202AD
+:10C37000020202020202020202020202020202029D
+:10C38000020202020202020202020202020202028D
+:10C39000020202020202020202020202020202027D
+:10C3A000020202020202020201020202020202026E
+:10C3B0000202020201010101010202020202020262
+:10C3C000020202020202020202020202020202024D
+:10C3D000020202020202020202020202020202003F
+:10C3E000000000000000000000000000000001014B
+:10C3F0000202010201020101010202010202000225
+:10C40000020202020202020202020202020202020C
+:10C4100002020202020202020202020202020202FC
+:10C4200002020202020202020202020202020202EC
+:10C4300002020202020202020202020202020202DC
+:10C4400002020202020202020202020202020202CC
+:10C4500002020202020101020202020202020202BE
+:10C4600002020202020201010202020202020202AE
+:10C47000020202020202020202020202020202029C
+:10C48000020202020202020202020202020202028C
+:10C49000020202020202020202020202020202027C
+:10C4A000020202020202020202020202020202026C
+:10C4B000020202020202020102020202020202025D
+:10C4C000020202020202020202020202020202024C
+:10C4D000020202020202020202020202020202003E
+:10C4E000000000000000000000000000000000014B
+:10C4F0000202010201020101010202010202000224
+:10C50000020202020202020202020202020202020B
+:10C5100002020202020202020202020202020202FB
+:10C5200002020202020101020202020202020202ED
+:10C5300002020202020202020202020202020202DB
+:10C5400002020202020202020202020202020202CB
+:10C5500002020202020102020202020202020202BC
+:10C5600002020202020201010202020202020202AD
+:10C57000020202020202020202020202020202029B
+:10C58000020202020202020202020202020202028B
+:10C59000020202020202020202020202020202027B
+:10C5A000020202020202020202020202020202026B
+:10C5B000020202020202020202020202020202025B
+:10C5C000020202020202020202020202020202024B
+:10C5D000020202020202020202020202020202003D
+:10C5E000000000000000000000000000000000004B
+:10C5F0000202010201020101000202010202000224
+:10C60000020202020202020202020202020202020A
+:10C6100002020202020202020202020202020202FA
+:10C6200002020202020101020202020202020202EC
+:10C6300002020202020101020202020202020202DC
+:10C6400002020202020202020202020202020202CA
+:10C6500002020202020202020202020202020202BA
+:10C6600002020202020101010202020202020202AD
+:10C67000020202020202020202020202020202029A
+:10C68000020202020202020202020202020202028A
+:10C69000020202020202020202020202020202027A
+:10C6A000020202020202020202020202020202026A
+:10C6B000020202020202020202020202020202025A
+:10C6C000020202020202020202020202020202024A
+:10C6D000020202020202020202020202020202003C
+:10C6E0000202000000000000000202000200000040
+:10C6F0000102010101010101000202010102000227
+:10C700000202020202020202020202020202020209
+:10C7100002020202020202020202020202020202F9
+:10C7200002020102010101020202020202020202ED
+:10C7300002020202020101020202020202020202DB
+:10C7400002020202020202020202020202020202C9
+:10C7500002020202020202020202020202020202B9
+:10C7600002020202020102020202020202020202AA
+:10C77000020202020201010102020202020202029C
+:10C780000202020202020202020202020202020289
+:10C790000202020202020202020202020202020279
+:10C7A0000202020202020202020202020202020269
+:10C7B0000202020202020202020202020202020259
+:10C7C0000202020202020202020202020202020249
+:10C7D0000202020202020202020202020202020239
+:10C7E0000202000000000000000202020202020039
+:10C7F000010100010001000000020100010200022D
+:10C800000202020202020202020202020202020208
+:10C8100002020202020202020202020202020202F8
+:10C8200002020102010202020202020202020201EB
+:10C8300001010101010202010101010101010102E5
+:10C8400002020202020202020202020202020201C9
+:10C8500001010101010101010101010101010101C8
+:10C8600001010101010202020101010101010102B4
+:10C87000020202020201010102020202020202029B
+:10C880000202020202020202020202020202020288
+:10C890000202020202020202020202020202020278
+:10C8A0000202020202020202020202020202020268
+:10C8B0000202020202020202020202020202020258
+:10C8C0000202020202020202020202020202020248
+:10C8D0000202020202020202020202020202020238
+:10C8E000020202020002020202020202020202002C
+:10C8F0000101000100010000000101000101000030
+:10C900000000000000000000000000000000000126
+:10C910000101010101010101010101010101010107
+:10C9200001010201020202010101010101010102F2
+:10C9300002020202020202020202020202020202D7
+:10C9400002020202020202020202020202020201C8
+:10C9500001010101010101010101010101010102C6
+:10C9600002020202020202020202020202020201A8
+:10C9700001010101010202020101010101010102A3
+:10C980000202020202020202020202020202020287
+:10C990000202020202020202020202020202020277
+:10C9A0000202020202020202020202020202020267
+:10C9B0000202020202020202020202020202020158
+:10C9C0000101010101010101010101010101010256
+:10C9D0000202020202020202020202020202020237
+:10C9E0000202020202020202020202020202020029
+:10C9F000010100010001000000010100010101002E
+:10CA00000000000000000000000000000000000224
+:10CA100002020202020202020202020202020202F6
+:10CA200002020202020202020202020202020200E8
+:10CA300000000000000000000000000000000001F5
+:10CA400001010101010101010101010101010101D6
+:10CA500001010101010101010101010101010101C6
+:10CA600001010101010101010101010101010102B5
+:10CA70000202020202020202020202020202020296
+:10CA80000202020202020202020202020202020286
+:10CA90000202020202020202020202020202020276
+:10CAA0000202020202020202020202020202020266
+:10CAB0000202020202020202020202020202020256
+:10CAC0000202020202020202020202020202020246
+:10CAD0000202020202020202020202020202020236
+:10CAE0000202020202020202020202020202020028
+:10CAF0000001000000000000000101000001010130
+:10CB00000101010101010101010101010101010016
+:10CB10000000000000000000000000000000000114
+:10CB200001010101010101010101010101010100F6
+:10CB300000000000000000000000000000000002F3
+:10CB400002020202020202020202020202020201C6
+:10CB500001010101010101010101010101010101C5
+:10CB600001010101010101010101010101010101B5
+:10CB700001010101010101010101010101010100A6
+:10CB800000000000000000000000000000000002A3
+:10CB90000202020202020202020202020202020176
+:10CBA0000101010101010101010101010101010274
+:10CBB0000202020202020202020202020202020057
+:10CBC0000000000000000000000000000000000263
+:10CBD0000202020202020202020202020202020235
+:10CBE0000202020202020202020202020202020027
+:10CBF0000000000000000000000100000001010131
+:10CC00000101010101010101010101010101010015
+:10CC10000000000000000000000000000000000113
+:10CC200001010101010101010101010101010101F4
+:10CC300001010101010101010101010101010100E5
+:10CC400000000000000000000000000000000001E3
+:10CC500001010101010101010101010101010101C4
+:10CC600001010101010101010101010101010101B4
+:10CC700001010101010101010101010101010100A5
+:10CC800000000000000000000000000000000002A2
+:10CC90000202020202020202020202020202020274
+:10CCA0000202020202020202020202020202020066
+:10CCB0000000000000000000000000000000000074
+:10CCC0000000000000000000000000000000000064
+:10CCD0000000000000000000000000000000000252
+:10CCE0000202020202020202020202020202020026
+:10CCF0000000000000000000000000000000010132
+:10CD00000101010101010101010101010101010113
+:10CD10000101010101010101010101010101010103
+:10CD200001010101010101010101010101010101F3
+:10CD300001010101010101010101010101010101E3
+:10CD400001010101010101010101010101010101D3
+:10CD500001010101010101010101010101010101C3
+:10CD600001010101010101010101010101010101B3
+:10CD700001010101010101010101010101010100A4
+:10CD800000000000000000000000000000000002A1
+:10CD90000202020202020202020202020202020174
+:10CDA0000101010101010101010101010101010074
+:10CDB0000000000000000000000000000000000073
+:10CDC0000000000000000000000000000000000063
+:10CDD0000000000000000000000000000000000251
+:10CDE0000202020202020202020202020202020124
+:10CDF0000101010101010101010101010101010123
+:10CE00000101010101010101010101010101010112
+:10CE10000101010101010101010101010101010102
+:10CE200001010101010101010101010101010101F2
+:10CE300001010101010101010101010101010101E2
+:10CE400001010101010101010101010101010101D2
+:10CE500001010101010101010101010101010101C2
+:10CE600001010101010101010101010101010101B2
+:10CE700001010101010101010101010101010100A3
+:10CE800000000000000000000000000000000000A2
+:10CE90000000000000000000000000000000000191
+:10CEA0000101010101010101010101010101010073
+:10CEB0000000000000000000000000000000000072
+:10CEC0000000000000000000000000000000000062
+:10CED0000000000000000000000000000000000250
+:10CEE0000202020202020202020202020202020123
+:10CEF0000101010101010101010101010101010122
+:10CF00000101010101010101010101010101010111
+:10CF10000101010101010101010101010101010101
+:10CF200001010101010101010101010101010101F1
+:10CF300001010101010101010101010101010101E1
+:10CF400001010101010101010101010101010101D1
+:10CF500001010101010101010101010101010101C1
+:10CF600001010101010101010101010101010101B1
+:10CF700001010101010101010101010101010101A1
+:10CF80000101010101010101010101010101010191
+:10CF90000101010101010101010101010101010181
+:10CFA0000101010101010101010101010101010072
+:10CFB0000000000000000000000000000000000170
+:10CFC0000101010101010101010101010101010151
+:10CFD0000101010101010101010101010101010042
+:10CFE0000000000000000000000000000000000140
+:10CFF0000101010101010101010101010101010121
+:10D000000101010101010101010101010101010110
+:10D010000101010101010101010101010101010100
+:10D0200001010101010101010101010101010101F0
+:10D0300001010101010101010101010101010101E0
+:10D0400001010101010101010101010101010101D0
+:10D0500001010101010101010101010101010101C0
+:10D0600001010101010101010101010101010101B0
+:10D0700001010101010101010101010101010101A0
+:10D080000101010101010101010101010101010190
+:10D090000101010101010101010101010101010180
+:10D0A0000101010101010101010101010101010170
+:10D0B0000101010101010101010101010101010160
+:10D0C0000101010101010101010101010101010150
+:10D0D0000101010101010101010101010101010041
+:10D0E000000000000000000000000000000000013F
+:10D0F0000101010101010101010101010101010120
+:10D10000010101010101010101010101010101010F
+:10D1100001010101010101010101010101010101FF
+:10D1200001010101010101010101010101010101EF
+:10D1300001010101010101010101010101010101DF
+:10D1400001010101010101010101010101010101CF
+:10D1500001010101010101010101010101010101BF
+:10D1600001010101010101010101010101010101AF
+:10D17000010101010101010101010101010101019F
+:10D18000010101010101010101010101010101018F
+:10D19000010101010101010101010101010101017F
+:10D1A000010101010101010101010101010101016F
+:10D1B000010101010101010101010101010101015F
+:10D1C000010101010101010101010101010101014F
+:10D1D0000101010101010101010101010101010040
+:10D1E000000000000000000000000000000000003F
+:10D1F000000000000000000000000000000000002F
+:10D20000000000000000000000000000000000001E
+:10D21000000000000000000000000000000000020C
+:10D2200002020202020202020202020202020202DE
+:10D2300002020202020202020202020202020202CE
+:10D2400002020202020202020202020202020202BE
+:10D2500002020202020202020202020202020202AE
+:10D26000020202020202020202020202020202029E
+:10D27000020202020202020202020202020202028E
+:10D28000020202020202020202020202020202027E
+:10D29000020202020202020202020202020202026E
+:10D2A000020202020202020202020202020202025E
+:10D2B000020202020202020202020202020202024E
+:10D2C000020202020202020202020202020202023E
+:10D2D0000202020202020202020202020202020030
+:10D2E000000000000000000000000000000000003E
+:10D2F000000000000000000000000000000000002E
+:10D30000000000000000000000000000000000001D
+:10D31000000000000000000000000000000000000D
+:10D3200000000000000000000000000000000000FD
+:10D3300000000000000000000000000000000000ED
+:10D3400000000000000000000000000000000002DB
+:10D3500002020202020202020202020202020202AD
+:10D36000020202020202020202020202020202029D
+:10D37000020202020202020202020202020202008F
+:10D38000000000000000000000000000000000009D
+:10D39000000000000000000000000000000000028B
+:10D3A000020202020202020202020202020202005F
+:10D3B000000000000000000000000000000000026B
+:10D3C000020202020202020202020202020202023D
+:10D3D000020202020202020202020202020202002F
+:10D3E000000000000000000000000000000000003D
+:10D3F000000000000000000000000000000000002D
+:10D40000000000000000000000000000000000001C
+:10D41000000000000000000000000000000000000C
+:10D4200000000000000000000000000000000000FC
+:10D4300000000000000000000000000000000000EC
+:10D4400000000000000000000000000000000000DC
+:10D4500000000000000000000000000000000000CC
+:10D4600000000000000000000000000000000000BC
+:10D4700000000000000000000000000000000000AC
+:10D48000000000000000000000000000000000009C
+:10D49000000000000000000000000000000000008C
+:10D4A000000000000000000000000000000000007C
+:10D4B000000000000000000000000000000000006C
+:10D4C000000000000000000000000000000000005C
+:10D4D000000000000000000000000000000000004C
+:10D4E000000000000000000000000000000000310B
+:10D4F000000000000000000000000000000000002C
+:10D50000000000000000000000000000000000001B
+:10D51000000000000000000000000000000000000B
+:10D5200000000000000000000000000000000000FB
+:10D5300000000000000000000000000100010101E7
+:10D5400001000000000000000000000000000000DA
+:10D5500000000000000000000000000000000000CB
+:10D5600000000000000000000000000000000000BB
+:10D5700000000000000000000000000000000000AB
+:10D58000000000000000000000000000000000009B
+:10D59000000000000000000000000000000000008B
+:10D5A000000000000000000000000000000000007B
+:10D5B000000000000000000000000000000000006B
+:10D5C000000000000000000000000000000000005B
+:10D5D000000000000000000000000000000000004B
+:10D5E000000000000000000000000000000000003B
+:10D5F000000000000000000000000000000000002B
+:10D60000000000000000000000000000000000001A
+:10D61000000000000000000000000000000000000A
+:10D6200000000000000000000000000000000000FA
+:10D6300000000000000000000000010101010101E4
+:10D6400001010000000000010000000000000000D7
+:10D6500000000000000000000000000000000000CA
+:10D6600000000000000000000000000000000000BA
+:10D6700000000000000000000000000000000000AA
+:10D68000000000000000000000000000000000009A
+:10D69000000000000000000000000000000000008A
+:10D6A000000000000000000000000000000000007A
+:10D6B000000000000000000000000000000000006A
+:10D6C000000000000000000000000000000000005A
+:10D6D000000000000000000000000000000000004A
+:10D6E000000000000000000000000000000000003A
+:10D6F000000000000000000000000000000000002A
+:10D700000000000000000000000000000000000019
+:10D710000000000000010000000000000000000008
+:10D7200000000000010000000000000000000000F8
+:10D7300000000000000000000000010101010101E3
+:10D7400001010100000000010000000000000000D5
+:10D7500000000000000000000000000000000000C9
+:10D7600000000000000000000000000000000000B9
+:10D7700000000000000000000000000000000000A9
+:10D780000000000000000000000000000000000099
+:10D790000000000000000000000000000000000089
+:10D7A0000000000000000000000000000000000079
+:10D7B0000000000000000000000000000000000069
+:10D7C0000000000000000000000000000000000059
+:10D7D0000000000000000000000000000000000049
+:10D7E0000000000000000000000000000000000039
+:10D7F0000000000000000000000000000000000029
+:10D800000000000000000000000000000000000018
+:10D810000000000001010000000000000000000006
+:10D8200000000001010101000000000000000000F4
+:10D8300000000000010000000000010101010101E1
+:10D8400001010100000000010000000000000000D4
+:10D8500000000000000000000000000000000000C8
+:10D8600000000000000000000000000000000000B8
+:10D8700000000000000000000000000000000000A8
+:10D880000000000000000000000000000000000098
+:10D890000000000000000000000000000000000088
+:10D8A0000000000000000000000000000000000078
+:10D8B0000000000000000000000000000000000068
+:10D8C0000000000000000000000000000000000058
+:10D8D0000000000000000000000000000000000048
+:10D8E0000000000000000000000000000000000038
+:10D8F0000000000001000000000000000000000027
+:10D900000000000000000000000000000000000017
+:10D910000000000101010100000000000000000003
+:10D9200000000001010101000000000000000000F3
+:10D9300000000001010101000001010101010101DC
+:10D9400001010100000000010000000000000000D3
+:10D9500000000000000000000000000000000000C7
+:10D9600000000000000000000000000000000000B7
+:10D9700000000000000000010000000000000000A6
+:10D980000000000000000000000000000000000097
+:10D990000000000000000000000000000000000087
+:10D9A0000000000000000000000000000000000077
+:10D9B0000000000000000000000000000000000067
+:10D9C0000000000000000000000000000000000057
+:10D9D0000000000000000000000000000000000047
+:10D9E0000000000000000000000000000000000037
+:10D9F0000000000101000000000000000000000025
+:10DA00000000000000000000000000000000000016
+:10DA10000000000101010100000000000000000002
+:10DA200000000101010101000000000000000000F1
+:10DA300000000001010101010101010101010101D9
+:10DA400001010100000000010000000000000000D2
+:10DA500000000000000000000000000000000000C6
+:10DA600000000000010000000000000000000000B5
+:10DA700000000000000000010000000000000000A5
+:10DA80000000000000000000000000000000000096
+:10DA90000000000000000000000000000000000086
+:10DAA0000000000000000000000000000000000076
+:10DAB0000000000000000000000000000000000066
+:10DAC0000000000000000000000000000000000056
+:10DAD0000000000000000000000000000000000046
+:10DAE0000000000000000000000000000000000036
+:10DAF0000000000101000000000000000000000024
+:10DB00000000000000000000000000000000000015
+:10DB100000000101010101000000000000000001FF
+:10DB200000010101010101000000000000000000EF
+:10DB300000000101010101010101010101010101D7
+:10DB400001010100000000010000000000000000D1
+:10DB500000000000000000000000000000000000C5
+:10DB600000000001010101000000000000000000B1
+:10DB700000000000000000010000000000000000A4
+:10DB80000000000000010000000000000000000094
+:10DB90000000000000000000000000000000000085
+:10DBA0000000000000000000000000000000000075
+:10DBB0000000000000010000000000000000000064
+:10DBC0000000000000010100000000000000000053
+:10DBD0000000000000000000000000000000000045
+:10DBE0000000000000000000000000000000000035
+:10DBF0000000000101000000000000000000000023
+:10DC00000000000000000000000000000000000014
+:10DC100000010101010101000000000000000001FD
+:10DC200000010101010101000000000000000001ED
+:10DC300000010101010101010101010101010101D5
+:10DC400001010100000000010000000000000000D0
+:10DC500000000000000000000000000000000000C4
+:10DC600000000001010101000000000000000000B0
+:10DC700000000000000000010000000000000000A3
+:10DC80000000000000010000000000000000000093
+:10DC90000000000000010000000000000000000083
+:10DCA0000000000000000000000000000000000074
+:10DCB0000000000001010000000000000000000062
+:10DCC0000000000001010100000000000000000051
+:10DCD0000000000000000000000000000000000044
+:10DCE0000000000000000000000000000000000034
+:10DCF0000000000101000000000000000000000022
+:10DD00000000000000000000000000000000000013
+:10DD100000010101010101000000000101010001F9
+:10DD200001010101010101000000000000000001EB
+:10DD300000010101010101010101010101010101D4
+:10DD400001010100000000010000000000000000CF
+:10DD500000000000000000000000000000000000C3
+:10DD600000000001010101000000000000000000AF
+:10DD700000020000000000010000000000000000A0
+:10DD80000000000000010000000000000000000092
+:10DD90000000000001010000000000000000000081
+:10DDA0000000000000000000000000000000000073
+:10DDB000000000010101010000000000000000005F
+:10DDC000000000010101010000000000000000004F
+:10DDD0000000000000000000000000000000000043
+:10DDE0000000000000000000000000000000000033
+:10DDF0000000000101000000000000000000000021
+:10DE0000000000000000000000000001010000010F
+:10DE100001010101010101010000000101010001F6
+:10DE200001010101010101000000000101010001E7
+:10DE300001010101010101010101010101010101D2
+:10DE400001010100000000010000000000000000CE
+:10DE500000000000000100000000000100000000C0
+:10DE600000010001010101000000000000000000AD
+:10DE7000000200000000000100000000000000009F
+:10DE80000000000001010000000000000000000090
+:10DE9000000000010101000000000000000000007F
+:10DEA0000000000000000000000000000000000072
+:10DEB000000000010101010000000001000000005D
+:10DEC000000000010101010000000000000000004E
+:10DED0000000000000000000000000000000000042
+:10DEE0000000000000000000000000000000000032
+:10DEF0000000000101000000000000000000000020
+:10DF0000000000000000000000000001010000010E
+:10DF100001010101010101010000000101010101F4
+:10DF200001010101010101000000000101010001E6
+:10DF300001010101010101010101010101010101D1
+:10DF400001010100000100010000000000000000CC
+:10DF500000000000010100000000000100000000BE
+:10DF600000010101010101000000000000000000AB
+:10DF7000020200000000000100000000000000009C
+:10DF8000000000000101000000000000000000008F
+:10DF9000000000010101000000000000000000007E
+:10DFA000000000000001010000000000000000006F
+:10DFB000000000010101010000000001000000005C
+:10DFC000000000010101010000000000000000004D
+:10DFD000000000000001010000000000000000003F
+:10DFE0000000000000000100000000000000000030
+:10DFF000000000010100000000000000000000001F
+:10E00000000000000000000000000001010100010C
+:10E0100001010101010101010100010101010101F1
+:10E0200001010101010101000000000101010101E4
+:10E0300001010101010101010101010101010101D0
+:10E0400001010100010100010000000000000000CA
+:10E0500000000001010101000000000101000001B9
+:10E0600000010101010101000000000000000000AA
+:10E07000020100000000000100000000000000009C
+:10E08000000000000101000000000000000000008E
+:10E09000000000010101010000000000000000007C
+:10E0A000000000000101010000000000000000006D
+:10E0B000000000010101010000000001000000005B
+:10E0C000000100010101010000000000000000004B
+:10E0D000000000000101010000000000000000003D
+:10E0E000000000000000010000000000000000002F
+:10E0F000000000010100000000000000000000001E
+:10E10000000000000000000001000001010100010A
+:10E1100001010101010101010101010101010101EF
+:10E1200001010101010101000100010101010101E1
+:10E1300001010101010101010101010101010101CF
+:10E1400001010101010101010000000000000000C7
+:10E1500000000001010101000100000101000001B7
+:10E1600000010101010101000000000002020000A5
+:10E17000020100000000000100000000000000009B
+:10E180000000000001010000000000000002000289
+:10E190000200000101010100000000000000000079
+:10E1A000000000010101010000000000000000006B
+:10E1B000000000010101010000000001000000005A
+:10E1C0000001010101010100000000000000000049
+:10E1D000000000010101010000000000000000003B
+:10E1E000000000000001010000000000000000002D
+:10E1F000000000010100000000000000000000001D
+:10E200000000000000000000010000010101000109
+:10E2100001010101010101010101010101010101EE
+:10E2200001010101010101000101010101010101DF
+:10E2300001010101010101010101010101010101CE
+:10E2400001010101010101010000000000000000C6
+:10E2500000000001010101000100000101010001B5
+:10E2600001010101010101000000000002020000A3
+:10E27000010100000001000100000000000000009A
+:10E280000000000001010000000000000002000288
+:10E290000200000101010100000000010000000077
+:10E2A0000001000101010100000000000000000069
+:10E2B0000000000101010100000000010101000156
+:10E2C0000101010101010100000000000000000047
+:10E2D000000000010101010000000000000000003A
+:10E2E000000000000101010000000000000000002B
+:10E2F000000000010100000000000000000000001C
+:10E300000000000000000001010001010101000106
+:10E3100001010101010101010101010101010101ED
+:10E3200001010101010101010101010101010101DD
+:10E3300001010101010101010101010101010201CC
+:10E3400001010101010101010000000100000000C4
+:10E3500000000001010101000100010101010001B3
+:10E36000010101010101010000020002010102029C
+:10E370000101000000010001000000000000000099
+:10E380000000000101010100000000000001000187
+:10E390000101000101010100000000010000000076
+:10E3A0000001010101010100000000000000000067
+:10E3B0000000000101010100010001010101000153
+:10E3C0000101010101010100000000000000000046
+:10E3D0000000000101010100000000000000000039
+:10E3E0000000000101010100000000000000000029
+:10E3F000000000010100000000000000000000001B
+:10E400000000000000000001010001010101000105
+:10E4100001010101010101010101010101010101EC
+:10E4200001010101010101010101010101010101DC
+:10E4300001010101010101010101020201020202C7
+:10E4400002010101010101020000000100000000C1
+:10E4500000000001010101000101010101010001B1
+:10E460000101010101010101000102020101020299
+:10E470000101020000010002000000000002000291
+:10E480000200000101010100000000000001000184
+:10E490000101000101010100000000010100000173
+:10E4A0000101010101010100000000000000000065
+:10E4B000000100010101010001010101010101014F
+:10E4C0000101010101010100000000010100000043
+:10E4D0000000000101010100000000010100000036
+:10E4E0000000000101010100000000000000000028
+:10E4F000000000010100000000000000000000001A
+:10E500000000000000000001010001010101000104
+:10E5100001010101010101010101010101010101EB
+:10E5200001010101010101010101010101010101DB
+:10E5300001010101010101020102020202020202C3
+:10E5400002010101010101020000000100000000C0
+:10E5500000000001010101010101010101010001AF
+:10E56000010101010101010100010101010102029A
+:10E570000101010001010002000000000002000290
+:10E580000200010101010100000000000101000181
+:10E590000101000101010100010000010100000171
+:10E5A0000101010101010100010000000000000063
+:10E5B000000100010101010101010101010101014D
+:10E5C0000101010101010100000000010100000042
+:10E5D0000000010101010100000000010100000034
+:10E5E0000000000101010100010000000000000026
+:10E5F000000000000001000000000000000000001A
+:10E600000000000000010001010001010101000102
+:10E6100001010101010101010101010101010101EA
+:10E6200001010101010101010101010101010101DA
+:10E6300001010101010101020202020202020202C1
+:10E6400002020201010101020100000100000000BC
+:10E6500000000101010101010101010101010101AC
+:10E66000010101010101010100010101010101019B
+:10E670000101010001010002000000000001000191
+:10E680000101010101010100000000000101000180
+:10E69000010100010101010001000001010100016F
+:10E6A0000101010101010100010000000000000062
+:10E6B000000100010101010101010101010101014C
+:10E6C0000101010101010100000000010101000040
+:10E6D0000001010101010100000000010101010030
+:10E6E0000001000101010100010000000000000024
+:10E6F0000000000000010000000000000000000019
+:10E700000000000100010001010001010101000100
+:10E7100001010101010101010101010101010101E9
+:10E7200001010101010101010101010101010101D9
+:10E7300001010101010101020202020202020202C0
+:10E7400002020201010101020100000100000000BB
+:10E7500000000101010101010101010101010101AB
+:10E76000010101010101010100010101010101019A
+:10E77000010101000101000200000000000102018E
+:10E78000010101010101010000000000010100017F
+:10E79000010100010101010101000101010100016C
+:10E7A0000101010101010100010001000000000060
+:10E7B000000101010101010101010101010101014A
+:10E7C000010101010101010001000001010100003E
+:10E7D000000101010101010001000001010101002E
+:10E7E0000001010101010100010000010000000021
+:10E7F0000000000000010000000000000000000018
+:10E8000000000001000100010100010101010101FE
+:10E8100001010202020201010101010101010101E4
+:10E8200001010101010101010101010101010101D8
+:10E8300001010101010101020202020202020202BF
+:10E8400002020201010101020100000100000000BA
+:10E8500000000101010101010101010101010101AA
+:10E860000101010101010101000101010101010199
+:10E870000101010101010102000100010101020188
+:10E88000010101010101010000000000010100017E
+:10E890000101000101010101010101010101010169
+:10E8A000010101010101010001000100000100005E
+:10E8B0000001010101010101010101010101010149
+:10E8C000010101010101010001010001010100013B
+:10E8D000000101010101010001010001010101012B
+:10E8E000010101010101010001000101000000001E
+:10E8F0000000000000010000000000000000000017
+:10E9000000000001000100010100010202010102FA
+:10E9100002020202020202020101010101010102DE
+:10E9200001010202020101010101010101010101D4
+:10E9300001010101010101020202020202020202BE
+:10E9400002020201010101020100000101000000B8
+:10E9500000000101010101010101010101010101A9
+:10E960000101010101010101000101010101010198
+:10E970000101010101010102000101010101010187
+:10E98000010101010101010000000000010100017D
+:10E990000101000101010101010101010101010168
+:10E9A000010101010101010101000100000100005C
+:10E9B0000001010101010101010101010101010148
+:10E9C0000101010101010101010101010101000138
+:10E9D0000001010101010101010101010101010128
+:10E9E0000101010101010100000101010001020119
+:10E9F0000000000000010000000200000001000013
+:10EA000000010001000100020200010202020102F5
+:10EA100002020202020202020101010202020202D9
+:10EA200002020202020202010101010101010102CE
+:10EA300001010202020101020202020202020202BA
+:10EA400002020201010101020100000101000000B7
+:10EA500000000101010101010101010101010101A8
+:10EA60000101010101010102000201010101010195
+:10EA70000101010101010102000101010101010186
+:10EA80000101010101020100010000000101010179
+:10EA90000101020202020101010101010101010162
+:10EAA0000101010101010101010101010101000058
+:10EAB0000001010101010101010101010101010147
+:10EAC0000101010101010101010101010101010136
+:10EAD0000101010101010101010101010101010126
+:10EAE0000101010101010100000101010001010119
+:10EAF0000000010000010000000200000001000011
+:10EB000000010101000100020200020202020102F2
+:10EB100002020202020202020202020202020202D5
+:10EB200002020202020202010101010202020202C9
+:10EB300002020202020202020202020202020202B5
+:10EB400002020201010101020100000101010000B5
+:10EB500000000101010101010101010201010101A6
+:10EB6000010101020201010200020201020201018F
+:10EB70000201010101010102010101010101010183
+:10EB80000101010102020100010000000101010177
+:10EB90000101010202020101010101010101010162
+:10EBA0000101010101010101010101010101000057
+:10EBB0000001010202020101010101020101010142
+:10EBC0000101010101010101010101010101010135
+:10EBD0000101010101010101010101010101010125
+:10EBE0000101010101010100000101010101010117
+:10EBF000000101000001010000020000000202000B
+:10EC000000010101010100020200020202020102F0
+:10EC100002020202020202020202020202020202D4
+:10EC200002020202020202020202020202020202C4
+:10EC300002020202020202020202020202020202B4
+:10EC400002020202020201020100000101010000B1
+:10EC500000000101010101010201010202010102A2
+:10EC60000102020202020202000202020202010189
+:10EC70000201020101010102010201010101010180
+:10EC80000101020102020100010000000202010272
+:10EC9000020201020202020101010101010101015E
+:10ECA0000101010101010101010101010101000056
+:10ECB0000001010202020201010101020101010140
+:10ECC0000101010202020201010101010101010130
+:10ECD0000101010101010101010101010101010124
+:10ECE0000101010101010100000101010101010116
+:10ECF0000001010000010100000202000002020008
+:10ED000000010102010100020200020202020202ED
+:10ED100002020202020202020202020202020202D3
+:10ED200002020202020202020202020202020202C3
+:10ED300002020202020202020202020202020202B3
+:10ED400002020202020202020100000201010000AE
+:10ED5000000001020202010202020202020201029A
+:10ED60000202020202020202000202020202020285
+:10ED70000202020101010102010202020202010279
+:10ED8000020202020202010001000001020202026C
+:10ED9000020201020202020101010101010101015D
+:10EDA0000101010101010101020101010101000054
+:10EDB0000001010202020202020202020202020237
+:10EDC000020202020202020101010101010101012C
+:10EDD0000101010101010101010101010101010123
+:10EDE0000101010101010100000000000101010118
+:10EDF0000101010000010100000202000202020202
+:10EE000002020202010100020200020202020202E8
+:10EE100002020202020202020202020202020202D2
+:10EE200002020202020202020202020202020202C2
+:10EE300002020202020202020202020202020202B2
+:10EE400002020202020202020200000201010000AC
+:10EE50000000010202020202020202020202020297
+:10EE60000202020202020202000202020202020284
+:10EE70000202020101020102010202020202020276
+:10EE80000202020202020200020001010202020268
+:10EE9000020201020202020101010101010101015C
+:10EEA0000101010101010102020102010101000051
+:10EEB0000002010202020202020202020202020235
+:10EEC0000202020202020201010101020201010129
+:10EED000010101020202020101010102020102011B
+:10EEE0000101010101010200000000000100000019
+:10EEF00001010100000101020202020102020202FC
+:10EF000002020202010100020200020202020202E7
+:10EF100002020202020202020202020202020202D1
+:10EF200002020202020202020202020202020202C1
+:10EF300002020202020202020202020202020202B1
+:10EF400002020202020202020200000201010000AB
+:10EF50000000020202020202020202020202020295
+:10EF60000202020202020202000202020202020283
+:10EF70000202020102020102020202020202020273
+:10EF80000202020202020200020001010202020267
+:10EF9000020201020202020101010102010101015A
+:10EFA000010101010101010202020201010200004E
+:10EFB0000002020202020202020202020202020233
+:10EFC0000202020202020202020201020202010124
+:10EFD0000101020202020202020201020202020115
+:10EFE0000101010202020200000000000000000016
+:10EFF00001010000000101020202020102020202FC
+:10F0000002020202010200020200020202020202E5
+:10F0100002020202020202020202020202020202D0
+:10F0200002020202020202020202020202020202C0
+:10F0300002020202020202020202020202020202B0
+:10F0400002020202020202020200010202010000A8
+:10F050000000020202020202020202020202020294
+:10F060000202020202020202010202020202020281
+:10F070000202020202020102020202020202020271
+:10F080000202020202020202020002020202020262
+:10F090000202020202020202020101020201010254
+:10F0A0000202020202020202020202020202000143
+:10F0B0000102020202020202020202020202020231
+:10F0C0000202020202020202020202020202020220
+:10F0D0000102020202020202020202020202020211
+:10F0E0000202020202020200000000000000000012
+:10F0F00000000000000101020201020202020202FD
+:10F1000002020202010200020200020202020202E4
+:10F1100002020202020202020202020202020202CF
+:10F1200002020202020202020202020202020202BF
+:10F1300002020202020202020202020202020202AF
+:10F1400002020202020202020201010202020001A4
+:10F150000000020202020202020202020202020293
+:10F160000202020202020202010202020202020280
+:10F17000020202020202020202020202020202026F
+:10F18000020202020202020202020202020202025F
+:10F19000020202020202020202020202020202024F
+:10F1A0000202020202020202020202020202000142
+:10F1B0000102020202020202020202020202020230
+:10F1C000020202020202020202020202020202021F
+:10F1D000020202020202020202020202020202020F
+:10F1E0000202020202020200000000000000000011
+:10F1F00000000000000101020201020202020202FC
+:10F2000002020202010200020202020202020202E1
+:10F2100002020202020202020202020202020202CE
+:10F2200002020202020202020202020202020202BE
+:10F2300002020202020202020202020202020202AE
+:10F2400002020202020202020201010202020001A3
+:10F250000000020202020202020202020202020292
+:10F26000020202020202020202020202020202027E
+:10F27000020202020202020202020202020202026E
+:10F28000020202020202020202020202020202025E
+:10F29000020202020202020202020202020202024E
+:10F2A0000202020202020202020202020202000141
+:10F2B000010202020202020202020202020202022F
+:10F2C000020202020202020202020202020202021E
+:10F2D000020202020202020202020202020202020E
+:10F2E0000202020202020200000000000000000010
+:10F2F0000000000000010102020101020101010100
+:10F3000001020202020200020202020202020202E0
+:10F3100002020202020202020202020202020202CD
+:10F3200002020202020202020202020202020202BD
+:10F3300002020202020202020202020202020202AD
+:10F3400002020202020202020202020202020001A0
+:10F350000001020202020202020202020202020290
+:10F36000020202020202020202020202020202027D
+:10F37000020202020202020202020202020202026D
+:10F38000020202020202020202020202020202025D
+:10F39000020202020202020202020202020202024D
+:10F3A000020202020202020202020202020200023F
+:10F3B000020202020202020202020202020202022D
+:10F3C000020202020202020202020202020202021D
+:10F3D000020202020202020202020202020202020D
+:10F3E000020202020202020000000000000000000F
+:10F3F00000000002020201020201010201010101FA
+:10F4000001020202020200020202020202020202DF
+:10F4100002020202020202020202020202020202CC
+:10F4200002020202020202020202020202020202BC
+:10F4300002020202020202020202020202020202AC
+:10F44000020202020202020202020202020200029E
+:10F45000000102020202020202020202020202028F
+:10F46000020202020202020202020202020202027C
+:10F47000020202020202020202020202020202026C
+:10F48000020202020202020202020202020202025C
+:10F49000020202020202020202020202020202024C
+:10F4A000020202020202020202020202020202023C
+:10F4B000020202020202020202020202020202022C
+:10F4C000020202020202020202020202020202021C
+:10F4D000020202020202020202020202020202020C
+:10F4E000020202020202020000000000000000000E
+:10F4F00000000002020201020100010201010101FB
+:10F5000001010101020200020202020202020202E1
+:10F5100002020202020202020202020202020202CB
+:10F5200002020202020202020202020202020202BB
+:10F5300002020202020202020202020202020202AB
+:10F54000020202020202020202020202020202029B
+:10F55000010102020202020202020202020202028D
+:10F560000202020202020202020101010101020181
+:10F57000010201020202020202020202020202026D
+:10F58000020202020202020202020202020202025B
+:10F59000020202020202020202020202020202024B
+:10F5A000020202020202020202020202020202023B
+:10F5B000020202020202020202020202020202022B
+:10F5C000020202020202020202020202020202021B
+:10F5D000020202020202020202020202020202020B
+:10F5E000020202020202020000000000000000000D
+:10F5F00000000002020201020100010201010101FA
+:10F6000001010101020200020202020202020202E0
+:10F6100002020202020202020202020202020202CA
+:10F6200002020202020202020202020202020202BA
+:10F6300002020202020202020202020202020202AA
+:10F64000020202020202020202020202020202029A
+:10F65000020202020202020202020202020202028A
+:10F660000202020202020202020101010101020180
+:10F67000010201020202020202020202020202026C
+:10F68000020202020202020202020202020202025A
+:10F69000020202020202020202020202020202024A
+:10F6A000020202020202020202020202020202023A
+:10F6B000020202020202020202020202020202022A
+:10F6C000020202020202020202020202020202021A
+:10F6D000020202020202020202020202020202020A
+:10F6E0000202020202020200000202020000000006
+:10F6F00000000002020202010100000200000000FE
+:10F7000000010101020200020202020202020202E0
+:10F7100002020202020202020202020202020202C9
+:10F7200002020202020202020202020202020202B9
+:10F7300002020202020202020202020202020202A9
+:10F740000202020202020202020202020202020299
+:10F750000202020202020202020202020202020289
+:10F76000020202020202020202010101010102017F
+:10F77000010201020202020202020202020202026B
+:10F780000202020202020202020202020202020259
+:10F790000202020202020202020202020202020249
+:10F7A0000202020202020202020202020202020239
+:10F7B0000202020202020202020202020202020229
+:10F7C0000202020202020202020202020202020219
+:10F7D0000202020202020202020202020202020209
+:10F7E00002020202020202000202020200020202FD
+:10F7F00000000002020202010100000100000000FE
+:10F8000000010101020200020202020202020202DF
+:10F8100002020202020202020202020202020202C8
+:10F8200002020202020202020202020202020202B8
+:10F8300002020202020202020202020202020202A8
+:10F840000202020202020202020202020202020298
+:10F850000202020202020202020202020202020288
+:10F86000020202020202020102020202020201027A
+:10F87000020202020202020202010101010102016E
+:10F88000010101020202020000000000000000006D
+:10F890000000000000000002020202020202020256
+:10F8A0000202020202020202020202020202020238
+:10F8B0000202020202020202020202020202020228
+:10F8C0000202020202020202020202020202020218
+:10F8D0000202020202020202020202020202020208
+:10F8E00002020202020202000202020202020202FA
+:10F8F00000000202020202010000000100000000FC
+:10F9000000000000020200020202020202020202E1
+:10F9100002020202020202020202020202020202C7
+:10F9200002020202020202020202020202020202B7
+:10F9300002020202020202010101010102010101AF
+:10F94000010202010101010202020202020202029C
+:10F950000202020202020202020202020202020287
+:10F960000202020202020202010202020202020278
+:10F97000020102010101010002020202020202026E
+:10F980000202020202020200000000000000000069
+:10F990000000000000000002020202020202020255
+:10F9A0000202020202020202020202020202020237
+:10F9B0000202020202020202020202020202020227
+:10F9C0000202020202020202020202020202020217
+:10F9D0000202020202020202020202020202020207
+:10F9E00002020202020202020202020202020202F7
+:10F9F00002020202020202010000000100000000F7
+:10FA000000000000020100010101010101010101EA
+:10FA100001010101010101020202020202020202CD
+:10FA200002020202020202020202020202020202B6
+:10FA300002020202020202020202020201020202A7
+:10FA40000201010202020201020202020202020299
+:10FA50000202020202020202020202020202020286
+:10FA60000202020202020201020202020202010278
+:10FA70000202020202020201000000000000010076
+:10FA80000000000000000000000000000000000076
+:10FA90000000000000000002020202020202020254
+:10FAA000020202020202020101010101010101013F
+:10FAB000010101010101010202020202020202022D
+:10FAC0000202020202020202020202020202020216
+:10FAD0000202020202020202020202020202020206
+:10FAE00002020202020202020202020202020202F6
+:10FAF00002020202020202000000000100000000F7
+:10FB000000000000010101020202020202020202E0
+:10FB100002020202020202000000000000000000D7
+:10FB200000000000000000020202020202020202C3
+:10FB300002020202020202000000000002000000B5
+:10FB400000020200000000020101010101010101A7
+:10FB5000010101010101010202020202020202028C
+:10FB6000020202020202020101010101010101017E
+:10FB70000101010101010101010101010101010175
+:10FB8000010101010101010000000000000001006D
+:10FB90000000000000000002020202020202020253
+:10FBA0000202020202020202020202020202020235
+:10FBB0000202020202020202020202020202020225
+:10FBC0000202020202020202020202020202020215
+:10FBD0000202020202020202020202020202020205
+:10FBE00002020202020202020202020202020202F5
+:10FBF00002020202020202000000000000000000F7
+:10FC000000000000010101010101010101010101E8
+:10FC100001010101010101000000000000000000DD
+:10FC200000000000000000000000000000000000D4
+:10FC300000000000000000010101010101010101BB
+:10FC400001010100000000000202020202020202A1
+:10FC50000202020202020200000000000000000096
+:10FC6000000000000000000101010101010101018B
+:10FC70000101010101010101010101010101010174
+:10FC80000101010101010101010101010101010164
+:10FC9000010101010101010202020202020202024B
+:10FCA0000202020202020200000000000000000046
+:10FCB0000000000000000002020202020202020232
+:10FCC0000202020202020202020202020202020214
+:10FCD0000202020202020202020202020202020204
+:10FCE00002020202020202020202020202020202F4
+:10FCF00002020202020202000000000000000000F6
+:10FD000000000000010101010101010101010101E7
+:10FD100001010101010101010101010101010101D3
+:10FD200001010101010101000000000000000000CC
+:10FD300000000000000000010101010101010101BA
+:10FD400001010101010101010000000000000000AB
+:10FD500000000000000000000000000000000000A3
+:10FD6000000000000000000101010101010101018A
+:10FD70000101010101010101010101010101010173
+:10FD80000101010101010101010101010101010163
+:10FD9000010101010101010202020202020202024A
+:10FDA0000202020202020200000000000000000045
+:10FDB0000000000000000002020202020202020231
+:10FDC0000202020202020202020202020202020213
+:10FDD0000202020202020202020202020202020203
+:10FDE00002020202020202020202020202020202F3
+:10FDF00002020202020202000000000000000000F5
+:10FE000000000000010001010101010101010101E7
+:10FE100001010101010101010101010101010101D2
+:10FE200001010101010101010101010101010101C2
+:10FE300001010101010101010101010101010101B2
+:10FE400001010101010101010101010101010101A2
+:10FE50000101010101010101010101010101010192
+:10FE60000101010101010101010101010101010182
+:10FE70000101010101010101010101010101010172
+:10FE80000101010101010101010101010101010162
+:10FE90000101010101010102020202020202020249
+:10FEA000020202020202020101010101010101013B
+:10FEB0000101010101010101010101010101010132
+:10FEC000010101010101010000000000000000002B
+:10FED0000000000000000000000000000000000022
+:10FEE0000000000000000002020202020202020200
+:10FEF00002020202020202010101010101010101EB
+:10FF000001010101010101010101010101010101E1
+:10FF100001010101010101010101010101010101D1
+:10FF200001010101010101010101010101010101C1
+:10FF300001010101010101010101010101010101B1
+:10FF400001010101010101010101010101010101A1
+:10FF50000101010101010101010101010101010191
+:10FF60000101010101010101010101010101010181
+:10FF70000101010101010101010101010101010171
+:10FF80000101010101010101010101010101010161
+:10FF90000101010101010102020202020202020248
+:10FFA000020202020202020101010101010101013A
+:10FFB0000101010101010101010101010101010131
+:10FFC0000101010101010101010101010101010121
+:10FFD000010101010101010000000000000000001A
+:10FFE00000000000000000020202020202020202FF
+:10FFF00002020202020202010101010101010101EA
+:0200000290006C
+:1000000001010101010101010101010101010101E0
+:1000100001010101010101010101010101010101D0
+:1000200001010101010101010101010101010101C0
+:1000300001010101010101010101010101010101B0
+:1000400001010101010101010101010101010101A0
+:100050000101010101010101010101010101010190
+:100060000101010101010101010101010101010180
+:100070000101010101010101010101010101010170
+:100080000101010101010101010101010101010160
+:100090000101010101010101010101010101010150
+:1000A0000101010101010101010101010101010140
+:1000B0000101010101010101010101010101010130
+:1000C0000101010101010101010101010101010120
+:1000D0000101010101010101010101010101010110
+:1000E00001010101010101020202020202020202F7
+:1000F00002020202020202010101010101010101E9
+:1001000001010101010101010101010101010101DF
+:1001100001010101010101010101010101010101CF
+:1001200001010101010101010101010101010101BF
+:1001300001010101010101010101010101010101AF
+:10014000010101010101010101010101010101019F
+:10015000010101010101010101010101010101018F
+:10016000010101010101010101010101010101017F
+:10017000010101010101010101010101010101016F
+:10018000010101010101010101010101010101015F
+:10019000010101010101010101010101010101014F
+:1001A000010101010101010101010101010101013F
+:1001B000010101010101010101010101010101012F
+:1001C000010101010101010101010101010101011F
+:1001D000010101010101010101010101010101010F
+:1001E0000101010101010100000000000000000008
+:1001F00000000000000000010101010101010101F6
+:1002000001010101010101010101010101010101DE
+:1002100001010101010101010101010101010101CE
+:1002200001010101010101010101010101010101BE
+:1002300001010101010101010101010101010101AE
+:10024000010101010101010101010101010101019E
+:10025000010101010101010101010101010101018E
+:10026000010101010101010101010101010101017E
+:10027000010101010101010101010101010101016E
+:10028000010101010101010101010101010101015E
+:10029000010101010101010101010101010101014E
+:1002A000010101010101010101010101010101013E
+:1002B000010101010101010101010101010101012E
+:1002C000010101010101010101010101010101011E
+:1002D000010101010101010101010101010101010E
+:1002E0000101010101010100000000000000000007
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000020202020202020202AB
+:10034000020202020202020202020202020202028D
+:10035000020202020202020202020202020202027D
+:10036000020202020202020202020202020202026D
+:10037000020202020202020202020202020202025D
+:10038000020202020202020202020202020202024D
+:10039000020202020202020202020202020202023D
+:1003A000020202020202020202020202020202022D
+:1003B000020202020202020202020202020202021D
+:1003C000020202020202020202020202020202020D
+:1003D00002020202020202020202020202020202FD
+:1003E00002020202020202000000000000000000FF
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000202020202020202027A
+:10047000020202020202020202020202020202025C
+:10048000020202020202020202020202020202024C
+:10049000020202020202020000000000000000004E
+:1004A000000000000000000202020202020202023A
+:1004B000020202020202020202020202020202021C
+:1004C000020202020202020202020202020202020C
+:1004D00002020202020202020202020202020202FC
+:1004E00002020202020202000000000000000000FE
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000300000000000000000CB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000000000000000000000CA
+:1006300000000000000000000000000000000000BA
+:1006400000000000000000000000000000000000AA
+:100650000000000000000000000001000001010097
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:100680000000000000000000000000000001010068
+:10069000000000000000000000000000000000005A
+:1006A000000000000000000000000000000000004A
+:1006B000000000000000000000000000000000003A
+:1006C0000000000000000000000000000000010029
+:1006D000000000000000000000000000000000001A
+:1006E000000000000000000000000000000000000A
+:1006F00000000000000000000000000000000000FA
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000000000000000000000C9
+:1007300000000000000000000000000000000000B9
+:1007400000000000000000000000000000000000A9
+:100750000000000000000000010001000101010094
+:100760000000000000000000000000000000000089
+:100770000000000000000000000000000000000079
+:100780000000000000000001010000000001010065
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000010028
+:1007D0000000000000000000000000000000000019
+:1007E0000000000000000000000000000000010008
+:1007F00000000000000001000000000000000000F8
+:1008000000000000000000000000000000000000E8
+:1008100000000000000000000000000000000000D8
+:1008200000000000000000000000000000000000C8
+:1008300000000000000000000000000000000000B8
+:1008400000000000000001000000000000000000A7
+:100850000000000000010100010001010101010090
+:100860000000000000000000000001000001010085
+:100870000000000000000000000000000000000078
+:100880000000000000010101010000000001010062
+:100890000000000000000000000000000000000058
+:1008A0000000000000000000000000000000010047
+:1008B0000000000000000000000000000000000038
+:1008C0000000000000000100000000000001010025
+:1008D0000000000000000000000000000000000018
+:1008E0000000000000000000000000000000010007
+:1008F00000000000000001010000000000000000F6
+:1009000001000000000000000001000000000000E5
+:1009100000000000000000000000000000000000D7
+:1009200000000000000000000000000000000000C7
+:1009300000000000000000000000000000000000B7
+:1009400000000000000001000000000000000000A6
+:10095000000100000001010101010101010101008C
+:100960000000000000000001010001000101010081
+:100970000000000000000000000000000000000077
+:10098000000000010001010101010000010101005E
+:100990000000000000000000000000000000000057
+:1009A0000000000000000000010100000000010044
+:1009B0000000000000000000000000000000000037
+:1009C0000000000000000100010100000101010021
+:1009D0000000000000000000000000000000000017
+:1009E0000000000000000100000000000001010004
+:1009F00000000000000001010000000000010001F3
+:100A000001000000010000000001010100000000E1
+:100A100000000000000000000000000000000000D6
+:100A200000000000000000000000000000000000C6
+:100A300000000000000000000000000000000000B6
+:100A400000000000000001000000000000010100A3
+:100A5000000100000101010101010101010101008A
+:100A6000000000000001010101000100010101007E
+:100A70000000000000000000000000000000000076
+:100A8000000001010001010101010101010101005A
+:100A90000000000000000000000000000000000056
+:100AA0000000000000000100010100000001010041
+:100AB0000000000000000000000000000000000036
+:100AC000000000000000010001010101010101001E
+:100AD0000000000000000000000000000000000016
+:100AE0000000000000000100010000000001010002
+:100AF00000000000000001010100000000010001F1
+:100B000001000000010000000001010100000000E0
+:100B100000000000000000000000000000010100D3
+:100B200000000000000000000000000000010100C3
+:100B300000000000000000000000000000000000B5
+:100B400000000000000001010100000000010100A0
+:100B50000101000101010101010101010101010087
+:100B6000000100000001010101010100010101007B
+:100B70000000000000000000000000000000000075
+:100B80000001010100010101010101010101010058
+:100B90000000000000000000000000000000000055
+:100BA000000000000000010101010000010101003E
+:100BB0000000000000000000000000000000000035
+:100BC000000000000000010101010101010101001C
+:100BD0000000000000000000000000000000000015
+:100BE0000000000000000100010000000001010001
+:100BF00000000000000001010100000000010001F0
+:100C000001000000010100000001010100000000DE
+:100C100000000000000000000100000001010100D0
+:100C200000000000000000000100000001010100C0
+:100C300000000000000000000000000000000000B4
+:100C4000000000000000010101000000000101009F
+:100C50000101010101010101010101010101010085
+:100C60000001010000010101010101010101010078
+:100C70000000000000000000000000000000000074
+:100C80000001010101010101010101010101010056
+:100C90000000000000000000000000000000000054
+:100CA000000000000001010101010101010101003A
+:100CB0000000000000000000000000000001010032
+:100CC000000000000001010101010101010101001A
+:100CD0000000000000000000000000000000000014
+:100CE00000000000000001000101000001010100FE
+:100CF00000000000000001010101000001010001ED
+:100D000001010001010100000001010101000000DA
+:100D100000000000000001000100010001010100CD
+:100D200000000000000001000100010101010100BC
+:100D300000000000000000000000000000000000B3
+:100D4000000000010000010101000000010101009C
+:100D50000101010101010101010101010101010084
+:100D60000001010100010101010101010101010076
+:100D70000000000000000000000000000000000073
+:100D80000101010101010101010101010101010054
+:100D90000000000000000000000000000000000053
+:100DA0000001000100010101010101010101010037
+:100DB0000000000000000000010000000001010030
+:100DC0000001000100010101010101010101010017
+:100DD0000000000000000000000000000000000013
+:100DE00000000000000001000101010101010100FB
+:100DF00000000000000001010101010101010002E9
+:100E000002010101010100000001010101000000D7
+:100E100000000000000001010101010001010100CA
+:100E200000000000000001010101010101010100B9
+:100E300000000000000000000000000000010100B0
+:100E40000000010100010101010000010101010197
+:100E50000101010101010101010101010101010083
+:100E60000001010101010101010101010101010074
+:100E70000000000000000000000000000000000171
+:100E80000101010101010101010101010101010053
+:100E90000000000000000100000000000000010050
+:100EA0000001010101010101010101010101010034
+:100EB000000000000000010001000000000101002E
+:100EC0000001010101010101010101010101010014
+:100ED0000000000000000000000000000000000012
+:100EE00000000000000001010101010101010100F9
+:100EF00000000000000001010101010101010002E8
+:100F000002010101020100000001010101000000D5
+:100F100000000000000101010101010101010101C6
+:100F200000000000000101010101010101010100B7
+:100F300000000000000000000100000000010100AE
+:100F40000001010100010101010100010101010194
+:100F50000101010101010101010101010101010082
+:100F60000101010101010101010101010101010072
+:100F7000000000000000000000000000000101016E
+:100F80000101010101010101010101010101010052
+:100F9000000000000000010001000000000001004E
+:100FA0000101010101010101010101010101010032
+:100FB000000000000000010101010000010101002A
+:100FC0000101010101010101010101010101010012
+:100FD0000000000000000000000000000000010010
+:100FE00000000100000101010101010101010100F6
+:100FF00000000000000101010101010101010002E6
+:1010000002010101020100000001010101000000D4
+:1010100000010001000101010101010101010101C3
+:1010200000000001000101010101010101010100B5
+:1010300000000000000001000100000100010100AB
+:101040000001010100010101010101010101010192
+:101050000101010101010101010101010101010081
+:101060000101010101010101010101010101010071
+:10107000000000000000000001000000000101016C
+:101080000101010101010101010101010101010051
+:10109000000000000001010001000000000101014A
+:1010A0000101010101010101010101010101010031
+:1010B0000000000000000101010101010101010126
+:1010C0000101010101010101010101010101010011
+:1010D000000000000000000000000000000001000F
+:1010E00000000101000101010101010101010100F4
+:1010F00000010001000101010101010101010002E3
+:1011000002010101020100010001010101000000D2
+:1011100000010101000101010101010101010101C1
+:1011200000000101000101010101010101010100B3
+:1011300001000001000001000100000101010100A7
+:101140000101010100010101010101010101010190
+:101150000101010101010101010101010101010080
+:101160000101010101010101010101010101010070
+:10117000000000000000010001000000000101016A
+:101180000101010101010101010101010101010050
+:101190000000000000010100010000000101010148
+:1011A0000101010101010101010101010101010030
+:1011B0000000000000000101010101010101010125
+:1011C0000101010101010101010101010101010010
+:1011D000000000000000000000000000000101000D
+:1011E00000000101000101010101010101010100F3
+:1011F00000010101010101010101010101010002E0
+:1012000002020202020200010002020201000000CA
+:1012100000010101000101010101010101010101C0
+:1012200000010101000101010101010101010101B0
+:1012300001000101000101000100010101010100A3
+:10124000010101010101010101010101010101018E
+:10125000010101010101010101010101010101017E
+:10126000010101010101010101010101010101006F
+:101270000000000000000101010000000101010167
+:10128000010101010101010101010101010101004F
+:101290000000000000010100010001010101010145
+:1012A000010101010101010101010101010101002F
+:1012B0000000000001010101010101010101010122
+:1012C000010101010101010101010101010101000F
+:1012D000000000000000000001000000000101000B
+:1012E00000010101000101010101010101010100F1
+:1012F00001010101010101010101010101010002DE
+:1013000002020202020200010002020201000000C9
+:1013100000010101010101010101010101010101BE
+:1013200000010101010101010101010101010101AE
+:10133000010101010001010101010101010101009F
+:10134000010101010101010101010101010101018D
+:10135000010101010101010101010101010101017D
+:10136000010101010101010101010101010101006E
+:101370000000000000000101010001010101010164
+:10138000010101010101010101010101010101004E
+:101390000001000000010101010101010101010141
+:1013A000010101010101010101010101010101002E
+:1013B0000000000101010101010101010101010120
+:1013C000010101010101010101010101010101000E
+:1013D0000000000000000100010000000001010009
+:1013E00000010101010101010101010101010100EF
+:1013F00001010101010100000101010101010002DF
+:1014000002020202020200010102020201000000C7
+:1014100001010101010101010101010101010101BC
+:1014200001010101010101010101010101010101AC
+:10143000010101010101010101010101010101019C
+:10144000010101010101010101010101010101018C
+:10145000010101010101010101010101010101017C
+:10146000010101010101010101010101010101006D
+:101470000000000000000101010101010101010162
+:10148000010101010101010101010101010101004D
+:101490000001000000010101010101010101010140
+:1014A000010101010101010101010101010101002D
+:1014B000000000010101010101010101010101011F
+:1014C000010101010101010101010101010101000D
+:1014D0000000000000000101010100000101010005
+:1014E00001010101010101010101010101010100ED
+:1014F00001010101010100000101010101000002DF
+:1015000002020202020200010102020202000001C4
+:1015100001010101010101010101010101010101BB
+:1015200001010101010101010101010101010101AB
+:10153000010101010101010101010101010101019B
+:10154000010101010101010101010101010101018B
+:10155000010101010101010101010101010101017B
+:10156000010101010101010101010101010101006C
+:101570000000000000010101010101010101010160
+:10158000010101010101010101010101010101004C
+:10159000000100010001010101010101010101013E
+:1015A000010101010101010101010101010101002C
+:1015B000000100010101010101010101010101011D
+:1015C000010101010101010101010101010101000C
+:1015D0000000000000000101010101010101010101
+:1015E00001010101010101010101010101010100EC
+:1015F00001010101010100000000000000000002E3
+:1016000002020202020200010102020202000001C3
+:1016100001010101010101010101010101010101BA
+:1016200001010101010101010101010101010101AA
+:10163000010101010101010101010101010101019A
+:10164000010101010101010101010101010101018A
+:10165000010101010101010101010101010101017A
+:10166000010101010101010101010101010101006B
+:10167000000100010001010101010101010101015D
+:10168000010101010101010101010101010101004B
+:10169000000101010001010101010101010101013C
+:1016A000010101010101010101010101010101002B
+:1016B000000100010101010101010101010101011C
+:1016C000010101010101010101010101010101000B
+:1016D0000000000000000101010101010101010100
+:1016E00001010101010101010101010101010100EB
+:1016F00000000000000000000000000000000002E8
+:1017000002020202020201020102020202000001C0
+:1017100001010101010101010101010101010101B9
+:1017200001010101010101010101010101010101A9
+:101730000101010101010101010101010101010199
+:101740000101010101010101010101010101010189
+:101750000101010101010101010102010101010178
+:101760000101010101010101010102010101010069
+:10177000000101010001010101010101010101015B
+:10178000010101010101010101010101010101004A
+:10179000010101010001010101010101010101013A
+:1017A000010101010101010101010101010101002A
+:1017B000000100010101010101010101010101011B
+:1017C000010101010101010101010101010101000A
+:1017D00000000100000101010101010101010101FD
+:1017E00001010101010101010101010101010100EA
+:1017F00000000000000000000000000000000102E6
+:1018000002020202020201020102020202000001BF
+:1018100001010101010101010101010101010102B7
+:1018200001010101010101010101010101010101A8
+:101830000101010101010101010101010101010198
+:101840000101010101010201010101010101010187
+:101850000202010102020101010102020202010170
+:101860000102020101020102010102010202010062
+:101870000101010100010101010101010101010159
+:101880000101010101010101010101010101010148
+:101890000101010101010101010101010101010138
+:1018A0000101010101010101010101010101010128
+:1018B0000001010101010101010101010101010119
+:1018C0000101010101010101010101010101010009
+:1018D00000010101000101010101010101010101FA
+:1018E00001010101010101010101010101010100E9
+:1018F00000000000000000000000000000000102E5
+:1019000002020202020201020102020202010001BD
+:1019100001010101010101010101020102020102B3
+:1019200001010101010101010101020202020102A2
+:101930000201010101010101010101010101010196
+:101940000101020201010202010101010102010281
+:101950000202020202020202020202020202020168
+:101960000202020202020202020202020202020158
+:101970000101010101010101010101010101010157
+:101980000101020201020102010101010102010142
+:101990000101010101010101010101010101010137
+:1019A0000101010101010101010101010101010127
+:1019B0000101010101010101010101010101010117
+:1019C0000101010101010101010101010101010008
+:1019D00000010101000101010101010101010101F9
+:1019E00001010101010102010101010101020200E5
+:1019F00000000000000000000000000000000102E4
+:101A000002020202020201020102020202010001BC
+:101A100001020202010202020202020202020202A8
+:101A20000101020201020202020202020202020299
+:101A30000201020201010101010101020102010191
+:101A40000202020201020202020101020202020279
+:101A50000202020202020202020202020202020266
+:101A60000202020202020202020202020202020157
+:101A70000101010101010101010101010101010255
+:101A80000202020202020202020202020202020137
+:101A90000101010101010101010101010101010136
+:101AA0000101010101010101010101010101010126
+:101AB0000101010101010101010101010101010116
+:101AC0000101010101010201010202020202020000
+:101AD00001010101000101010101010101010101F7
+:101AE00001010201010102010202020202020200DE
+:101AF00000000000000000000000000000000102E3
+:101B000002020202020201020102020202010002BA
+:101B100002020202020202020202020202020202A5
+:101B20000202020202020202020202020202020295
+:101B30000202020202020201020102020202020287
+:101B40000202020202020202020202020202020275
+:101B50000202020202020202020202020202020265
+:101B60000202020202020202020202020202020156
+:101B70000101010101010101010101010101010254
+:101B80000202020202020202020202020202020136
+:101B90000101010101010101010101010101010135
+:101BA0000101010101010101010201010101010124
+:101BB0000101010101010101010101010102010213
+:101BC00002020202020202020202020202020201F6
+:101BD00001010101000101010101010101010101F6
+:101BE00001010202010202020202020202020200DA
+:101BF00000000000000000000000000000000102E2
+:101C000002020202020201020202020202010002B8
+:101C100002020202020202020202020202020202A4
+:101C20000202020202020202020202020202020294
+:101C30000202020202020202020202020202020284
+:101C40000202020202020202020202020202020274
+:101C50000202020202020202020202020202020264
+:101C60000202020202020202020202020202020155
+:101C70000101010101010101010101010102010252
+:101C80000202020202020202020202020202020135
+:101C90000101010101020201010101010101010231
+:101CA0000202020202020202020202020202020115
+:101CB0000101010102010202020202020202020209
+:101CC00002020202020202020202020202020201F5
+:101CD00001010101000101010101010101010102F4
+:101CE00002020202020202020202020202020200D6
+:101CF00000000000000000000000000000000102E1
+:101D000002020202020202020202020202020002B5
+:101D100002020202020202020202020202020202A3
+:101D20000202020202020202020202020202020293
+:101D30000202020202020202020202020202020283
+:101D40000202020202020202020202020202020273
+:101D50000202020202020202020202020202020263
+:101D60000202020202020202020202020202020154
+:101D7000010101010101020202010202020202024A
+:101D80000202020202020202020202020202020134
+:101D90000102010101020201020102020202020229
+:101DA0000202020202020202020202020202020114
+:101DB0000101010202020202020202020202020206
+:101DC00002020202020202020202020202020201F4
+:101DD00001010101010101010101010101010102F2
+:101DE00002020202020202020202020202020200D5
+:101DF00000000000000000000000000000000101E1
+:101E000001020202010202020202020202020002B6
+:101E100002020202020202020202020202020202A2
+:101E20000202020202020202020202020202020292
+:101E30000202020202020202020202020202020282
+:101E40000202020202020202020202020202020272
+:101E50000202020202020202020202020202020262
+:101E60000202020202020202020202020202020252
+:101E70000202020201020202020202020202020243
+:101E80000202020202020202020202020202020232
+:101E90000202020201020202020202020202020223
+:101EA0000202020202020202020202020202020212
+:101EB0000102010202020202020202020202020204
+:101EC00002020202020202020202020202020201F3
+:101ED00001010101010101010101010101010102F1
+:101EE00002020202020202020202020202020200D4
+:101EF00000000000000000000000000000000101E0
+:101F000001010101010102020202020202020002B9
+:101F100002020202020202020202020202020202A1
+:101F20000202020202020202020202020202020291
+:101F30000202020202020202020202020202020281
+:101F40000202020202020202020202020202020271
+:101F50000202020202020202020202020202020261
+:101F60000202020202020202020202020202020251
+:101F70000202020202020202020202020202020241
+:101F80000202020202020202020202020202020231
+:101F90000202020202020202020202020202020221
+:101FA0000202020202020202020202020202020211
+:101FB0000202020202020202020202020202020201
+:101FC00002020202020202020202020202020201F2
+:101FD00001010101010101010101010101020202EE
+:101FE00002020202020202020202020202020200D3
+:101FF00000000000000000000000000000000101DF
+:1020000001010101010102020201010102020002BB
+:1020100002020202020202020202020202020202A0
+:102020000202020202020202020202020202020290
+:102030000202020202020202020202020202020280
+:102040000202020202020202020202020202020270
+:102050000202020202020202020202020202020260
+:102060000202020202020202020202020202020250
+:102070000202020202020202020202020202020240
+:102080000202020202020202020202020202020230
+:102090000202020202020202020202020202020220
+:1020A0000202020202020202020202020202020210
+:1020B0000202020202020202020202020202020200
+:1020C00002020202020202020202020202020201F1
+:1020D00001010201010102020202020202020202E5
+:1020E00002020202020202020202020202020200D2
+:1020F00000000000000000000000000000000101DE
+:1021000001010101010102010201010101020002BC
+:10211000020202020202020202020202020202029F
+:10212000020202020202020202020202020202028F
+:10213000020202020202020202020202020202027F
+:10214000020202020202020202020202020202026F
+:10215000020202020202020202020202020202025F
+:10216000020202020202020202020202020202024F
+:10217000020202020202020202020202020202023F
+:10218000020202020202020202020202020202022F
+:10219000020202020202020202020202020202021F
+:1021A000020202020202020202020202020202020F
+:1021B00002020202020202020202020202020202FF
+:1021C00002020202020202020202020202020202EF
+:1021D00002020202010202020202020202020202E0
+:1021E00002020202020202020202020202020200D1
+:1021F00000000000000002020000000000000101D9
+:1022000001010101010102010201010101020002BB
+:10221000020202020202020202020202020202029E
+:10222000020202020202020202020202020202028E
+:10223000020202020202020202020202020202027E
+:10224000020202020202020202020202020202026E
+:10225000020202020202020202020202020202025E
+:10226000020202020202020202020202020202024E
+:10227000020202020202020202020202020202023E
+:10228000020202020202020202020202020202022E
+:10229000020202020202020202020202020202021E
+:1022A000020202020202020202020202020202020E
+:1022B00002020202020202020202020202020202FE
+:1022C00002020202020202020202020202020202EE
+:1022D00002020202010202020202020202020202DF
+:1022E00002020202020202020202020202020200D0
+:1022F00000000000000002020000000000020201D5
+:1023000001010101010102010201010101010002BB
+:10231000020202020202020202020202020202029D
+:10232000020202020202020202020202020202028D
+:10233000020202020202020202020202020202027D
+:10234000020202020202020202020202020202026D
+:10235000020202020202020202020202020202025D
+:10236000020202020202020202020202020202024D
+:10237000020202020202020202020202020202023D
+:10238000020202020202020202020202020202022D
+:10239000020202020202020202020202020202021D
+:1023A000020202020202020202020202020202020D
+:1023B00002020202020202020202020202020202FD
+:1023C00002020202020202020202020202020202ED
+:1023D00002020202020202020202020202020202DD
+:1023E00002020202020202020202020202020200CF
+:1023F00000000000000002020202020202020200CB
+:1024000000010101010102010201010101010002BB
+:10241000020202020202020202020202020202029C
+:10242000020202020202020202020202020202028C
+:10243000020202020202020202020202020202027C
+:10244000020202020202020202020202020202026C
+:10245000020202020202020202020202020202025C
+:10246000020202020202020202020202020202024C
+:10247000020202020202020202020202020202023C
+:10248000020202020202020202020202020202022C
+:10249000020202020202020202020202020202021C
+:1024A000020202020202020202020202020202020C
+:1024B00002020202020202020202020202020202FC
+:1024C00002020202020202020202020202020202EC
+:1024D00002020202020202020202020202020202DC
+:1024E00002020202020202020202020202020200CE
+:1024F00002020202020202020202020202020200BE
+:1025000000010101010101010101010101010002BC
+:10251000020202020202020202020202020202029B
+:10252000020202020202020202020202020202028B
+:10253000020202020202020202020202020202027B
+:10254000020202020202020202020202020202026B
+:10255000020202020202020202020202020202025B
+:10256000020202020202020202020202020202024B
+:10257000020202020202020202020202020202023B
+:10258000020202020202020202020202020202022B
+:10259000020202020202020202020202020202021B
+:1025A000020202020202020202020202020202020B
+:1025B00002020202020202020202020202020202FB
+:1025C00002020202020202020202020202020202EB
+:1025D00002020202020202020202020202020202DB
+:1025E00002020202020202020202020202020200CD
+:1025F00002020202020202020202020202020200BD
+:1026000000000000000001000100000000010002C5
+:10261000020202020202020202020202020202029A
+:10262000020202020202020202020202020202028A
+:10263000020202020202020202020202020202027A
+:10264000020202020202020202020202020202026A
+:10265000020202020202020202020202020202025A
+:10266000020202020202020202020202020202024A
+:10267000020202020202020202020202020202023A
+:10268000020202020202020202020202020202022A
+:10269000020202020202020202020202020202021A
+:1026A000020202020202020202020202020202020A
+:1026B00002020202020202020202020202020202FA
+:1026C00002020202020202020202020202020202EA
+:1026D00002020202020202020202020202020202DA
+:1026E00002020202020202020202020202020200CC
+:1026F00002020202020202020202020202020200BC
+:1027000000000000000001000100000000000002C5
+:102710000202020202020202020202020202020299
+:102720000202020202020202020202020202020289
+:102730000202020202020202020202020202020279
+:102740000202020202020202020202020202020269
+:102750000202020202020202020202020202020259
+:102760000202020202020202020202020202020249
+:102770000202020202020202020202020202020239
+:102780000202020202020202020202020202020229
+:102790000202020202020202020202020202020219
+:1027A0000202020202020202020202020202020209
+:1027B00002020202020202020202020202020202F9
+:1027C00002020202020202020202020202020202E9
+:1027D00002020202020202020202020202020202D9
+:1027E00002020202020202020202020202020202C9
+:1027F00002020202020202020202020202020200BB
+:1028000000000000000001000100000000000002C4
+:102810000202020202020202020202020202020298
+:102820000202020202020202020202020202020288
+:102830000202020202020202020202020202020278
+:102840000202020202020202020202020202020268
+:102850000202020202020202020202020202020258
+:102860000202020202020202020202020202020248
+:102870000202020202020202020202020202020238
+:102880000202020202020202020202020202020228
+:102890000202020202020202020202020202020218
+:1028A0000202020202020202020202020202020208
+:1028B00002020202020202020202020202020202F8
+:1028C00002020202020202020202020202020202E8
+:1028D00002020202020202020202020202020202D8
+:1028E00002020202020202020202020202020202C8
+:1028F00002020202020202020202020202020000BC
+:1029000000000000000000000000000000000001C6
+:1029100001010101010101010101010101010101A7
+:102920000101010101010101010101010101010098
+:102930000000000000000000000000000000000295
+:102940000202020202020202020202020202020267
+:102950000202020202020202020202020202020257
+:102960000202020202020202020202020202020247
+:102970000202020202020202020202020202020237
+:102980000202020202020202020202020202020227
+:102990000202020202020202020202020202020217
+:1029A0000202020202020202020202020202020207
+:1029B00002020202020202020202020202020202F7
+:1029C00002020202020202020202020202020202E7
+:1029D00002020202020202020202020202020202D7
+:1029E00002020202020202020202020202020202C7
+:1029F00002020202020202020202020202020000BB
+:102A000000000000000000000000000000000102C3
+:102A10000202020202020202020202020202020296
+:102A20000202020202020202020202020202020187
+:102A30000101010101010101010101010101010285
+:102A40000202020202020202020202020202020266
+:102A50000202020202020202020202020202020058
+:102A60000000000000000000000000000000000264
+:102A70000202020202020202020202020202020236
+:102A80000202020202020202020202020202020226
+:102A90000202020202020202020202020202020216
+:102AA0000202020202020202020202020202020206
+:102AB00002020202020202020202020202020202F6
+:102AC00002020202020202020202020202020202E6
+:102AD00002020202020202020202020202020202D6
+:102AE00002020202020202020202020202020202C6
+:102AF00002020202020202020202020202020200B8
+:102B000000000000000000000000000000000101C3
+:102B100001010101010101010101010101010100A6
+:102B200000000000000000000000000000000001A4
+:102B30000101010101010101010101010101010185
+:102B40000101010101010101010101010101010076
+:102B50000000000000000000000000000000000075
+:102B60000000000000000000000000000000000263
+:102B70000202020202020202020202020202020235
+:102B80000202020202020202020202020202020225
+:102B90000202020202020202020202020202020215
+:102BA0000202020202020202020202020202020106
+:102BB0000101010101010101010101010101010204
+:102BC00002020202020202020202020202020202E5
+:102BD00002020202020202020202020202020202D5
+:102BE00002020202020202020202020202020202C5
+:102BF00002020202020202020202020202020201B6
+:102C000001000000000000000000000000000101C1
+:102C100001010101010101010101010101010100A5
+:102C200000000000000000000000000000000001A3
+:102C30000101010101010101010101010101010184
+:102C40000101010101010101010101010101010174
+:102C50000101010101010101010101010101010065
+:102C60000000000000000000000000000000000064
+:102C70000000000000000000000000000000000252
+:102C80000202020202020202020202020202020224
+:102C90000202020202020202020202020202020214
+:102CA0000202020202020202020202020202020204
+:102CB00002020202020202020202020202020202F4
+:102CC00002020202020202020202020202020202E4
+:102CD00002020202020202020202020202020201D5
+:102CE00001010101010101010101010101010102D3
+:102CF00002020202020202020202020202020201B5
+:102D000001000000000000000000000000000101C0
+:102D100001010101010101010101010101010101A3
+:102D20000101010101010101010101010101010193
+:102D30000101010101010101010101010101010183
+:102D40000101010101010101010101010101010173
+:102D50000101010101010101010101010101010163
+:102D60000101010101010101010101010101010054
+:102D70000000000000000000000000000000000251
+:102D80000202020202020202020202020202020025
+:102D90000000000000000000000000000000000231
+:102DA0000202020202020202020202020202020104
+:102DB0000101010101010101010101010101010103
+:102DC00001010101010101010101010101010102F2
+:102DD00002020202020202020202020202020201D4
+:102DE00001010101010101010101010101010102D2
+:102DF00002020202020202020202020202020201B4
+:102E000001010101010101010101010101010101B2
+:102E100001010101010101010101010101010101A2
+:102E20000101010101010101010101010101010192
+:102E30000101010101010101010101010101010182
+:102E40000101010101010101010101010101010172
+:102E50000101010101010101010101010101010162
+:102E60000101010101010101010101010101010152
+:102E70000101010101010101010101010101010142
+:102E80000101010101010101010101010101010033
+:102E90000000000000000000000000000000000230
+:102EA0000202020202020202020202020202020103
+:102EB0000101010101010101010101010101010102
+:102EC00001010101010101010101010101010101F2
+:102ED00001010101010101010101010101010101E2
+:102EE00001010101010101010101010101010102D1
+:102EF00002020202020202020202020202020201B3
+:102F000001010101010101010101010101010101B1
+:102F100001010101010101010101010101010101A1
+:102F20000101010101010101010101010101010191
+:102F30000101010101010101010101010101010181
+:102F40000101010101010101010101010101010171
+:102F50000101010101010101010101010101010161
+:102F60000101010101010101010101010101010151
+:102F70000101010101010101010101010101010141
+:102F80000101010101010101010101010101010131
+:102F90000101010101010101010101010101010121
+:102FA0000101010101010101010101010101010111
+:102FB0000101010101010101010101010101010101
+:102FC00001010101010101010101010101010101F1
+:102FD00001010101010101010101010101010101E1
+:102FE00001010101010101010101010101010100D2
+:102FF00000000000000000000000000000000001D0
+:1030000001010101010101010101010101010101B0
+:1030100001010101010101010101010101010101A0
+:103020000101010101010101010101010101010190
+:103030000101010101010101010101010101010180
+:103040000101010101010101010101010101010170
+:103050000101010101010101010101010101010160
+:103060000101010101010101010101010101010150
+:103070000101010101010101010101010101010140
+:103080000101010101010101010101010101010130
+:103090000101010101010101010101010101010120
+:1030A0000101010101010101010101010101010110
+:1030B0000101010101010101010101010101010100
+:1030C00001010101010101010101010101010101F0
+:1030D00001010101010101010101010101010101E0
+:1030E00001010101010101010101010101010100D1
+:1030F00000000000000000000000000000000001CF
+:1031000001010101010101010101010101010101AF
+:10311000010101010101010101010101010101019F
+:10312000010101010101010101010101010101018F
+:10313000010101010101010101010101010101017F
+:10314000010101010101010101010101010101016F
+:10315000010101010101010101010101010101015F
+:10316000010101010101010101010101010101014F
+:10317000010101010101010101010101010101013F
+:10318000010101010101010101010101010101012F
+:10319000010101010101010101010101010101011F
+:1031A000010101010101010101010101010101010F
+:1031B00001010101010101010101010101010101FF
+:1031C00001010101010101010101010101010101EF
+:1031D00001010101010101010101010101010101DF
+:1031E00001010101010101010101010101010100D0
+:1031F00000000000000000000000000000000000CF
+:1032000000000000000000000000000000000000BE
+:1032100000000000000000000000000000000000AE
+:10322000000000000000000000000000000000029C
+:10323000020202020202020202020202020202026E
+:10324000020202020202020202020202020202025E
+:10325000020202020202020202020202020202024E
+:10326000020202020202020202020202020202023E
+:10327000020202020202020202020202020202022E
+:10328000020202020202020202020202020202021E
+:10329000020202020202020202020202020202020E
+:1032A00002020202020202020202020202020202FE
+:1032B00002020202020202020202020202020202EE
+:1032C00002020202020202020202020202020202DE
+:1032D00002020202020202020202020202020202CE
+:1032E00002020202020202020202020202020200C0
+:1032F00000000000000000000000000000000000CE
+:1033000000000000000000000000000000000000BD
+:1033100000000000000000000000000000000000AD
+:10332000000000000000000000000000000000009D
+:10333000000000000000000000000000000000008D
+:10334000000000000000000000000000000000007D
+:10335000000000000000000000000000000000006D
+:10336000000000000000000000000000000000005D
+:10337000000000000000000000000000000000004D
+:10338000000000000000000000000000000000003D
+:10339000000000000000000000000000000000002D
+:1033A000000000000000000000000000000000021B
+:1033B00002020202020202020202020202020202ED
+:1033C00002020202020202020202020202020202DD
+:1033D00002020202020202020202020202020202CD
+:1033E00002020202020202020202020202020200BF
+:1033F00000000000000000000000000000000000CD
+:1034000000000000000000000000000000000000BC
+:1034100000000000000000000000000000000000AC
+:10342000000000000000000000000000000000009C
+:10343000000000000000000000000000000000008C
+:10344000000000000000000000000000000000007C
+:10345000000000000000000000000000000000006C
+:10346000000000000000000000000000000000005C
+:10347000000000000000000000000000000000004C
+:10348000000000000000000000000000000000003C
+:10349000000000000000000000000000000000002C
+:1034A000000000000000000000000000000000001C
+:1034B000000000000000000000000000000000000C
+:1034C00000000000000000000000000000000000FC
+:1034D00000000000000000000000000000000002EA
+:1034E00002020202020202020202020202020200BE
+:1034F00000000000000000000000000000000000CC
+:1035000000000000000000000000000000000000BB
+:1035100000000000000000000000000000000000AB
+:10352000000000000000000000000000000000009B
+:10353000000000000000000000000000000000008B
+:10354000000000000000000000000000000000007B
+:10355000000000000000000000000000000000006B
+:10356000000000000000000000000000000000005B
+:10357000000000000000000000000000000000004B
+:10358000000000000000000000000000000000003B
+:10359000000000000000000000000000000000002B
+:1035A000000000000000000000000000000000001B
+:1035B000000000000000000000000000000000000B
+:1035C00000000000000000000000000000000000FB
+:1035D00000000000000000000000000000000000EB
+:1035E00000000000000000000000000000000000DB
+:1035F000000000000000000000000000000000309B
+:1036000036090000000000386B090000000000408F
+:103610009A09000000000048C8090000000000509E
+:10362000F409000000000058200A000000000060BB
+:10363000440A000000000068620A000000000070F8
+:10364000800A0000000000789E0A00000000008050
+:10365000BC0A000000000088DA0A000000000090A8
+:10366000F80A000000000098160B0000000000356A
+:103670000000000000000000000000000001000148
+:10368000000000000000000000000000000000003A
+:10369000000000000000000000000000000000002A
+:1036A000000000000000000000000000000000001A
+:1036B000000000000000000000000000000000000A
+:1036C00000000000000000000101000000000000F8
+:1036D00000000000000000000000000000000000EA
+:1036E00000000000000000000000000000000000DA
+:1036F00000000000000000000000000000000000CA
+:1037000000000000000000000000000000000000B9
+:1037100000000000000000000000000000000000A9
+:103720000000000000000000000000000000000099
+:103730000000000000000000000000000000000089
+:103740000000000000000000000000000000000079
+:103750000000000000000000000000000000000069
+:103760000000000000000000000000000000000059
+:103770000000000000010100000000000001010144
+:103780000000000000000000000000000000000039
+:103790000000000000000000000000000000000029
+:1037A0000000000000000000000000000000000019
+:1037B0000000000000000000000000000000000009
+:1037C00000000000000000000101010000000000F6
+:1037D00000000000000001000000000000000000E8
+:1037E00000000000000000000000000000000000D9
+:1037F00000000000000000000000000000000000C9
+:1038000000000000000000000000000000000000B8
+:1038100000000000000000000000000000000000A8
+:103820000100000000000000000000000000000097
+:103830000000000000000000000000000000000088
+:103840000000000000000000000000000000000078
+:103850000000000000000000000000000000000068
+:103860000000000000000000000000000001000057
+:10387000000000000001010200010000010101013F
+:103880000000000000000000000000000000000038
+:103890000000000000000000000000000000000028
+:1038A0000000000000000000000000000000000018
+:1038B0000000000000000000000000000000000008
+:1038C00000000000000000000101010000000000F5
+:1038D00000000000000001000000000000000000E7
+:1038E00000000000000000000000000000000000D8
+:1038F00000000000000000000000000000000000C8
+:1039000000000000000000000000000000000000B7
+:1039100000000000000000010000000000010000A5
+:103920000100000000000000000000000000000096
+:103930000000000000000000000000000000000087
+:103940000000000000000000000000000000000077
+:103950000000000000000000000000000000000067
+:103960000000000000000000000000010001000055
+:103970000000000000010102000201010202010139
+:103980000100000000000000000000000000000036
+:103990000000000000000000000000000000000027
+:1039A0000000000000000000000000000000000017
+:1039B0000000000000000000000000000000000007
+:1039C00000000000000000000201010100000000F2
+:1039D00000000000000001000000000000000000E6
+:1039E00000000000000000000000000000000000D7
+:1039F00000000000000000000000000000000000C7
+:103A000000000000000000000000000000000000B6
+:103A100000000000000000010000000000010000A4
+:103A20000100000000000000000000000000000095
+:103A30000000000000000000000000000000000086
+:103A40000000000000000000000000000000000076
+:103A50000000000000000000000000000000000066
+:103A60000000000000000000000000010101000152
+:103A70000000000000010102020202020202020232
+:103A80000100000000000000000000000000000035
+:103A90000000000000000000000000000000000026
+:103AA0000000000000000000000000000000000016
+:103AB0000000000000000000000000000000000006
+:103AC00000000000000000000202010100000000F0
+:103AD00000000000000001000000000000000000E5
+:103AE00000000000000000000000000000000000D6
+:103AF00000000000000000000000000000000000C6
+:103B000000000000000000000000000000000000B5
+:103B100000000000000000010101000001010000A0
+:103B20000100000000000000000000000000000094
+:103B30000000000000000000000000000000000085
+:103B40000000000000000000000000000000000075
+:103B50000000000000000000000000000000000065
+:103B6000000000000000000000000101010101014F
+:103B7000010001010101010202020202020202022D
+:103B80000100010101000000000000000000000031
+:103B90000000000000000000000000000000000025
+:103BA0000000000000000000000000000000000015
+:103BB0000000000000000000000000000000000005
+:103BC00000000000000000000202020100000000EE
+:103BD00000000000000001000000000000000000E4
+:103BE00000000000000000000000000000000000D5
+:103BF00000000000000000000000000000000000C5
+:103C000000000000000000000000000000000000B4
+:103C1000000000000000000101010101010101009C
+:103C20000100010000000000000000000000000092
+:103C30000000000000000000000000000000000084
+:103C40000000000000000000000000000000000074
+:103C50000000000000000000000000000000000064
+:103C6000000000000000000000010101010101014D
+:103C7000010001010101010202020202020202022C
+:103C8000020001010100000000000000000000002F
+:103C90000000000000000000000000000000000024
+:103CA0000000000000000000000000000000000014
+:103CB0000000000000000000000000000000000004
+:103CC00000000000000000020202020101010000E9
+:103CD00000000000000001000000000000000000E3
+:103CE00000000000000000000000000000000000D4
+:103CF00000000000000000000000000000000000C4
+:103D000000000000000000000000000000000000B3
+:103D1000000000000000000101010101010101019A
+:103D20000100010000000000000000000000000091
+:103D30000000000000000000000000000000000083
+:103D40000000000000000000000000000000000073
+:103D50000000000000000000000000000000000063
+:103D6000000000000000000000010101010101014C
+:103D7000010001010101010202020202020202022B
+:103D8000020001010100000000000000000000002E
+:103D90000000000000000000000000000000000023
+:103DA0000000000000000000000000000000000013
+:103DB0000000000000000000000000000000000003
+:103DC00000000000000000020202020201010000E7
+:103DD00000000000000001000000000000000000E2
+:103DE00000000000000000000000000000000000D3
+:103DF00000000000000000000000000000000000C3
+:103E000000000000000000000000000000000000B2
+:103E10000000000000000002010101010101010198
+:103E2000010001000000010000000000000000008F
+:103E30000000000000000000000000000000000082
+:103E40000000000000000000000000000000000072
+:103E50000000000000000000000000000000000062
+:103E6000000000000000000001010101010101014A
+:103E70000101010101010102020202020202020229
+:103E8000020202010100000000000000000000002A
+:103E90000000000000000000000000000000000022
+:103EA0000000000000000000000000000000000012
+:103EB0000000000000000000000000000000000002
+:103EC00000000000000000020202020202010000E5
+:103ED00000000000000001000000000000000000E1
+:103EE00000000000000000000000000000000000D2
+:103EF00000000000000000000000000000000000C2
+:103F000000000000000000000000000000000000B1
+:103F10000000000000000002020101010101010196
+:103F2000010001000000010000000000000000008E
+:103F30000000000000000000000000000000000081
+:103F40000000000000000000000000000000000071
+:103F50000000000000000000000000000000000061
+:103F60000000000000000000010101010101010149
+:103F70000101010101010102020202020202020228
+:103F80000202020201000000000000000000000028
+:103F90000000000000000000000000000000000021
+:103FA0000000000000000000000000000000000011
+:103FB0000000000000000000000000000000000001
+:103FC00000000000000000020202020202010100E3
+:103FD00000000000000001000000000000000000E0
+:103FE00000000000000000000000000000000000D1
+:103FF00000000000000000000000000000000000C1
+:1040000000000000000000000000000000000000B0
+:104010000000000000000002020201010101010194
+:10402000010001000000010000000000000000008D
+:104030000000000000000000000000000000000080
+:104040000000000000000000000000000000000070
+:104050000000000000000000000000000000000060
+:104060000000000000000000010101010101010148
+:104070000101010101010102020202020202020227
+:104080000202020202000000000000000000000026
+:104090000000000000000000000000000000000020
+:1040A0000000000000000000000000000000000010
+:1040B0000000000000000000000000000000000000
+:1040C00000000000000000020202020202020101E0
+:1040D00000000000000001000000000000000000DF
+:1040E00000000000000000000000000000000000D0
+:1040F00000000000000000000000000000000000C0
+:1041000000000000000000000000000000000000AF
+:104110000000000000000002020202010101010192
+:10412000010001000000010000000000000000008C
+:10413000000000000000000000000000000000007F
+:10414000000000000000000000000000000000006F
+:10415000000000000000000000000000000000005F
+:104160000000000000000000010101010101010147
+:104170000101010101010102020202020202020226
+:104180000202020202010000000000000000000024
+:10419000000000000000000000000000000000001F
+:1041A000000000000000000000000000000000000F
+:1041B00000000000000000000000000000000000FF
+:1041C00000000000000000020202020202020101DF
+:1041D00000000100000001000000000000000000DD
+:1041E00000000000000000000000000000000000CF
+:1041F00000000000000000000000000000000000BF
+:1042000000000000000000000000000000000000AE
+:10421000000000000000000202020202020201018E
+:10422000010001010000010000000000000000008A
+:10423000000000000000000000000000000000007E
+:10424000000000000000000000000000000000006E
+:10425000000000000000000000000000000000005E
+:104260000000000000000000010101010101010146
+:104270000101010101010102020202020202020225
+:104280000202020202010000000000000000000023
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000000000E
+:1042B00000000000000000000000000000000000FE
+:1042C00000000000000000020202020202020201DD
+:1042D00000000100000002000000000000000000DB
+:1042E00000000000000000000000000000000000CE
+:1042F00000000000000000000000000000000000BE
+:1043000000000000000000000000000000000000AD
+:10431000000000000000000202020202020201018D
+:104320000200010100000100000000000000000088
+:10433000000000000000000000000000000000007D
+:10434000000000000000000000000000000000006D
+:10435000000000000000000000000000000000005D
+:104360000000000000000000010101010101010145
+:104370000101010101010102020202020202020224
+:104380000202020202010000000000000000000022
+:10439000000000000000000000000000000000001D
+:1043A000000000000000000000000000000000000D
+:1043B00000000000000000000000000000000000FD
+:1043C00000000000000000020202020202020201DC
+:1043D00001000100010002000000000000000000D8
+:1043E00000000000000000000000000000000000CD
+:1043F00000000000000000000000000000000000BD
+:1044000000000000000000000000000000000000AC
+:10441000000000000000000202020202020202018B
+:104420000200010100010100000000000000000086
+:10443000000000000000000000000000000000007C
+:10444000000000000000000000000000000000006C
+:10445000000000000000000000000000000000005C
+:104460000000000000000000020202020101010140
+:104470000101010101010102020202020202020223
+:104480000202020202010000000000000000000021
+:10449000000000000000000000000000000000001C
+:1044A000000000000000000000000000000000000C
+:1044B00000000000000000000000000000000000FC
+:1044C00000000000000000020202020202020202DA
+:1044D00001000100010002000000000000000000D7
+:1044E00000000000000000000000000000000000CC
+:1044F00000000000000000000000000000000000BC
+:1045000000000000000000000000000000000000AB
+:10451000000000000000000202020202020202018A
+:104520000200010100010100000000000000000085
+:10453000000000000000000000000000000000007B
+:10454000000000000000000000000000000000006B
+:10455000000000000000000000000000000000005B
+:10456000000000000000000002020202010101013F
+:104570000101010101010102020202020202020222
+:104580000202020202010000000000000000000020
+:10459000000000000000000000000000000000001B
+:1045A000000000000000000000000000000000000B
+:1045B00000000000000000000000000000000000FB
+:1045C00000000000000000020202020202020202D9
+:1045D00002000201010002000000000000000000D3
+:1045E00000000000000000000000000000000000CB
+:1045F00000000000000000000000000000000000BB
+:1046000000000000000000000000000000000000AA
+:104610000000000000000002020202020202020288
+:104620000200010100010100000000000000000084
+:10463000000000000000000000000000000000007A
+:10464000000000000000000000000000000000006A
+:10465000000000000000000000000000000000005A
+:10466000000000000000000002020202020201013C
+:104670000101010101010102020202020202020221
+:10468000020202020201000000000000000000001F
+:10469000000000000000000000000000000000001A
+:1046A000000000000000000000000000000000000A
+:1046B00000000000000000000000000000000000FA
+:1046C00000000000000000020202020202020202D8
+:1046D00002020201010002000000000000000000D0
+:1046E00000000000000000000000000000000000CA
+:1046F00000000000000000000000000000000000BA
+:1047000000000000000000000000000000000000A9
+:104710000000000000000002020202020202020287
+:104720000200020100010100000000000000000082
+:104730000000000000000000000000000000000079
+:104740000000000000000000000000000000000069
+:104750000000000000000000000000000000000059
+:10476000000000000000000002020202020201013B
+:104770000101010101010102020202020202020220
+:10478000020202020201000000000000000000001E
+:104790000000000000000000000000000000000019
+:1047A0000000000000000000000000000000000009
+:1047B00000000000000000000000000000000000F9
+:1047C00000000000000000020202020202020202D7
+:1047D00002020201020002000000000000000000CE
+:1047E00000000000000000000000000000000000C9
+:1047F00000000000000000000000000000000000B9
+:1048000000000000000000000000000000000000A8
+:104810000000000000000002020202020202020286
+:104820000200020101010100000000000000000080
+:104830000000000000000000000000000000000078
+:104840000000000000000000000000000000000068
+:104850000000000000000000000000000000000058
+:104860000000000000000000020202020202020139
+:10487000010101010101010202020202020202021F
+:10488000020202020202000000000000000000001C
+:104890000000000000000000000000000000000018
+:1048A0000000000000000000000000000000000008
+:1048B00000000000000000000000000000000000F8
+:1048C00000000000000000020202020202020202D6
+:1048D00002020202020002000000000000000000CC
+:1048E00000000000000000000000000000000000C8
+:1048F00000000000000000000000000000000000B8
+:1049000000000000000000000000000000000000A7
+:104910000000000000000002020202020202020285
+:10492000020002010101010000000000000000007F
+:104930000000000000000000000000000000000077
+:104940000000000000000000000000000000000067
+:104950000000000000000000000000000000000057
+:104960000000000000000000020202020202020237
+:10497000010101010101010202020202020202021E
+:10498000020202020202000000000000000000001B
+:104990000000000000000000000000000000000017
+:1049A0000000000000000000000000000000000007
+:1049B00000000000000000000000000000000000F7
+:1049C00000000000000000020202020202020202D5
+:1049D00002020202020002000000000000000000CB
+:1049E00000000000000000000000000000000000C7
+:1049F00000000000000000000000000000000000B7
+:104A000000000000000000000000000000000000A6
+:104A10000000000000000002020202020202020284
+:104A2000020002010101010000000000000000007E
+:104A30000000000000000000000000000000000076
+:104A40000000000000000000000000000000000066
+:104A50000000000000000000000000000000000056
+:104A60000000000000000000020202020202020236
+:104A7000020101010101010202020202020202021C
+:104A8000020102020202000000000000000000001B
+:104A90000000000000000000000000000000000016
+:104AA0000000000000000000000000000000000006
+:104AB00000000000000000000000000000000000F6
+:104AC00000000000000000020202020202020202D4
+:104AD00002020202020002000000000000000000CA
+:104AE00000000000000000000000000000000000C6
+:104AF00000000000000000000000000000000000B6
+:104B000000000000000000000000000000000000A5
+:104B10000000000000000002020202020202020283
+:104B2000020102020101020000000000000000007A
+:104B30000000000000000000000000000000000075
+:104B40000000000000000000000000000000000065
+:104B50000000000000000000000000000000000055
+:104B60000000000000000002020202020202020233
+:104B7000020101010101010202020202020202021B
+:104B8000020101010102010000000000000000001C
+:104B90000000000000000000000000000000000015
+:104BA0000000000000000000000000000000000005
+:104BB00000000000000000000000000000000000F5
+:104BC00000000000000000020202020202020202D3
+:104BD00002020202020102000000000000000000C8
+:104BE00000000000000000000000000000000000C5
+:104BF00000000000000000000000000000000000B5
+:104C000000000000000000000000000000000000A4
+:104C10000000000000000002020202020202020282
+:104C20000201020201010200000000000000000079
+:104C30000000000000000000000000000000000074
+:104C40000000000000000000000000000000000064
+:104C50000000000000000000000000000000000054
+:104C60000000000000000002020202020202020232
+:104C7000020102010101010202020202020202011A
+:104C8000010101010102010000000000000000001C
+:104C90000000000000000000000000000000000014
+:104CA0000000000000000000000000000000000004
+:104CB00000000000000000000000000000000000F4
+:104CC00000000000000000020202020202020202D2
+:104CD00002020202020102000000000000000000C7
+:104CE00000000000000000000000000000000000C4
+:104CF00000000000000000000000000000000000B4
+:104D000000000000000000000000000000000000A3
+:104D10000000000000000002020202020202020281
+:104D20000201020201010200000000000000000078
+:104D30000000000000000000000000000000000073
+:104D40000000000000000000000000000000000063
+:104D50000000000000000000000000000000000053
+:104D60000000000000000002020202020202020231
+:104D7000020202020101010202020202010101011A
+:104D8000010101010102010000000000000000001B
+:104D90000000000000000000000000000000000013
+:104DA0000000000000000000000000000000000003
+:104DB00000000000000000000000000000000000F3
+:104DC00000000000000000020202020202020202D1
+:104DD00002020202020102000000000000000000C6
+:104DE00000000000000000000000000000000000C3
+:104DF00000000000000000000000000000000000B3
+:104E000000000000000000000000000000000000A2
+:104E10000000000000000002020202020202020280
+:104E20000202020201010200000000000000000076
+:104E30000000000000000000000000000000000072
+:104E40000000000000000000000000000000000062
+:104E50000000000000000000000000000000000052
+:104E60000000000000000002020202020202020230
+:104E70000202020202020102020202020101010117
+:104E8000010101010101010000000000000000001B
+:104E90000000000000000000000000000000000012
+:104EA0000000000000000000000000000000000002
+:104EB00000000000000000000000000000000000F2
+:104EC00000000000000000020202020202020202D0
+:104ED00002020202020102000000000000000000C5
+:104EE00000000000000000000000000000000000C2
+:104EF00000000000000000000000000000000000B2
+:104F000000000000000000000000000000000000A1
+:104F1000000000000000000202020202020202027F
+:104F20000202020202010200000000000000000074
+:104F30000000000000000000000000000000000071
+:104F40000000000000000000000000000000000061
+:104F50000000000000000000000000000000000051
+:104F6000000000000000000202020202020202022F
+:104F70000202020202020202020202010101010116
+:104F8000010101010101010000000000000000001A
+:104F90000000000000000000000000000000000011
+:104FA0000000000000000000000000000000000001
+:104FB00000000000000000000000000000000000F1
+:104FC00000000000000000020202020202020202CF
+:104FD00002020202020101000000000000000000C5
+:104FE00000000000000000000000000000000000C1
+:104FF00000000000000000000000000000000000B1
+:1050000000000000000000000000000000000000A0
+:10501000000000000000000202020202020202027E
+:105020000202020202020200000000000000000072
+:105030000000000000000000000000000000000070
+:105040000000000000000000000000000000000060
+:105050000000000000000000000000000000000050
+:10506000000000000000000202020202020202022E
+:105070000202020202020201020101010101010118
+:105080000101010101010100000000000000000019
+:105090000000000000000000000000000000000010
+:1050A0000000000000000000000000000000000000
+:1050B00000000000000000000000000000000000F0
+:1050C00000000000000000020202020202020202CE
+:1050D00002020202020201000000000000000000C3
+:1050E00000000000000000000000000000000000C0
+:1050F00000000000000000000000000000000000B0
+:10510000000000000000000000000000000000009F
+:10511000000000000000000202020202020202027D
+:105120000202020202020200000000000000000071
+:10513000000000000000000000000000000000006F
+:10514000000000000000000000000000000000005F
+:10515000000000000000000000000000000000004F
+:10516000000000000000000202020202020202022D
+:105170000202020202020201010101010101010118
+:105180000101010101010100000000000000000018
+:10519000000000000000000000000000000000000F
+:1051A00000000000000000000000000000000000FF
+:1051B00000000000000000000000000000000000EF
+:1051C00000000000000000020202020202020202CD
+:1051D00002010202010201000000000000000000C4
+:1051E00000000000000000000000000000000000BF
+:1051F00000000000000000000000000000000000AF
+:10520000000000000000000000000000000000009E
+:10521000000000000000000202020202020202027C
+:105220000202020202020200000000000000000070
+:10523000000000000000000000000000000000006E
+:10524000000000000000000000000000000000005E
+:10525000000000000000000000000000000000004E
+:10526000000000000000000202020202020202022C
+:105270000202020202020201010101010101010117
+:105280000101010101010100000000000000000017
+:10529000000000000000000000000000000000000E
+:1052A00000000000000000000000000000000000FE
+:1052B00000000000000000000000000000000000EE
+:1052C00000000000000000020202020202020202CC
+:1052D00002010101010201000000000000000000C5
+:1052E00000000000000000000000000000000000BE
+:1052F00000000000000000000000000000000000AE
+:10530000000000000000000000000000000000009D
+:10531000000000000000000202020202020202027B
+:10532000020202020202020000000000000000006F
+:10533000000000000000000000000000000000006D
+:10534000000000000000000000000000000000005D
+:10535000000000000000000000000000000000004D
+:10536000000000000000000202020202020202022B
+:105370000202020202020201010101010101010116
+:105380000101010101010100000000000000000016
+:10539000000000000000000000000000000000000D
+:1053A00000000000000000000000000000000000FD
+:1053B00000000000000000000000000000000000ED
+:1053C00000000000000000020202020201020202CC
+:1053D00001010101010201000000000000000000C5
+:1053E00000000000000000000000000000000000BD
+:1053F00000000000000000000000000000000000AD
+:10540000000000000000000000000000000000009C
+:10541000000000000000000202020202020202027A
+:10542000020202020202020000000000000000006E
+:10543000000000000000000000000000000000006C
+:10544000000000000000000000000000000000005C
+:10545000000000000000000000000000000000004C
+:10546000000000000000000202020202020202022A
+:105470000202020202020201010101010101010115
+:105480000101010101010100000000000000000015
+:10549000000000000000000000000000000000000C
+:1054A00000000000000000000000000000000000FC
+:1054B00000000000000000000000000000000000EC
+:1054C00000000000000000020202020201010101CE
+:1054D00001010101010101000000000000000000C5
+:1054E00000000000000000000000000000000000BC
+:1054F00000000000000000000000000000000000AC
+:10550000000000000000000000000000000000009B
+:105510000000000000000002020202020202020279
+:10552000020202020202020000000000000000006D
+:10553000000000000000000000000000000000006B
+:10554000000000000000000000000000000000005B
+:10555000000000000000000000000000000000004B
+:105560000000000000000002020202020202020229
+:105570000202020202020201010101010101010114
+:105580000101010101010100000000000000000014
+:10559000000000000000000000000000000000000B
+:1055A00000000000000000000000000000000000FB
+:1055B00000000000000000000000000000000000EB
+:1055C00000000000000000010101010101010101D2
+:1055D00001010101010101000000000000000000C4
+:1055E00000000000000000000000000000000000BB
+:1055F00000000000000000000000000000000000AB
+:10560000000000000000000000000000000000009A
+:105610000000000000000002020202020202020278
+:10562000020202020202020000000000000000006C
+:10563000000000000000000000000000000000006A
+:10564000000000000000000000000000000000005A
+:10565000000000000000000000000000000000004A
+:105660000000000000000002020202020202020228
+:105670000202020202020201010101010101010113
+:105680000101010101010100000000000000000013
+:10569000000000000000000000000000000000000A
+:1056A00000000000000000000000000000000000FA
+:1056B00000000000000000000000000000000000EA
+:1056C00000000000000000010101010101010101D1
+:1056D00001010101010101000000000000000000C3
+:1056E00000000000000000000000000000000000BA
+:1056F00000000000000000000000000000000000AA
+:105700000000000000000000000000000000000099
+:105710000000000000000002020202020202020277
+:10572000020202020202020000000000000000006B
+:105730000000000000000000000000000000000069
+:105740000000000000000000000000000000000059
+:105750000000000000000000000000000000000049
+:105760000000000000000002020202020202020227
+:105770000202020202020201010101010101010112
+:105780000101010101010100000000000000000012
+:105790000000000000000000000000000000000009
+:1057A00000000000000000000000000000000000F9
+:1057B00000000000000000000000000000000000E9
+:1057C00000000000000000010101010101010101D0
+:1057D00001010101010101000000000000000000C2
+:1057E00000000000000000000000000000000000B9
+:1057F00000000000000000000000000000000000A9
+:105800000000000000000000000000000000000098
+:105810000000000000000002020202020202020276
+:10582000020202020202020000000000000000006A
+:105830000000000000000000000000000000000068
+:105840000000000000000000000000000000000058
+:105850000000000000000000000000000000000048
+:105860000000000000000002020202020202020226
+:105870000202020202020201010101010101010111
+:105880000101010101010100000000000000000011
+:105890000000000000000000000000000000000008
+:1058A00000000000000000000000000000000000F8
+:1058B00000000000000000000000000000000000E8
+:1058C00000000000000000010101010101010101CF
+:1058D00001010101010101000000000000000000C1
+:1058E00000000000000000000000000000000000B8
+:1058F00000000000000000000000000000000000A8
+:105900000000000000000000000000000000000097
+:105910000000000000000002020202020202020275
+:105920000202020202020200000000000000000069
+:105930000000000000000000000000000000000067
+:105940000000000000000000000000000000000057
+:105950000000000000000000000000000000000047
+:105960000000000000000002020202020202020225
+:105970000202020202020201010101010101010110
+:105980000101010101010100000000000000000010
+:105990000000000000000000000000000000000007
+:1059A00000000000000000000000000000000000F7
+:1059B00000000000000000000000000000000000E7
+:1059C00000000000000000010101010101010101CE
+:1059D00001010101010101000000000000000000C0
+:1059E00000000000000000000000000000000000B7
+:1059F00000000000000000000000000000000000A7
+:105A00000000000000000000000000000000000096
+:105A10000000000000000002020202020202020274
+:105A20000202020202020100000000000000000069
+:105A30000000000000000000000000000000000066
+:105A40000000000000000000000000000000000056
+:105A50000000000000000000000000000000000046
+:105A60000000000000000002020202020202020224
+:105A7000020202020202020101010101010101010F
+:105A8000010101010101010000000000000000000F
+:105A90000000000000000000000000000000000006
+:105AA00000000000000000000000000000000000F6
+:105AB00000000000000000000000000000000000E6
+:105AC00000000000000000010101010101010101CD
+:105AD00001010101010101000000000000000000BF
+:105AE00000000000000000000000000000000000B6
+:105AF00000000000000000000000000000000000A6
+:105B00000000000000000000000000000000000095
+:105B10000000000000000002020202020202020273
+:105B20000202020202020100000000000000000068
+:105B30000000000000000000000000000000000065
+:105B40000000000000000000000000000000000055
+:105B50000000000000000000000000000000000045
+:105B60000000000000000002020202020202020223
+:105B7000020202020202020101010101010101010E
+:105B8000010101010101010000000000000000000E
+:105B90000000000000000000000000000000000005
+:105BA00000000000000000000000000000000000F5
+:105BB00000000000000000000000000000000000E5
+:105BC00000000000000000010101010101010101CC
+:105BD00001010101010101000000000000000000BE
+:105BE00000000000000000000000000000000000B5
+:105BF00000000000000000000000000000000000A5
+:105C00000000000000000000000000000000000094
+:105C10000000000000000002020202020202020272
+:105C2000010101010102010000000000000000006C
+:105C30000000000000000000000000000000000064
+:105C40000000000000000000000000000000000054
+:105C50000000000000000000000000000000000044
+:105C60000000000000000002020202020202020222
+:105C7000020202020202020101010101010101010D
+:105C8000010101010101010000000000000000000D
+:105C90000000000000000000000000000000000004
+:105CA00000000000000000000000000000000000F4
+:105CB00000000000000000000000000000000000E4
+:105CC00000000000000000010101010101010101CB
+:105CD00001010101010101000000000000000000BD
+:105CE00000000000000000000000000000000000B4
+:105CF00000000000000000000000000000000000A4
+:105D00000000000000000000000000000000000093
+:105D10000000000000000002020202020101010175
+:105D2000010101010101010000000000000000006C
+:105D30000000000000000000000000000000000063
+:105D40000000000000000000000000000000000053
+:105D50000000000000000000000000000000000043
+:105D60000000000000000002020202020202020221
+:105D7000020202020202020101010101010101010C
+:105D8000010101010101010000000000000000000C
+:105D90000000000000000000000000000000000003
+:105DA00000000000000000000000000000000000F3
+:105DB00000000000000000000000000000000000E3
+:105DC00000000000000000010101010101010101CA
+:105DD00001010101010101000000000000000000BC
+:105DE00000000000000000000000000000000000B3
+:105DF00000000000000000000000000000000000A3
+:105E00000000000000000000000000000000000092
+:105E10000000000000000001010101010101010179
+:105E2000010101010101010000000000000000006B
+:105E30000000000000000000000000000000000062
+:105E40000000000000000000000000000000000052
+:105E50000000000000000000000000000000000042
+:105E60000000000000000002020202020202020220
+:105E7000020202020202020101010101010101010B
+:105E8000010101010101010000000000000000000B
+:105E90000000000000000000000000000000000002
+:105EA00000000000000000000000000000000000F2
+:105EB00000000000000000000000000000000000E2
+:105EC00000000000000000010101010101010101C9
+:105ED00001010101010101000000000000000000BB
+:105EE00000000000000000000000000000000000B2
+:105EF00000000000000000000000000000000000A2
+:105F00000000000000000000000000000000000091
+:105F10000000000000000001010101010101010178
+:105F2000010101010101010000000000000000006A
+:105F30000000000000000000000000000000000061
+:105F40000000000000000000000000000000000051
+:105F50000000000000000000000000000000000041
+:105F6000000000000000000202020202020202021F
+:105F7000020202020202020101010101010101010A
+:105F8000010101010101010000000000000000000A
+:105F90000000000000000000000000000000000001
+:105FA00000000000000000000000000000000000F1
+:105FB00000000000000000000000000000000000E1
+:105FC00000000000000000010101010101010101C8
+:105FD00001010101010101000000000000000000BA
+:105FE00000000000000000000000000000000000B1
+:105FF00000000000000000000000000000000000A1
+:106000000000000000000000000000000000000090
+:106010000000000000000001010101010101010177
+:106020000101010101010100000000000000000069
+:106030000000000000000000000000000000000060
+:106040000000000000000000000000000000000050
+:106050000000000000000000000000000000000040
+:10606000000000000000000202020202020202021E
+:106070000202020202020201010101010101010109
+:106080000101010101010100000000000000000009
+:106090000000000000000000000000000000000000
+:1060A00000000000000000000000000000000000F0
+:1060B00000000000000000000000000000000000E0
+:1060C00000000000000000010101010101010101C7
+:1060D00001010101010101000000000000000000B9
+:1060E00000000000000000000000000000000000B0
+:1060F00000000000000000000000000000000000A0
+:10610000000000000000000000000000000000008F
+:106110000000000000000001010101010101010176
+:106120000101010101010100000000000000000068
+:10613000000000000000000000000000000000005F
+:10614000000000000000000000000000000000004F
+:10615000000000000000000000000000000000003F
+:10616000000000000000000202020202020202021D
+:106170000202020202020201010101010101010108
+:106180000101010101010100000000000000000008
+:1061900000000000000000000000000000000000FF
+:1061A00000000000000000000000000000000000EF
+:1061B00000000000000000000000000000000000DF
+:1061C00000000000000000010101010101010101C6
+:1061D00001010101010101000000000000000000B8
+:1061E00000000000000000000000000000000000AF
+:1061F000000000000000000000000000000000009F
+:10620000000000000000000000000000000000008E
+:106210000000000000000001010101010101010175
+:106220000101010101010100000000000000000067
+:10623000000000000000000000000000000000005E
+:10624000000000000000000000000000000000004E
+:10625000000000000000000000000000000000003E
+:10626000000000000000000202020202020202021C
+:106270000202020202020201010101010101010107
+:106280000101010101010100000000000000000007
+:1062900000000000000000000000000000000000FE
+:1062A00000000000000000000000000000000000EE
+:1062B00000000000000000000000000000000000DE
+:1062C00000000000000000010101010101010101C5
+:1062D00001010101010101000000000000000000B7
+:1062E00000000000000000000000000000000000AE
+:1062F000000000000000000000000000000000009E
+:10630000000000000000000000000000000000008D
+:106310000000000000000001010101010101010174
+:106320000101010101010100000000000000000066
+:10633000000000000000000000000000000000005D
+:10634000000000000000000000000000000000004D
+:10635000000000000000000000000000000000003D
+:10636000000000000000000202020202020202021B
+:106370000202020202020201010101010101010106
+:106380000101010101010100000000000000000006
+:1063900000000000000000000000000000000000FD
+:1063A00000000000000000000000000000000000ED
+:1063B00000000000000000000000000000000000DD
+:1063C00000000000000000010101010101010101C4
+:1063D00001010101010101000000000000000000B6
+:1063E00000000000000000000000000000000000AD
+:1063F000000000000000000000000000000000009D
+:10640000000000000000000000000000000000008C
+:106410000000000000000001010101010101010173
+:106420000101010101010100000000000000000065
+:10643000000000000000000000000000000000005C
+:10644000000000000000000000000000000000004C
+:10645000000000000000000000000000000000003C
+:10646000000000000000000202020202020202021A
+:106470000202020202020201010101010101010105
+:106480000101010101010100000000000000000005
+:1064900000000000000000000000000000000000FC
+:1064A00000000000000000000000000000000000EC
+:1064B00000000000000000000000000000000000DC
+:1064C00000000000000000010101010101010101C3
+:1064D00001010101010101000000000000000000B5
+:1064E00000000000000000000000000000000000AC
+:1064F000000000000000000000000000000000009C
+:10650000000000000000000000000000000000008B
+:106510000000000000000001010101010101010172
+:106520000101010101010100000000000000000064
+:10653000000000000000000000000000000000005B
+:10654000000000000000000000000000000000004B
+:10655000000000000000000000000000000000003B
+:106560000000000000000002020202020202020219
+:106570000202020202020201010101010101010104
+:106580000101010101010100000000000000000004
+:1065900000000000000000000000000000000000FB
+:1065A00000000000000000000000000000000000EB
+:1065B00000000000000000000000000000000000DB
+:1065C00000000000000000010101010101010101C2
+:1065D00001010101010101000000000000000000B4
+:1065E00000000000000000000000000000000000AB
+:1065F000000000000000000000000000000000009B
+:10660000000000000000000000000000000000008A
+:106610000000000000000001010101010101010171
+:106620000101010101010100000000000000000063
+:10663000000000000000000000000000000000005A
+:10664000000000000000000000000000000000004A
+:10665000000000000000000000000000000000003A
+:106660000000000000000002020202020202020218
+:106670000202020202020201010101010101010103
+:106680000101010101010100000000000000000003
+:1066900000000000000000000000000000000000FA
+:1066A00000000000000000000000000000000000EA
+:1066B00000000000000000000000000000000000DA
+:1066C00000000000000000010101010101010101C1
+:1066D00001010101010101000000000000000000B3
+:1066E00000000000000000000000000000000000AA
+:1066F000000000000000000000000000000000009A
+:106700000000000000000000000000000000000089
+:106710000000000000000001010101010101010170
+:106720000101010101010100000000000000000062
+:106730000000000000000000000000000000000059
+:106740000000000000000000000000000000000049
+:106750000000000000000000000000000000000039
+:106760000000000000000002020202020202020217
+:106770000202020202020201010101010101010102
+:106780000101010101010100000000000000000002
+:1067900000000000000000000000000000000000F9
+:1067A00000000000000000000000000000000000E9
+:1067B00000000000000000000000000000000000D9
+:1067C00000000000000000010101010101010101C0
+:1067D00001010101010101000000000000000000B2
+:1067E00000000000000000000000000000000000A9
+:1067F0000000000000000000000000000000000099
+:106800000000000000000000000000000000000088
+:10681000000000000000000101010101010101016F
+:106820000101010101010100000000000000000061
+:106830000000000000000000000000000000000058
+:106840000000000000000000000000000000000048
+:106850000000000000000000000000000000000038
+:106860000000000000000000010101010101010120
+:106870000101010101010100000000000000000011
+:106880000000000000000000000000000000000008
+:1068900000000000000000000000000000000000F8
+:1068A00000000000000000000000000000000000E8
+:1068B00000000000000000000000000000000000D8
+:1068C00000000000000000020202020202020202B6
+:1068D00002020202020202000000000000000000AA
+:1068E00000000000000000000000000000000000A8
+:1068F0000000000000000000000000000000000098
+:106900000000000000000000000000000000000087
+:106910000000000000000002020202020202020265
+:106920000202020202020200000000000000000059
+:106930000000000000000000000000000000000057
+:106940000000000000000000000000000000000047
+:106950000000000000000000000000000000000037
+:106960000000000000000000000000000000000027
+:106970000000000000000000000000000000000017
+:106980000000000000000000000000000000000007
+:1069900000000000000000000000000000000000F7
+:1069A00000000000000000000000000000000000E7
+:1069B00000000000000000000000000000000000D7
+:1069C00000000000000000020202020202020202B5
+:1069D00002020202020202000000000000000000A9
+:1069E00000000000000000000000000000000000A7
+:1069F0000000000000000000000000000000000097
+:106A00000000000000000000000000000000000086
+:106A10000000000000000002020202020202020264
+:106A20000202020202020200000000000000000058
+:106A30000000000000000000000000000000000056
+:106A40000000000000000000000000000000000046
+:106A50000000000000000000000000000000000036
+:106A60000000000000000000000000000000000026
+:106A70000000000000000000000000000000000016
+:106A80000000000000000000000000000000000006
+:106A900000000000000000000000000000000000F6
+:106AA00000000000000000000000000000000000E6
+:106AB00000000000000000000000000000000000D6
+:106AC00000000000000000000000000000000000C6
+:106AD00000000000000000000000000000000000B6
+:106AE00000000000000000000000000000000000A6
+:106AF0000000000000000000000000000000000096
+:106B00000000000000000000000000000000000085
+:106B10000000000000000000000000000000000075
+:106B20000000000000000000000000000000000065
+:106B30000000000000000000000000000000000055
+:106B40000000000000000000000000000000000045
+:106B50000000000000000000000000000000000035
+:106B60000000000000000000000000000000000025
+:106B7000000000000000002F0000000000000000E6
+:106B80000000000000000000000000000000000005
+:106B900000000000000000000000000000000000F5
+:106BA00000000000000000000000000000000000E5
+:106BB00000000000000000000000000000000000D5
+:106BC00000000000000000000000000000000000C5
+:106BD00000000000010000010000000000000100B2
+:106BE00000000000000000000000000000000000A5
+:106BF0000000000000000000000000000000000095
+:106C00000000000000000000000000000000000084
+:106C10000000000000000000000000000000000074
+:106C20000000000000000000000000000000000064
+:106C30000000000000000000000000000000000054
+:106C40000000000000000000000000000000000044
+:106C50000000000000000000000000000000000034
+:106C60000000000000000000000000000000000024
+:106C70000000000000000000000000000000000014
+:106C80000000000000000000000000000000000004
+:106C900000000000000000000000000000000000F4
+:106CA00000000000000000000000000000000000E4
+:106CB00000000000000000000000000000000000D4
+:106CC00000000000000000000000000000000001C3
+:106CD00001010000010101010000010001000100AB
+:106CE00000000000000000000000000000000000A4
+:106CF0000000000000000000000000000000000094
+:106D00000000000000000000000000000000000083
+:106D10000000000000000000000000000000000073
+:106D20000000000001000000000000000000000062
+:106D30000000000000000000000000000000000053
+:106D40000000000000000000000000000000000043
+:106D50000000000000000000000000000000000033
+:106D60000000000000000000000000000000000023
+:106D70000000000000000000000000000000000112
+:106D80000000000000000000000000000000000003
+:106D900000000000000000000000000000000000F3
+:106DA00000000000000000000000000000000000E3
+:106DB00000000000000000000000000000000000D3
+:106DC00000000000000000000000000000000001C2
+:106DD00002010000010101010000010001000100A9
+:106DE00000000000000000000000000000000000A3
+:106DF0000000000000000000000000000000000093
+:106E00000000000000000000000000000000000082
+:106E10000000000000000000000000000000000072
+:106E20000000000001000000000000000000000061
+:106E30000000000000000000000000000000000052
+:106E40000000000000000000000000000000000042
+:106E50000000000000000000000000000000000032
+:106E60000000000000000000000000000000000022
+:106E7000000000000100000000000000000001010F
+:106E80000000000000000000000000000000000002
+:106E900000000000000000000000000000000000F2
+:106EA00000000000000000000000000000000000E2
+:106EB00000000000000000000000000000000000D2
+:106EC00000000000000000000000000000000002C0
+:106ED00002020000010101010000010001000100A7
+:106EE00000000000000000000000000000000000A2
+:106EF0000000000000000000000000000000000092
+:106F00000000000000000000000000000000000081
+:106F10000000000000000000000000000000000071
+:106F20000000000001000000000000000000000060
+:106F30000000000000000000000000000000000051
+:106F40000000000000000000000000000000000041
+:106F50000000000000000000000000000000000031
+:106F60000000000000000000000000000000000021
+:106F7000000000000101000000000000010101020A
+:106F80000000000000000000000000000000000001
+:106F900000000000000000000000000000000000F1
+:106FA00000000000000000000000000000000000E1
+:106FB00000000000000000000000000000000000D1
+:106FC00000000000000000000000000000000002BF
+:106FD00002020000010101010100010001000100A5
+:106FE00000000000000000000000000000000000A1
+:106FF0000000000000000000000000000000000091
+:107000000000000000000000000000000000000080
+:107010000000000000000000000000000000000070
+:10702000010000000100000000000001000000005D
+:107030000000000000000000000000000000000050
+:107040000000000000000000000000000000000040
+:107050000000000000000000000000000000000030
+:107060000000000000000000000000000000000020
+:107070000000000001010000000000000101010209
+:107080000000000000000000000000000000000000
+:1070900000000000000000000000000000000000F0
+:1070A00000000000000000000000000000000000E0
+:1070B00000000000000000000000000000000000D0
+:1070C00000000000000000000000000000000002BE
+:1070D00002020100010101010101010101000100A1
+:1070E00000000000000000000000000000000000A0
+:1070F0000000000000000000000000000000000090
+:10710000000000000000000000000000000000007F
+:10711000000000000000000000000000000000006F
+:10712000010000000100000000000001000000005C
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000003F
+:10715000000000000000000000000000000000002F
+:10716000000000000000000000000000000000001F
+:107170000001010101010100000001000101010203
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000000EF
+:1071A00000000000000000000000000000000000DF
+:1071B00000000000000000000000000000000000CF
+:1071C00000000000000000000000000000000002BD
+:1071D000020202000101020201010101010001009D
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000008F
+:10720000000000000000000000000000000000007E
+:10721000000000000000000000000000000000016D
+:107220000101000001000100000001010000000058
+:10723000000000000000000000000000000000004E
+:10724000000000000000000000000000000000003E
+:10725000000000000000000000000000000000002E
+:10726000000000000000000000000000000000001E
+:107270000001010101010101010001000101010200
+:1072800000000000000000000000000000000000FE
+:1072900000000000000000000000000000000000EE
+:1072A00000000000000000000000000000000000DE
+:1072B00000000000000000000000000000000000CE
+:1072C00000000000000000000000000000000002BC
+:1072D0000202020102020202010101010100010099
+:1072E000000000000000000000000000000000009E
+:1072F000000000000000000000000000000000008E
+:10730000000000000000000000000000000000007D
+:10731000000000000000000000000000000000016C
+:107320000201000001000100000001010000010055
+:10733000000000000000000000000000000000004D
+:10734000000000000000000000000000000000003D
+:10735000000000000000000000000000000000002D
+:10736000000000000000000000000000000000001D
+:1073700001010101010101010101010101010102FC
+:1073800002000000000000000000000000000000FB
+:1073900000000000000000000000000000000000ED
+:1073A00000000000000000000000000000000000DD
+:1073B00000000000000000000000000000000000CD
+:1073C00000000000000000000000000000000002BB
+:1073D0000202020202020202010102010100010096
+:1073E000000000000000000000000000000000009D
+:1073F000000000000000000000000000000000008D
+:10740000000000000000000000000000000000007C
+:10741000000000000000000000000000000000016B
+:107420000201010001010100000101010100010050
+:10743000000000000000000000000000000000004C
+:10744000000000000000000000000000000000003C
+:10745000000000000000000000000000000000002C
+:10746000000000000000000000000000000000001C
+:1074700001010101010101010101010101010102FB
+:1074800002000000010000000000000000000000F9
+:1074900000000000000000000000000000000000EC
+:1074A00000000000000000000000000000000000DC
+:1074B00000000000000000000000000000000000CC
+:1074C00000000000000000000000000000000002BA
+:1074D0000202020202020202020102010100010094
+:1074E000000000000000000000000000000000009C
+:1074F000000000000000000000000000000000008C
+:10750000000000000000000000000000000000007B
+:107510000000000000000000000000000000000269
+:10752000020201000101010100010101010001004D
+:10753000000000000000000000000000000000004B
+:10754000000000000000000000000000000000003B
+:10755000000000000000000000000000000000002B
+:10756000000000000000000000000000000000001B
+:1075700001010101010101010101010101010102FA
+:1075800002020200010000000000000001000000F3
+:1075900000000000000000000000000000000000EB
+:1075A00000000000000000000000000000000000DB
+:1075B00000000000000000000000000000000000CB
+:1075C00000000000000000000000000000000002B9
+:1075D0000202020202020202020202020200010090
+:1075E000000000000000000000000000000000009B
+:1075F000000000000000000000000000000000008B
+:10760000000000000000000000000000000000007A
+:107610000000000000000000000000000000000268
+:10762000020201010101010100010101010001004B
+:10763000000000000000000000000000000000004A
+:10764000000000000000000000000000000000003A
+:10765000000000000000000000000000000000002A
+:10766000000000000000000000000000000000001A
+:1076700001010101010101010101010101010102F9
+:1076800002020200010000000000000001000000F2
+:1076900000000000000000000000000000000000EA
+:1076A00000000000000000000000000000000000DA
+:1076B00000000000000000000000000000000000CA
+:1076C00000000000000000000000000000000002B8
+:1076D000020202020202020202020202020002008E
+:1076E000000000000000000000000000000000009A
+:1076F000000000000000000000000000000000008A
+:107700000000000000000000000000000000000079
+:107710000000000000000000000000000000000267
+:107720000202020102010101010101010100010047
+:107730000000000000000000000000000000000049
+:107740000000000000000000000000000000000039
+:107750000000000000000000000000000000000029
+:107760000000000000000000000000000000000019
+:1077700001010101010101010101010101010102F8
+:1077800002020202020000000000000001010000ED
+:1077900000000000000000000000000000000000E9
+:1077A00000000000000000000000000000000000D9
+:1077B00000000000000000000000000000000000C9
+:1077C00000000000000000000000000000000002B7
+:1077D000020202020202020202020202020002008D
+:1077E0000000000000000000000000000000000099
+:1077F0000000000000000000000000000000000089
+:107800000000000000000000000000000000000078
+:107810000000000000000000000000000000000266
+:107820000202020102010101010101010101010045
+:107830000000000000000000000000000000000048
+:107840000000000000000000000000000000000038
+:107850000000000000000000000000000000000028
+:107860000000000000000000000000000000000018
+:1078700001010101010101010101010101010102F7
+:1078800002020202020000020000000001010000EA
+:1078900000000000000000000000000000000000E8
+:1078A00000000000000000000000000000000000D8
+:1078B00000000000000000000000000000000000C8
+:1078C00000000000000000000000000000000002B6
+:1078D000020202020202020202020202020102008B
+:1078E0000000000000000000000000000000000098
+:1078F0000000000000000000000000000000000088
+:107900000000000000000000000000000000000077
+:107910000000000000000000000000000000000265
+:107920000202020202010201010101020101010041
+:107930000000000000000000000000000000000047
+:107940000000000000000000000000000000000037
+:107950000000000000000000000000000000000027
+:107960000000000000000000000000000000000017
+:1079700002020101010101010101010101010102F4
+:1079800002020202020002020002000202010000E2
+:1079900000000000000000000000000000000000E7
+:1079A00000000000000000000000000000000000D7
+:1079B00000000000000000000000000000000000C7
+:1079C00000000000000000000000000000000002B5
+:1079D000020202020202020202020202020102008A
+:1079E0000000000000000000000000000000000097
+:1079F0000000000000000000000000000000000087
+:107A00000000000000000000000000000000000076
+:107A10000000000000000000000000000000000264
+:107A20000202020202010201010101020101010040
+:107A30000000000000000000000000000000000046
+:107A40000000000000000000000000000000000036
+:107A50000000000000000000000000000000000026
+:107A60000000000000000000000000000000000016
+:107A700002020201010101010101010101010102F2
+:107A800002020202020002020202000202020000DE
+:107A900000000000000000000000000000000000E6
+:107AA00000000000000000000000000000000000D6
+:107AB00000000000000000000000000000000000C6
+:107AC00000000000000000000000000000000002B4
+:107AD0000202020202020202020202020201020089
+:107AE0000000000000000000000000000000000096
+:107AF0000000000000000000000000000000000086
+:107B00000000000000000000000000000000000075
+:107B10000000000000000000000000000000000263
+:107B2000020202020202020201010202010101003C
+:107B30000000000000000000000000000000000045
+:107B40000000000000000000000000000000000035
+:107B50000000000000000000000000000000000025
+:107B60000000000000000000000000000000000015
+:107B700002020202010101010101010101010102F0
+:107B800002020202020202020202020202020000D9
+:107B900000000000000000000000000000000000E5
+:107BA00000000000000000000000000000000000D5
+:107BB00000000000000000000000000000000000C5
+:107BC00000000000000000000000000000000002B3
+:107BD0000202020202020202020202020202020087
+:107BE0000000000000000000000000000000000095
+:107BF0000000000000000000000000000000000085
+:107C00000000000000000000000000000000000074
+:107C10000000000000000000000000000000000262
+:107C2000020202020202020201020202010101003A
+:107C30000000000000000000000000000000000044
+:107C40000000000000000000000000000000000034
+:107C50000000000000000000000000000000000024
+:107C60000000000000000000000000000000000014
+:107C700002020202020101010101010101010102EE
+:107C800002020202020202020202020202020000D8
+:107C900000000000000000000000000000000000E4
+:107CA00000000000000000000000000000000000D4
+:107CB00000000000000000000000000000000000C4
+:107CC00000000000000000000000000000000002B2
+:107CD0000202020202020202020202020202020086
+:107CE0000000000000000000000000000000000094
+:107CF0000000000000000000000000000000000084
+:107D00000000000000000000000000000000000073
+:107D10000000000000000000000000000000000261
+:107D20000202020202020202020202020101010038
+:107D30000000000000000000000000000000000043
+:107D40000000000000000000000000000000000033
+:107D50000000000000000000000000000000000023
+:107D60000000000000000000000000000000000013
+:107D700002020202020201010101010101010102EC
+:107D800002020202020202020202020202020000D7
+:107D900000000000000000000000000000000000E3
+:107DA00000000000000000000000000000000000D3
+:107DB00000000000000000000000000000000000C3
+:107DC00000000000000000000000000000000002B1
+:107DD0000202020202020202020202020202020085
+:107DE0000000000000000000000000000000000093
+:107DF0000000000000000000000000000000000083
+:107E00000000000000000000000000000000000072
+:107E10000000000000000000000000000000000260
+:107E20000202020202020202020202020101010037
+:107E30000000000000000000000000000000000042
+:107E40000000000000000000000000000000000032
+:107E50000000000000000000000000000000000022
+:107E60000000000000000000000000000000000012
+:107E700002020202020202010101010101010102EA
+:107E800002020202020202020202020202020000D6
+:107E900000000000000000000000000000000000E2
+:107EA00000000000000000000000000000000000D2
+:107EB00000000000000000000000000000000000C2
+:107EC00000000000000000000000000000000002B0
+:107ED0000202020202020202020202020202020084
+:107EE0000000000000000000000000000000000092
+:107EF0000000000000000000000000000000000082
+:107F00000000000000000000000000000000000071
+:107F1000000000000000000000000000000000025F
+:107F20000202020202020202020202020201010035
+:107F30000000000000000000000000000000000041
+:107F40000000000000000000000000000000000031
+:107F50000000000000000000000000000000000021
+:107F6000000000000000000000000000000000020F
+:107F700002020202020202020101010101010102E8
+:107F800002020202020202020202020202020000D5
+:107F900000000000000000000000000000000000E1
+:107FA00000000000000000000000000000000000D1
+:107FB00000000000000000000000000000000000C1
+:107FC00000000000000000000000000000000002AF
+:107FD0000202020202020202020202020202020083
+:107FE0000000000000000000000000000000000091
+:107FF0000000000000000000000000000000000081
+:108000000000000000000000000000000000000070
+:10801000000000000000000000000000000000025E
+:108020000202020202020202020202020201020033
+:108030000000000000000000000000000000000040
+:108040000000000000000000000000000000000030
+:108050000000000000000000000000000000000020
+:10806000000000000000000000000000000000020E
+:1080700002020202020202020201010101010102E6
+:1080800002020202020202020202020101010100D6
+:1080900000000000000000000000000000000000E0
+:1080A00000000000000000000000000000000000D0
+:1080B00000000000000000000000000000000000C0
+:1080C00000000000000000000000000000000002AE
+:1080D0000202020202020202020202020202020082
+:1080E0000000000000000000000000000000000090
+:1080F0000000000000000000000000000000000080
+:10810000000000000000000000000000000000006F
+:10811000000000000000000000000000000000025D
+:108120000202020202020202020202020202020031
+:10813000000000000000000000000000000000003F
+:10814000000000000000000000000000000000002F
+:10815000000000000000000000000000000000001F
+:10816000000000000000000000000000000000020D
+:1081700002020202020202020202020101010102E3
+:1081800002020202020202020201010101010100D7
+:1081900000000000000000000000000000000000DF
+:1081A00000000000000000000000000000000000CF
+:1081B00000000000000000000000000000000000BF
+:1081C00000000000000000000000000000000002AD
+:1081D0000202020202020202020202020202020081
+:1081E000000000000000000000000000000000008F
+:1081F000000000000000000000000000000000007F
+:10820000000000000000000000000000000000006E
+:10821000000000000000000000000000000000025C
+:108220000202020202020202020202020202020030
+:10823000000000000000000000000000000000003E
+:10824000000000000000000000000000000000002E
+:10825000000000000000000000000000000000001E
+:10826000000000000000000000000000000000020C
+:1082700002020202020202020202020202020102DF
+:1082800002020202020202010101010101010100D8
+:1082900000000000000000000000000000000000DE
+:1082A00000000000000000000000000000000000CE
+:1082B00000000000000000000000000000000000BE
+:1082C00000000000000000000000000000000002AC
+:1082D0000202020202020202020202020202020080
+:1082E000000000000000000000000000000000008E
+:1082F000000000000000000000000000000000007E
+:10830000000000000000000000000000000000006D
+:10831000000000000000000000000000000000025B
+:10832000020202020202020202020202020202002F
+:10833000000000000000000000000000000000003D
+:10834000000000000000000000000000000000002D
+:10835000000000000000000000000000000000001D
+:10836000000000000000000000000000000000020B
+:1083700002020202020202020202020202020202DD
+:1083800002020202020201010101010101010100D8
+:1083900000000000000000000000000000000000DD
+:1083A00000000000000000000000000000000000CD
+:1083B00000000000000000000000000000000000BD
+:1083C00000000000000000000000000000000002AB
+:1083D000020202020202020202020202020202007F
+:1083E000000000000000000000000000000000008D
+:1083F000000000000000000000000000000000007D
+:10840000000000000000000000000000000000006C
+:10841000000000000000000000000000000000025A
+:10842000020202020202020202020202020202002E
+:10843000000000000000000000000000000000003C
+:10844000000000000000000000000000000000002C
+:10845000000000000000000000000000000000001C
+:10846000000000000000000000000000000000020A
+:1084700002020202020202020202020202020202DC
+:1084800002020202010101010101010101010100D9
+:1084900000000000000000000000000000000000DC
+:1084A00000000000000000000000000000000000CC
+:1084B00000000000000000000000000000000000BC
+:1084C00000000000000000000000000000000002AA
+:1084D000020202020202020202020202020202007E
+:1084E000000000000000000000000000000000008C
+:1084F000000000000000000000000000000000007C
+:10850000000000000000000000000000000000006B
+:108510000000000000000000000000000000000259
+:10852000020202020202020202020202020202002D
+:10853000000000000000000000000000000000003B
+:10854000000000000000000000000000000000002B
+:10855000000000000000000000000000000000001B
+:108560000000000000000000000000000000000209
+:1085700002020202020202020202020202020201DC
+:1085800002020101010101010101010101010100DA
+:1085900000000000000000000000000000000000DB
+:1085A00000000000000000000000000000000000CB
+:1085B00000000000000000000000000000000000BB
+:1085C00000000000000000000000000000000002A9
+:1085D0000202020202020202020201010101010082
+:1085E000000000000000000000000000000000008B
+:1085F000000000000000000000000000000000007B
+:10860000000000000000000000000000000000006A
+:108610000000000000000000000000000000000258
+:10862000020202020202020202020202020202002C
+:10863000000000000000000000000000000000003A
+:10864000000000000000000000000000000000002A
+:10865000000000000000000000000000000000001A
+:108660000000000000000000000000000000000208
+:1086700002020202020202020202020202020201DB
+:1086800001010101010101010101010101010100DB
+:1086900000000000000000000000000000000000DA
+:1086A00000000000000000000000000000000000CA
+:1086B00000000000000000000000000000000000BA
+:1086C00000000000000000000000000000000002A8
+:1086D0000202020202020101010101010101010085
+:1086E000000000000000000000000000000000008A
+:1086F000000000000000000000000000000000007A
+:108700000000000000000000000000000000000069
+:108710000000000000000000000000000000000257
+:10872000020202020202020202020202020202002B
+:108730000000000000000000000000000000000039
+:108740000000000000000000000000000000000029
+:108750000000000000000000000000000000000019
+:108760000000000000000000000000000000000207
+:1087700002020202020202020202020202020201DA
+:1087800001010101010101010101010101010100DA
+:1087900000000000000000000000000000000000D9
+:1087A00000000000000000000000000000000000C9
+:1087B00000000000000000000000000000000000B9
+:1087C00000000000000000000000000000000002A7
+:1087D0000202020202010101010101010101010085
+:1087E0000000000000000000000000000000000089
+:1087F0000000000000000000000000000000000079
+:108800000000000000000000000000000000000068
+:108810000000000000000000000000000000000256
+:10882000020202020202020202020202020202002A
+:108830000000000000000000000000000000000038
+:108840000000000000000000000000000000000028
+:108850000000000000000000000000000000000018
+:108860000000000000000000000000000000000206
+:1088700002020202020202020202020202020201D9
+:1088800001010101010101010101010101010100D9
+:1088900000000000000000000000000000000000D8
+:1088A00000000000000000000000000000000000C8
+:1088B00000000000000000000000000000000000B8
+:1088C00000000000000000000000000000000002A6
+:1088D0000101010101010101010101010101010089
+:1088E0000000000000000000000000000000000088
+:1088F0000000000000000000000000000000000078
+:108900000000000000000000000000000000000067
+:108910000000000000000000000000000000000255
+:108920000202020202020202020202020202020029
+:108930000000000000000000000000000000000037
+:108940000000000000000000000000000000000027
+:108950000000000000000000000000000000000017
+:108960000000000000000000000000000000000205
+:1089700002020202020202020202020202020201D8
+:1089800001010101010101010101010101010100D8
+:1089900000000000000000000000000000000000D7
+:1089A00000000000000000000000000000000000C7
+:1089B00000000000000000000000000000000000B7
+:1089C00000000000000000000000000000000001A6
+:1089D0000101010101010101010101010101010088
+:1089E0000000000000000000000000000000000087
+:1089F0000000000000000000000000000000000077
+:108A00000000000000000000000000000000000066
+:108A10000000000000000000000000000000000254
+:108A20000202020202020202020202020202020028
+:108A30000000000000000000000000000000000036
+:108A40000000000000000000000000000000000026
+:108A50000000000000000000000000000000000016
+:108A60000000000000000000000000000000000204
+:108A700002020202020202020202020202020201D7
+:108A800001010101010101010101010101010100D7
+:108A900000000000000000000000000000000000D6
+:108AA00000000000000000000000000000000000C6
+:108AB00000000000000000000000000000000000B6
+:108AC00000000000000000000000000000000001A5
+:108AD0000101010101010101010101010101010087
+:108AE0000000000000000000000000000000000086
+:108AF0000000000000000000000000000000000076
+:108B00000000000000000000000000000000000065
+:108B10000000000000000000000000000000000253
+:108B20000202020202020202020202010202020028
+:108B30000000000000000000000000000000000035
+:108B40000000000000000000000000000000000025
+:108B50000000000000000000000000000000000015
+:108B60000000000000000000000000000000000203
+:108B700002020202020202020202020202020201D6
+:108B800001010101010101010101010101010100D6
+:108B900000000000000000000000000000000000D5
+:108BA00000000000000000000000000000000000C5
+:108BB00000000000000000000000000000000000B5
+:108BC00000000000000000000000000000000001A4
+:108BD0000101010101010101010101010101010086
+:108BE0000000000000000000000000000000000085
+:108BF0000000000000000000000000000000000075
+:108C00000000000000000000000000000000000064
+:108C10000000000000000000000000000000000252
+:108C20000202020202020202020201010202020028
+:108C30000000000000000000000000000000000034
+:108C40000000000000000000000000000000000024
+:108C50000000000000000000000000000000000014
+:108C60000000000000000000000000000000000202
+:108C700002020202020202020202020202020201D5
+:108C800001010101010101010101010101010100D5
+:108C900000000000000000000000000000000000D4
+:108CA00000000000000000000000000000000000C4
+:108CB00000000000000000000000000000000000B4
+:108CC00000000000000000000000000000000001A3
+:108CD0000101010101010101010101010101010085
+:108CE0000000000000000000000000000000000084
+:108CF0000000000000000000000000000000000074
+:108D00000000000000000000000000000000000063
+:108D10000000000000000000000000000000000251
+:108D2000020202020202010101010101010101002E
+:108D30000000000000000000000000000000000033
+:108D40000000000000000000000000000000000023
+:108D50000000000000000000000000000000000013
+:108D60000000000000000000000000000000000201
+:108D700002020202020202020202020202020201D4
+:108D800001010101010101010101010101010100D4
+:108D900000000000000000000000000000000000D3
+:108DA00000000000000000000000000000000000C3
+:108DB00000000000000000000000000000000000B3
+:108DC00000000000000000000000000000000001A2
+:108DD0000101010101010101010101010101010084
+:108DE0000000000000000000000000000000000083
+:108DF0000000000000000000000000000000000073
+:108E00000000000000000000000000000000000062
+:108E10000000000000000000000000000000000250
+:108E20000101010101010101010101010101010033
+:108E30000000000000000000000000000000000032
+:108E40000000000000000000000000000000000022
+:108E50000000000000000000000000000000000012
+:108E60000000000000000000000000000000000200
+:108E700002020202020202020202020202020201D3
+:108E800001010101010101010101010101010100D3
+:108E900000000000000000000000000000000000D2
+:108EA00000000000000000000000000000000000C2
+:108EB00000000000000000000000000000000000B2
+:108EC00000000000000000000000000000000001A1
+:108ED0000101010101010101010101010101010083
+:108EE0000000000000000000000000000000000082
+:108EF0000000000000000000000000000000000072
+:108F00000000000000000000000000000000000061
+:108F10000000000000000000000000000000000150
+:108F20000101010101010101010101010101010032
+:108F30000000000000000000000000000000000031
+:108F40000000000000000000000000000000000021
+:108F50000000000000000000000000000000000011
+:108F600000000000000000000000000000000002FF
+:108F700002020202020202020202020202020201D2
+:108F800001010101010101010101010101010100D2
+:108F900000000000000000000000000000000000D1
+:108FA00000000000000000000000000000000000C1
+:108FB00000000000000000000000000000000000B1
+:108FC00000000000000000000000000000000001A0
+:108FD0000101010101010101010101010101010082
+:108FE0000000000000000000000000000000000081
+:108FF0000000000000000000000000000000000071
+:109000000000000000000000000000000000000060
+:10901000000000000000000000000000000000014F
+:109020000101010101010101010101010101010031
+:109030000000000000000000000000000000000030
+:109040000000000000000000000000000000000020
+:109050000000000000000000000000000000000010
+:1090600000000000000000000000000000000002FE
+:1090700002020202020202020202020202020201D1
+:1090800001010101010101010101010101010100D1
+:1090900000000000000000000000000000000000D0
+:1090A00000000000000000000000000000000000C0
+:1090B00000000000000000000000000000000000B0
+:1090C000000000000000000000000000000000019F
+:1090D0000101010101010101010101010101010081
+:1090E0000000000000000000000000000000000080
+:1090F0000000000000000000000000000000000070
+:10910000000000000000000000000000000000005F
+:10911000000000000000000000000000000000014E
+:109120000101010101010101010101010101010030
+:10913000000000000000000000000000000000002F
+:10914000000000000000000000000000000000001F
+:10915000000000000000000000000000000000000F
+:1091600000000000000000000000000000000002FD
+:1091700002020202020202020202020202020201D0
+:1091800001010101010101010101010101010100D0
+:1091900000000000000000000000000000000000CF
+:1091A00000000000000000000000000000000000BF
+:1091B00000000000000000000000000000000000AF
+:1091C000000000000000000000000000000000019E
+:1091D0000101010101010101010101010101010080
+:1091E000000000000000000000000000000000007F
+:1091F000000000000000000000000000000000006F
+:10920000000000000000000000000000000000005E
+:10921000000000000000000000000000000000014D
+:10922000010101010101010101010101010101002F
+:10923000000000000000000000000000000000002E
+:10924000000000000000000000000000000000001E
+:10925000000000000000000000000000000000000E
+:1092600000000000000000000000000000000002FC
+:1092700002020202020202020202020202020201CF
+:1092800001010101010101010101010101010100CF
+:1092900000000000000000000000000000000000CE
+:1092A00000000000000000000000000000000000BE
+:1092B00000000000000000000000000000000000AE
+:1092C000000000000000000000000000000000019D
+:1092D000010101010101010101010101010101007F
+:1092E000000000000000000000000000000000007E
+:1092F000000000000000000000000000000000006E
+:10930000000000000000000000000000000000005D
+:10931000000000000000000000000000000000014C
+:10932000010101010101010101010101010101002E
+:10933000000000000000000000000000000000002D
+:10934000000000000000000000000000000000001D
+:10935000000000000000000000000000000000000D
+:1093600000000000000000000000000000000002FB
+:1093700002020202020202020202020202020201CE
+:1093800001010101010101010101010101010100CE
+:1093900000000000000000000000000000000000CD
+:1093A00000000000000000000000000000000000BD
+:1093B00000000000000000000000000000000000AD
+:1093C000000000000000000000000000000000019C
+:1093D000010101010101010101010101010101007E
+:1093E000000000000000000000000000000000007D
+:1093F000000000000000000000000000000000006D
+:10940000000000000000000000000000000000005C
+:10941000000000000000000000000000000000014B
+:10942000010101010101010101010101010101002D
+:10943000000000000000000000000000000000002C
+:10944000000000000000000000000000000000001C
+:10945000000000000000000000000000000000000C
+:1094600000000000000000000000000000000002FA
+:1094700002020202020202020202020202020201CD
+:1094800001010101010101010101010101010100CD
+:1094900000000000000000000000000000000000CC
+:1094A00000000000000000000000000000000000BC
+:1094B00000000000000000000000000000000000AC
+:1094C000000000000000000000000000000000019B
+:1094D000010101010101010101010101010101007D
+:1094E000000000000000000000000000000000007C
+:1094F000000000000000000000000000000000006C
+:10950000000000000000000000000000000000005B
+:10951000000000000000000000000000000000014A
+:10952000010101010101010101010101010101002C
+:10953000000000000000000000000000000000002B
+:10954000000000000000000000000000000000001B
+:10955000000000000000000000000000000000000B
+:1095600000000000000000000000000000000002F9
+:1095700002020202020202020202020202020201CC
+:1095800001010101010101010101010101010100CC
+:1095900000000000000000000000000000000000CB
+:1095A00000000000000000000000000000000000BB
+:1095B00000000000000000000000000000000000AB
+:1095C000000000000000000000000000000000019A
+:1095D000010101010101010101010101010101007C
+:1095E000000000000000000000000000000000007B
+:1095F000000000000000000000000000000000006B
+:10960000000000000000000000000000000000005A
+:109610000000000000000000000000000000000149
+:10962000010101010101010101010101010101002B
+:10963000000000000000000000000000000000002A
+:10964000000000000000000000000000000000001A
+:10965000000000000000000000000000000000000A
+:1096600000000000000000000000000000000002F8
+:1096700002020202020202020202020202020201CB
+:1096800001010101010101010101010101010100CB
+:1096900000000000000000000000000000000000CA
+:1096A00000000000000000000000000000000000BA
+:1096B00000000000000000000000000000000000AA
+:1096C0000000000000000000000000000000000199
+:1096D000010101010101010101010101010101007B
+:1096E000000000000000000000000000000000007A
+:1096F000000000000000000000000000000000006A
+:109700000000000000000000000000000000000059
+:109710000000000000000000000000000000000148
+:10972000010101010101010101010101010101002A
+:109730000000000000000000000000000000000029
+:109740000000000000000000000000000000000019
+:109750000000000000000000000000000000000009
+:1097600000000000000000000000000000000002F7
+:1097700002020202020202020202020202020201CA
+:1097800001010101010101010101010101010100CA
+:1097900000000000000000000000000000000000C9
+:1097A00000000000000000000000000000000000B9
+:1097B00000000000000000000000000000000000A9
+:1097C0000000000000000000000000000000000198
+:1097D000010101010101010101010101010101007A
+:1097E0000000000000000000000000000000000079
+:1097F0000000000000000000000000000000000069
+:109800000000000000000000000000000000000058
+:109810000000000000000000000000000000000246
+:10982000020202020202020202020202020202001A
+:109830000000000000000000000000000000000028
+:109840000000000000000000000000000000000018
+:109850000000000000000000000000000000000008
+:1098600000000000000000000000000000000000F8
+:1098700002020202020202020202020202020201C9
+:1098800001010101010101010101010101010100C9
+:1098900000000000000000000000000000000000C8
+:1098A00000000000000000000000000000000000B8
+:1098B00000000000000000000000000000000000A8
+:1098C0000000000000000000000000000000000296
+:1098D000020202020202020202020202020202006A
+:1098E0000000000000000000000000000000000078
+:1098F0000000000000000000000000000000000068
+:109900000000000000000000000000000000000057
+:109910000000000000000000000000000000000245
+:109920000202020202020202020202020202020019
+:109930000000000000000000000000000000000027
+:109940000000000000000000000000000000000017
+:109950000000000000000000000000000000000007
+:1099600000000000000000000000000000000000F7
+:1099700001010101010101010101010101010100D8
+:1099800000000000000000000000000000000000D7
+:1099900000000000000000000000000000000000C7
+:1099A00000000000000000000000000000000000B7
+:1099B00000000000000000000000000000000000A7
+:1099C0000000000000000000000000000000000097
+:1099D0000000000000000000000000000000000087
+:1099E0000000000000000000000000000000000077
+:1099F0000000000000000000000000000000000067
+:109A00000000000000000000000000000000000056
+:109A10000000000000000000000000000000000046
+:109A20000000000000000000000000000000000036
+:109A30000000000000000000000000000000000026
+:109A40000000000000000000000000000000000016
+:109A50000000000000000000000000000000000006
+:109A600000000000000000000000000000000000F6
+:109A70000000000000000000000000000000002EB8
+:109A800000000000000000000000000000000000D6
+:109A900000000000000000000000000000000000C6
+:109AA00000000000000000000000000000000000B6
+:109AB00000000000000000000000000000000000A6
+:109AC0000000000000000000000000000000000096
+:109AD0000000000000000000000000000000000086
+:109AE0000000000000000000000000000000000076
+:109AF0000000000000000000000000000000000066
+:109B00000000000000000000000000000000000055
+:109B10000000000000000000000000000000000045
+:109B20000000000000000000000000010000000034
+:109B30000000000000000000000000000000000025
+:109B40000000000000000000000000000000000015
+:109B50000000000000000000000000000000000005
+:109B600000000000000000000000000000000000F5
+:109B700000000000000000000000000000000000E5
+:109B800000000000000000010000000000000000D4
+:109B900000000000000000000000000000000000C5
+:109BA00000000000000000000000000000000000B5
+:109BB00000000000000000000000000000000000A5
+:109BC0000000000000000000000000000000000095
+:109BD0000000000000000000000000000000000085
+:109BE0000100000000000000000000000000000074
+:109BF0000000000000000000000000000000000065
+:109C00000000000000000000000000000000000054
+:109C10000000000000000000000000000000000044
+:109C20000000000000000000000000010000000033
+:109C30000000000000010000000000000000000023
+:109C40000000000000000000000000000000000014
+:109C50000000000000000000000000000000000004
+:109C600000000000000000000000000000000000F4
+:109C700000000000000000000000000000000000E4
+:109C800000000000000000010000000000000000D3
+:109C900000000000000000000000000000000000C4
+:109CA00000000000000000000000000000000000B4
+:109CB00000000000000000000000000000000000A4
+:109CC0000000000000000000000000000000000094
+:109CD0000000000000000000000000000000000084
+:109CE0000101000000000000000000000000000072
+:109CF0000000000000000000000000000000000064
+:109D00000000000000000000000000000000000053
+:109D10000000000000000000000000000000000043
+:109D2000000000000000000000000001010100012F
+:109D30000000000001010000000000000000000021
+:109D40000000000000000000000000000000000013
+:109D50000000000000000000000000000000000003
+:109D600000000000000000000000000000000000F3
+:109D700000000000000000000000000000000000E3
+:109D800000000000000000010100000000000000D1
+:109D900000000000000000000000000000000000C3
+:109DA00000000000000000000000000000000000B3
+:109DB00000000000000000000000000000000000A3
+:109DC0000000000000000000000000000000000093
+:109DD0000000000000000001000000000000000082
+:109DE0000101000000000000000000000000000071
+:109DF0000000000000000000000000000000000063
+:109E00000000000000000000000000000000000052
+:109E10000000000000000000000000000000000042
+:109E2000000000000000000000000001010100012E
+:109E3000000000000101010000000000000000001F
+:109E40000000000000000000000000000000000012
+:109E50000000000000000000000000000000000002
+:109E600000000000000000000000000000000000F2
+:109E700000000000000000000000010100010001DE
+:109E800000000000010000010100000000000000CF
+:109E900001000000000000000000000000000000C1
+:109EA00000000000000000000000000000000000B2
+:109EB00000000000000000000000000000000000A2
+:109EC0000000000000000000000000000000000092
+:109ED0000000000000000001000000000000000081
+:109EE0000101000000000000000000000000000070
+:109EF0000000000000000000000000000000000062
+:109F00000000000000000000000000000000000051
+:109F10000000000000000000000000000000000041
+:109F2000000000000000000000000001010101012C
+:109F3000000000000101010000000000000000001E
+:109F40000000000000000000000000000000000011
+:109F50000000000000000000000000000000000001
+:109F600000000000000000000000000000000000F1
+:109F700000000000000000000000010100010001DD
+:109F800000000000010100020100000000000000CC
+:109F900001000000000000000000000000000000C0
+:109FA00000000000000000000000000000000000B1
+:109FB00000000000000000000000000000000000A1
+:109FC0000000000000000000000000000000000091
+:109FD000000000000000000100000001000000007F
+:109FE000010100000000000000000000000000006F
+:109FF0000000000000000000000000000000000061
+:10A000000000000000000000000000000000000050
+:10A010000000000000000000000000000000000040
+:10A02000000000000000000000000001010101012B
+:10A03000000000000101010000000000000000001D
+:10A040000000000000000000000000000000000010
+:10A050000000000000000000000000000000000000
+:10A0600000000000000000000000000000000000F0
+:10A0700000000000000000000000010101010101DA
+:10A0800001000000010100020100000000000000CA
+:10A0900001000000000000000000000000000000BF
+:10A0A00000000000000000000000000000000000B0
+:10A0B00000000000000000000000000000000000A0
+:10A0C0000000000000000000000000000000000090
+:10A0D000000000000000000201010101000000007A
+:10A0E000010100000000010000000000000000006D
+:10A0F0000000000000000000000000000000000060
+:10A10000000000000000000000000000000000004F
+:10A11000000000000000000000000000000000003F
+:10A12000000000000000000000000001010101012A
+:10A13000010001000101010000000000000000001A
+:10A14000000000000000000000000000000000000F
+:10A1500000000000000000000000000000000000FF
+:10A1600000000000000000000000000000000000EF
+:10A1700000000000000000000000010101010101D9
+:10A1800001010001010101020100000000000000C6
+:10A1900001000000000000000000000000000000BE
+:10A1A00000000000000000000000000000000000AF
+:10A1B000000000000000000000000000000000009F
+:10A1C000000000000000000000000000000000008F
+:10A1D0000000000000000002010101010100000078
+:10A1E000010100000000010000000000000000006C
+:10A1F000000000000000000000000000000000005F
+:10A20000000000000000000000000000000000004E
+:10A21000000000000000000000000000000000003E
+:10A220000000000000000001010000010101010127
+:10A230000100010001010100000000000000000019
+:10A24000000000000000000000000000000000000E
+:10A2500000000000000000000000000000000000FE
+:10A2600000000000000000000000000000000000EE
+:10A2700000000000000000000000010101010101D8
+:10A2800001010101010101020200010000000001C1
+:10A2900001000000000000000000000000000000BD
+:10A2A00000000000000000000000000000000000AE
+:10A2B000000000000000000000000000000000009E
+:10A2C000000000000000000000000000000000008E
+:10A2D0000000000000000002010101010100000077
+:10A2E000010100000000010000000000000000006B
+:10A2F000000000000000000000000000000000005E
+:10A30000000000000000000000000000000000004D
+:10A31000000000000000000000000000000000003D
+:10A320000000000000000001010100010101010125
+:10A330000100010001010100000000000000000018
+:10A34000000000000000000000000000000000000D
+:10A3500000000000000000000000000000000000FD
+:10A3600000000000000000000000000000000000ED
+:10A3700000000000000000000000010101010101D7
+:10A3800001010101010101020200010000000001C0
+:10A3900001000000000000000000000000000000BC
+:10A3A00000000000000000000000000000000000AD
+:10A3B000000000000000000000000000000000009D
+:10A3C000000000000000000000000000000000008D
+:10A3D0000000000000000002020102010101000073
+:10A3E0000202000000000100000000000000000068
+:10A3F000000000000000000000000000000000005D
+:10A40000000000000000000000000000000000004C
+:10A41000000000000000000000000000000000003C
+:10A420000000000000000001010100010101010124
+:10A430000100010001010100000000000000000017
+:10A44000000000000000000000000000000000000C
+:10A4500000000000000000000000000000000000FC
+:10A4600000000000000000000000000000000000EC
+:10A4700000000000000000000000010101010101D6
+:10A4800001010101010101020200010100000101BD
+:10A4900002000000000000000000000000000000BA
+:10A4A00000000000000000000000000000000000AC
+:10A4B000000000000000000000000000000000009C
+:10A4C000000000000000000000000000000000008C
+:10A4D0000000000000000002020202020101000070
+:10A4E0000202000000000100000000000000000067
+:10A4F000000000000000000000000000000000005C
+:10A50000000000000000000000000000000000004B
+:10A51000000000000000000000000000000000003B
+:10A520000000000000000001010101020101010121
+:10A530000100010001010100000000000000000016
+:10A54000000000000000000000000000000000000B
+:10A5500000000000000000000000000000000000FB
+:10A5600000000000000000000000000000000000EB
+:10A5700000000000000000000000010101010101D5
+:10A5800001010101010101020200010100000101BC
+:10A5900002000000000000000000000000000000B9
+:10A5A00000000000000000000000000000000000AB
+:10A5B000000000000000000000000000000000009B
+:10A5C000000000000000000000000000000000008B
+:10A5D000000000000000000202020202020101006D
+:10A5E0000202000000000100000000000000000066
+:10A5F000000000000000000000000000000000005B
+:10A60000000000000000000000000000000000004A
+:10A61000000000000000000000000000000000003A
+:10A62000000000000000000201010102010101011F
+:10A630000100010001010100000000000000000015
+:10A64000000000000000000000000000000000000A
+:10A6500000000000000000000000000000000000FA
+:10A6600000000000000000000000000000000000EA
+:10A6700000000000000000000000010101010101D4
+:10A6800001010101010101020200020100010101B9
+:10A6900002000000000000000000000000000000B8
+:10A6A00000000000000000000000000000000000AA
+:10A6B000000000000000000000000000000000009A
+:10A6C000000000000000000000000000000000008A
+:10A6D000000000000000000202020202020101016B
+:10A6E0000202000000000100000000000000000065
+:10A6F000000000000000000000000000000000005A
+:10A700000000000000000000000000000000000049
+:10A710000000000000000000000000000000000039
+:10A72000000000000000000202010102020101011C
+:10A730000100010001010100000000000000000014
+:10A740000000000000000000000000000000000009
+:10A7500000000000000000000000000000000000F9
+:10A7600000000000000000000000000000000000E9
+:10A7700000000000000000000000010101010101D3
+:10A7800001010101010101020200020100010102B7
+:10A7900002010001000000000000000000000000B5
+:10A7A00000000000000000000000000000000000A9
+:10A7B0000000000000000000000000000000000099
+:10A7C0000000000000000000000000000000000089
+:10A7D0000000000000000002020202020202010169
+:10A7E0000202010000000100000000000000000063
+:10A7F0000000000000000000000000000000000059
+:10A800000000000000000000000000000000000048
+:10A810000000000000000000000000000000000038
+:10A82000000000000000000202010102020201011A
+:10A830000101010101010100000000000000000011
+:10A840000000000000000000000000000000000008
+:10A8500000000000000000000000000000000000F8
+:10A8600000000000000000000000000000000000E8
+:10A8700000000000000000000000010101010101D2
+:10A8800001010101010101020201020201010202B2
+:10A8900002010001000000000000000000000000B4
+:10A8A00000000000000000000000000000000000A8
+:10A8B0000000000000000000000000000000000098
+:10A8C0000000000000000000000000000000000088
+:10A8D0000000000000000002020202020202020167
+:10A8E0000202010000000100000000000000000062
+:10A8F0000000000000000000000000000000000058
+:10A900000000000000000000000000000000000047
+:10A910000000000000000000000000000000000037
+:10A920000000000000000002020201020202020216
+:10A930000101010101010100000000000000000010
+:10A940000000000000000000000000000000000007
+:10A9500000000000000000000000000000000000F7
+:10A9600000000000000000000000000000000000E7
+:10A9700000000000000000000000000101010101D2
+:10A9800001010101010101020201020201010202B1
+:10A9900002020001000000000000000000000000B2
+:10A9A00000000000000000000000000000000000A7
+:10A9B0000000000000000000000000000000000097
+:10A9C0000000000000000000000000000000000087
+:10A9D0000000000000000002020202020202020265
+:10A9E000020202000100020000000000000000005E
+:10A9F0000000000000000000000000000000000057
+:10AA00000000000000000000000000000000000046
+:10AA10000000000000000000000000000000000036
+:10AA20000000000000000002020202020202020214
+:10AA3000010101010101010000000000000000000F
+:10AA40000000000000000000000000000000000006
+:10AA500000000000000000000000000000000000F6
+:10AA600000000000000000000000000000000000E6
+:10AA700000000000000000000000020001010101D0
+:10AA800001010101010101020201020202020202AE
+:10AA900002020102000000000000000000000000AF
+:10AAA00000000000000000000000000000000000A6
+:10AAB0000000000000000000000000000000000096
+:10AAC0000000000000000000000000000000000086
+:10AAD0000000000000000002020202020202020264
+:10AAE000020202000100020000000000000000005D
+:10AAF0000000000000000000000000000000000056
+:10AB00000000000000000000000000000000000045
+:10AB10000000000000000000000000000000000035
+:10AB20000000000000000002020202020202020213
+:10AB3000020101010101010000000000000000000D
+:10AB40000000000000000000000000000000000005
+:10AB500000000000000000000000000000000000F5
+:10AB600000000000000000000000000000000000E5
+:10AB700000000000000000000000020201010101CD
+:10AB800001010101010101020202020202020202AC
+:10AB900002020102000000000000000000000000AE
+:10ABA00000000000000000000000000000000000A5
+:10ABB0000000000000000000000000000000000095
+:10ABC0000000000000000000000000000000000085
+:10ABD0000000000000000002020202020202020263
+:10ABE000020202000100020000000000000000005C
+:10ABF0000000000000000000000000000000000055
+:10AC00000000000000000000000000000000000044
+:10AC10000000000000000000000000000000000034
+:10AC20000000000000000002020202020202020212
+:10AC30000201020102020100000000000000000009
+:10AC40000000000000000000000000000000000004
+:10AC500000000000000000000000000000000000F4
+:10AC600000000000000000000000000000000000E4
+:10AC700000000000000000000000020200000101CE
+:10AC800001010101010101020202020202020202AB
+:10AC900002020202000000000000000000000000AC
+:10ACA00000000000000000000000000000000000A4
+:10ACB0000000000000000000000000000000000094
+:10ACC0000000000000000000000000000000000084
+:10ACD0000000000000000002020202020202020262
+:10ACE000020202010100020000000000000000005A
+:10ACF0000000000000000000000000000000000054
+:10AD00000000000000000000000000000000000043
+:10AD10000000000000000000000000000000000033
+:10AD20000000000000000002020202020202020211
+:10AD30000201020102020100000000000000000008
+:10AD40000000000000000000000000000000000003
+:10AD500000000000000000000000000000000000F3
+:10AD600000000000000000000000000000000000E3
+:10AD700000000000000000000000020202020000CB
+:10AD800001010101010101020202020202020202AA
+:10AD900002020202000100000000000000000000AA
+:10ADA00000000000000000000000000000000000A3
+:10ADB0000000000000000000000000000000000093
+:10ADC0000000000000000000000000000000000083
+:10ADD0000000000000000002020202020202020261
+:10ADE0000202020202000200000000000000000057
+:10ADF0000000000000000000000000000000000053
+:10AE00000000000000000000000000000000000042
+:10AE10000000000000000000000000000000000032
+:10AE20000000000000000002020202020202020210
+:10AE30000201020102020200000000000000000006
+:10AE40000000000000000000000000000000000002
+:10AE500000000000000000000000000000000000F2
+:10AE600000000000000000000000000000000000E2
+:10AE700000000000000000000000020202020202C6
+:10AE800000010101010101020202020202020202AA
+:10AE900002020202000100000000000000000000A9
+:10AEA00000000000000000000000000000000000A2
+:10AEB0000000000000000000000000000000000092
+:10AEC0000000000000000000000000000000000082
+:10AED0000000000000000002020202020202020260
+:10AEE0000202020202000200000000000000000056
+:10AEF0000000000000000000000000000000000052
+:10AF00000000000000000000000000000000000041
+:10AF10000000000000000000000000000000000031
+:10AF2000000000000000000202020202020202020F
+:10AF30000202020102020200000000000000000004
+:10AF40000000000000000000000000000000000001
+:10AF500000000000000000000000000000000000F1
+:10AF600000000000000000000000000000000000E1
+:10AF700000000000000000000001020202020202C4
+:10AF800002000101010101020202020202020202A8
+:10AF900002020202000100000000000000000000A8
+:10AFA00000000000000000000000000000000000A1
+:10AFB0000000000000000000000000000000000091
+:10AFC0000000000000000000000000000000000081
+:10AFD000000000000000000202020202020202025F
+:10AFE0000202020202000200000000000000000055
+:10AFF0000000000000000000000000000000000051
+:10B000000000000000000000000000000000000040
+:10B010000000000000000000000000000000000030
+:10B02000000000000000000202020202020202020E
+:10B030000202020202020200000000000000000002
+:10B040000000000000000000000000000000000000
+:10B0500000000000000000000000000000000000F0
+:10B0600000000000000000000000000000000000E0
+:10B0700000000000000000000101020202020202C2
+:10B0800002020000000101020202020202020202A8
+:10B0900002020202010100000000000000000000A6
+:10B0A00000000000000000000000000000000000A0
+:10B0B0000000000000000000000000000000000090
+:10B0C0000000000000000000000000000000000080
+:10B0D000000000000000000202020202020202025E
+:10B0E0000202020202010200000000000000000053
+:10B0F0000000000000000000000000000000000050
+:10B10000000000000000000000000000000000003F
+:10B11000000000000000000000000000000000002F
+:10B12000000000000000000202020202020202020D
+:10B130000202020202020200000000000000000001
+:10B1400000000000000000000000000000000000FF
+:10B1500000000000000000000000000000000000EF
+:10B1600000000000000000000000000000000000DF
+:10B1700000000000000000020001020202020202C0
+:10B1800002020202020001020202020202020202A2
+:10B1900002020202010201000000000000000000A3
+:10B1A000000000000000000000000000000000009F
+:10B1B000000000000000000000000000000000008F
+:10B1C000000000000000000000000000000000007F
+:10B1D000000000000000000202020202020202025D
+:10B1E0000202020202020200000000000000000051
+:10B1F000000000000000000000000000000000004F
+:10B20000000000000000000000000000000000003E
+:10B21000000000000000000000000000000000002E
+:10B22000000000000000000202020202020202020C
+:10B230000202020202020200000000000000000000
+:10B2400000000000000000000000000000000000FE
+:10B2500000000000000000000000000000000000EE
+:10B2600000000000000000000000000000000000DE
+:10B2700000000000000000020200020202020202BE
+:10B28000020202020202010202020202020202029F
+:10B2900001010201010201000000000000000000A5
+:10B2A000000000000000000000000000000000009E
+:10B2B000000000000000000000000000000000008E
+:10B2C000000000000000000000000000000000007E
+:10B2D000000000000000000202020202020202025C
+:10B2E0000202020202020200000000000000000050
+:10B2F000000000000000000000000000000000004E
+:10B30000000000000000000000000000000000003D
+:10B31000000000000000000000000000000000002D
+:10B32000000000000000000202020202020202020B
+:10B3300002020202020202000000000000000000FF
+:10B3400000000000000000000000000000000000FD
+:10B3500000000000000000000000000000000000ED
+:10B3600000000000000000000000000000000000DD
+:10B3700000000000000000020202020202020202BB
+:10B3800002020202020200020202020202020201A0
+:10B3900001010101010201000000000000000000A5
+:10B3A000000000000000000000000000000000009D
+:10B3B000000000000000000000000000000000008D
+:10B3C000000000000000000000000000000000007D
+:10B3D000000000000000000202020202020202025B
+:10B3E0000200000202020200000000000000000053
+:10B3F000000000000000000000000000000000004D
+:10B40000000000000000000000000000000000003C
+:10B41000000000000000000000000000000000002C
+:10B42000000000000000000202020202020202020A
+:10B4300002020202020202000000000000000000FE
+:10B4400000000000000000000000000000000000FC
+:10B4500000000000000000000000000000000000EC
+:10B4600000000000000000000000000000000000DC
+:10B4700000000000000000020202020202020202BA
+:10B48000020202020202020202020202020201019E
+:10B4900001010101020101000000000000000000A4
+:10B4A000000000000000000000000000000000009C
+:10B4B000000000000000000000000000000000008C
+:10B4C000000000000000000000000000000000007C
+:10B4D000000000000000000202020202020202005C
+:10B4E0000200000202020100000000000000000053
+:10B4F000000000000000000000000000000000004C
+:10B50000000000000000000000000000000000003B
+:10B51000000000000000000000000000000000002B
+:10B520000000000000000002020202020202020209
+:10B5300002020202020202000000000000000000FD
+:10B5400000000000000000000000000000000000FB
+:10B5500000000000000000000000000000000000EB
+:10B5600000000000000000000000000000000000DB
+:10B5700000000000000000020202020202020202B9
+:10B5800002020202020202010202020201010101A0
+:10B5900001010101020101000000000000000000A3
+:10B5A000000000000000000000000000000000009B
+:10B5B000000000000000000000000000000000008B
+:10B5C000000000000000000000000000000000007B
+:10B5D0000000000000000002020200020000000063
+:10B5E0000101010101010100000000000000000054
+:10B5F000000000000000000000000000000000004B
+:10B60000000000000000000000000000000000003A
+:10B61000000000000000000000000000000000002A
+:10B620000000000000000002020202020202020208
+:10B6300002020202020202000000000000000000FC
+:10B6400000000000000000000000000000000000FA
+:10B6500000000000000000000000000000000000EA
+:10B6600000000000000000000000000000000000DA
+:10B6700000000000000000020202020202020202B8
+:10B6800002020202020202010102010101010101A2
+:10B6900001010101010101000000000000000000A3
+:10B6A000000000000000000000000000000000009A
+:10B6B000000000000000000000000000000000008A
+:10B6C000000000000000000000000000000000007A
+:10B6D0000000000000000002020200020000000062
+:10B6E0000101010101010100000000000000000053
+:10B6F000000000000000000000000000000000004A
+:10B700000000000000000000000000000000000039
+:10B710000000000000000000000000000000000029
+:10B720000000000000000002020202020202020207
+:10B7300002020202020202000000000000000000FB
+:10B7400000000000000000000000000000000000F9
+:10B7500000000000000000000000000000000000E9
+:10B7600000000000000000000000000000000000D9
+:10B7700000000000000000020202020202020202B7
+:10B7800002020202020202010102010101010101A1
+:10B7900001010101010101000000000000000000A2
+:10B7A0000000000000000000000000000000000099
+:10B7B0000000000000000000000000000000000089
+:10B7C0000000000000000000000000000000000079
+:10B7D0000000000000000000020000010101010162
+:10B7E0000101010101010100000000000000000052
+:10B7F0000000000000000000000000000000000049
+:10B800000000000000000000000000000000000038
+:10B810000000000000000000000000000000000028
+:10B820000000000000000002020202020202020206
+:10B8300002020202020202000000000000000000FA
+:10B8400000000000000000000000000000000000F8
+:10B8500000000000000000000000000000000000E8
+:10B8600000000000000000000000000000000000D8
+:10B8700000000000000000020202020202020202B6
+:10B8800002020202020202010101010101010101A1
+:10B8900001010101010101000000000000000000A1
+:10B8A0000000000000000000000000000000000098
+:10B8B0000000000000000000000000000000000088
+:10B8C0000000000000000000000000000000000078
+:10B8D000000000000000000101010101010101015F
+:10B8E0000101010101010100000000000000000051
+:10B8F0000000000000000000000000000000000048
+:10B900000000000000000000000000000000000037
+:10B910000000000000000000000000000000000027
+:10B920000000000000000002020202020202020205
+:10B9300002020202020202000000000000000000F9
+:10B9400000000000000000000000000000000000F7
+:10B9500000000000000000000000000000000000E7
+:10B9600000000000000000000000000000000000D7
+:10B9700000000000000000020202020202020202B5
+:10B9800002020202020202010101010101010101A0
+:10B9900001010101010101000000000000000000A0
+:10B9A0000000000000000000000000000000000097
+:10B9B0000000000000000000000000000000000087
+:10B9C0000000000000000000000000000000000077
+:10B9D000000000000000000101010101010101015E
+:10B9E0000101010101010100000000000000000050
+:10B9F0000000000000000000000000000000000047
+:10BA00000000000000000000000000000000000036
+:10BA10000000000000000000000000000000000026
+:10BA20000000000000000002020202020202020204
+:10BA300002020202020202000000000000000000F8
+:10BA400000000000000000000000000000000000F6
+:10BA500000000000000000000000000000000000E6
+:10BA600000000000000000000000000000000000D6
+:10BA700000000000000000020202020202020202B4
+:10BA8000020202020202020101010101010101019F
+:10BA9000010101010101010000000000000000009F
+:10BAA0000000000000000000000000000000000096
+:10BAB0000000000000000000000000000000000086
+:10BAC0000000000000000000000000000000000076
+:10BAD000000000000000000101010101010101015D
+:10BAE000010101010101010000000000000000004F
+:10BAF0000000000000000000000000000000000046
+:10BB00000000000000000000000000000000000035
+:10BB10000000000000000000000000000000000025
+:10BB20000000000000000002020202020202020203
+:10BB300002020202020202000000000000000000F7
+:10BB400000000000000000000000000000000000F5
+:10BB500000000000000000000000000000000000E5
+:10BB600000000000000000000000000000000000D5
+:10BB700000000000000000020202020202020202B3
+:10BB8000020202020202020101010101010101019E
+:10BB9000010101010101010000000000000000009E
+:10BBA0000000000000000000000000000000000095
+:10BBB0000000000000000000000000000000000085
+:10BBC0000000000000000000000000000000000075
+:10BBD000000000000000000101010101010101015C
+:10BBE000010101010101010000000000000000004E
+:10BBF0000000000000000000000000000000000045
+:10BC00000000000000000000000000000000000034
+:10BC10000000000000000000000000000000000024
+:10BC20000000000000000002020202020202020202
+:10BC300002020202020202000000000000000000F6
+:10BC400000000000000000000000000000000000F4
+:10BC500000000000000000000000000000000000E4
+:10BC600000000000000000000000000000000000D4
+:10BC700000000000000000020202020202020202B2
+:10BC8000020202020202020101010101010101019D
+:10BC9000010101010101010000000000000000009D
+:10BCA0000000000000000000000000000000000094
+:10BCB0000000000000000000000000000000000084
+:10BCC0000000000000000000000000000000000074
+:10BCD000000000000000000101010101010101015B
+:10BCE000010101010101010000000000000000004D
+:10BCF0000000000000000000000000000000000044
+:10BD00000000000000000000000000000000000033
+:10BD10000000000000000000000000000000000023
+:10BD20000000000000000002020202010101010106
+:10BD300001010101010101000000000000000000FC
+:10BD400000000000000000000000000000000000F3
+:10BD500000000000000000000000000000000000E3
+:10BD600000000000000000000000000000000000D3
+:10BD700000000000000000020202020202020202B1
+:10BD8000020202020202020101010101010101019C
+:10BD9000010101010101010000000000000000009C
+:10BDA0000000000000000000000000000000000093
+:10BDB0000000000000000000000000000000000083
+:10BDC0000000000000000000000000000000000073
+:10BDD000000000000000000101010101010101015A
+:10BDE000010101010101010000000000000000004C
+:10BDF0000000000000000000000000000000000043
+:10BE00000000000000000000000000000000000032
+:10BE10000000000000000000000000000000000022
+:10BE20000000000000000001010101010101010109
+:10BE300001010101010101000000000000000000FB
+:10BE400000000000000000000000000000000000F2
+:10BE500000000000000000000000000000000000E2
+:10BE600000000000000000000000000000000000D2
+:10BE700000000000000000020202020202020202B0
+:10BE8000020202020202020101010101010101019B
+:10BE9000010101010101010000000000000000009B
+:10BEA0000000000000000000000000000000000092
+:10BEB0000000000000000000000000000000000082
+:10BEC0000000000000000000000000000000000072
+:10BED0000000000000000001010101010101010159
+:10BEE000010101010101010000000000000000004B
+:10BEF0000000000000000000000000000000000042
+:10BF00000000000000000000000000000000000031
+:10BF10000000000000000000000000000000000021
+:10BF20000000000000000001010101010101010108
+:10BF300001010101010101000000000000000000FA
+:10BF400000000000000000000000000000000000F1
+:10BF500000000000000000000000000000000000E1
+:10BF600000000000000000000000000000000000D1
+:10BF700000000000000000020202020202020202AF
+:10BF8000020202020202020101010101010101019A
+:10BF9000010101010101010000000000000000009A
+:10BFA0000000000000000000000000000000000091
+:10BFB0000000000000000000000000000000000081
+:10BFC0000000000000000000000000000000000071
+:10BFD0000000000000000001010101010101010158
+:10BFE000010101010101010000000000000000004A
+:10BFF0000000000000000000000000000000000041
+:10C000000000000000000000000000000000000030
+:10C010000000000000000000000000000000000020
+:10C020000000000000000001010101010101010107
+:10C0300001010101010101000000000000000000F9
+:10C0400000000000000000000000000000000000F0
+:10C0500000000000000000000000000000000000E0
+:10C0600000000000000000000000000000000000D0
+:10C0700000000000000000020202020202020202AE
+:10C080000202020202020201010101010101010199
+:10C090000101010101010100000000000000000099
+:10C0A0000000000000000000000000000000000090
+:10C0B0000000000000000000000000000000000080
+:10C0C0000000000000000000000000000000000070
+:10C0D0000000000000000001010101010101010157
+:10C0E0000101010101010100000000000000000049
+:10C0F0000000000000000000000000000000000040
+:10C10000000000000000000000000000000000002F
+:10C11000000000000000000000000000000000001F
+:10C120000000000000000001010101010101010106
+:10C1300001010101010101000000000000000000F8
+:10C1400000000000000000000000000000000000EF
+:10C1500000000000000000000000000000000000DF
+:10C1600000000000000000000000000000000000CF
+:10C1700000000000000000020202020202020202AD
+:10C180000202020202020201010101010101010198
+:10C190000101010101010100000000000000000098
+:10C1A000000000000000000000000000000000008F
+:10C1B000000000000000000000000000000000007F
+:10C1C000000000000000000000000000000000006F
+:10C1D0000000000000000001010101010101010156
+:10C1E0000101010101010100000000000000000048
+:10C1F000000000000000000000000000000000003F
+:10C20000000000000000000000000000000000002E
+:10C21000000000000000000000000000000000001E
+:10C220000000000000000001010101010101010105
+:10C2300001010101010101000000000000000000F7
+:10C2400000000000000000000000000000000000EE
+:10C2500000000000000000000000000000000000DE
+:10C2600000000000000000000000000000000000CE
+:10C2700000000000000000020202020202020202AC
+:10C280000202020202020201010101010101010197
+:10C290000101010101010100000000000000000097
+:10C2A000000000000000000000000000000000008E
+:10C2B000000000000000000000000000000000007E
+:10C2C000000000000000000000000000000000006E
+:10C2D0000000000000000001010101010101010155
+:10C2E0000101010101010100000000000000000047
+:10C2F000000000000000000000000000000000003E
+:10C30000000000000000000000000000000000002D
+:10C31000000000000000000000000000000000001D
+:10C320000000000000000001010101010101010104
+:10C3300001010101010101000000000000000000F6
+:10C3400000000000000000000000000000000000ED
+:10C3500000000000000000000000000000000000DD
+:10C3600000000000000000000000000000000000CD
+:10C3700000000000000000020202020202020202AB
+:10C380000202020202020201010101010101010196
+:10C390000101010101010100000000000000000096
+:10C3A000000000000000000000000000000000008D
+:10C3B000000000000000000000000000000000007D
+:10C3C000000000000000000000000000000000006D
+:10C3D0000000000000000001010101010101010154
+:10C3E0000101010101010100000000000000000046
+:10C3F000000000000000000000000000000000003D
+:10C40000000000000000000000000000000000002C
+:10C41000000000000000000000000000000000001C
+:10C420000000000000000001010101010101010103
+:10C4300001010101010101000000000000000000F5
+:10C4400000000000000000000000000000000000EC
+:10C4500000000000000000000000000000000000DC
+:10C4600000000000000000000000000000000000CC
+:10C4700000000000000000020202020202020202AA
+:10C480000202020202020201010101010101010195
+:10C490000101010101010100000000000000000095
+:10C4A000000000000000000000000000000000008C
+:10C4B000000000000000000000000000000000007C
+:10C4C000000000000000000000000000000000006C
+:10C4D0000000000000000001010101010101010153
+:10C4E0000101010101010100000000000000000045
+:10C4F000000000000000000000000000000000003C
+:10C50000000000000000000000000000000000002B
+:10C51000000000000000000000000000000000001B
+:10C520000000000000000001010101010101010102
+:10C5300001010101010101000000000000000000F4
+:10C5400000000000000000000000000000000000EB
+:10C5500000000000000000000000000000000000DB
+:10C5600000000000000000000000000000000000CB
+:10C5700000000000000000020202020202020202A9
+:10C580000202020202020201010101010101010194
+:10C590000101010101010100000000000000000094
+:10C5A000000000000000000000000000000000008B
+:10C5B000000000000000000000000000000000007B
+:10C5C000000000000000000000000000000000006B
+:10C5D0000000000000000002020202020202020249
+:10C5E000020202020202020000000000000000003D
+:10C5F000000000000000000000000000000000003B
+:10C60000000000000000000000000000000000002A
+:10C61000000000000000000000000000000000001A
+:10C6200000000000000000020202020202020202F8
+:10C6300002020202020202000000000000000000EC
+:10C6400000000000000000000000000000000000EA
+:10C6500000000000000000000000000000000000DA
+:10C6600000000000000000000000000000000000CA
+:10C6700000000000000000020202020202020202A8
+:10C680000202020202020201010101010101010193
+:10C690000101010101010100000000000000000093
+:10C6A000000000000000000000000000000000008A
+:10C6B000000000000000000000000000000000007A
+:10C6C000000000000000000000000000000000006A
+:10C6D0000000000000000002020202020202020248
+:10C6E000020202020202020000000000000000003C
+:10C6F000000000000000000000000000000000003A
+:10C700000000000000000000000000000000000029
+:10C710000000000000000000000000000000000019
+:10C7200000000000000000020202020202020202F7
+:10C7300002020202020202000000000000000000EB
+:10C7400000000000000000000000000000000000E9
+:10C7500000000000000000000000000000000000D9
+:10C7600000000000000000000000000000000000C9
+:10C7700000000000000000000000010101010101B3
+:10C7800001010101010101000000000000000000A2
+:10C790000000000000000000000000000000000099
+:10C7A0000000000000000000000000000000000089
+:10C7B0000000000000000000000000000000000079
+:10C7C0000000000000000000000000000000000069
+:10C7D0000000000000000000000000000000000059
+:10C7E0000000000000000000000000000000000049
+:10C7F0000000000000000000000000000000000039
+:10C800000000000000000000000000000000000028
+:10C810000000000000000000000000000000000018
+:10C820000000000000000000000000000000000008
+:10C8300000000000000000000000000000000000F8
+:10C8400000000000000000000000000000000000E8
+:10C8500000000000000000000000000000000000D8
+:10C8600000000000000000000000000000000000C8
+:10C8700000000000000000000000000000000000B8
+:10C88000000000000000002C00000000000000007C
+:10C890000000000000000000000000000000000098
+:10C8A0000000000000000000000000000000000088
+:10C8B0000000000000000000000000000000000078
+:10C8C0000000000000000000000000000000000068
+:10C8D0000000000000000000000000000000000058
+:10C8E0000000000000000000000000000000000048
+:10C8F0000000000000000000000000000000000038
+:10C900000000000000000000000000000000000027
+:10C910000000000000000000000000000000000017
+:10C920000000000000000000000000000000000007
+:10C9300000000000000000000000000000000100F6
+:10C9400000000000000000000000000000000000E7
+:10C9500000000000000000000000000000000000D7
+:10C9600000000000000000000000000000000000C7
+:10C9700000000000000000000000000000000000B7
+:10C9800000000000000000000000000000000000A7
+:10C990000000000000000000000000000000000097
+:10C9A0000000000000000000000000000000000087
+:10C9B0000000000000000000000000000000000077
+:10C9C0000000000000000000000000000000000067
+:10C9D0000000000000000000000000000000000057
+:10C9E0000000000000000000000000010000000046
+:10C9F0000000000000000000000000000000000037
+:10CA00000000000000000000000000000000000026
+:10CA10000000000000000000000000000000000016
+:10CA20000000000000000000000000000000000006
+:10CA300000000000010100000000000000000100F3
+:10CA400000000000000000000000000000000000E6
+:10CA500000000000000000000000000000000000D6
+:10CA600000000000000000000000000000000000C6
+:10CA700000000000000000000000000000000000B6
+:10CA800000000000000000000000000000000000A6
+:10CA90000000000000000000000000000000000096
+:10CAA0000000000000000000000000000000000086
+:10CAB0000000000000000000000000000000000076
+:10CAC0000000000000000000000000000000000066
+:10CAD0000000000000000000000000000000000056
+:10CAE0000000000000000000000000010000000045
+:10CAF0000000000000000000000000000000000036
+:10CB00000000000000000000000000000000000025
+:10CB10000000000000000000000000000000000015
+:10CB20000000000000000000000000000000000005
+:10CB300000000000010101000000000000000100F1
+:10CB400000000000000000000000000000000000E5
+:10CB500000000000000000000000000000000000D5
+:10CB600000000000000000000000000000000000C5
+:10CB700000000000000000000000000000000000B5
+:10CB800000000000000000000000000000000000A5
+:10CB90000000000000000000000000000000000095
+:10CBA0000000000000000000000000000000000085
+:10CBB0000000000000000000000000000000000075
+:10CBC0000000000000000000000000000000000065
+:10CBD0000000000000000000000000000000000055
+:10CBE0000100000001000000000000010000000042
+:10CBF0000000000000000000000000000000000035
+:10CC00000000000000000000000000000000000024
+:10CC10000000000000000000000000000000000014
+:10CC20000000000000000000000000000000000004
+:10CC300000000000010101000000000000000100F0
+:10CC400000000000000000000000000000000000E4
+:10CC500000000000000000000000000000000000D4
+:10CC600000000000000000000000000000000000C4
+:10CC700000000000000000000000000000000000B4
+:10CC800000000000000000000000000000000000A4
+:10CC90000001010000010000000000000000000091
+:10CCA0000000000000000000000000000000000084
+:10CCB0000000000000000000000000000000000074
+:10CCC0000000000000000000000000000000000064
+:10CCD0000000000000000000000000000000000153
+:10CCE0000100000001000000000000010000000041
+:10CCF0000000000000000000000000000000000034
+:10CD00000000000000000000000000000000000023
+:10CD10000000000000000000000000000000000013
+:10CD20000000000000000000000000000000000003
+:10CD300000000000010101000000000000000100EF
+:10CD400000000000000000000000000000000000E3
+:10CD500000000000000000000000000000000000D3
+:10CD600000000000000000000000000000000000C3
+:10CD700000000000000000000000000000000000B3
+:10CD800000000000000000000000000000000001A2
+:10CD90000001010000010000000000000000000090
+:10CDA0000000000000000000000000000000000083
+:10CDB0000000000000000000000000000000000073
+:10CDC0000000000000000000000000000000000063
+:10CDD0000000000000000000000000000000000152
+:10CDE000010000000101000000000001000000003F
+:10CDF0000000000000000000000000000000000033
+:10CE00000000000000000000000000000000000022
+:10CE10000000000000000000000000000000000012
+:10CE20000000000000000000000000000000000002
+:10CE300000000000010101000000000000000100EE
+:10CE400000000000000000000000000000000000E2
+:10CE500000000000000000000000000000000000D2
+:10CE600000000000000000000000000000000000C2
+:10CE700000000000000000000000000000000000B2
+:10CE800000000000000000000000000000000001A1
+:10CE9000000101000101000000000000000000008E
+:10CEA0000000000000000000000000000000000082
+:10CEB0000000000000000000000000000000000072
+:10CEC0000000000000000000000000000000000062
+:10CED0000000000000000000000000000000000151
+:10CEE000010000000101000000000001010001003C
+:10CEF0000000000000000000000000000000000032
+:10CF00000000000000000000000000000000000021
+:10CF10000000000000000000000000000000000011
+:10CF20000000000000000000000000000000000100
+:10CF300000000000010101000000000000010100EC
+:10CF400000000000000000000000000000000000E1
+:10CF500000000000000000000000000000000000D1
+:10CF600000000000000000000000000000000000C1
+:10CF700000000000000000000000000000000000B1
+:10CF800000000000000000000000000000000001A0
+:10CF9000000101000101000000000000010000008C
+:10CFA0000000000000000000000000000000000081
+:10CFB0000000000000000000000000000000000071
+:10CFC0000000000000000000000000000000000061
+:10CFD0000000000000000000000000000000000150
+:10CFE000010100000101000000000001010001003A
+:10CFF0000000000000000000000000000000000031
+:10D000000000000000000000000000000000000020
+:10D010000000000000000000000000000000000010
+:10D0200000000000000000000000000000000001FF
+:10D0300001000000010101010101000000010100E7
+:10D0400000000000000000000000000000000000E0
+:10D0500000000000000000000000000000000000D0
+:10D0600000000000000000000000000000000000C0
+:10D0700000000000000000000000000000000000B0
+:10D08000000000000000000000000000000000029E
+:10D090000001010101010000010100000100000088
+:10D0A0000000000000000000000000000000000080
+:10D0B0000000000000000000000000000000000070
+:10D0C0000000000000000000000000000000000060
+:10D0D000000000000000000000000000000000024E
+:10D0E0000101000001010000000001010101010037
+:10D0F0000000000000000000000000000000000030
+:10D10000000000000000000000000000000000001F
+:10D11000000000000000000000000000000000000F
+:10D1200000000000000000000000000000000001FE
+:10D1300001000000010101010101000000010100E6
+:10D1400000000000000000000000000000000000DF
+:10D1500000000000000000000000000000000000CF
+:10D1600000000000000000000000000000000000BF
+:10D1700000000000000000000000000000000000AF
+:10D18000000000000000000000000000000000029D
+:10D190000002020101010000010100000100000085
+:10D1A000000000000000000000000000000000007F
+:10D1B000000000000000000000000000000000006F
+:10D1C000000000000000000000000000000000005F
+:10D1D000000000000000000000000000000000024D
+:10D1E0000101010001010000000001010101010035
+:10D1F000000000000000000000000000000000002F
+:10D20000000000000000000000000000000000001E
+:10D21000000000000000000000000000000000000E
+:10D2200000000000000000000000000000000001FD
+:10D2300001000000010101010101000000010100E5
+:10D2400000000000000000000000000000000000DE
+:10D2500000000000000000000000000000000000CE
+:10D2600000000000000000000000000000000000BE
+:10D2700000000000000000000000000000000000AE
+:10D28000000000000100000000000000000000029B
+:10D290000102020101020000010100010100000081
+:10D2A000000000000000000000000000000000007E
+:10D2B000000000000000000000000000000000006E
+:10D2C000000000000000000000000000000000005E
+:10D2D000000000000000000000000000000000024C
+:10D2E0000201010001010100000001010101010032
+:10D2F000000000000000000000000000000000002E
+:10D30000000000000000000000000000000000001D
+:10D31000000000000000000000000000000000000D
+:10D3200000000000000000000000000000000002FB
+:10D3300001000000010101010101000001010100E3
+:10D3400000000000000000000000000000000000DD
+:10D3500000000000000000000000000000000000CD
+:10D3600000000000000000000000000000000000BD
+:10D3700000000000000000000000000000000000AD
+:10D38000000000000100000000000000000000029A
+:10D39000010202010202000001010001010000007F
+:10D3A000000000000000000000000000000000007D
+:10D3B000000000000000000000000000000000006D
+:10D3C000000000000000000000000000000000005D
+:10D3D000000000000000000000000000000000024B
+:10D3E000020101010101010000010101010101002F
+:10D3F000000000000000000000000000000000002D
+:10D40000000000000000000000000000000000001C
+:10D41000000000000000000000000000000000000C
+:10D4200000000000000000000000000000000002FA
+:10D4300001010000010101010101000001010100E1
+:10D4400000000000000000000000000000000000DC
+:10D4500000000000000000000000000000000000CC
+:10D4600000000000000000000000000000000000BC
+:10D4700000000000000000000000000000000000AC
+:10D480000000000001000000000000010000000298
+:10D49000010202020202000101020001020000007A
+:10D4A000000000000000000000000000000000007C
+:10D4B000000000000000000000000000000000006C
+:10D4C000000000000000000000000000000000005C
+:10D4D000000000000000000000000000000000024A
+:10D4E000020201010201010000010101010101002C
+:10D4F000000000000000000000000000000000002C
+:10D50000000000000000000000000000000000001B
+:10D51000000000000000000000000000000000000B
+:10D5200000000000000000000000000000000002F9
+:10D5300001010000020201010101010001010100DD
+:10D5400000000000000000000000000000000000DB
+:10D5500000000000000000000000000000000000CB
+:10D5600000000000000000000000000000000000BB
+:10D5700000000000000000000000000000000000AB
+:10D580000100010001000000000000010000010294
+:10D590000102020202020101020200020201000075
+:10D5A000000000000000000000000000000000007B
+:10D5B000000000000000000000000000000000006B
+:10D5C000000000000000000000000000000000005B
+:10D5D0000000000000000000000000000000000249
+:10D5E0000202020102020100000101020101010028
+:10D5F000000000000000000000000000000000002B
+:10D60000000000000000000000000000000000001A
+:10D61000000000000000000000000000000000000A
+:10D6200000000000000000000000000000000002F8
+:10D6300002010100020202010101010101010100D8
+:10D6400000000000000000000000000000000000DA
+:10D6500000000000000000000000000000000000CA
+:10D6600000000000000000000000000000000000BA
+:10D6700000000000000000000000000000000000AA
+:10D680000100000101000000000000010000010293
+:10D690000202020202020101020200020201000073
+:10D6A000000000000000000000000000000000007A
+:10D6B000000000000000000000000000000000006A
+:10D6C000000000000000000000000000000000005A
+:10D6D0000000000000000000000000000000000248
+:10D6E0000202020102020100000101020101010027
+:10D6F000000000000000000000000000000000002A
+:10D700000000000000000000000000000000000019
+:10D710000000000000000000000000000000000009
+:10D7200000000000000000000000000000000002F7
+:10D7300002010100020202010101010101010100D7
+:10D7400000000000000000000000000000000000D9
+:10D7500000000000000000000000000000000000C9
+:10D7600000000000000000000000000000000000B9
+:10D7700000000000000000000000000000000000A9
+:10D780000100000000000000000000010000010294
+:10D790000202020202020102020201020201000070
+:10D7A0000000000000000000000000000000000079
+:10D7B0000000000000000000000000000000000069
+:10D7C0000000000000000000000000000000000059
+:10D7D0000000000000000000000000000000000247
+:10D7E0000202020202020101000101020101010024
+:10D7F0000000000000000000000000000000000029
+:10D800000000000000000000000000000000000018
+:10D810000000000000000000000000000000000008
+:10D8200000000000000000000000000000000002F6
+:10D8300002020101020202010101010101010100D4
+:10D8400000000000000000000000000000000000D8
+:10D8500000000000000000000000000000000000C8
+:10D8600000000000000000000000000000000000B8
+:10D8700000000000000000000000000000000000A8
+:10D880000001000000000000010000010000010292
+:10D89000020202020202020202020202020200006C
+:10D8A0000000000000000000000000000000000078
+:10D8B0000000000000000000000000000000000068
+:10D8C0000000000000000000000000000000000058
+:10D8D0000000000000000000000000000000000246
+:10D8E0000202020202020201000102020201010020
+:10D8F0000000000000000000000000000000000028
+:10D900000000000000000000000000000000000017
+:10D910000000000000000000000000000000000007
+:10D9200000000000000000000000000000000002F5
+:10D9300002020201020202020101010101010100D1
+:10D9400000000000000000000000000000000000D7
+:10D9500000000000000000000000000000000000C7
+:10D9600000000000000000000000000000000000B7
+:10D9700000000000000000000000000000000000A7
+:10D980000000000000010100010000010000010290
+:10D99000020202020202020202020202020200006B
+:10D9A0000000000000000000000000000000000077
+:10D9B0000000000000000000000000000000000067
+:10D9C0000000000000000000000000000000000057
+:10D9D0000000000000000000000000000000000245
+:10D9E000020202020202020101020202020101001D
+:10D9F0000000000000000000000000000000000027
+:10DA00000000000000000000000000000000000016
+:10DA10000000000000000000000000000000000006
+:10DA200000000000000000000000000000000002F4
+:10DA300002020201020202020202010101010200CD
+:10DA400000000000000000000000000000000000D6
+:10DA500000000000000000000000000000000000C6
+:10DA600000000000000000000000000000000000B6
+:10DA700000000000000000000000000000000000A6
+:10DA8000000000000001010001000000010001028F
+:10DA9000020202020202020202020202020200006A
+:10DAA0000000000000000000000000000000000076
+:10DAB0000000000000000000000000000000000066
+:10DAC0000000000000000000000000000000000056
+:10DAD0000000000000000000000000000000000244
+:10DAE000020202020202020101020202020201001B
+:10DAF0000000000000000000000000000000000026
+:10DB00000000000000000000000000000000000015
+:10DB10000000000000000000000000000000000005
+:10DB200000000000000000000000000000000002F3
+:10DB300002020202020202020202010101010200CB
+:10DB400000000000000000000000000000000000D5
+:10DB500000000000000000000000000000000000C5
+:10DB600000000000000000000000000000000000B5
+:10DB700000000000000000000000000000000000A5
+:10DB8000000000000001010001000000010001028E
+:10DB90000202020202020202020202020202000069
+:10DBA0000000000000000000000000000000000075
+:10DBB0000000000000000000000000000000000065
+:10DBC0000000000000000000000000000000000055
+:10DBD0000000000000000000000000000000000243
+:10DBE0000202020202020202010202020202020018
+:10DBF0000000000000000000000000000000000025
+:10DC00000000000000000000000000000000000014
+:10DC10000000000000000000000000000000000004
+:10DC200000000000000000000000000000000002F2
+:10DC300002020202020202020202010101020200C9
+:10DC400000000000000000000000000000000000D4
+:10DC500000000000000000000000000000000000C4
+:10DC600000000000000000000000000000000000B4
+:10DC700000000000000000000000000000000000A4
+:10DC8000000000000000000001000000010001028F
+:10DC90000202020202020202020202020202000068
+:10DCA0000000000000000000000000000000000074
+:10DCB0000000000000000000000000000000000064
+:10DCC0000000000000000000000000000000000054
+:10DCD0000000000000000000000000000000000242
+:10DCE0000202020202020202010202020202020017
+:10DCF0000000000000000000000000000000000024
+:10DD00000000000000000000000000000000000013
+:10DD10000000000000000000000000000000000003
+:10DD200000000000000000000000000000000002F1
+:10DD300002020202020202020202020102020200C6
+:10DD400000000000000000000000000000000000D3
+:10DD500000000000000000000000000000000000C3
+:10DD600000000000000000000000000000000000B3
+:10DD700000000000000000000000000000000000A3
+:10DD8000000000000000000000000000010101028E
+:10DD90000202020202020202020202010101010069
+:10DDA0000000000000000000000000000000000073
+:10DDB0000000000000000000000000000000000063
+:10DDC0000000000000000000000000000000000053
+:10DDD0000000000000000000000000000000000241
+:10DDE0000202020202020202020202020202020015
+:10DDF0000000000000000000000000000000000023
+:10DE00000000000000000000000000000000000012
+:10DE10000000000000000000000000000000000002
+:10DE200000000000000000000000000000000002F0
+:10DE300002020202020202020202020202020200C4
+:10DE400000000000000000000000000000000000D2
+:10DE500000000000000000000000000000000000C2
+:10DE600000000000000000000000000000000000B2
+:10DE700000000000000000000000000000000002A0
+:10DE8000000000000000000000010000010101028C
+:10DE9000020202020202020202010101010101006A
+:10DEA0000000000000000000000000000000000072
+:10DEB0000000000000000000000000000000000062
+:10DEC0000000000000000000000000000000000052
+:10DED0000000000000000000000000000000000240
+:10DEE0000202020202020202020202020202020014
+:10DEF0000000000000000000000000000000000022
+:10DF00000000000000000000000000000000000011
+:10DF10000000000000000000000000000000000001
+:10DF200000000000000000000000000000000002EF
+:10DF300002020202020202020202020202020200C3
+:10DF400000000000000000000000000000000000D1
+:10DF500000000000000000000000000000000000C1
+:10DF600000000000000000000000000000000000B1
+:10DF7000000000000000000000000000000000029F
+:10DF8000000000000000000000010100000101028B
+:10DF9000020202020202020201010101010101006A
+:10DFA0000000000000000000000000000000000071
+:10DFB0000000000000000000000000000000000061
+:10DFC0000000000000000000000000000000000051
+:10DFD000000000000000000000000000000000023F
+:10DFE0000202020202020202020202020202020013
+:10DFF0000000000000000000000000000000000021
+:10E000000000000000000000000000000000000010
+:10E010000000000000000000000000000000000000
+:10E0200000000000000000000000000000000002EE
+:10E0300002020202020202020202020202020200C2
+:10E0400000000000000000000000000000000000D0
+:10E0500000000000000000000000000000000000C0
+:10E0600000000000000000000000000000000000B0
+:10E07000000000000000000000000000000000029E
+:10E080000200000000000001000101000001010287
+:10E09000020202020101020101010101010101006C
+:10E0A0000000000000000000000000000000000070
+:10E0B0000000000000000000000000000000000060
+:10E0C0000000000000000000000000000000000050
+:10E0D000000000000000000000000000000000023E
+:10E0E0000202020202020202020202020202020012
+:10E0F0000000000000000000000000000000000020
+:10E10000000000000000000000000000000000000F
+:10E1100000000000000000000000000000000000FF
+:10E1200000000000000000000000000000000002ED
+:10E1300002020202020202020202020202020200C1
+:10E1400000000000000000000000000000000000CF
+:10E1500000000000000000000000000000000000BF
+:10E1600000000000000000000000000000000000AF
+:10E17000000000000000000000000000000000029D
+:10E180000200000000000001000101000001000287
+:10E19000020202020101010101010101010101006C
+:10E1A000000000000000000000000000000000006F
+:10E1B000000000000000000000000000000000005F
+:10E1C000000000000000000000000000000000004F
+:10E1D000000000000000000000000000000000023D
+:10E1E0000202020202020202020202020202020011
+:10E1F000000000000000000000000000000000001F
+:10E20000000000000000000000000000000000000E
+:10E2100000000000000000000000000000000000FE
+:10E2200000000000000000000000000000000002EC
+:10E2300002020202020202020202020202020200C0
+:10E2400000000000000000000000000000000000CE
+:10E2500000000000000000000000000000000000BE
+:10E2600000000000000000000000000000000000AE
+:10E27000000000000000000000000000000000029C
+:10E280000202020000000000000001000001000284
+:10E29000020101010101010101010101010101006E
+:10E2A000000000000000000000000000000000006E
+:10E2B000000000000000000000000000000000005E
+:10E2C000000000000000000000000000000000004E
+:10E2D000000000000000000000000000000000023C
+:10E2E0000202020202020202020202020202020010
+:10E2F000000000000000000000000000000000001E
+:10E30000000000000000000000000000000000000D
+:10E3100000000000000000000000000000000000FD
+:10E3200000000000000000000000000000000002EB
+:10E3300002020202020202020202020202020200BF
+:10E3400000000000000000000000000000000000CD
+:10E3500000000000000000000000000000000000BD
+:10E3600000000000000000000000000000000000AD
+:10E37000000000000000000000000000000000029B
+:10E380000202020000000000000000000001000185
+:10E39000020101010101010101010101010101006D
+:10E3A000000000000000000000000000000000006D
+:10E3B000000000000000000000000000000000005D
+:10E3C000000000000000000000000000000000004D
+:10E3D000000000000000000000000000000000023B
+:10E3E000020202020202020202020202020202000F
+:10E3F000000000000000000000000000000000001D
+:10E40000000000000000000000000000000000000C
+:10E4100000000000000000000000000000000000FC
+:10E4200000000000000000000000000000000002EA
+:10E4300002020202020202020202020202020200BE
+:10E4400000000000000000000000000000000000CC
+:10E4500000000000000000000000000000000000BC
+:10E4600000000000000000000000000000000000AC
+:10E47000000000000000000000000000000000029A
+:10E480000202020202000000000000000000000181
+:10E49000010101010101010101010101010101006D
+:10E4A000000000000000000000000000000000006C
+:10E4B000000000000000000000000000000000005C
+:10E4C000000000000000000000000000000000004C
+:10E4D000000000000000000000000000000000023A
+:10E4E000020202020202020202020202020202000E
+:10E4F000000000000000000000000000000000001C
+:10E50000000000000000000000000000000000000B
+:10E5100000000000000000000000000000000000FB
+:10E5200000000000000000000000000000000002E9
+:10E5300002020202020202020202020202020200BD
+:10E5400000000000000000000000000000000000CB
+:10E5500000000000000000000000000000000000BB
+:10E5600000000000000000000000000000000000AB
+:10E570000000000000000000000000000000000299
+:10E580000202020202000000000000000000000180
+:10E59000010101010101010101010101010101006C
+:10E5A000000000000000000000000000000000006B
+:10E5B000000000000000000000000000000000005B
+:10E5C000000000000000000000000000000000004B
+:10E5D0000000000000000000000000000000000239
+:10E5E000020202020202020202020202020202000D
+:10E5F000000000000000000000000000000000001B
+:10E60000000000000000000000000000000000000A
+:10E6100000000000000000000000000000000000FA
+:10E6200000000000000000000000000000000002E8
+:10E6300002020202020202020202020202020200BC
+:10E6400000000000000000000000000000000000CA
+:10E6500000000000000000000000000000000000BA
+:10E6600000000000000000000000000000000000AA
+:10E670000000000000000000000000000000000298
+:10E68000020202020202000000000000000000017D
+:10E69000010101010101010101010101010101006B
+:10E6A000000000000000000000000000000000006A
+:10E6B000000000000000000000000000000000005A
+:10E6C000000000000000000000000000000000004A
+:10E6D0000000000000000000000000000000000238
+:10E6E0000202020202020202020101010101020011
+:10E6F000000000000000000000000000000000001A
+:10E700000000000000000000000000000000000009
+:10E7100000000000000000000000000000000000F9
+:10E7200000000000000000000000000000000002E7
+:10E7300002020202020202020202020202020200BB
+:10E7400000000000000000000000000000000000C9
+:10E7500000000000000000000000000000000000B9
+:10E7600000000000000000000000000000000000A9
+:10E770000000000000000000000000000000000297
+:10E78000020202020202020000000000000000017A
+:10E79000010101010101010101010101010101006A
+:10E7A0000000000000000000000000000000000069
+:10E7B0000000000000000000000000000000000059
+:10E7C0000000000000000000000000000000000049
+:10E7D0000000000000000000000000000000000237
+:10E7E0000202020201010101010101010101010016
+:10E7F0000000000000000000000000000000000019
+:10E800000000000000000000000000000000000008
+:10E8100000000000000000000000000000000000F8
+:10E8200000000000000000000000000000000002E6
+:10E8300002020202020202020202020202020200BA
+:10E8400000000000000000000000000000000000C8
+:10E8500000000000000000000000000000000000B8
+:10E8600000000000000000000000000000000000A8
+:10E870000000000000000000000000000000000296
+:10E880000202020202020200020000000000020175
+:10E890000101010101010101010101010101010069
+:10E8A0000000000000000000000000000000000068
+:10E8B0000000000000000000000000000000000058
+:10E8C0000000000000000000000000000000000048
+:10E8D0000000000000000000000000000000000137
+:10E8E0000101010101010101010101010101010019
+:10E8F0000000000000000000000000000000000018
+:10E900000000000000000000000000000000000007
+:10E9100000000000000000000000000000000000F7
+:10E9200000000000000000000000000000000002E5
+:10E9300002020202020202020202020202020200B9
+:10E9400000000000000000000000000000000000C7
+:10E9500000000000000000000000000000000000B7
+:10E9600000000000000000000000000000000000A7
+:10E970000000000000000000000000000000000295
+:10E98000020202020202020202020002000002016E
+:10E990000101010101010101010101010101010068
+:10E9A0000000000000000000000000000000000067
+:10E9B0000000000000000000000000000000000057
+:10E9C0000000000000000000000000000000000047
+:10E9D0000000000000000000000000000000000136
+:10E9E0000101010101010101010101010101010018
+:10E9F0000000000000000000000000000000000017
+:10EA00000000000000000000000000000000000006
+:10EA100000000000000000000000000000000000F6
+:10EA200000000000000000000000000000000002E4
+:10EA300002020202010101010101010101010100C3
+:10EA400000000000000000000000000000000000C6
+:10EA500000000000000000000000000000000000B6
+:10EA600000000000000000000000000000000000A6
+:10EA70000000000000000000000000000000000294
+:10EA8000020202020202020202020202000002016B
+:10EA90000101010101010101010101010101010067
+:10EAA0000000000000000000000000000000000066
+:10EAB0000000000000000000000000000000000056
+:10EAC0000000000000000000000000000000000046
+:10EAD0000000000000000000000000000000000135
+:10EAE0000101010101010101010101010101010017
+:10EAF0000000000000000000000000000000000016
+:10EB00000000000000000000000000000000000005
+:10EB100000000000000000000000000000000000F5
+:10EB200000000000000000000000000000000001E4
+:10EB300001010101010101010101010101010100C6
+:10EB400000000000000000000000000000000000C5
+:10EB500000000000000000000000000000000000B5
+:10EB600000000000000000000000000000000000A5
+:10EB70000000000000000000000000000000000293
+:10EB80000202020202020202020202020202020166
+:10EB90000101010101010101010101010101010066
+:10EBA0000000000000000000000000000000000065
+:10EBB0000000000000000000000000000000000055
+:10EBC0000000000000000000000000000000000045
+:10EBD0000000000000000000000000000000000134
+:10EBE0000101010101010101010101010101010016
+:10EBF0000000000000000000000000000000000015
+:10EC00000000000000000000000000000000000004
+:10EC100000000000000000000000000000000000F4
+:10EC200000000000000000000000000000000001E3
+:10EC300001010101010101010101010101010100C5
+:10EC400000000000000000000000000000000000C4
+:10EC500000000000000000000000000000000000B4
+:10EC600000000000000000000000000000000000A4
+:10EC70000000000000000000000000000000000292
+:10EC80000202020202020202020202020202020165
+:10EC90000101010101010101010101010101010065
+:10ECA0000000000000000000000000000000000064
+:10ECB0000000000000000000000000000000000054
+:10ECC0000000000000000000000000000000000044
+:10ECD0000000000000000000000000000000000133
+:10ECE0000101010101010101010101010101010015
+:10ECF0000000000000000000000000000000000014
+:10ED00000000000000000000000000000000000003
+:10ED100000000000000000000000000000000000F3
+:10ED200000000000000000000000000000000001E2
+:10ED300001010101010101010101010101010100C4
+:10ED400000000000000000000000000000000000C3
+:10ED500000000000000000000000000000000000B3
+:10ED600000000000000000000000000000000000A3
+:10ED70000000000000000000000000000000000291
+:10ED80000202020202020202020202020202020164
+:10ED90000101010101010101010101010101010064
+:10EDA0000000000000000000000000000000000063
+:10EDB0000000000000000000000000000000000053
+:10EDC0000000000000000000000000000000000043
+:10EDD0000000000000000000000000000000000132
+:10EDE0000101010101010101010101010101010014
+:10EDF0000000000000000000000000000000000013
+:10EE00000000000000000000000000000000000002
+:10EE100000000000000000000000000000000000F2
+:10EE200000000000000000000000000000000001E1
+:10EE300001010101010101010101010101010100C3
+:10EE400000000000000000000000000000000000C2
+:10EE500000000000000000000000000000000000B2
+:10EE600000000000000000000000000000000000A2
+:10EE70000000000000000000000000000000000290
+:10EE80000202020202020202020202020202020163
+:10EE90000101010101010101010101010101010063
+:10EEA0000000000000000000000000000000000062
+:10EEB0000000000000000000000000000000000052
+:10EEC0000000000000000000000000000000000042
+:10EED0000000000000000000000000000000000131
+:10EEE0000101010101010101010101010101010013
+:10EEF0000000000000000000000000000000000012
+:10EF00000000000000000000000000000000000001
+:10EF100000000000000000000000000000000000F1
+:10EF200000000000000000000000000000000001E0
+:10EF300001010101010101010101010101010100C2
+:10EF400000000000000000000000000000000000C1
+:10EF500000000000000000000000000000000000B1
+:10EF600000000000000000000000000000000000A1
+:10EF7000000000000000000000000000000000028F
+:10EF80000202020202020202020202020202020162
+:10EF90000101010101010101010101010101010062
+:10EFA0000000000000000000000000000000000061
+:10EFB0000000000000000000000000000000000051
+:10EFC0000000000000000000000000000000000041
+:10EFD0000000000000000000000000000000000130
+:10EFE0000101010101010101010101010101010012
+:10EFF0000000000000000000000000000000000011
+:10F000000000000000000000000000000000000000
+:10F0100000000000000000000000000000000000F0
+:10F0200000000000000000000000000000000001DF
+:10F0300001010101010101010101010101010100C1
+:10F0400000000000000000000000000000000000C0
+:10F0500000000000000000000000000000000000B0
+:10F0600000000000000000000000000000000000A0
+:10F07000000000000000000000000000000000028E
+:10F080000202020202020202020202020202020161
+:10F090000101010101010101010101010101010061
+:10F0A0000000000000000000000000000000000060
+:10F0B0000000000000000000000000000000000050
+:10F0C0000000000000000000000000000000000040
+:10F0D000000000000000000000000000000000012F
+:10F0E0000101010101010101010101010101010011
+:10F0F0000000000000000000000000000000000010
+:10F1000000000000000000000000000000000000FF
+:10F1100000000000000000000000000000000000EF
+:10F1200000000000000000000000000000000001DE
+:10F1300001010101010101010101010101010100C0
+:10F1400000000000000000000000000000000000BF
+:10F1500000000000000000000000000000000000AF
+:10F16000000000000000000000000000000000009F
+:10F17000000000000000000000000000000000028D
+:10F180000202020202020202020202020202020160
+:10F190000101010101010101010101010101010060
+:10F1A000000000000000000000000000000000005F
+:10F1B000000000000000000000000000000000004F
+:10F1C000000000000000000000000000000000003F
+:10F1D000000000000000000000000000000000012E
+:10F1E0000101010101010101010101010101010010
+:10F1F000000000000000000000000000000000000F
+:10F2000000000000000000000000000000000000FE
+:10F2100000000000000000000000000000000000EE
+:10F2200000000000000000000000000000000002DC
+:10F2300002020202020202020202020202020200B0
+:10F2400000000000000000000000000000000000BE
+:10F2500000000000000000000000000000000000AE
+:10F26000000000000000000000000000000000009E
+:10F27000000000000000000000000000000000028C
+:10F28000020202020202020202020202020202015F
+:10F29000010101010101010101010101010101005F
+:10F2A000000000000000000000000000000000005E
+:10F2B000000000000000000000000000000000004E
+:10F2C000000000000000000000000000000000003E
+:10F2D000000000000000000000000000000000022C
+:10F2E0000202020202020202020202020202020000
+:10F2F000000000000000000000000000000000000E
+:10F3000000000000000000000000000000000000FD
+:10F3100000000000000000000000000000000000ED
+:10F3200000000000000000000000000000000002DB
+:10F3300002020202020202020202020202020200AF
+:10F3400000000000000000000000000000000000BD
+:10F3500000000000000000000000000000000000AD
+:10F36000000000000000000000000000000000009D
+:10F37000000000000000000000000000000000028B
+:10F38000020202020202020202020202020202005F
+:10F39000000000000000000000000000000000006D
+:10F3A000000000000000000000000000000000005D
+:10F3B000000000000000000000000000000000004D
+:10F3C000000000000000000000000000000000003D
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000000000000000000000000000000CC
+:10F4400000000000000000000000000000000000BC
+:10F4500000000000000000000000000000000000AC
+:10F46000000000000000000000000000000000009C
+:10F47000000000000000000000000000000000008C
+:10F480000000000000000000000000000000002C50
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000004C
+:10F4C000000000000000000000000000000000003C
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000100000000000000001B
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000009B
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B000000000000000000000000000000000004B
+:10F5C000000000000000000000000000000000003B
+:10F5D000000000000000000000000000000000002B
+:10F5E000000000000000000100000000000000001A
+:10F5F000000000000000000000000000000000000B
+:10F6000000000000000000000000000000000000FA
+:10F6100000000000000000000000000000000000EA
+:10F6200000000000000000000000000000000000DA
+:10F6300000000000000000000000000000000000CA
+:10F6400000000000000000000000000000000000BA
+:10F6500000000000000000000000000000000000AA
+:10F66000000000000000000000000000000000009A
+:10F67000000000000000000000000000000000008A
+:10F68000000000000000000000000000000000007A
+:10F69000000000000000000000000000000000006A
+:10F6A000000000000000000000000000000000005A
+:10F6B000000000000000000000000000000000004A
+:10F6C000000000000000000000000000000000003A
+:10F6D000000000000000000000000000000000002A
+:10F6E0000000000000000001000000000000000019
+:10F6F000000000000000000000000000000000000A
+:10F7000000000000000000000000000000000000F9
+:10F7100000000000000000000000000000000000E9
+:10F7200000000000000000000000000000000000D9
+:10F7300000000000000000000000000000000000C9
+:10F7400000000000000000000000000000000000B9
+:10F7500000000000000000000000000000000000A9
+:10F760000000000000000000000000000000000099
+:10F770000000000000000000000000000000000089
+:10F780000000000000000000000000000000000079
+:10F790000000000000000000000000000000000069
+:10F7A0000000000000000000000000000000000059
+:10F7B0000000000000000000000000000000000049
+:10F7C0000000000000000000000000000000000039
+:10F7D0000000000000000000000000000000000029
+:10F7E0000000000000000002000000000000000017
+:10F7F0000001000000000000000000000000000008
+:10F8000000000000000000000000000000000000F8
+:10F8100000000000000000000000000000000000E8
+:10F8200000000000000000000000000000000000D8
+:10F8300000000000000000000000000000000000C8
+:10F8400000000000000000000000000000000000B8
+:10F8500000000000000000000000000000000000A8
+:10F860000000000000000000000000000000000098
+:10F870000000000000000000000000000000000088
+:10F880000000000000000000000000000000000078
+:10F890000000000000000000000100000000000067
+:10F8A0000000000000010000000000000000000057
+:10F8B0000000000000000000000000000000000048
+:10F8C0000000000000000000000000000000000038
+:10F8D0000000000000000000000000000000000028
+:10F8E0000000000000000002000000000001000015
+:10F8F0000001010100000100000000000000000004
+:10F9000000000000000000000000000000000000F7
+:10F9100000000000000000000000000000000000E7
+:10F9200000000000000000000000000000000000D7
+:10F9300000000000000000000000000000000000C7
+:10F9400000000000000000000000000000000000B7
+:10F9500000000000000000000000000000000000A7
+:10F960000000000000000000000000000000000097
+:10F970000000000000000000000000000000000087
+:10F980000000000000000000000200000000000075
+:10F990000000000000000000000100000100000065
+:10F9A0000000000000010000000000000000000056
+:10F9B0000000000000000000000000000000000047
+:10F9C0000000000000000000000000000000000037
+:10F9D0000000000000000000000000000000000027
+:10F9E0000000000000000002000100000001010012
+:10F9F0000001010101010100000000000000000001
+:10FA000000000000000000000000000000000000F6
+:10FA100000000000000000000000000000000000E6
+:10FA200000000000000000000000000000000000D6
+:10FA300000000000000000000000000000000000C6
+:10FA400000000000000000000000000000000000B6
+:10FA500000000000000000000000000000000000A6
+:10FA60000000000000000000000000000000000096
+:10FA70000000000000000000000000000000000086
+:10FA80000000000000000000000200000000000074
+:10FA90000000000000000000010100000100000063
+:10FAA0000000000000010000000000000000000055
+:10FAB0000000000000000000000000000000000046
+:10FAC0000000000000000000000000000000000036
+:10FAD0000000000000000000000000000000000026
+:10FAE000000000000000000200010001010101010E
+:10FAF0000001010101010100000000000000000000
+:10FB000000000000000000000000000000000000F5
+:10FB100000000000000000000000000000000000E5
+:10FB200000000000000000000000000000000000D5
+:10FB300000000000000000000000000000000000C5
+:10FB400000000000000000000000000000000000B5
+:10FB500000000000000000000000000000000000A5
+:10FB60000000000000000000000000000000000095
+:10FB70000000000000000000000000000000000085
+:10FB80000000000000000000000200000000000073
+:10FB90000000000000000001010100000100000061
+:10FBA0000000000000010000000000000000000054
+:10FBB0000000000000000000000000000000000045
+:10FBC0000000000000000000000000000000000035
+:10FBD0000000000000000000000000000000000025
+:10FBE000000000000000000201010001010101010C
+:10FBF00000010101010101000000000000000000FF
+:10FC000000000000000000000000000000000000F4
+:10FC100000000000000000000000000000000000E4
+:10FC200000000000000000000000000000000000D4
+:10FC300000000000000000000000000000000000C4
+:10FC400000000000000000000000000000000000B4
+:10FC500000000000000000000000000000000000A4
+:10FC60000000000000000000000000000000000094
+:10FC70000000000000000000000000000000000084
+:10FC80000000000000000000000200000000000072
+:10FC90000000000000000001010100000100000060
+:10FCA0000001000001010000000000000000000051
+:10FCB0000000000000000000000000000000000044
+:10FCC0000000000000000000000000000000000034
+:10FCD0000000000000000000000000000000000024
+:10FCE000000000000000000201010101010101010A
+:10FCF00000010101010101000000000000000000FE
+:10FD000000000000000000000000000000000000F3
+:10FD100000000000000000000000000000000000E3
+:10FD200000000000000000000000000000000000D3
+:10FD300000000000000000000000000000000000C3
+:10FD400000000000000000000000000000000000B3
+:10FD500000000000000000000000000000000000A3
+:10FD60000000000000000000000000000000000093
+:10FD70000000000000000000000000000000000083
+:10FD80000000000000000000000100000000000072
+:10FD9000000000000100000101010000010100005D
+:10FDA000000101000101000000000000000000004F
+:10FDB0000000000000000000000000000000000043
+:10FDC0000000000000000000000000000000000033
+:10FDD0000000000000000000000000000000000023
+:10FDE0000000000000000002010201010101010108
+:10FDF00001010101010101000000000000000000FC
+:10FE000000000000000000000000000000000000F2
+:10FE100000000000000000000000000000000000E2
+:10FE200000000000000000000000000000000000D2
+:10FE300000000000000000010000000000000000C1
+:10FE400000000000000000000000000000000000B2
+:10FE500000000000000000000000000000000000A2
+:10FE60000000000000000000000000000000000092
+:10FE70000000000000000000000000000000000082
+:10FE80000000000000000000000101000000000070
+:10FE9000000000000100000101010000010101005B
+:10FEA000000101000101000000000000000000004E
+:10FEB0000000000000000000000000000000000042
+:10FEC0000000000000000000000000000000000032
+:10FED0000000000000000000000000000000000022
+:10FEE0000000000000000002010201010101010107
+:10FEF00001010101010101000000000000000000FB
+:10FF000000000000000000000000000000000000F1
+:10FF100000000000000000000000000000000000E1
+:10FF200000000000000000000000000000000000D1
+:10FF300000000000000000010000000000000000C0
+:10FF400000000000000000000000000000000000B1
+:10FF500000000000000000000000000000000000A1
+:10FF60000000000000000000000000000000000091
+:10FF70000000000000000000000000000000000081
+:10FF8000000000000000000000010100000000006F
+:10FF90000000000001000002010200010101010057
+:10FFA000000101000101000000000000000000004D
+:10FFB0000000000000000000000000000000000041
+:10FFC0000000000000000000000000000000000031
+:10FFD0000000000000000000000000000000000021
+:10FFE0000000000000000002020201010102010104
+:10FFF00001020101010101000000000000000000F9
+:02000002A0005C
+:1000000000000000000000000000000000000000F0
+:1000100000000000000000000000000000000000E0
+:1000200000000000000000000000000000000000D0
+:1000300000000000000000010000000000000000BF
+:1000400000000000000000000000000000000000B0
+:1000500000000000000000000000000000000000A0
+:100060000000000000000000000000000000000090
+:100070000000000000000000000000000000000080
+:10008000000000000000000000010100010000016C
+:100090000000000001000002010200010101010056
+:1000A000000101000101000000000000000000004C
+:1000B0000000000000000000000000000000000040
+:1000C0000000000000000000000000000000000030
+:1000D0000000000000000000000000000000000020
+:1000E0000000000000000002020202020102020100
+:1000F00001020201010101000000000000000000F7
+:1001000000000000000000000000000000000000EF
+:1001100000000000000000000000000000000000DF
+:1001200000000000000000000000000000000000CF
+:1001300000000000000000010000000000000000BE
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000000000000000000000000000008F
+:10017000000000000000000000000000000000007F
+:10018000000000000000000001010100010000016A
+:100190000000000001010002020201010101010151
+:1001A000000101010101000000000000000000004A
+:1001B000000000000000000000000000000000003F
+:1001C000000000000000000000000000000000002F
+:1001D000000000000000000000000000000000001F
+:1001E00000000000000000020202020202020202FD
+:1001F00001020202010101000000000000000000F5
+:1002000000000000000000000000000000000000EE
+:1002100000000000000000000000000000000000DE
+:1002200000000000000000000000000000000000CE
+:1002300000000000000000020000000001000000BB
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:100280000000000000000000010100010100000169
+:10029000000000000101010202020101010101014F
+:1002A0000102010101010000000000000000000047
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E00000000000000000020202020202020202FC
+:1002F00001020202020202000000000000000000F1
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000020001000001000000B9
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:100380000000000000000000010100010100000168
+:10039000010000000101010202020101020201014B
+:1003A0000102020101020000000000000000000044
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E00000000000000000020202020202020202FB
+:1003F00002020202020202000000000000000000EF
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000020101010101000000B5
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000000007C
+:100480000000000000000000000000010100000169
+:100490000100000101010102020201010202020148
+:1004A0000102020101020000000000000000000043
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000000000000000000002C
+:1004D000000000000000000000000000000000001C
+:1004E00000000000000000020202020202020202FA
+:1004F00002020202020202000000000000000000EE
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000020101010101000000B4
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:100580000000000000000000000000010100000168
+:100590000100010101010102020201020202020145
+:1005A0000102020101020000000000000000000042
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E00000000000000000020202020202020202F9
+:1005F00002020202020202000000000000000000ED
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000000000000000000000CA
+:1006300000000000000000020101010101010000B2
+:1006400000000000000001000000000000000000A9
+:10065000000000000000000000000000000000009A
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:100680000000000000000000000000010100000167
+:100690000100010101010102020202020202020242
+:1006A0000102020101020000000000000000000041
+:1006B000000000000000000000000000000000003A
+:1006C000000000000000000000000000000000002A
+:1006D000000000000000000000000000000000001A
+:1006E00000000000000000020202020202020202F8
+:1006F00002020202020202000000000000000000EC
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000000000000000000000C9
+:1007300000000000000000020102010101010100AF
+:1007400001000000010101000000000000000000A5
+:100750000000000000000000000000000000000099
+:100760000000000000000000000000000000000089
+:100770000000000000000000000000000000000079
+:100780000000000000000000000000000000010068
+:100790000100010101010102020202020202020241
+:1007A000010202010202000000000000000000003F
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000000029
+:1007D0000000000000000000000000000000000019
+:1007E00000000000000000020202020202020202F7
+:1007F00002020202020202000000000000000000EB
+:1008000000000000000000000000000000000000E8
+:1008100000000000000000000000000000000000D8
+:1008200000000000000000000000000000000000C8
+:1008300000000000000000020202010101010101AC
+:1008400001000101010101000000000000000000A2
+:100850000000000000000000000000000000000098
+:100860000000000000000000000000000000000088
+:100870000000000000000000000000000000000078
+:100880000000000000000000000000000000010067
+:100890000101010100010102020202020202020240
+:1008A000010202020202000000000000000000003D
+:1008B0000000000000000000000000000000000038
+:1008C0000000000000000000000000000000000028
+:1008D0000000000000000000000000000000000018
+:1008E00000000000000000020202020202020202F6
+:1008F00002020202020202000000000000000000EA
+:1009000000000000000000000000000000000000E7
+:1009100000000000000000000000000000000000D7
+:1009200000000000000000000000000000000000C7
+:1009300000000000000000020202020101010101AA
+:1009400001000101010101000000000000000000A1
+:100950000000000000000000000000000000000097
+:100960000000000000000000000000000000000087
+:100970000000000000000000000000000000000077
+:100980000000000000000000000000000000010066
+:10099000010101010001010202020202020202023F
+:1009A000020202020202000000000000000000003B
+:1009B0000000000000000000000000000000000037
+:1009C0000000000000000000000000000000000027
+:1009D0000000000000000000000000000000000017
+:1009E00000000000000000020202020202020202F5
+:1009F00002020202020202000000000000000000E9
+:100A000000000000000000000000000000000000E6
+:100A100000000000000000000000000000000000D6
+:100A200000000000000000000000000000000000C6
+:100A300000000000000000020202020202010101A7
+:100A400001000101010101000000000000000000A0
+:100A50000000000000000000000000000000000096
+:100A60000000000000000000000000000000000086
+:100A70000000000000000000000000000000000076
+:100A80000000000000000000000000000001010064
+:100A9000000101010001010202020202020202023F
+:100AA000020202020202000000000000000000003A
+:100AB0000000000000000000000000000000000036
+:100AC0000000000000000000000000000000000026
+:100AD0000000000000000000000000000000000016
+:100AE00000000000000000020202020202020202F4
+:100AF00002020202020202000000000000000000E8
+:100B000000000000000000000000000000000000E5
+:100B100000000000000000000000000000000000D5
+:100B200000000000000000000000000000000000C5
+:100B300000000000000000020202020202010101A6
+:100B4000010001010101010000000000000000009F
+:100B50000000000000000000000000000000000095
+:100B60000000000000000000000000000000000085
+:100B70000000000000000000000000000000000075
+:100B80000000000000000000000000000001010063
+:100B9000000101010000010202020202020202023F
+:100BA0000202020202020100000000000000000038
+:100BB0000000000000000000000000000000000035
+:100BC0000000000000000000000000000000000025
+:100BD0000000000000000000000000000000000015
+:100BE00000000000000000020202020202020202F3
+:100BF00002020202020202000000000000000000E7
+:100C000000000000000000000000000000000000E4
+:100C100000000000000000000000000000000000D4
+:100C200000000000000000000000000000000000C4
+:100C300000000000000000020202020202020101A4
+:100C4000010001010101010000000000000000009E
+:100C50000000000000000000000000000000000094
+:100C60000000000000000000000000000000000084
+:100C70000000000000000000000000000000000074
+:100C80000000000000000002000000000001000061
+:100C9000000100010000010202020202020202023F
+:100CA0000201010202020100000000000000000039
+:100CB0000000000000000000000000000000000034
+:100CC0000000000000000000000000000000000024
+:100CD0000000000000000000000000000000000014
+:100CE00000000000000000020202020202020202F2
+:100CF00002020202020202000000000000000000E6
+:100D000000000000000000000000000000000000E3
+:100D100000000000000000000000000000000000D3
+:100D200000000000000000000000000000000000C3
+:100D300000000000000000020202020202020201A2
+:100D4000010101010101010000000000000000009C
+:100D50000000000000000000000000000000000093
+:100D60000000000000000000000000000000000083
+:100D70000000000000000000000000000000000073
+:100D80000000000000000002000000000001000060
+:100D90000000000000000002020202020202020241
+:100DA0000201010202010100000000000000000039
+:100DB0000000000000000000000000000000000033
+:100DC0000000000000000000000000000000000023
+:100DD0000000000000000000000000000000000013
+:100DE00000000000000000020202020202020202F1
+:100DF00002020202020202000000000000000000E5
+:100E000000000000000000000000000000000000E2
+:100E100000000000000000000000000000000000D2
+:100E200000000000000000000000000000000000C2
+:100E300000000000000000020202020202020202A0
+:100E4000020101010101010000000000000000009A
+:100E50000000000000000000000000000000000092
+:100E60000000000000000000000000000000000082
+:100E70000000000000000000000000000000000072
+:100E8000000000000000000202020000000000005C
+:100E90000000000000000002020202020201010143
+:100EA0000201010102010100000000000000000039
+:100EB0000000000000000000000000000000000032
+:100EC0000000000000000000000000000000000022
+:100ED0000000000000000000000000000000000012
+:100EE00000000000000000010202020202020202F1
+:100EF00002010101010101000000000000000000EA
+:100F000000000000000000000000000000000000E1
+:100F100000000000000000000000000000000000D1
+:100F200000000000000000000000000000000000C1
+:100F3000000000000000000202020202020202029F
+:100F40000201020101010100000000000000000098
+:100F50000000000000000000000000000000000091
+:100F60000000000000000000000000000000000081
+:100F70000000000000000000000000000000000071
+:100F8000000000000000000202020000000000005B
+:100F90000000000000000002020202020201010142
+:100FA0000201010101010100000000000000000039
+:100FB0000000000000000000000000000000000031
+:100FC0000000000000000000000000000000000021
+:100FD0000000000000000000000000000000000011
+:100FE00000000000000000020202020202010202F0
+:100FF00002020202020202000000000000000000E3
+:1010000000000000000000000000000000000000E0
+:1010100000000000000000000000000000000000D0
+:1010200000000000000000000000000000000000C0
+:10103000000000000000000202020202020202029E
+:101040000201020202020200000000000000000093
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000000000000000000000070
+:101080000000000000000002020202000000000058
+:101090000000000000000002020102010101010144
+:1010A0000101010101010100000000000000000039
+:1010B0000000000000000000000000000000000030
+:1010C0000000000000000000000000000000000020
+:1010D0000000000000000000000000000000000010
+:1010E00000000000000000000201010202020000F6
+:1010F00000000000000000000000000000000000F0
+:1011000000000000000000000000000000000000DF
+:1011100000000000000000000000000000000000CF
+:1011200000000000000000000000000000000000BF
+:10113000000000000000000202020202020202029D
+:101140000202020202020200000000000000000091
+:10115000000000000000000000000000000000008F
+:10116000000000000000000000000000000000007F
+:10117000000000000000000000000000000000006F
+:101180000000000000000002020202020200000053
+:101190000000000000000001010101010101010146
+:1011A0000101010101010100000000000000000038
+:1011B000000000000000000000000000000000002F
+:1011C000000000000000000000000000000000001F
+:1011D000000000000000000000000000000000000F
+:1011E00000000000000000000202020000000101F7
+:1011F00001010101010101000000000000000000E8
+:1012000000000000000000000000000000000000DE
+:1012100000000000000000000000000000000000CE
+:1012200000000000000000000000000000000000BE
+:10123000000000000000000202020202020202029C
+:101240000202020202020200000000000000000090
+:10125000000000000000000000000000000000008E
+:10126000000000000000000000000000000000007E
+:10127000000000000000000000000000000000006E
+:101280000000000000000002020202020200000052
+:101290000000000000000001010101010101010145
+:1012A0000101010101010100000000000000000037
+:1012B000000000000000000000000000000000002E
+:1012C000000000000000000000000000000000001E
+:1012D000000000000000000000000000000000000E
+:1012E00000000000000000000000000101010101F9
+:1012F00001010101010101000000000000000000E7
+:1013000000000000000000000000000000000000DD
+:1013100000000000000000000000000000000000CD
+:1013200000000000000000000000000000000000BD
+:10133000000000000000000202020202020202029B
+:10134000020202020202020000000000000000008F
+:10135000000000000000000000000000000000008D
+:10136000000000000000000000000000000000007D
+:10137000000000000000000000000000000000006D
+:10138000000000000000000202020202020000024F
+:101390000000000000000001010101010101010144
+:1013A0000101010101010100000000000000000036
+:1013B000000000000000000000000000000000002D
+:1013C000000000000000000000000000000000001D
+:1013D000000000000000000000000000000000000D
+:1013E00000000000000000010101010101010101F4
+:1013F00001010101010101000000000000000000E6
+:1014000000000000000000000000000000000000DC
+:1014100000000000000000000000000000000000CC
+:1014200000000000000000000000000000000000BC
+:10143000000000000000000202020202020202029A
+:10144000020202020202020000000000000000008E
+:10145000000000000000000000000000000000008C
+:10146000000000000000000000000000000000007C
+:10147000000000000000000000000000000000006C
+:10148000000000000000000202020202020202024A
+:10149000020000000200000101010101010101013F
+:1014A0000101010101010100000000000000000035
+:1014B000000000000000000000000000000000002C
+:1014C000000000000000000000000000000000001C
+:1014D000000000000000000000000000000000000C
+:1014E00000000000000000010101010101010101F3
+:1014F00001010101010101000000000000000000E5
+:1015000000000000000000000000000000000000DB
+:1015100000000000000000000000000000000000CB
+:1015200000000000000000000000000000000000BB
+:101530000000000000000002020202020202020299
+:10154000020202020202020000000000000000008D
+:10155000000000000000000000000000000000008B
+:10156000000000000000000000000000000000007B
+:10157000000000000000000000000000000000006B
+:101580000000000000000002020202020202020249
+:101590000200020202020201010101010101010136
+:1015A0000101010101010100000000000000000034
+:1015B000000000000000000000000000000000002B
+:1015C000000000000000000000000000000000001B
+:1015D000000000000000000000000000000000000B
+:1015E00000000000000000010101010101010101F2
+:1015F00001010101010101000000000000000000E4
+:1016000000000000000000000000000000000000DA
+:1016100000000000000000000000000000000000CA
+:1016200000000000000000000000000000000000BA
+:101630000000000000000002020202020202020298
+:10164000020202020202020000000000000000008C
+:10165000000000000000000000000000000000008A
+:10166000000000000000000000000000000000007A
+:10167000000000000000000000000000000000006A
+:101680000000000000000002020202020202020248
+:101690000202020202020201010101010101010133
+:1016A0000101010101010100000000000000000033
+:1016B000000000000000000000000000000000002A
+:1016C000000000000000000000000000000000001A
+:1016D000000000000000000000000000000000000A
+:1016E00000000000000000010101010101010101F1
+:1016F00001010101010101000000000000000000E3
+:1017000000000000000000000000000000000000D9
+:1017100000000000000000000000000000000000C9
+:1017200000000000000000000000000000000000B9
+:101730000000000000000002020202020202020297
+:10174000020202020202020000000000000000008B
+:101750000000000000000000000000000000000089
+:101760000000000000000000000000000000000079
+:101770000000000000000000000000000000000069
+:101780000000000000000002020202020202020247
+:101790000202020202020201010101010101010132
+:1017A0000101010101010100000000000000000032
+:1017B0000000000000000000000000000000000029
+:1017C0000000000000000000000000000000000019
+:1017D0000000000000000000000000000000000009
+:1017E00000000000000000010101010101010101F0
+:1017F00001010101010101000000000000000000E2
+:1018000000000000000000000000000000000000D8
+:1018100000000000000000000000000000000000C8
+:1018200000000000000000000000000000000000B8
+:101830000000000000000002020202020202020296
+:10184000020202020202020000000000000000008A
+:101850000000000000000000000000000000000088
+:101860000000000000000000000000000000000078
+:101870000000000000000000000000000000000068
+:101880000000000000000002020202020202020246
+:101890000202020202020201010101010101010131
+:1018A0000101010101010100000000000000000031
+:1018B0000000000000000000000000000000000028
+:1018C0000000000000000000000000000000000018
+:1018D0000000000000000000000000000000000008
+:1018E00000000000000000010101010101010101EF
+:1018F00001010101010101000000000000000000E1
+:1019000000000000000000000000000000000000D7
+:1019100000000000000000000000000000000000C7
+:1019200000000000000000000000000000000000B7
+:1019300000000000000000000200000000000000A5
+:101940000000000000000000000000000000000097
+:101950000000000000000000000000000000000087
+:101960000000000000000000000000000000000077
+:101970000000000000000000000000000000000067
+:101980000000000000000002020202020202020245
+:101990000202020202020201010101010101010130
+:1019A0000101010101010100000000000000000030
+:1019B0000000000000000000000000000000000027
+:1019C0000000000000000000000000000000000017
+:1019D0000000000000000000000000000000000007
+:1019E00000000000000000010101010101010101EE
+:1019F00001010101010101000000000000000000E0
+:101A000000000000000000000000000000000000D6
+:101A100000000000000000000000000000000000C6
+:101A200000000000000000000000000000000000B6
+:101A3000000000000000000101010101010101019D
+:101A4000010101010101010000000000000000008F
+:101A50000000000000000000000000000000000086
+:101A60000000000000000000000000000000000076
+:101A70000000000000000000000000000000000066
+:101A80000000000000000002020202020202020244
+:101A9000020202020202020101010101010101012F
+:101AA000010101010101010000000000000000002F
+:101AB0000000000000000000000000000000000026
+:101AC0000000000000000000000000000000000016
+:101AD0000000000000000000000000000000000006
+:101AE00000000000000000010101010101010101ED
+:101AF00001010101010101000000000000000000DF
+:101B000000000000000000000000000000000000D5
+:101B100000000000000000000000000000000000C5
+:101B200000000000000000000000000000000000B5
+:101B3000000000000000000101010101010101019C
+:101B4000010101010101010000000000000000008E
+:101B50000000000000000000000000000000000085
+:101B60000000000000000000000000000000000075
+:101B70000000000000000000000000000000000065
+:101B80000000000000000002020202020202020243
+:101B9000020202020202020101010101010101012E
+:101BA000010101010101010000000000000000002E
+:101BB0000000000000000000000000000000000025
+:101BC0000000000000000000000000000000000015
+:101BD0000000000000000000000000000000000005
+:101BE00000000000000000010101010101010101EC
+:101BF00001010101010101000000000000000000DE
+:101C000000000000000000000000000000000000D4
+:101C100000000000000000000000000000000000C4
+:101C200000000000000000000000000000000000B4
+:101C3000000000000000000101010101010101019B
+:101C4000010101010101010000000000000000008D
+:101C50000000000000000000000000000000000084
+:101C60000000000000000000000000000000000074
+:101C70000000000000000000000000000000000064
+:101C80000000000000000002020202020202020242
+:101C9000020202020202020101010101010101012D
+:101CA000010101010101010000000000000000002D
+:101CB0000000000000000000000000000000000024
+:101CC0000000000000000000000000000000000014
+:101CD0000000000000000000000000000000000004
+:101CE00000000000000000010101010101010101EB
+:101CF00001010101010101000000000000000000DD
+:101D000000000000000000000000000000000000D3
+:101D100000000000000000000000000000000000C3
+:101D200000000000000000000000000000000000B3
+:101D3000000000000000000101010101010101019A
+:101D4000010101010101010000000000000000008C
+:101D50000000000000000000000000000000000083
+:101D60000000000000000000000000000000000073
+:101D70000000000000000000000000000000000063
+:101D80000000000000000002020202020202020241
+:101D9000020202020202020101010101010101012C
+:101DA000010101010101010000000000000000002C
+:101DB0000000000000000000000000000000000023
+:101DC0000000000000000000000000000000000013
+:101DD0000000000000000000000000000000000003
+:101DE00000000000000000020202020202020202E1
+:101DF00002020202020202000000000000000000D5
+:101E000000000000000000000000000000000000D2
+:101E100000000000000000000000000000000000C2
+:101E200000000000000000000000000000000000B2
+:101E30000000000000000001010101010101010199
+:101E4000010101010101010000000000000000008B
+:101E50000000000000000000000000000000000082
+:101E60000000000000000000000000000000000072
+:101E70000000000000000000000000000000000062
+:101E80000000000000000002020202020202020240
+:101E9000020202020202020101010101010101012B
+:101EA000010101010101010000000000000000002B
+:101EB0000000000000000000000000000000000022
+:101EC0000000000000000000000000000000000012
+:101ED0000000000000000000000000000000000002
+:101EE00000000000000000020202020202020202E0
+:101EF00002020202020202000000000000000000D4
+:101F000000000000000000000000000000000000D1
+:101F100000000000000000000000000000000000C1
+:101F200000000000000000000000000000000000B1
+:101F3000000000000000000202020202020202028F
+:101F40000202020202020200000000000000000083
+:101F50000000000000000000000000000000000081
+:101F60000000000000000000000000000000000071
+:101F70000000000000000000000000000000000061
+:101F8000000000000000000202020202020202023F
+:101F90000202020202020200000000000000000033
+:101FA0000000000000000000000000000000000031
+:101FB0000000000000000000000000000000000021
+:101FC0000000000000000000000000000000000011
+:101FD0000000000000000000000000000000000001
+:101FE00000000000000000000000000000000000F1
+:101FF00000000000000000000000000000000000E1
+:1020000000000000000000000000000000000000D0
+:1020100000000000000000000000000000000000C0
+:1020200000000000000000000000000000000000B0
+:1020300000000000000000000000000000000000A0
+:102040000000000000000000000000000000000090
+:102050000000000000000000000000000000000080
+:102060000000000000000000000000000000000070
+:102070000000000000000000000000000000000060
+:102080000000000000000000000000000000000050
+:10209000000000000000002400000000000000011B
+:1020A0000101010101010101010101010101010021
+:1020B0000000000000000000000000000000000020
+:1020C0000000000000000000000000000000000010
+:1020D0000000000000000000000000000000000000
+:1020E00000000000000000000000000000000000F0
+:1020F00000000000000000000000000000000100DF
+:1021000000000000000000000000000000000000CF
+:1021100000000000000000000000000000000000BF
+:1021200000000000000000000000000000000000AF
+:10213000000000000000000000000000000000009F
+:10214000000000000000010000000000000101008C
+:10215000000000000000000000000000000000007F
+:10216000000000000000000000000000000000006F
+:10217000000000000000000000000000000000005F
+:10218000000000000000000000000000000000024D
+:10219000010101010101010101010101010101012F
+:1021A0000101010101010101010101010101010020
+:1021B000000000000000000000000000000000001F
+:1021C000000000000000000000000000000000000F
+:1021D00000000000000000000000000000000000FF
+:1021E00000000000000000000000000000000000EF
+:1021F00000000000000000000000000000000100DE
+:1022000000000000000000000000000000000000CE
+:1022100000000000000000000000000000000000BE
+:1022200000000000000000000000000000000000AE
+:10223000000000000000000000000000000000009E
+:102240000000000001010101010100000001010086
+:10225000000000000000000000000000000000007E
+:10226000000000000000000000000000000000006E
+:10227000000000000000000000000000000000005E
+:10228000000000000000000000000000000000024C
+:10229000010101010101010101010101010101012E
+:1022A000010101010101010101010101010101001F
+:1022B000000000000000000000000000000000001E
+:1022C000000000000000000000000000000000000E
+:1022D00000000000000000000000000000000000FE
+:1022E00000000000000000000000000000000000EE
+:1022F00000000000000000000000000000000100DD
+:1023000000000000000000000000000000000000CD
+:1023100000000000000000000000000000000000BD
+:1023200000000000000000000000000000000000AD
+:10233000000000000000000000000000000000009D
+:102340000000000001010101010100000001010085
+:10235000000000000000000000000000000000007D
+:10236000000000000000000000000000000000006D
+:10237000000000000000000000000000000000005D
+:10238000000000000000000000000000000000024B
+:10239000010101010101010101010101010101022C
+:1023A000010101010101010101010101010101001E
+:1023B000000000000000000000000000000000001D
+:1023C000000000000000000000000000000000000D
+:1023D00000000000000000000000000000000000FD
+:1023E00000000000000000000000000000000000ED
+:1023F00000000000000100000000000000000100DB
+:1024000000000000000000000000000000000000CC
+:1024100000000000000000000000000000000000BC
+:1024200000000000000000000000000000000000AC
+:10243000000000000000000000000000000000009C
+:102440000000000001010101010100000001010084
+:10245000000000000000000000000000000000007C
+:10246000000000000000000000000000000000006C
+:10247000000000000000000000000000000000005C
+:10248000000000000000000000000000000000024A
+:10249000010101010101010101010101010101022B
+:1024A000010101010101010101010101010101001D
+:1024B000000000000000000000000000000000001C
+:1024C000000000000000000000000000000000000C
+:1024D00000000000000000000000000000000000FC
+:1024E00000000000000000000000000000000000EC
+:1024F00000000000000100000000000000000100DA
+:1025000000000000000000000000000000000000CB
+:1025100000000000000000000000000000000000BB
+:1025200000000000000000000000000000000000AB
+:10253000000000000000000000000000000000009B
+:102540000000000001010101010100000001010083
+:10255000000000000000000000000000000000007B
+:10256000000000000000000000000000000000006B
+:10257000000000000000000000000000000000005B
+:102580000000000000000000000000000000000249
+:10259000010101010101010101010101010101022A
+:1025A0000102010201010101010101010201010019
+:1025B000000000000000000000000000000000001B
+:1025C000000000000000000000000000000000000B
+:1025D00000000000000000000000000000000000FB
+:1025E00000000000000000000000000000000000EB
+:1025F00000000000000100000000000000000100D9
+:1026000000000000000000000000000000000000CA
+:1026100000000000000000000000000000000000BA
+:1026200000000000000000000000000000000000AA
+:10263000000000000000000000000000000000009A
+:102640000000000001010101010100010001010081
+:10265000000000000000000000000000000000007A
+:10266000000000000000000000000000000000006A
+:10267000000000000000000000000000000000005A
+:102680000000000000000000000000000000000248
+:10269000010001010101010101010101010101022A
+:1026A0000202020201020201010102010201010013
+:1026B000000000000000000000000000000000001A
+:1026C000000000000000000000000000000000000A
+:1026D00000000000000000000000000000000000FA
+:1026E00000000000000000000000000000000001E9
+:1026F00001000000000101000000000000010100D5
+:1027000000000000000000000000000000000000C9
+:1027100000000000000000000000000000000000B9
+:1027200000000000000000000000000000000000A9
+:102730000000000000000000000000000000000099
+:10274000000100000101010101010101000101007E
+:102750000000000000000000000000000000000079
+:102760000000000000000000000000000000000069
+:102770000000000000000000000000000000000059
+:102780000000000000000000000000000000000247
+:10279000000000000101010101000001000101022F
+:1027A000020202020102020202020202020101000E
+:1027B0000000000000000000000000000000000019
+:1027C0000000000000000000000000000000000009
+:1027D00000000000000000000000000000000000F9
+:1027E00000000000000000000000000000000001E8
+:1027F00001000001010101010000000000010100D1
+:1028000000000000000000000000000000000000C8
+:1028100000000000000000000000000000000000B8
+:1028200000000000000000000000000000000000A8
+:102830000000000000000000000000000000000098
+:10284000000100000101010101010101000101007D
+:102850000000000000000000000000000000000078
+:102860000000000000000000000000000000000068
+:102870000000000000000000000000000000000058
+:102880000000000000000000000000000000000246
+:102890000000000001000001000000000001010232
+:1028A000020202020202020202020202020101000C
+:1028B0000000000000000000000000000000000018
+:1028C0000000000000000000000000000000000008
+:1028D00000000000000000000000000000000000F8
+:1028E00000000000000000000000000000000002E6
+:1028F00001000001010101010000000000010100D0
+:1029000000000000000000000000000000000000C7
+:1029100000000000000000000000000000000000B7
+:1029200000000000000000000000000000000000A7
+:102930000000000000000000000000000000000097
+:10294000000101000101010101010101000101007B
+:102950000000000000000000000000000000000077
+:102960000000000000000000000000000000000067
+:102970000000000000000000000000000000000057
+:102980000000000000000000000000000000000245
+:102990000000000000000000000000000001010233
+:1029A000020202020202020202020202010101000C
+:1029B0000000000000000000000000000000000017
+:1029C0000000000000000000000000000000000007
+:1029D00000000000000000000000000000000000F7
+:1029E00000000000000000000000000000000002E5
+:1029F00001000001010101010000000202010100CB
+:102A000000000000000000000000000000000000C6
+:102A100000000000000000000000000000000000B6
+:102A200000000000000000000000000000000000A6
+:102A30000000000000000000000000000000000096
+:102A40000001010101010101010101010001010079
+:102A50000000000000000000000000000000000076
+:102A60000000000000000000000000000000000066
+:102A70000000000000000000000000000000000056
+:102A80000000000000000000000000000000000244
+:102A90000000000000000000000000000001020231
+:102AA000020202020202020202020202010101000B
+:102AB0000000000000000000000000000000000016
+:102AC0000000000000000000000000000000000006
+:102AD00000000000000000000000000000000000F6
+:102AE00000000000000000000000000000000002E4
+:102AF00001010101010101010000010102010100C8
+:102B000000000000000000000000000000000000C5
+:102B100000000000000000000000000000000000B5
+:102B200000000000000000000000000000000000A5
+:102B30000000000000000000000000000000000095
+:102B40000101010101010101010101010001010077
+:102B50000000000000000000000000000000000075
+:102B60000000000000000000000000000000000065
+:102B70000000000000000000000000000000000055
+:102B80000000000000000000000000000000000243
+:102B90000000000000000000000000000001020230
+:102BA000020202020202020202020102010101000B
+:102BB0000000000000000000000000000000000015
+:102BC0000000000000000000000000000000000005
+:102BD00000000000000000000000000000000000F5
+:102BE00000000000000000000000000000000002E3
+:102BF00002010101010201010100010101010100C5
+:102C000000000000000000000000000000000000C4
+:102C100000000000000000000000000000000000B4
+:102C200000000000000000000000000000000000A4
+:102C30000000000000000000000000000000000094
+:102C40000102010102020201010101010101010071
+:102C50000000000000000000000000000000000074
+:102C60000000000000000000000000000000000064
+:102C70000000000000000000000000000000000054
+:102C80000000000000000000000000000000000242
+:102C9000000000000000000000000000000102022F
+:102CA000020202010202010202020102010101000C
+:102CB0000000000000000000000000000000000014
+:102CC0000000000000000000000000000000000004
+:102CD00000000000000000000000000000000000F4
+:102CE00000000000000000000000000000000002E2
+:102CF00002010102010201010100010101010100C3
+:102D000000000000000000000000000000000000C3
+:102D100000000000000000000000000000000000B3
+:102D200000000000000000000000000000000000A3
+:102D30000000000000000000000000000000000291
+:102D4000010201010202020202020101010101006D
+:102D50000000000000000000000000000000000073
+:102D60000000000000000000000000000000000063
+:102D70000000000000000000000000000000000053
+:102D80000000000000000000000000000000000241
+:102D9000000000000000000000000000000002022F
+:102DA000020202010201010101020101010101000F
+:102DB0000000000000000000000000000000000013
+:102DC0000000000000000000000000000000000003
+:102DD00000000000000000000000000000000000F3
+:102DE00000000000000000000000000000000002E1
+:102DF00002020102020202010102010101010200BC
+:102E000000000000000000000000000000000000C2
+:102E100000000000000000000000000000000000B2
+:102E200000000000000000000000000000000000A2
+:102E30000000000000000000000000000000000290
+:102E4000010202010202020202020101010101006B
+:102E50000000000000000000000000000000000072
+:102E60000000000000000000000000000000000062
+:102E70000000000000000000000000000000000052
+:102E80000000000000000000000000000000000240
+:102E9000000000000000000000000000000002022E
+:102EA000020102010201010101010101010201000F
+:102EB0000000000000000000000000000000000012
+:102EC0000000000000000000000000000000000002
+:102ED00000000000000000000000000000000000F2
+:102EE00000000000000000000000000000000002E0
+:102EF00002020202020202020101010101010200BA
+:102F000000000000000000000000000000000000C1
+:102F100000000000000000000000000000000000B1
+:102F200000000000000000000000000000000000A1
+:102F3000000000000000000000000000000000028F
+:102F40000202020202020202020201010102020066
+:102F50000000000000000000000000000000000071
+:102F60000000000000000000000000000000000061
+:102F70000000000000000000000000000000000051
+:102F8000000000000000000000000000000000023F
+:102F9000000200000000000000000000000002022B
+:102FA000020101010201010101010101010201000F
+:102FB0000000000000000000000000000000000011
+:102FC0000000000000000000000000000000000001
+:102FD00000000000000000000000000000000000F1
+:102FE00000000000000000000000000000000002DF
+:102FF00002020202020202020101020101010200B8
+:1030000000000000000000000000000000000000C0
+:1030100000000000000000000000000000000000B0
+:1030200000000000000000000000000000000000A0
+:10303000000000000000000000000000000000028E
+:103040000202020202020202020202020102020063
+:103050000000000000000000000000000000000070
+:103060000000000000000000000000000000000060
+:103070000000000000000000000000000000000050
+:10308000000000000000000000000000000000023E
+:10309000020202020000000000020200020002021E
+:1030A0000101010101010101010101010102010010
+:1030B0000000000000000000000000000000000010
+:1030C0000000000000000000000000000000000000
+:1030D00000000000000000000000000000000000F0
+:1030E00000000000000000000000000000000002DE
+:1030F00002020202020202020201020201020200B4
+:1031000000000000000000000000000000000000BF
+:1031100000000000000000000000000000000000AF
+:10312000000000000000000000000000000000009F
+:10313000000000000000000000000000000000028D
+:103140000202020202020202020202020102020062
+:10315000000000000000000000000000000000006F
+:10316000000000000000000000000000000000005F
+:10317000000000000000000000000000000000004F
+:10318000000000000000000000000000000000023D
+:103190000202020200020200020202020200020116
+:1031A000010101010101010101010101010201000F
+:1031B000000000000000000000000000000000000F
+:1031C00000000000000000000000000000000000FF
+:1031D00000000000000000000000000000000000EF
+:1031E00000000000000000000000000000000002DD
+:1031F00002020202020202020201020202020200B2
+:1032000000000000000000000000000000000000BE
+:1032100000000000000000000000000000000000AE
+:10322000000000000000000000000000000000009E
+:10323000000000000000000000000000000000028C
+:103240000202020202020202020202020102020061
+:10325000000000000000000000000000000000006E
+:10326000000000000000000000000000000000005E
+:10327000000000000000000000000000000000004E
+:10328000000000000000000000000000000000023C
+:10329000020202020202020202020202020202010F
+:1032A000010101010101010101010101010200000F
+:1032B000000000000000000000000000000000000E
+:1032C00000000000000000000000000000000000FE
+:1032D00000000000000000000000000000000000EE
+:1032E00000000000000000000000000000000002DC
+:1032F00002020202020202020202020202020200B0
+:1033000000000000000000000000000000000000BD
+:1033100000000000000000000000000000000000AD
+:10332000000000000000000000000000000000009D
+:10333000000000000000000000000000000000028B
+:10334000020202020202020202020202020202005F
+:10335000000000000000000000000000000000006D
+:10336000000000000000000000000000000000005D
+:10337000000000000000000000000000000000004D
+:10338000000000000000000000000000000000003D
+:103390000202020202020202020202020202000110
+:1033A000010101010101010101010101010200000E
+:1033B000000000000000000000000000000000000D
+:1033C00000000000000000000000000000000000FD
+:1033D00000000000000000000000000000000000ED
+:1033E00000000000000000000000000000000002DB
+:1033F00002020202020202020202020202020200AF
+:1034000000000000000000000000000000000000BC
+:1034100000000000000000000000000000000000AC
+:10342000000000000000000000000000000000009C
+:10343000000000000000000000000000000000028A
+:10344000020202020202020202020202020202005E
+:10345000000000000000000000000000000000006C
+:10346000000000000000000000000000000000005C
+:10347000000000000000000000000000000000004C
+:10348000000000000000000000000000000000003C
+:10349000020202020202020202020202020200010F
+:1034A000010101010101010101010101010200000D
+:1034B000000000000000000000000000000000000C
+:1034C00000000000000000000000000000000000FC
+:1034D00000000000000000000000000000000000EC
+:1034E00000000000000000000000000000000002DA
+:1034F00002020202020202020202020202020200AE
+:1035000000000000000000000000000000000000BB
+:1035100000000000000000000000000000000000AB
+:10352000000000000000000000000000000000009B
+:103530000000000000000000000000000000000289
+:10354000020202020202020202020202020202005D
+:10355000000000000000000000000000000000006B
+:10356000000000000000000000000000000000005B
+:10357000000000000000000000000000000000004B
+:10358000000000000000000000000000000000003B
+:10359000020202020202020202020202020200010E
+:1035A000010101010101010101010101010200000C
+:1035B000000000000000000000000000000000000B
+:1035C00000000000000000000000000000000000FB
+:1035D00000000000000000000000000000000000EB
+:1035E00000000000000000000000000000000002D9
+:1035F00002020202020202020202020202020200AD
+:1036000000000000000000000000000000000000BA
+:1036100000000000000000000000000000000000AA
+:10362000000000000000000000000000000000009A
+:103630000000000000000000000000000000000288
+:10364000020202020202020202020202020202005C
+:10365000000000000000000000000000000000006A
+:10366000000000000000000000000000000000005A
+:10367000000000000000000000000000000000004A
+:10368000000000000000000000000000000000003A
+:10369000020202020202020202020202020200010D
+:1036A000010101010101010101010101010100000C
+:1036B000000000000000000000000000000000000A
+:1036C00000000000000000000000000000000000FA
+:1036D00000000000000000000000000000000000EA
+:1036E00000000000000000000000000000000002D8
+:1036F00002020202020202020202020202020200AC
+:1037000000000000000000000000000000000000B9
+:1037100000000000000000000000000000000000A9
+:103720000000000000000000000000000000000099
+:103730000000000000000000000000000000000287
+:10374000020202020202020202020202020202005B
+:103750000000000000000000000000000000000069
+:103760000000000000000000000000000000000059
+:103770000000000000000000000000000000000049
+:103780000000000000000000000000000000000039
+:10379000020202020202020202020202020200010C
+:1037A000010101000101010101010101000100000D
+:1037B0000000000000000000000000000000000009
+:1037C00000000000000000000000000000000000F9
+:1037D00000000000000000000000000000000000E9
+:1037E00000000000000000000000000000000002D7
+:1037F00002020202020202020202020202020200AB
+:1038000000000000000000000000000000000000B8
+:1038100000000000000000000000000000000000A8
+:103820000000000000000000000000000000000098
+:103830000000000000000000000000000000000286
+:10384000020202020202020202020202020202005A
+:103850000000000000000000000000000000000068
+:103860000000000000000000000000000000000058
+:103870000000000000000000000000000000000048
+:103880000000000000000000000000000000000038
+:10389000020202020202020202020202020200010B
+:1038A000010001000101000101010001000100000F
+:1038B0000000000000000000000000000000000008
+:1038C00000000000000000000000000000000000F8
+:1038D00000000000000000000000000000000000E8
+:1038E00000000000000000000000000000000002D6
+:1038F00002020202020202020202010101020200AD
+:1039000000000000000000000000000000000000B7
+:1039100000000000000000000000000000000000A7
+:103920000000000000000000000000000000000097
+:103930000000000000000000000000000000000285
+:103940000202020202020202020202020202020059
+:103950000000000000000000000000000000000067
+:103960000000000000000000000000000000000057
+:103970000000000000000000000000000000000047
+:103980000000000000000000000000000000000037
+:10399000020202020202020202020202000200010C
+:1039A0000100010001000000000100010001000011
+:1039B0000000000000000000000000000000000007
+:1039C00000000000000000000000000000000000F7
+:1039D00000000000000000000000000000000000E7
+:1039E00000000000000000000000000000000002D5
+:1039F00002020201010202020202020202020200AB
+:103A000000000000000000000000000000000000B6
+:103A100000000000000000000000000000000000A6
+:103A20000000000000000000000000000000000096
+:103A30000000000000000000000000000000000284
+:103A40000202020202020202020202020202020058
+:103A50000000000000000000000000000000000066
+:103A60000000000000000000000000000000000056
+:103A70000000000000000000000000000000000046
+:103A80000000000000000000000000000000000036
+:103A9000020202020202020202020002000200010D
+:103AA0000000000001000000000100010001000012
+:103AB0000000000000000000000000000000000006
+:103AC00000000000000000000000000000000000F6
+:103AD00000000000000000000000000000000000E6
+:103AE00000000000000000000000000000000002D4
+:103AF00002020202020101010101010101010100B2
+:103B000000000000000000000000000000000000B5
+:103B100000000000000000000000000000000000A5
+:103B20000000000000000000000000000000000095
+:103B30000000000000000000000000000000000283
+:103B4000020101010202020202020202020202005A
+:103B50000000000000000000000000000000000065
+:103B60000000000000000000000000000000000055
+:103B70000000000000000000000000000000000045
+:103B80000000000000000000000000000000000035
+:103B90000202020202020202020000000002000110
+:103BA0000000000000000000000000000001000014
+:103BB0000000000000000000000000000000000005
+:103BC00000000000000000000000000000000000F5
+:103BD00000000000000000000000000000000000E5
+:103BE00000000000000000000000000000000001D4
+:103BF00001010101010101010101010101010100B6
+:103C000000000000000000000000000000000000B4
+:103C100000000000000000000000000000000000A4
+:103C20000000000000000000000000000000000094
+:103C30000000000000000000000000000000000282
+:103C40000202020201010101010101010101010061
+:103C50000000000000000000000000000000000064
+:103C60000000000000000000000000000000000054
+:103C70000000000000000000000000000000000044
+:103C80000000000000000000000000000000000034
+:103C90000202020202020202020000000002000010
+:103CA0000000000000000000000000000001000013
+:103CB0000000000000000000000000000000000004
+:103CC00000000000000000000000000000000000F4
+:103CD00000000000000000000000000000000000E4
+:103CE00000000000000000000000000000000001D3
+:103CF00001010101010101010101010101010100B5
+:103D000000000000000000000000000000000000B3
+:103D100000000000000000000000000000000000A3
+:103D20000000000000000000000000000000000093
+:103D30000000000000000000000000000000000182
+:103D40000101010101010101010101010101010064
+:103D50000000000000000000000000000000000063
+:103D60000000000000000000000000000000000053
+:103D70000000000000000000000000000000000043
+:103D80000000000000000000000000000000000033
+:103D90000202020202020202000000000002000011
+:103DA0000000000000000000000000000001000012
+:103DB0000000000000000000000000000000000003
+:103DC00000000000000000000000000000000000F3
+:103DD00000000000000000000000000000000000E3
+:103DE00000000000000000000000000000000001D2
+:103DF00001010101010101010101010101010100B4
+:103E000000000000000000000000000000000000B2
+:103E100000000000000000000000000000000000A2
+:103E20000000000000000000000000000000000092
+:103E30000000000000000000000000000000000181
+:103E40000101010101010101010101010101010063
+:103E50000000000000000000000000000000000062
+:103E60000000000000000000000000000000000052
+:103E70000000000000000000000000000000000042
+:103E80000000000000000000000000000000000032
+:103E90000202020202020002000000000000000014
+:103EA0000000000000000000000000000001000011
+:103EB0000000000000000000000000000000000002
+:103EC00000000000000000000000000000000000F2
+:103ED00000000000000000000000000000000000E2
+:103EE00000000000000000000000000000000001D1
+:103EF00001010101010101010101010101010100B3
+:103F000000000000000000000000000000000000B1
+:103F100000000000000000000000000000000000A1
+:103F20000000000000000000000000000000000091
+:103F30000000000000000000000000000000000180
+:103F40000101010101010101010101010101010062
+:103F50000000000000000000000000000000000061
+:103F60000000000000000000000000000000000051
+:103F70000000000000000000000000000000000041
+:103F80000000000000000000000000000000000031
+:103F90000202020002000000000000000000000019
+:103FA0000000000000000000000000000001000010
+:103FB0000000000000000000000000000000000001
+:103FC00000000000000000000000000000000000F1
+:103FD00000000000000000000000000000000000E1
+:103FE00000000000000000000000000000000001D0
+:103FF00001010101010101010101010101010100B2
+:1040000000000000000000000000000000000000B0
+:1040100000000000000000000000000000000000A0
+:104020000000000000000000000000000000000090
+:10403000000000000000000000000000000000017F
+:104040000101010101010101010101010101010061
+:104050000000000000000000000000000000000060
+:104060000000000000000000000000000000000050
+:104070000000000000000000000000000000000040
+:104080000000000000000000000000000000000030
+:10409000020000000200000000000000000000001C
+:1040A000000000000000000000000000000100000F
+:1040B0000000000000000000000000000000000000
+:1040C00000000000000000000000000000000000F0
+:1040D00000000000000000000000000000000000E0
+:1040E00000000000000000000000000000000001CF
+:1040F00001010101010101010101010101010100B1
+:1041000000000000000000000000000000000000AF
+:10411000000000000000000000000000000000009F
+:10412000000000000000000000000000000000008F
+:10413000000000000000000000000000000000017E
+:104140000101010101010101010101010101010060
+:10415000000000000000000000000000000000005F
+:10416000000000000000000000000000000000004F
+:10417000000000000000000000000000000000003F
+:10418000000000000000000000000000000000002F
+:10419000020000000000000000000000000000001D
+:1041A000000000000000000000000000000100000E
+:1041B00000000000000000000000000000000000FF
+:1041C00000000000000000000000000000000000EF
+:1041D00000000000000000000000000000000000DF
+:1041E00000000000000000000000000000000001CE
+:1041F00001010101010101010101010101010100B0
+:1042000000000000000000000000000000000000AE
+:10421000000000000000000000000000000000009E
+:10422000000000000000000000000000000000008E
+:10423000000000000000000000000000000000027C
+:104240000202020202020202020202020202020050
+:10425000000000000000000000000000000000005E
+:10426000000000000000000000000000000000004E
+:10427000000000000000000000000000000000003E
+:10428000000000000000000000000000000000002E
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000000000E
+:1042B00000000000000000000000000000000000FE
+:1042C00000000000000000000000000000000000EE
+:1042D00000000000000000000000000000000000DE
+:1042E00000000000000000000000000000000002CC
+:1042F00002020202020202020202020202020200A0
+:1043000000000000000000000000000000000000AD
+:10431000000000000000000000000000000000009D
+:10432000000000000000000000000000000000008D
+:10433000000000000000000000000000000000027B
+:10434000020202020202020202020202020202004F
+:10435000000000000000000000000000000000005D
+:10436000000000000000000000000000000000004D
+:10437000000000000000000000000000000000003D
+:10438000000000000000000000000000000000002D
+:10439000000000000000000000000000000000001D
+:1043A000000000000000000000000000000000000D
+:1043B00000000000000000000000000000000000FD
+:1043C00000000000000000000000000000000000ED
+:1043D00000000000000000000000000000000000DD
+:1043E00000000000000000000000000000000000CD
+:1043F00000000000000000000000000000000000BD
+:1044000000000000000000000000000000000000AC
+:10441000000000000000000000000000000000009C
+:10442000000000000000000000000000000000008C
+:10443000000000000000000000000000000000007C
+:10444000000000000000000000000000000000006C
+:10445000000000000000000000000000000000005C
+:10446000000000000000000000000000000000004C
+:10447000000000000000000000000000000000003C
+:10448000000000000000000000000000000000002C
+:104490000000000000000000000000000000001EFE
+:1044A0000000000000000001010101010101010103
+:1044B00001010101010101000000000000000000F5
+:1044C00000000000000000000000000000000000EC
+:1044D00000000000000000000000000000000000DC
+:1044E00000000000000000000000000000000000CC
+:1044F00000000000000000000000000000010001BA
+:1045000000000000000101000000000000000000A9
+:10451000000000000000000000000000000000009B
+:10452000000000000000000000000000000000008B
+:10453000000000000000000000000000000000007B
+:10454000000000000000000000000000000001006A
+:10455000000100000000000000000000000000005A
+:10456000000000000000000000000000000000004B
+:10457000000000000000000000000000000000003B
+:10458000000000000000000000000000000000002B
+:104590000000000000000002010101010101010111
+:1045A00001010101010101010101010101010101FB
+:1045B00001010101010101000000000000000000F4
+:1045C00000000000000000000000000000000000EB
+:1045D00000000000000000000000000000000000DB
+:1045E00000000000000000000000000000000000CB
+:1045F00000000000000000000000000001010101B7
+:1046000000000000000101000000000000000000A8
+:10461000000000000000000000000000000000009A
+:10462000000000000000000000000000000000008A
+:10463000000000000000000000000000000000007A
+:104640000000000000000000010000000001010166
+:104650000101000100010100000000000000000055
+:10466000000000000000000000000000000000004A
+:10467000000000000000000000000000000000003A
+:10468000000000000000000000000000000000002A
+:104690000000000000000002010101010101010110
+:1046A00001010101010101020101010101010101F9
+:1046B00001010101010101000000000000000000F3
+:1046C00000000000000000000000000000000000EA
+:1046D00000000000000000000000000000000000DA
+:1046E00000000000000000000000000000000000CA
+:1046F00000000000000000000000000001010101B6
+:1047000002000000000101000000000000000000A5
+:104710000000000000000000000000000000000099
+:104720000000000000000000000000000000000089
+:104730000000000000000000000000000000000079
+:104740000000000000000000010000000001010165
+:104750000101010100010100000000000000000053
+:104760000000000000000000000000000000000049
+:104770000000000000000000000000000000000039
+:104780000000000000000000000000000000000029
+:10479000000000000000000201010101010101010F
+:1047A00001010101010101020101010101010101F8
+:1047B00001010101010101000000000000000000F2
+:1047C00000000000000000000000000000000000E9
+:1047D00000000000000000000000000000000000D9
+:1047E00000000000000000000000000000000000C9
+:1047F00000000000000000000000000001010101B5
+:1048000001010200000101000000000000000000A2
+:104810000000000000000000000000000000000098
+:104820000000000000000000000000000000000088
+:104830000000000000000000000000000000000078
+:104840000000000000000000010100000001010163
+:104850000101010100010100000000000000000052
+:104860000000000000000000000000000000000048
+:104870000000000000000000000000000000000038
+:104880000000000000000000000000000000000028
+:10489000000000000000000201010101010101010E
+:1048A00001010101010101020101010101010101F7
+:1048B00001010101010101000000000000000000F1
+:1048C00000000000000000000000000000000000E8
+:1048D00000000000000000000000000000000000D8
+:1048E00000000000000000000000000000000000C8
+:1048F00000000000000000000100000001010101B3
+:10490000010101020201010000000000000000009E
+:104910000000000000000000000000000000000097
+:104920000000000000000000000000000000000087
+:104930000000000000000000000000000000000077
+:104940000000000000000000010101000001010161
+:104950000101010100010100000000000000000051
+:104960000000000000000000000000000000000047
+:104970000000000000000000000000000000000037
+:104980000000000000000000000000000000000027
+:104990000000000000000002000101010000000111
+:1049A00001010101010101020101010101020101F5
+:1049B00001010101010101000000000000000000F0
+:1049C00000000000000000000000000000000000E7
+:1049D00000000000000000000000000000000000D7
+:1049E00000000000000000000000000000000000C7
+:1049F00000000000000000000100000001010101B2
+:104A0000010101010101010000000000000000009F
+:104A10000000000000000000000000000000000096
+:104A20000000000000000000000000000000000086
+:104A30000000000000000000000000000000000076
+:104A4000000000000000000201010100000101015E
+:104A5000010101010101010000000000000000004F
+:104A60000000000000000000000000000000000046
+:104A70000000000000000000000000000000000036
+:104A80000000000000000000000000000000000026
+:104A90000000000000000002000001000000000112
+:104AA00000000001010101020202010102020101F4
+:104AB00001010101010101000000000000000000EF
+:104AC00000000000000000000000000000000000E6
+:104AD00000000000000000000000000000000000D6
+:104AE00000000000000000000000000000000000C6
+:104AF00000000000000000000101000001010101B0
+:104B0000010101010101010000000000000000009E
+:104B10000000000000000000000000000000000095
+:104B20000000000000000000000000000000000085
+:104B30000000000000000000000000000000000075
+:104B4000000000000000000202010101000101015B
+:104B5000010101010101010000000000000000004E
+:104B60000000000000000000000000000000000045
+:104B70000000000000000000000000000000000035
+:104B80000000000000000000000000000000000025
+:104B90000000000000000002000000000000000013
+:104BA00000000000000101020202010102020201F4
+:104BB00001010101010101000000000000000000EE
+:104BC00000000000000000000000000000000000E5
+:104BD00000000000000000000000000000000000D5
+:104BE00000000000000000000000000000000000C5
+:104BF00000000000000000000101000001010101AF
+:104C0000010101010101010000000000000000009D
+:104C10000000000000000000000000000000000094
+:104C20000000000000000000000000000000000084
+:104C30000000000000000000000000000000000074
+:104C4000000000000000000202010101000101015A
+:104C5000010101010101010000000000000000004D
+:104C60000000000000000000000000000000000044
+:104C70000000000000000000000000000000000034
+:104C80000000000000000000000000000000000024
+:104C90000000000000000002000000000000000012
+:104CA00000000000000102020202020202020201F0
+:104CB00001010201010101000000000000000000EC
+:104CC00000000000000000000000000000000000E4
+:104CD00000000000000000000000000000000000D4
+:104CE00000000000000000000000000000000000C4
+:104CF00000000000000000000101000002020101AC
+:104D0000010101010101010000000000000000009C
+:104D10000000000000000000000000000000000093
+:104D20000000000000000000000000000000000083
+:104D30000000000000000000000000000000000073
+:104D40000000000000000002020201010002020156
+:104D5000010101010101010000000000000000004C
+:104D60000000000000000000000000000000000043
+:104D70000000000000000000000000000000000033
+:104D80000000000000000000000000000000000023
+:104D90000000000000000002000000000000000011
+:104DA00000000000000002020202020202020202EF
+:104DB00002020201010101000000000000000000E9
+:104DC00000000000000000000000000000000000E3
+:104DD00000000000000000000000000000000000D3
+:104DE00000000000000000000000000000000000C3
+:104DF00000000000000000020201010002020202A5
+:104E0000010101010101010000000000000000009B
+:104E10000000000000000000000000000000000092
+:104E20000000000000000000000000000000000082
+:104E30000000000000000000000000000000000072
+:104E40000000000000000002020202010002020253
+:104E50000202010101010100000000000000000049
+:104E60000000000000000000000000000000000042
+:104E70000000000000000000000000000000000032
+:104E80000000000000000000000000000000000022
+:104E90000000000000000002000000000000000010
+:104EA00000020000000002020202020202020202EC
+:104EB00002020202020101000000000000000000E6
+:104EC00000000000000000000000000000000000E2
+:104ED00000000000000000000000000000000000D2
+:104EE00000000000000000000000000000000000C2
+:104EF00000000000000000020201010002020202A4
+:104F0000010101010101010000000000000000009A
+:104F10000000000000000000000000000000000091
+:104F20000000000000000000000000000000000081
+:104F30000000000000000000000000000000000071
+:104F40000000000000000002020202020002020251
+:104F50000202020201010100000000000000000046
+:104F60000000000000000000000000000000000041
+:104F70000000000000000000000000000000000031
+:104F80000000000000000000000000000000000021
+:104F9000000000000000000202000000000000000D
+:104FA00000020000000002020202020202020202EB
+:104FB00002020202020101000000000000000000E5
+:104FC00000000000000000000000000000000000E1
+:104FD00000000000000000000000000000000000D1
+:104FE00000000000000000000000000000000000C1
+:104FF00000000000000000020202010102020202A1
+:105000000202010101020200000000000000000095
+:105010000000000000000000000000000000000090
+:105020000000000000000000000000000000000080
+:105030000000000000000000000000000000000070
+:105040000000000000000002020202020002020250
+:105050000202020201020200000000000000000043
+:105060000000000000000000000000000000000040
+:105070000000000000000000000000000000000030
+:105080000000000000000000000000000000000020
+:10509000000000000000000202020000000000000A
+:1050A00000020000000202020202020202010202E9
+:1050B00002020202020101000000000000000000E4
+:1050C00000000000000000000000000000000000E0
+:1050D00000000000000000000000000000000000D0
+:1050E00000000000000000000000000000000000C0
+:1050F00000000000000000020202010102020202A0
+:105100000202020101020200000000000000000093
+:10511000000000000000000000000000000000008F
+:10512000000000000000000000000000000000007F
+:10513000000000000000000000000000000000006F
+:10514000000000000000000202020202010202024E
+:105150000202020202020200000000000000000041
+:10516000000000000000000000000000000000003F
+:10517000000000000000000000000000000000002F
+:10518000000000000000000000000000000000001F
+:105190000000000000000002020200000202020003
+:1051A00000020000000202010202020202010202E9
+:1051B00002020202020201000000000000000000E2
+:1051C00000000000000000000000000000000000DF
+:1051D00000000000000000000000000000000000CF
+:1051E00000000000000000000000000000000000BF
+:1051F000000000000000000202020201020202029E
+:105200000202020202020200000000000000000090
+:10521000000000000000000000000000000000008E
+:10522000000000000000000000000000000000007E
+:10523000000000000000000000000000000000006E
+:10524000000000000000000202020202020202024C
+:105250000202020202020200000000000000000040
+:10526000000000000000000000000000000000003E
+:10527000000000000000000000000000000000002E
+:10528000000000000000000000000000000000001E
+:105290000000000000000002020200020202020000
+:1052A00002020200000202010201020201010202E6
+:1052B00002020202020201000000000000000000E1
+:1052C00000000000000000000000000000000000DE
+:1052D00000000000000000000000000000000000CE
+:1052E00000000000000000000000000000000000BE
+:1052F000000000000000000202020202020202029C
+:10530000020202020202020000000000000000008F
+:10531000000000000000000000000000000000008D
+:10532000000000000000000000000000000000007D
+:10533000000000000000000000000000000000006D
+:10534000000000000000000202020202020202024B
+:10535000020202020202020000000000000000003F
+:10536000000000000000000000000000000000003D
+:10537000000000000000000000000000000000002D
+:10538000000000000000000000000000000000001D
+:1053900000000000000000020202020202020202FB
+:1053A00002020202020200010201020201010102E4
+:1053B00002020102020200000000000000000000E2
+:1053C00000000000000000000000000000000000DD
+:1053D00000000000000000000000000000000000CD
+:1053E00000000000000000000000000000000000BD
+:1053F000000000000000000202020202020202029B
+:10540000020202020202020000000000000000008E
+:10541000000000000000000000000000000000008C
+:10542000000000000000000000000000000000007C
+:10543000000000000000000000000000000000006C
+:10544000000000000000000202020202020202024A
+:10545000020202020202020000000000000000003E
+:10546000000000000000000000000000000000003C
+:10547000000000000000000000000000000000002C
+:10548000000000000000000000000000000000001C
+:1054900000000000000000000202020202020202FC
+:1054A00002020202020200010101020201010102E4
+:1054B00002010102020200000000000000000000E2
+:1054C00000000000000000000000000000000000DC
+:1054D00000000000000000000000000000000000CC
+:1054E00000000000000000000000000000000000BC
+:1054F000000000000000000202020202020202029A
+:10550000020202020202020000000000000000008D
+:10551000000000000000000000000000000000008B
+:10552000000000000000000000000000000000007B
+:10553000000000000000000000000000000000006B
+:105540000000000000000002020202020202020249
+:10555000020202020202020000000000000000003D
+:10556000000000000000000000000000000000003B
+:10557000000000000000000000000000000000002B
+:10558000000000000000000000000000000000001B
+:1055900000000000000000000202020202020202FB
+:1055A00002020202020200010101020201010102E3
+:1055B00002010102010200000000000000000000E2
+:1055C00000000000000000000000000000000000DB
+:1055D00000000000000000000000000000000000CB
+:1055E00000000000000000000000000000000000BB
+:1055F0000000000000000002020202020202020299
+:10560000020202020202020000000000000000008C
+:10561000000000000000000000000000000000008A
+:10562000000000000000000000000000000000007A
+:10563000000000000000000000000000000000006A
+:105640000000000000000002020202020202020248
+:10565000020202020202020000000000000000003C
+:10566000000000000000000000000000000000003A
+:10567000000000000000000000000000000000002A
+:10568000000000000000000000000000000000001A
+:1056900000000000000000000202020202020202FA
+:1056A00002000202020200010101010101010101E7
+:1056B00001010101010200000000000000000000E3
+:1056C00000000000000000000000000000000000DA
+:1056D00000000000000000000000000000000000CA
+:1056E00000000000000000000000000000000000BA
+:1056F0000000000000000002020202020202020298
+:10570000020202020202020000000000000000008B
+:105710000000000000000000000000000000000089
+:105720000000000000000000000000000000000079
+:105730000000000000000000000000000000000069
+:105740000000000000000002020202020202020247
+:10575000020202020202020000000000000000003B
+:105760000000000000000000000000000000000039
+:105770000000000000000000000000000000000029
+:105780000000000000000000000000000000000019
+:1057900000000000000000000202020202020202F9
+:1057A00002000202020200010101010101010101E6
+:1057B00001010101010200000000000000000000E2
+:1057C00000000000000000000000000000000000D9
+:1057D00000000000000000000000000000000000C9
+:1057E00000000000000000000000000000000000B9
+:1057F0000000000000000002020202020202020297
+:10580000020202020202020000000000000000008A
+:105810000000000000000000000000000000000088
+:105820000000000000000000000000000000000078
+:105830000000000000000000000000000000000068
+:105840000000000000000001020202020202020247
+:10585000020202020202020000000000000000003A
+:105860000000000000000000000000000000000038
+:105870000000000000000000000000000000000028
+:105880000000000000000000000000000000000018
+:1058900000000000000000000202020202020202F8
+:1058A00002000202020000010101010101010101E7
+:1058B00001010101010100000000000000000000E2
+:1058C00000000000000000000000000000000000D8
+:1058D00000000000000000000000000000000000C8
+:1058E00000000000000000000000000000000000B8
+:1058F0000000000000000002020202020202020296
+:105900000202020202020200000000000000000089
+:105910000000000000000000000000000000000087
+:105920000000000000000000000000000000000077
+:105930000000000000000000000000000000000067
+:10594000000000000000000101010101010202024B
+:105950000202020202020200000000000000000039
+:105960000000000000000000000000000000000037
+:105970000000000000000000000000000000000027
+:105980000000000000000000000000000000000017
+:1059900000000000000000000202020202020202F7
+:1059A00002000202020000010101010101010101E6
+:1059B00001010101010100000000000000000000E1
+:1059C00000000000000000000000000000000000D7
+:1059D00000000000000000000000000000000000C7
+:1059E00000000000000000000000000000000000B7
+:1059F0000000000000000002020202020101010199
+:105A0000010101010101010000000000000000008F
+:105A10000000000000000000000000000000000086
+:105A20000000000000000000000000000000000076
+:105A30000000000000000000000000000000000066
+:105A4000000000000000000202020202020000004A
+:105A50000000000000000000000000000000000046
+:105A60000000000000000000000000000000000036
+:105A70000000000000000000000000000000000026
+:105A80000000000000000000000000000000000016
+:105A900000000000000000000202020202020002F8
+:105AA00002000002020000000101010101010101E8
+:105AB00001010101010100000000000000000000E0
+:105AC00000000000000000000000000000000000D6
+:105AD00000000000000000000000000000000000C6
+:105AE00000000000000000000000000000000000B6
+:105AF000000000000000000101010101010101019D
+:105B0000010101010101010000000000000000008E
+:105B10000000000000000000000000000000000085
+:105B20000000000000000000000000000000000075
+:105B30000000000000000000000000000000000065
+:105B40000000000000000002000000000001010150
+:105B5000010101010101010000000000000000003E
+:105B60000000000000000000000000000000000035
+:105B70000000000000000000000000000000000025
+:105B80000000000000000000000000000000000015
+:105B900000000000000000000202020202000002F9
+:105BA00000000000000000000100010101000101EF
+:105BB00001010101010100000000000000000000DF
+:105BC00000000000000000000000000000000000D5
+:105BD00000000000000000000000000000000000C5
+:105BE00000000000000000000000000000000000B5
+:105BF000000000000000000101010101010101019C
+:105C0000010101010101010000000000000000008D
+:105C10000000000000000000000000000000000084
+:105C20000000000000000000000000000000000074
+:105C30000000000000000000000000000000000064
+:105C4000000000000000000101010101010101014B
+:105C5000010101010101010000000000000000003D
+:105C60000000000000000000000000000000000034
+:105C70000000000000000000000000000000000024
+:105C80000000000000000000000000000000000014
+:105C900000000000000000000202020200000002FA
+:105CA00000000000000000000100010100000101EF
+:105CB00001010101010100000000000000000000DE
+:105CC00000000000000000000000000000000000D4
+:105CD00000000000000000000000000000000000C4
+:105CE00000000000000000000000000000000000B4
+:105CF000000000000000000101010101010101019B
+:105D0000010101010101010000000000000000008C
+:105D10000000000000000000000000000000000083
+:105D20000000000000000000000000000000000073
+:105D30000000000000000000000000000000000063
+:105D4000000000000000000101010101010101014A
+:105D5000010101010101010000000000000000003C
+:105D60000000000000000000000000000000000033
+:105D70000000000000000000000000000000000023
+:105D80000000000000000000000000000000000013
+:105D900000000000000000000000020200000000FF
+:105DA00000000000000000000000010100000101EF
+:105DB00001010101010100000000000000000000DD
+:105DC00000000000000000000000000000000000D3
+:105DD00000000000000000000000000000000000C3
+:105DE00000000000000000000000000000000000B3
+:105DF000000000000000000101010101010101019A
+:105E0000010101010101010000000000000000008B
+:105E10000000000000000000000000000000000082
+:105E20000000000000000000000000000000000072
+:105E30000000000000000000000000000000000062
+:105E40000000000000000001010101010101010149
+:105E5000010101010101010000000000000000003B
+:105E60000000000000000000000000000000000032
+:105E70000000000000000000000000000000000022
+:105E80000000000000000000000000000000000012
+:105E90000000000000000000000002000000000000
+:105EA00000000000000000000000010100000001EF
+:105EB00001000001010100000000000000000000DE
+:105EC00000000000000000000000000000000000D2
+:105ED00000000000000000000000000000000000C2
+:105EE00000000000000000000000000000000000B2
+:105EF0000000000000000001010101010101010199
+:105F0000010101010101010000000000000000008A
+:105F10000000000000000000000000000000000081
+:105F20000000000000000000000000000000000071
+:105F30000000000000000000000000000000000061
+:105F40000000000000000001010101010101010148
+:105F5000010101010101010000000000000000003A
+:105F60000000000000000000000000000000000031
+:105F70000000000000000000000000000000000021
+:105F80000000000000000000000000000000000011
+:105F900000000000000000000000020000000000FF
+:105FA00000000000000000000000010100000001EE
+:105FB00001000001000100000000000000000000DE
+:105FC00000000000000000000000000000000000D1
+:105FD00000000000000000000000000000000000C1
+:105FE00000000000000000000000000000000000B1
+:105FF0000000000000000001010101010101010198
+:106000000101010101010100000000000000000089
+:106010000000000000000000000000000000000080
+:106020000000000000000000000000000000000070
+:106030000000000000000000000000000000000060
+:10604000000000000000000202020202020202023E
+:106050000202020202020200000000000000000032
+:106060000000000000000000000000000000000030
+:106070000000000000000000000000000000000020
+:106080000000000000000000000000000000000010
+:106090000000000000000000000000000000000000
+:1060A00000000000000000000000000000000001EF
+:1060B00001000001000100000000000000000000DD
+:1060C00000000000000000000000000000000000D0
+:1060D00000000000000000000000000000000000C0
+:1060E00000000000000000000000000000000000B0
+:1060F000000000000000000202020202020202028E
+:106100000202020202020200000000000000000081
+:10611000000000000000000000000000000000007F
+:10612000000000000000000000000000000000006F
+:10613000000000000000000000000000000000005F
+:10614000000000000000000202020202020202023D
+:106150000202020202020200000000000000000031
+:10616000000000000000000000000000000000002F
+:10617000000000000000000000000000000000001F
+:10618000000000000000000000000000000000000F
+:1061900000000000000000000000000000000000FF
+:1061A00000000000000000000000000000000000EF
+:1061B00000000000000000000000000000000000DF
+:1061C00000000000000000000000000000000000CF
+:1061D00000000000000000000000000000000000BF
+:1061E00000000000000000000000000000000000AF
+:1061F000000000000000000000000000000000009F
+:10620000000000000000000000000000000000008E
+:10621000000000000000000000000000000000007E
+:10622000000000000000000000000000000000006E
+:10623000000000000000000000000000000000005E
+:10624000000000000000000000000000000000004E
+:10625000000000000000000000000000000000003E
+:10626000000000000000000000000000000000002E
+:10627000000000000000000000000000000000001E
+:10628000000000000000000000000000000000000E
+:1062900000000000000000000000000000000000FE
+:1062A000000000000000001E0000000000000001CF
+:1062B00001010101010101010101010101010100CF
+:1062C00000000000000000000000000000000000CE
+:1062D00000000000000000000000000000000000BE
+:1062E00000000000000000000000000000000000AE
+:1062F000000000000000000000000000000000009E
+:106300000001010001000000000000000000010089
+:10631000000000000000000000000000000000007D
+:10632000000000000000000000000000000000006D
+:10633000000000000000000000000000000000005D
+:10634000000000000000000000000000000000004D
+:10635000000000000000000000000000000000003D
+:10636000000000000000000000000000000000002D
+:10637000000000000000000000000000000000001D
+:10638000000000000000000000000000000000000D
+:1063900000000000000000000000000000000002FB
+:1063A00001010101010101010101010101010101DD
+:1063B00001010101010101010101010101010100CE
+:1063C00000000000000000000000000000000000CD
+:1063D00000000000000000000000000000000000BD
+:1063E00000000000000000000000000000000000AD
+:1063F000000000000000000000000000000000009D
+:106400000001010101010000000002000101010082
+:10641000000000000000000000000000000000007C
+:10642000000000000000000000000000000000006C
+:10643000000000000000000000000000000000005C
+:10644000000000000000000000000000000000004C
+:10645000000000000000000000000000000000003C
+:10646000000000000000000000000000000000002C
+:10647000000000000000000000000000000000001C
+:10648000000000000000000000000000000000000C
+:1064900000000000000000000000000000000002FA
+:1064A00001010101010101010101010101010102DB
+:1064B00001010101010101010101010101010100CD
+:1064C00000000000000000000000000000000000CC
+:1064D00000000000000000000000000000000000BC
+:1064E00000000000000000000000000000000000AC
+:1064F000000000000000000000000000000000009C
+:106500000001010101010000000002000101010081
+:10651000000000000000000000000000000000007B
+:10652000000000000000000000000000000000006B
+:10653000000000000000000000000000000000005B
+:10654000000000000000000000000000000000004B
+:106550000101000100000000000000000000000038
+:10656000000000000000000000000000000000002B
+:10657000000000000000000000000000000000001B
+:10658000000000000000000000000000000000000B
+:1065900000000000000000000000000000000002F9
+:1065A00001010101010101010101010101010102DA
+:1065B00001010101010101010101010101010100CC
+:1065C00000000000000000000000000000000000CB
+:1065D00000000000000000000000000000000000BB
+:1065E00000000000000000000000000000000000AB
+:1065F000000000000000000000000000000000009B
+:106600000001010101010000000001000101010081
+:10661000000000000000000000000000000000007A
+:10662000000000000000000000000000000000006A
+:10663000000000000000000000000000000000005A
+:10664000000000000000000000000000000000004A
+:106650000101000100000000000000000000000037
+:10666000000000000000000000000000000000002A
+:10667000000000000000000000000000000000001A
+:10668000000000000000000000000000000000000A
+:1066900000000000000000000000000000000002F8
+:1066A00000010101010101010101010101010102DA
+:1066B00002020101010101010101010101010100C9
+:1066C00000000000000000000000000000000000CA
+:1066D00000000000000000000000000000000000BA
+:1066E00000000000000000000000000000000000AA
+:1066F0000000000000000000000000000000000199
+:106700000001010101010000000001000101010080
+:106710000000000000000000000000000000000079
+:106720000000000000000000000000000000000069
+:106730000000000000000000000000000000000059
+:106740000000000000000000000000000000000049
+:106750000101010101000000000000000000010033
+:106760000000000000000000000000000000000029
+:106770000000000000000000000000000000000019
+:106780000000000000000000000000000000000009
+:1067900000000000000000000000000000000002F7
+:1067A00000010101010101010101010101010102D9
+:1067B00002020201010101010101010101010100C7
+:1067C00000000000000000000000000000000000C9
+:1067D00000000000000000000000000000000000B9
+:1067E00000000000000000000000000000000000A9
+:1067F0000000000000000000000000000000000198
+:10680000000101010101000000000100010101007F
+:106810000000000000000000000000000000000078
+:106820000000000000000000000000000000000068
+:106830000000000000000000000000000000000058
+:106840000000000000000000000000000000000048
+:10685000010101010101000000000000010101002F
+:106860000000000000000000000000000000000028
+:106870000000000000000000000000000000000018
+:106880000000000000000000000000000000000008
+:1068900000000000000000000000000000000002F6
+:1068A00000000001000000010000000001010102E1
+:1068B00002020201010102010101010101010100C5
+:1068C00000000000000000000000000000000000C8
+:1068D00000000000000000000000000000000000B8
+:1068E00000000000000000000000000000000000A8
+:1068F0000000000000000000000000000000000296
+:10690000000101010101000000000100010101007E
+:106910000000000000000000000000000000000077
+:106920000000000000000000000000000000000067
+:106930000000000000000000000000000000000057
+:106940000000000000000000000000000000000047
+:10695000010101010101000000000000010101002E
+:106960000000000000000000000000000000000027
+:106970000000000000000000000000000000000017
+:106980000000000000000000000000000000000007
+:1069900000000000000000000000000000000002F5
+:1069A00000000000000000000000000001010102E2
+:1069B00002020202020102020201010101010100C0
+:1069C00000000000000000000000000000000000C7
+:1069D00000000000000000000000000000000000B7
+:1069E00000000000000000000000000000000000A7
+:1069F0000000000000000000000000000000000295
+:106A0000010201010101000000000100010101007B
+:106A10000000000000000000000000000000000076
+:106A20000000000000000000000000000000000066
+:106A30000000000000000000000000000000000056
+:106A40000000000000000000000000000000000046
+:106A5000010101010101000000010000010101002C
+:106A60000000000000000000000000000000000026
+:106A70000000000000000000000000000000000016
+:106A80000000000000000000000000000000000006
+:106A900000000000000000000000000000000002F4
+:106AA00000000000000000000000000001000102E2
+:106AB00002020202020202020201020101010100BD
+:106AC00000000000000000000000000000000000C6
+:106AD00000000000000000000000000000000000B6
+:106AE00000000000000000000000000000000000A6
+:106AF0000000000000000000000000000000000294
+:106B00000102020102010000000001000101010078
+:106B10000000000000000000000000000000000075
+:106B20000000000000000000000000000000000065
+:106B30000000000000000000000000000000000055
+:106B40000000000000000000000000000000000144
+:106B50000201010101010000000100010101010029
+:106B60000000000000000000000000000000000025
+:106B70000000000000000000000000000000000015
+:106B80000000000000000000000000000000000005
+:106B900000000000000000000000000000000002F3
+:106BA00000000000000000000000000000000102E2
+:106BB00002020202020202020202020201010100BA
+:106BC00000000000000000000000000000000000C5
+:106BD00000000000000000000000000000000000B5
+:106BE00000000000000000000000000000000000A5
+:106BF0000000000000000000000000000000000293
+:106C00000202020202020000000001000101010074
+:106C10000000000000000000000000000000000074
+:106C20000000000000000000000000000000000064
+:106C30000000000000000000000000000000000054
+:106C40000000000000000000000000000000000242
+:106C50000202010101010100000100010101010026
+:106C60000000000000000000000000000000000024
+:106C70000000000000000000000000000000000014
+:106C80000000000000000000000000000000000004
+:106C900000000000000000000000000000000002F2
+:106CA00002000200020202000202020000000002D2
+:106CB00002010102020202020202020201010100BB
+:106CC00000000000000000000000000000000000C4
+:106CD00000000000000000000000000000000000B4
+:106CE00000000000000000000000000000000000A4
+:106CF0000000000000000000000000000000000292
+:106D0000020202020202000002000102010101006F
+:106D10000000000000000000000000000000000073
+:106D20000000000000000000000000000000000063
+:106D30000000000000000000000000000000000053
+:106D40000000000000000000000000000000000241
+:106D50000202010201010101010100010101010022
+:106D60000000000000000000000000000000000023
+:106D70000000000000000000000000000000000013
+:106D80000000000000000000000000000000000003
+:106D900000000000000000000000000000000002F1
+:106DA00002000202020202020202020000000002CD
+:106DB00002010102020202020202020201010100BA
+:106DC00000000000000000000000000000000000C3
+:106DD00000000000000000000000000000000000B3
+:106DE00000000000000000000000000000000000A3
+:106DF0000000000000000000000000000000000291
+:106E0000020202020202000101020101020202006A
+:106E10000000000000000000000000000000000072
+:106E20000000000000000000000000000000000062
+:106E30000000000000000000000000000000000052
+:106E40000000000000000000000000000000000240
+:106E5000020202020201010101010101010101001E
+:106E60000000000000000000000000000000000022
+:106E70000000000000000000000000000000000012
+:106E80000000000000000000000000000000000002
+:106E900000000000000000000000000000000002F0
+:106EA00002020202020202020202020200000202C6
+:106EB00001010102020201020202020202020100B9
+:106EC00000000000000000000000000000000000C2
+:106ED00000000000000000000000000000000000B2
+:106EE00000000000000000000000000000000000A2
+:106EF0000000000000000000000000000000000290
+:106F00000202020202020001010102010202020069
+:106F10000000000000000000000000000000000071
+:106F20000000000000000000000000000000000061
+:106F30000000000000000000000000000000000051
+:106F4000000000000000000000000000000000023F
+:106F5000020202020202010101010101010101001C
+:106F60000000000000000000000000000000000021
+:106F70000000000000000000000000000000000011
+:106F80000000000000000000000000000000000001
+:106F900000000000000000000000000000000002EF
+:106FA00002020202020202020202020200000201C6
+:106FB00001010101020201010202020202020100BA
+:106FC00000000000000000000000000000000000C1
+:106FD00000000000000000000000000000000000B1
+:106FE00000000000000000000000000000000000A1
+:106FF000000000000000000000000000000000028F
+:107000000202020202020101010102010202020067
+:107010000000000000000000000000000000000070
+:107020000000000000000000000000000000000060
+:107030000000000000000000000000000000000050
+:10704000000000000000000000000000000000023E
+:10705000020202020202010101010101010101001B
+:107060000000000000000000000000000000000020
+:107070000000000000000000000000000000000010
+:107080000000000000000000000000000000000000
+:1070900000000000000000000000000000000002EE
+:1070A00002020202020202020202020200020201C3
+:1070B00001010101010201010102010202020100BC
+:1070C00000000000000000000000000000000000C0
+:1070D00000000000000000000000000000000000B0
+:1070E00000000000000000000000000000000000A0
+:1070F000000000000000000000000000000000028E
+:107100000202020202020102010102010202020065
+:10711000000000000000000000000000000000006F
+:10712000000000000000000000000000000000005F
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000023D
+:107150000202020202020201010201010202020015
+:10716000000000000000000000000000000000001F
+:10717000000000000000000000000000000000000F
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000002ED
+:1071A00002020202020202020202020202020201C0
+:1071B00001010101010201010102010102020000BD
+:1071C00000000000000000000000000000000000BF
+:1071D00000000000000000000000000000000000AF
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000028D
+:107200000202020202020202020102010202020062
+:10721000000000000000000000000000000000006E
+:10722000000000000000000000000000000000005E
+:10723000000000000000000000000000000000004E
+:10724000000000000000000000000000000000023C
+:107250000202020202020202020201020202020011
+:10726000000000000000000000000000000000001E
+:10727000000000000000000000000000000000000E
+:1072800000000000000000000000000000000000FE
+:1072900000000000000000000000000000000000EE
+:1072A00002020202020202020202020202020201BF
+:1072B00001010101010101010101010102020000BE
+:1072C00000000000000000000000000000000000BE
+:1072D00000000000000000000000000000000000AE
+:1072E000000000000000000000000000000000009E
+:1072F000000000000000000000000000000000028C
+:10730000020202020202020202020202020202005F
+:10731000000000000000000000000000000000006D
+:10732000000000000000000000000000000000005D
+:10733000000000000000000000000000000000004D
+:10734000000000000000000000000000000000023B
+:10735000020202020202020202020202020202000F
+:10736000000000000000000000000000000000001D
+:10737000000000000000000000000000000000000D
+:1073800000000000000000000000000000000000FD
+:1073900000000000000000000000000000000000ED
+:1073A00002020202020202020202020202020201BE
+:1073B00001010101010101010101010102020000BD
+:1073C00000000000000000000000000000000000BD
+:1073D00000000000000000000000000000000000AD
+:1073E000000000000000000000000000000000009D
+:1073F000000000000000000000000000000000028B
+:10740000020202020202020202020202020202005E
+:10741000000000000000000000000000000000006C
+:10742000000000000000000000000000000000005C
+:10743000000000000000000000000000000000004C
+:10744000000000000000000000000000000000023A
+:10745000020202020202020202020202020202000E
+:10746000000000000000000000000000000000001C
+:10747000000000000000000000000000000000000C
+:1074800000000000000000000000000000000000FC
+:1074900000000000000000000000000000000000EC
+:1074A00002020202020202020200000202020201C1
+:1074B00001000001010101010101010101010000C0
+:1074C00000000000000000000000000000000000BC
+:1074D00000000000000000000000000000000000AC
+:1074E000000000000000000000000000000000009C
+:1074F000000000000000000000000000000000028A
+:10750000020202020202020202020202020202005D
+:10751000000000000000000000000000000000006B
+:10752000000000000000000000000000000000005B
+:10753000000000000000000000000000000000004B
+:107540000000000000000000000000000000000239
+:10755000020202020202020202020202020202000D
+:10756000000000000000000000000000000000001B
+:10757000000000000000000000000000000000000B
+:1075800000000000000000000000000000000000FB
+:1075900000000000000000000000000000000000EB
+:1075A00002020202020202020000000002020201C4
+:1075B00001000001010101010101010101010000BF
+:1075C00000000000000000000000000000000000BB
+:1075D00000000000000000000000000000000000AB
+:1075E000000000000000000000000000000000009B
+:1075F0000000000000000000000000000000000289
+:10760000020202020202020202020202020202005C
+:10761000000000000000000000000000000000006A
+:10762000000000000000000000000000000000005A
+:10763000000000000000000000000000000000004A
+:107640000000000000000000000000000000000238
+:10765000020202020202020202020202020202000C
+:10766000000000000000000000000000000000001A
+:10767000000000000000000000000000000000000A
+:1076800000000000000000000000000000000000FA
+:1076900000000000000000000000000000000000EA
+:1076A00002020202020000020000000002020201C7
+:1076B00000000001010101010101010101010000BF
+:1076C00000000000000000000000000000000000BA
+:1076D00000000000000000000000000000000000AA
+:1076E000000000000000000000000000000000009A
+:1076F0000000000000000000000000000000000288
+:10770000020202020202020002020202020202005D
+:107710000000000000000000000000000000000069
+:107720000000000000000000000000000000000059
+:107730000000000000000000000000000000000049
+:107740000000000000000000000000000000000237
+:10775000020202020202020202020202020202000B
+:107760000000000000000000000000000000000019
+:107770000000000000000000000000000000000009
+:1077800000000000000000000000000000000000F9
+:1077900000000000000000000000000000000000E9
+:1077A00002020202000000000000000002020001CC
+:1077B00000000000010101010101010101010000BF
+:1077C00000000000000000000000000000000000B9
+:1077D00000000000000000000000000000000000A9
+:1077E0000000000000000000000000000000000099
+:1077F0000000000000000000000000000000000287
+:107800000002020200000000000000000000000072
+:107810000000000000000000000000000000000068
+:107820000000000000000000000000000000000058
+:107830000000000000000000000000000000000048
+:107840000000000000000000000000000000000236
+:10785000020202020202020202020202020202000A
+:107860000000000000000000000000000000000018
+:107870000000000000000000000000000000000008
+:1078800000000000000000000000000000000000F8
+:1078900000000000000000000000000000000000E8
+:1078A00002020002000000000000000002000000D0
+:1078B00000000000010100010101010101010000BF
+:1078C00000000000000000000000000000000000B8
+:1078D00000000000000000000000000000000000A8
+:1078E0000000000000000000000000000000000098
+:1078F0000000000000000000000000000000000187
+:107900000101010101010101010101010101010068
+:107910000000000000000000000000000000000067
+:107920000000000000000000000000000000000057
+:107930000000000000000000000000000000000047
+:107940000000000000000000000000000000000235
+:107950000202020202020202020202020202020009
+:107960000000000000000000000000000000000017
+:107970000000000000000000000000000000000007
+:1079800000000000000000000000000000000000F7
+:1079900000000000000000000000000000000000E7
+:1079A00002020000000000000000000002000000D1
+:1079B00000000000000100000101010101010000C0
+:1079C00000000000000000000000000000000000B7
+:1079D00000000000000000000000000000000000A7
+:1079E0000000000000000000000000000000000097
+:1079F0000000000000000000000000000000000186
+:107A00000101010101010101010101010101010067
+:107A10000000000000000000000000000000000066
+:107A20000000000000000000000000000000000056
+:107A30000000000000000000000000000000000046
+:107A40000000000000000000000000000000000234
+:107A50000202020000000000000000000000000020
+:107A60000000000000000000000000000000000016
+:107A70000000000000000000000000000000000006
+:107A800000000000000000000000000000000000F6
+:107A900000000000000000000000000000000000E6
+:107AA00000020000000000000000000000000000D4
+:107AB00000000000000100000101000101010000C0
+:107AC00000000000000000000000000000000000B6
+:107AD00000000000000000000000000000000000A6
+:107AE0000000000000000000000000000000000096
+:107AF0000000000000000000000000000000000185
+:107B00000101010101010101010101010101010066
+:107B10000000000000000000000000000000000065
+:107B20000000000000000000000000000000000055
+:107B30000000000000000000000000000000000045
+:107B40000000000000000000000000000000000035
+:107B50000000000000000000000000000000000025
+:107B60000000000000000000000000000000000015
+:107B70000000000000000000000000000000000005
+:107B800000000000000000000000000000000000F5
+:107B900000000000000000000000000000000000E5
+:107BA00000020000000000000000000000000000D3
+:107BB00000000000000100000001000001010000C1
+:107BC00000000000000000000000000000000000B5
+:107BD00000000000000000000000000000000000A5
+:107BE0000000000000000000000000000000000095
+:107BF0000000000000000000000000000000000184
+:107C00000101010101010101010101010101010065
+:107C10000000000000000000000000000000000064
+:107C20000000000000000000000000000000000054
+:107C30000000000000000000000000000000000044
+:107C40000000000000000000000000000000000133
+:107C50000101010101010101010101010101010015
+:107C60000000000000000000000000000000000014
+:107C70000000000000000000000000000000000004
+:107C800000000000000000000000000000000000F4
+:107C900000000000000000000000000000000000E4
+:107CA00000000000000000000000000000000000D4
+:107CB00000000000000000000000000000000000C4
+:107CC00000000000000000000000000000000000B4
+:107CD00000000000000000000000000000000000A4
+:107CE0000000000000000000000000000000000094
+:107CF0000000000000000000000000000000000183
+:107D00000101010101010101010101010101010064
+:107D10000000000000000000000000000000000063
+:107D20000000000000000000000000000000000053
+:107D30000000000000000000000000000000000043
+:107D40000000000000000000000000000000000132
+:107D50000101010101010101010101010101010014
+:107D60000000000000000000000000000000000013
+:107D70000000000000000000000000000000000003
+:107D800000000000000000000000000000000000F3
+:107D900000000000000000000000000000000000E3
+:107DA00000000000000000000000000000000000D3
+:107DB00000000000000000000000000000000000C3
+:107DC00000000000000000000000000000000000B3
+:107DD00000000000000000000000000000000000A3
+:107DE0000000000000000000000000000000000093
+:107DF0000000000000000000000000000000000182
+:107E00000101010101010101010101010101010063
+:107E10000000000000000000000000000000000062
+:107E20000000000000000000000000000000000052
+:107E30000000000000000000000000000000000042
+:107E40000000000000000000000000000000000131
+:107E50000101010101010101010101010101010013
+:107E60000000000000000000000000000000000012
+:107E70000000000000000000000000000000000002
+:107E800000000000000000000000000000000000F2
+:107E900000000000000000000000000000000000E2
+:107EA00000000000000000000000000000000000D2
+:107EB00000000000000000000000000000000000C2
+:107EC00000000000000000000000000000000000B2
+:107ED00000000000000000000000000000000000A2
+:107EE0000000000000000000000000000000000092
+:107EF0000000000000000000000000000000000280
+:107F00000202020202020202020202020202020053
+:107F10000000000000000000000000000000000061
+:107F20000000000000000000000000000000000051
+:107F30000000000000000000000000000000000041
+:107F4000000000000000000000000000000000022F
+:107F50000202020202020202020202020202020003
+:107F60000000000000000000000000000000000011
+:107F70000000000000000000000000000000000001
+:107F800000000000000000000000000000000000F1
+:107F900000000000000000000000000000000000E1
+:107FA00000000000000000000000000000000000D1
+:107FB00000000000000000000000000000000000C1
+:107FC00000000000000000000000000000000000B1
+:107FD00000000000000000000000000000000000A1
+:107FE0000000000000000000000000000000000091
+:107FF0000000000000000000000000000000000081
+:108000000000000000000000000000000000000070
+:108010000000000000000000000000000000000060
+:108020000000000000000000000000000000000050
+:108030000000000000000000000000000000000040
+:108040000000000000000000000000000000000030
+:108050000000000000000000000000000000000020
+:108060000000000000000000000000000000000010
+:108070000000000000000000000000000000000000
+:1080800000000000000000000000000000000000F0
+:1080900000000000000000000000000000000000E0
+:1080A0000000000000000000000000000000001EB2
+:1080B00000000000000000010101010101010101B7
+:1080C00001010101010101000000000000000000A9
+:1080D00000000000000000000000000000000000A0
+:1080E0000000000000000000000000000000000090
+:1080F0000000000000000000000000000000000080
+:10810000000000000000000001010000000000006D
+:10811000000000000000010000000000000000005E
+:10812000000000000000000000000000000000004F
+:10813000000000000000000000000000000000003F
+:10814000000000000000000000000000000000002F
+:10815000000000000000000000000000000000001F
+:10816000000000000000000000000000000000000F
+:1081700000000000000000000000000000000000FF
+:1081800000000000000000000000000000000000EF
+:1081900000000000000000000000000000000000DF
+:1081A00000000000000000000101010101010101C7
+:1081B00001010101010101010101010101010101AF
+:1081C00001010101010101000000000000000000A8
+:1081D000000000000000000000000000000000009F
+:1081E000000000000000000000000000000000008F
+:1081F000000000000000000000000000000000007F
+:10820000000000000000000001010000000000006C
+:10821000000000000000010000000000000000005D
+:10822000000000000000000000000000000000004E
+:10823000000000000000000000000000000000003E
+:10824000000000000000000000000000000000002E
+:10825000000000000000000000000000000000001E
+:10826000000000000000000000000000000000000E
+:1082700000000000000000000000000000000000FE
+:1082800000000000000000000000000000000000EE
+:1082900000000000000000000000000000000000DE
+:1082A00000000000000000000101010101010101C6
+:1082B00001010101010101020101010101010101AD
+:1082C00001010101010101000000000000000000A7
+:1082D000000000000000000000000000000000009E
+:1082E000000000000000000000000000000000008E
+:1082F000000000000000000000000000000000007E
+:10830000000000000000000001010001000000006A
+:10831000000000000000010000000000000000005C
+:10832000000000000000000000000000000000004D
+:10833000000000000000000000000000000000003D
+:10834000000000000000000000000000000000002D
+:10835000000000000000000000000000000000001D
+:10836000000000000000000000000000000000000D
+:1083700000000000000000000000000000000000FD
+:1083800000000000000000000000000000000000ED
+:1083900000000000000000000000000000000000DD
+:1083A00000000000000000000101010101010101C5
+:1083B00001010101010101020101010101010101AC
+:1083C00001010101010101000000000000000000A6
+:1083D000000000000000000000000000000000009D
+:1083E000000000000000000000000000000000008D
+:1083F000000000000000000000000000000000007D
+:108400000000000000000000010101010100000067
+:10841000000000000000010000000000000000005B
+:10842000000000000000000000000000000000004C
+:10843000000000000000000000000000000000003C
+:10844000000000000000000000000000000000002C
+:10845000000000000000000000000000000000001C
+:108460000000010100010000000000000000000009
+:1084700000000000000000000000000000000000FC
+:1084800000000000000000000000000000000000EC
+:1084900000000000000000000000000000000000DC
+:1084A00000000000000000020101010101010101C2
+:1084B00001010101010101020101010101010101AB
+:1084C00001010101010101000000000000000000A5
+:1084D000000000000000000000000000000000009C
+:1084E000000000000000000000000000000000008C
+:1084F000000000000000000000000000000000007C
+:108500000000000000000000010101010100000066
+:10851000000000000000010000000000000000005A
+:10852000000000000000000000000000000000004B
+:10853000000000000000000000000000000000003B
+:10854000000000000000000000000000000000002B
+:108550000000000000000000010100000000000019
+:108560000000010100010100000000000000000007
+:1085700000000000000000000000000000000000FB
+:1085800000000000000000000000000000000000EB
+:1085900000000000000000000000000000000000DB
+:1085A00000000000000000020101010101010101C1
+:1085B00001010101010101020101010101010101AA
+:1085C00001010101010101000000000000000000A4
+:1085D000000000000000000000000000000000009B
+:1085E000000000000000000000000000000000008B
+:1085F000000000000000000000000000000000007B
+:108600000000000000000000010101010100000065
+:108610000000000000000100000000000000000059
+:10862000000000000000000000000000000000004A
+:10863000000000000000000000000000000000003A
+:10864000000000000000000000000000000000002A
+:108650000000000000000000010100000100000017
+:108660000100010101010100000000000000000004
+:1086700000000000000000000000000000000000FA
+:1086800000000000000000000000000000000000EA
+:1086900000000000000000000000000000000000DA
+:1086A00000000000000000020101010101010101C0
+:1086B00001010101010101020201010101010101A8
+:1086C00001010101010101000000000000000000A3
+:1086D000000000000000000000000000000000009A
+:1086E000000000000000000000000000000000008A
+:1086F000000000000000000000000000000000007A
+:108700000000000000000002020101010100010060
+:108710000000000000000100000000000000000058
+:108720000000000000000000000000000000000049
+:108730000000000000000000000000000000000039
+:108740000000000000000000000000000000000029
+:108750000000000000000000010100010100010014
+:108760000100010101010100000000000000000003
+:1087700000000000000000000000000000000000F9
+:1087800000000000000000000000000000000000E9
+:1087900000000000000000000000000000000000D9
+:1087A00000000000000000020001010101010101C0
+:1087B00001010101010101020201010101010101A7
+:1087C00001010101010101000000000000000000A2
+:1087D0000000000000000000000000000000000099
+:1087E0000000000000000000000000000000000089
+:1087F0000000000000000000000000000000000079
+:10880000000000000000000202020101010001005E
+:108810000100000001000100000000000000000055
+:108820000000000000000000000000000000000048
+:108830000000000000000000000000000000000038
+:108840000000000000000000000000000000000028
+:108850000000000000000000010101010100010012
+:108860000100010101010100000000000000000002
+:1088700000000000000000000000000000000000F8
+:1088800000000000000000000000000000000000E8
+:1088900000000000000000000000000000000000D8
+:1088A00000000000000000020000010101010101C0
+:1088B00001000101010101020202020101020102A3
+:1088C00002010101010101000000000000000000A0
+:1088D0000000000000000000000000000000000098
+:1088E0000000000000000000000000000000000088
+:1088F0000000000000000000000000000000000078
+:10890000000000000000000202020101010001005D
+:108910000100000001000100000000000000000054
+:108920000000000000000000000000000000000047
+:108930000000000000000000000000000000000037
+:108940000000000000000000000000000000000027
+:108950000000000000000000010101010100010011
+:108960000100010101010100000000000000000001
+:1089700000000000000000000000000000000000F7
+:1089800000000000000000000000000000000000E7
+:1089900000000000000000000000000000000000D7
+:1089A00000000000000000020000010001010101C0
+:1089B00001000101010101020202020201020102A1
+:1089C000020101010101010000000000000000009F
+:1089D0000000000000000000000000000000000097
+:1089E0000000000000000000000000000000000087
+:1089F0000000000000000000000000000000000077
+:108A0000000000000000000202020202010001005A
+:108A10000100000001010100000000000000000052
+:108A20000000000000000000000000000000000046
+:108A30000000000000000000000000000000000036
+:108A40000000000000000000000000000000000026
+:108A5000000000000000000101010101010101000E
+:108A600001010101010101000000000000000000FF
+:108A700000000000000000000000000000000000F6
+:108A800000000000000000000000000000000000E6
+:108A900000000000000000000000000000000000D6
+:108AA00000000000000000020000000000000000C4
+:108AB000000001010101010202020202020202029F
+:108AC000020101010101010000000000000000009E
+:108AD0000000000000000000000000000000000096
+:108AE0000000000000000000000000000000000086
+:108AF0000000000000000000000000000000000076
+:108B00000000000000000002020202020200010058
+:108B10000100000001010100000000000000000051
+:108B20000000000000000000000000000000000045
+:108B30000000000000000000000000000000000035
+:108B40000000000000000000000000000000000025
+:108B5000000000000000000202010101010101010A
+:108B600001010101010101000000000000000000FE
+:108B700000000000000000000000000000000000F5
+:108B800000000000000000000000000000000000E5
+:108B900000000000000000000000000000000000D5
+:108BA00000000000000000020002000000000000C1
+:108BB000000201010101010202020202020202029C
+:108BC000020201010101010000000000000000009C
+:108BD0000000000000000000000000000000000095
+:108BE0000000000000000000000000000000000085
+:108BF0000000000000000000000000000000000075
+:108C00000000000000000002020202020201010155
+:108C1000010000000101020000000000000000004F
+:108C20000000000000000000000000000000000044
+:108C30000000000000000000000000000000000034
+:108C40000000000000000000000000000000000024
+:108C50000000000000000002020201010101010108
+:108C600001010101010101000000000000000000FD
+:108C700000000000000000000000000000000000F4
+:108C800000000000000000000000000000000000E4
+:108C900000000000000000000000000000000000D4
+:108CA00000000000000000020202000200000000BC
+:108CB000000201010001010202020202020202029C
+:108CC000020202010101010000000000000000009A
+:108CD0000000000000000000000000000000000094
+:108CE0000000000000000000000000000000000084
+:108CF0000000000000000000000000000000000074
+:108D00000000000000000002020202020201020153
+:108D1000010100000101020000000000000000004D
+:108D20000000000000000000000000000000000043
+:108D30000000000000000000000000000000000033
+:108D40000000000000000000000000000000000023
+:108D50000000000000000002020201010101010107
+:108D600001010101010101000000000000000000FC
+:108D700000000000000000000000000000000000F3
+:108D800000000000000000000000000000000000E3
+:108D900000000000000000000000000000000000D3
+:108DA00000000000000000020202020202000200B5
+:108DB000020200000000000202020202020202029D
+:108DC0000202020202010100000000000000000097
+:108DD0000000000000000000000000000000000093
+:108DE0000000000000000000000000000000000083
+:108DF0000000000000000000000000000000000073
+:108E00000000000000000002020202020201020251
+:108E1000020100010101020000000000000000004A
+:108E20000000000000000000000000000000000042
+:108E30000000000000000000000000000000000032
+:108E40000000000000000000000000000000000022
+:108E50000000000000000002020202020201010103
+:108E600001010101010101000000000000000000FB
+:108E700000000000000000000000000000000000F2
+:108E800000000000000000000000000000000000E2
+:108E900000000000000000000000000000000000D2
+:108EA00000000000000000020202020202020202B0
+:108EB000020200000000000102020202020202029D
+:108EC0000102020202020100000000000000000096
+:108ED0000000000000000000000000000000000092
+:108EE0000000000000000000000000000000000082
+:108EF0000000000000000000000000000000000072
+:108F0000000000000000000202020202020202024F
+:108F10000202000102010200000000000000000047
+:108F20000000000000000000000000000000000041
+:108F30000000000000000000000000000000000031
+:108F40000000000000000000000000000000000021
+:108F50000000000000000002020202020201020101
+:108F600002010202010201000000000000000000F6
+:108F700000000000000000000000000000000000F1
+:108F800000000000000000000000000000000000E1
+:108F900000000000000000000000000000000000D1
+:108FA00000000000000000020202020202020202AF
+:108FB000020200000200000102020202020202029A
+:108FC0000102020202020000000000000000000096
+:108FD0000000000000000000000000000000000091
+:108FE0000000000000000000000000000000000081
+:108FF0000000000000000000000000000000000071
+:10900000000000000000000202020202020202024E
+:109010000202010102020200000000000000000044
+:109020000000000000000000000000000000000040
+:109030000000000000000000000000000000000030
+:109040000000000000000000000000000000000020
+:1090500000000000000000020202020202020201FF
+:1090600002010202020202000000000000000000F3
+:1090700000000000000000000000000000000000F0
+:1090800000000000000000000000000000000000E0
+:1090900000000000000000000000000000000000D0
+:1090A00000000000000000020202020202020202AE
+:1090B0000202020202020201020202020202020291
+:1090C0000102020202020000000000000000000095
+:1090D0000000000000000000000000000000000090
+:1090E0000000000000000000000000000000000080
+:1090F0000000000000000000000000000000000070
+:10910000000000000000000202020202020202024D
+:109110000202010102020200000000000000000043
+:10912000000000000000000000000000000000003F
+:10913000000000000000000000000000000000002F
+:10914000000000000000000000000000000000001F
+:1091500000000000000000020202020202020202FD
+:1091600002020202020202000000000000000000F1
+:1091700000000000000000000000000000000000EF
+:1091800000000000000000000000000000000000DF
+:1091900000000000000000000000000000000000CF
+:1091A00000000000000000020202020202020202AD
+:1091B0000202020202020201010202020201020193
+:1091C0000102020202020000000000000000000094
+:1091D000000000000000000000000000000000008F
+:1091E000000000000000000000000000000000007F
+:1091F000000000000000000000000000000000006F
+:10920000000000000000000202020202020202024C
+:109210000202010202020200000000000000000041
+:10922000000000000000000000000000000000003E
+:10923000000000000000000000000000000000002E
+:10924000000000000000000000000000000000001E
+:1092500000000000000000020202020202020202FC
+:1092600002020202020202000000000000000000F0
+:1092700000000000000000000000000000000000EE
+:1092800000000000000000000000000000000000DE
+:1092900000000000000000000000000000000000CE
+:1092A00000000000000000020202020202020202AC
+:1092B0000202020202020201010201020201020193
+:1092C0000102020202020000000000000000000093
+:1092D000000000000000000000000000000000008E
+:1092E000000000000000000000000000000000007E
+:1092F000000000000000000000000000000000006E
+:10930000000000000000000202020202020202024B
+:10931000020202020202020000000000000000003F
+:10932000000000000000000000000000000000003D
+:10933000000000000000000000000000000000002D
+:10934000000000000000000000000000000000001D
+:1093500000000000000000020202020202020202FB
+:1093600002020202020202000000000000000000EF
+:1093700000000000000000000000000000000000ED
+:1093800000000000000000000000000000000000DD
+:1093900000000000000000000000000000000000CD
+:1093A00000000000000000000202020202020202AD
+:1093B0000202020202020201010101010101010196
+:1093C0000101010202020000000000000000000094
+:1093D000000000000000000000000000000000008D
+:1093E000000000000000000000000000000000007D
+:1093F000000000000000000000000000000000006D
+:10940000000000000000000202020202020202004C
+:109410000200020202020200000000000000000040
+:10942000000000000000000000000000000000003C
+:10943000000000000000000000000000000000002C
+:10944000000000000000000000000000000000001C
+:1094500000000000000000020202020202020202FA
+:1094600002020202020202000000000000000000EE
+:1094700000000000000000000000000000000000EC
+:1094800000000000000000000000000000000000DC
+:1094900000000000000000000000000000000000CC
+:1094A00000000000000000000202020202020202AC
+:1094B0000202020202020201010101010101010195
+:1094C0000101010101020000000000000000000095
+:1094D000000000000000000000000000000000008C
+:1094E000000000000000000000000000000000007C
+:1094F000000000000000000000000000000000006C
+:10950000000000000000000102020202020202004C
+:10951000020002020202020000000000000000003F
+:10952000000000000000000000000000000000003B
+:10953000000000000000000000000000000000002B
+:10954000000000000000000000000000000000001B
+:1095500000000000000000020202020202020202F9
+:1095600002020202020202000000000000000000ED
+:1095700000000000000000000000000000000000EB
+:1095800000000000000000000000000000000000DB
+:1095900000000000000000000000000000000000CB
+:1095A00000000000000000000202020202020202AB
+:1095B0000200020202020201010101010101010196
+:1095C0000101010101010000000000000000000095
+:1095D000000000000000000000000000000000008B
+:1095E000000000000000000000000000000000007B
+:1095F000000000000000000000000000000000006B
+:10960000000000000000000202020202020202004A
+:10961000020002020202020000000000000000003E
+:10962000000000000000000000000000000000003A
+:10963000000000000000000000000000000000002A
+:10964000000000000000000000000000000000001A
+:1096500000000000000000020202020202020202F8
+:1096600002020202020202000000000000000000EC
+:1096700000000000000000000000000000000000EA
+:1096800000000000000000000000000000000000DA
+:1096900000000000000000000000000000000000CA
+:1096A00000000000000000000202020202020202AA
+:1096B0000200020202020201010101010101010195
+:1096C0000101010101010000000000000000000094
+:1096D000000000000000000000000000000000008A
+:1096E000000000000000000000000000000000007A
+:1096F000000000000000000000000000000000006A
+:109700000000000000000000010101010101010151
+:109710000101010101010100000000000000000042
+:109720000000000000000000000000000000000039
+:109730000000000000000000000000000000000029
+:109740000000000000000000000000000000000019
+:1097500000000000000000020202020202020202F7
+:1097600002020202020202000000000000000000EB
+:1097700000000000000000000000000000000000E9
+:1097800000000000000000000000000000000000D9
+:1097900000000000000000000000000000000000C9
+:1097A00000000000000000000202020202020202A9
+:1097B0000200020202020201010101010101010194
+:1097C0000101010101010000000000000000000093
+:1097D0000000000000000000000000000000000089
+:1097E0000000000000000000000000000000000079
+:1097F0000000000000000000000000000000000069
+:10980000000000000000000101010101010101014F
+:109810000101010101010100000000000000000041
+:109820000000000000000000000000000000000038
+:109830000000000000000000000000000000000028
+:109840000000000000000000000000000000000018
+:1098500000000000000000020202020202020202F6
+:1098600002020202020202000000000000000000EA
+:1098700000000000000000000000000000000000E8
+:1098800000000000000000000000000000000000D8
+:1098900000000000000000000000000000000000C8
+:1098A00000000000000000000202020202020202A8
+:1098B0000200020202020200010101010101010194
+:1098C0000001010101010000000000000000000093
+:1098D0000000000000000000000000000000000088
+:1098E0000000000000000000000000000000000078
+:1098F0000000000000000000000000000000000068
+:10990000000000000000000101010101010101014E
+:109910000101010101010100000000000000000040
+:109920000000000000000000000000000000000037
+:109930000000000000000000000000000000000027
+:109940000000000000000000000000000000000017
+:1099500000000000000000020202020202020202F5
+:1099600002020202020202000000000000000000E9
+:1099700000000000000000000000000000000000E7
+:1099800000000000000000000000000000000000D7
+:1099900000000000000000000000000000000000C7
+:1099A00000000000000000000202020202020202A7
+:1099B0000000020202020200010101010101010195
+:1099C0000001010101010000000000000000000092
+:1099D0000000000000000000000000000000000087
+:1099E0000000000000000000000000000000000077
+:1099F0000000000000000000000000000000000067
+:109A0000000000000000000101010101010101014D
+:109A1000010101010101010000000000000000003F
+:109A20000000000000000000000000000000000036
+:109A30000000000000000000000000000000000026
+:109A40000000000000000000000000000000000016
+:109A500000000000000000010101010101010101FD
+:109A600001010101010101000000000000000000EF
+:109A700000000000000000000000000000000000E6
+:109A800000000000000000000000000000000000D6
+:109A900000000000000000000000000000000000C6
+:109AA00000000000000000000200020002020002AC
+:109AB0000000020202020200010101010101010194
+:109AC0000001010101010000000000000000000091
+:109AD0000000000000000000000000000000000086
+:109AE0000000000000000000000000000000000076
+:109AF0000000000000000000000000000000000066
+:109B0000000000000000000101010101010101014C
+:109B1000010101010101010000000000000000003E
+:109B20000000000000000000000000000000000035
+:109B30000000000000000000000000000000000025
+:109B40000000000000000000000000000000000015
+:109B500000000000000000010101010101010101FC
+:109B600001010101010101000000000000000000EE
+:109B700000000000000000000000000000000000E5
+:109B800000000000000000000000000000000000D5
+:109B900000000000000000000000000000000000C5
+:109BA00000000000000000000200020000020000AF
+:109BB0000000020200020200000101010101010196
+:109BC0000001010101010000000000000000000090
+:109BD0000000000000000000000000000000000085
+:109BE0000000000000000000000000000000000075
+:109BF0000000000000000000000000000000000065
+:109C0000000000000000000101010101010101014B
+:109C1000010101010101010000000000000000003D
+:109C20000000000000000000000000000000000034
+:109C30000000000000000000000000000000000024
+:109C40000000000000000000000000000000000014
+:109C500000000000000000010101010101010101FB
+:109C600001010101010101000000000000000000ED
+:109C700000000000000000000000000000000000E4
+:109C800000000000000000000000000000000000D4
+:109C900000000000000000000000000000000000C4
+:109CA00000000000000000000000020000000000B2
+:109CB000000002020002000000010001000001019A
+:109CC0000000000000000000000000000000000094
+:109CD0000000000000000000000000000000000084
+:109CE0000000000000000000000000000000000074
+:109CF0000000000000000000000000000000000064
+:109D00000000000000000002020202020202020241
+:109D10000202020202020200000000000000000035
+:109D20000000000000000000000000000000000033
+:109D30000000000000000000000000000000000023
+:109D40000000000000000000000000000000000013
+:109D500000000000000000020202020202020202F1
+:109D600002020202020202000000000000000000E5
+:109D700000000000000000000000000000000000E3
+:109D800000000000000000000000000000000000D3
+:109D900000000000000000000000000000000000C3
+:109DA00000000000000000000000000000000000B3
+:109DB00000000000000000000000000000000000A3
+:109DC0000000000000000000000000000000000093
+:109DD0000000000000000000000000000000000083
+:109DE0000000000000000000000000000000000073
+:109DF0000000000000000000000000000000000063
+:109E00000000000000000000000000000000000052
+:109E10000000000000000000000000000000000042
+:109E20000000000000000000000000000000000032
+:109E30000000000000000000000000000000000022
+:109E40000000000000000000000000000000000012
+:109E50000000000000000000000000000000000002
+:109E600000000000000000000000000000000000F2
+:109E700000000000000000000000000000000000E2
+:109E800000000000000000000000000000000000D2
+:109E900000000000000000000000000000000000C2
+:109EA00000000000000000000000000000000000B2
+:109EB000000000000000001E000000000000000282
+:109EC0000101010101010101010101010101010083
+:109ED0000000000000000000000000000000000082
+:109EE0000000000000000000000000000000000072
+:109EF0000000000000000000000000000000000062
+:109F00000000000000000000000000000000000051
+:109F1000010000000000000000000000000100003F
+:109F20000000000000000000000000000000000031
+:109F30000000000000000000000000000000000021
+:109F40000000000000000000000000000000000011
+:109F50000000000000000000000000000000000001
+:109F600000000000000000000000000000000000F1
+:109F700000000000000000000000000000000000E1
+:109F800000000000000000000000000000000000D1
+:109F900000000000000000000000000000000000C1
+:109FA00000000000000000000000000000000000B1
+:109FB0000101010101010101010101010101010290
+:109FC0000101010101010101010101010101010082
+:109FD0000000000000000000000000000000000081
+:109FE0000000000000000000000000000000000071
+:109FF0000000000000000000000000000000000061
+:10A000000000000000000000000000000000000050
+:10A01000010000000100000000000000000100003D
+:10A020000000000000000000000000000000000030
+:10A030000000000000000000000000000000000020
+:10A040000000000000000000000000000000000010
+:10A050000000000000000000000000000000000000
+:10A0600000000000000000000000000000000000F0
+:10A0700000000000000000000000000000000000E0
+:10A0800000000000000000000000000000000000D0
+:10A0900000000000000000000000000000000000C0
+:10A0A00000000000000000000000000000000000B0
+:10A0B000010101010101010101010101010101028F
+:10A0C0000101010101010101010101010101010081
+:10A0D0000000000000000000000000000000000080
+:10A0E0000000000000000000000000000000000070
+:10A0F0000000000000000000000000000000000060
+:10A10000000000000000000000000000000000004F
+:10A11000010000000100000000000000000101003B
+:10A12000000000000000000000000000000000002F
+:10A13000000000000000000000000000000000001F
+:10A14000000000000000000000000000000000000F
+:10A1500000000000000000000000000000000000FF
+:10A1600000000000000000000000000000000000EF
+:10A1700000000000000000000000000000000000DF
+:10A1800000000000000000000000000000000000CF
+:10A1900000000000000000000000000000000000BF
+:10A1A00000000000000000000000000000000002AD
+:10A1B000010101010101010101010101010101028E
+:10A1C0000101010101010101010101010101010080
+:10A1D000000000000000000000000000000000007F
+:10A1E000000000000000000000000000000000006F
+:10A1F000000000000000000000000000000000005F
+:10A20000000000000000000000000000000000004E
+:10A210000101000001000000000000000001010039
+:10A22000000000000000000000000000000000002E
+:10A23000000000000000000000000000000000001E
+:10A24000000000000000000000000000000000000E
+:10A2500000000000000000000000000000000000FE
+:10A2600000000000000000000000000000000000EE
+:10A2700000000000000000000000000000000000DE
+:10A2800000000000000000000000000000000000CE
+:10A2900000000000000000000000000000000000BE
+:10A2A00000000000000000000000000000000002AC
+:10A2B000010101010101010101010101010101028D
+:10A2C000020101010101010101010101010101007E
+:10A2D000000000000000000000000000000000007E
+:10A2E000000000000000000000000000000000006E
+:10A2F000000000000000000000000000000000005E
+:10A30000000000000000000000000000000000004D
+:10A310000101000001000000000001000001010037
+:10A32000000000000000000000000000000000002D
+:10A33000000000000000000000000000000000001D
+:10A34000000000000000000000000000000000000D
+:10A3500000000000000000000000000000000000FD
+:10A3600000000000000000000000000000000000ED
+:10A3700000000000000000000000000000000000DD
+:10A3800000000000000000000000000000000000CD
+:10A3900000000000000000000000000000000000BD
+:10A3A00000000000000000000000000000000002AB
+:10A3B000010101010101010101010101010101028C
+:10A3C000020101010101010101010101010101007D
+:10A3D000000000000000000000000000000000007D
+:10A3E000000000000000000000000000000000006D
+:10A3F000000000000000000000000000000000005D
+:10A40000000000000000000000000000000000004C
+:10A410000201010001000000000001000001010034
+:10A42000000000000000000000000000000000002C
+:10A43000000000000000000000000000000000001C
+:10A44000000000000000000000000000000000000C
+:10A4500000000000000000000000000000000000FC
+:10A4600000000000000000000000000000000000EC
+:10A4700000000000000000000000000000000000DC
+:10A4800000000000000000000000000000000000CC
+:10A4900000000000000000000000000000000000BC
+:10A4A00000000000000000000000000000000002AA
+:10A4B000010101010101010101010101010101028B
+:10A4C000020101010101010101010101020101007B
+:10A4D000000000000000000000000000000000007C
+:10A4E000000000000000000000000000000000006C
+:10A4F000000000000000000000000000000000005C
+:10A500000000000000000000000000000000000249
+:10A510000201010001000000000001010101010031
+:10A52000000000000000000000000000000000002B
+:10A53000000000000000000000000000000000001B
+:10A54000000000000000000000000000000000000B
+:10A5500000000000000000000000000000000000FB
+:10A5600001000000000000000000000000000000EA
+:10A5700000000000000000000000000000000000DB
+:10A5800000000000000000000000000000000000CB
+:10A5900000000000000000000000000000000000BB
+:10A5A00000000000000000000000000000000002A9
+:10A5B000010101010101010101010101010101028A
+:10A5C0000201010201010101010101020201010078
+:10A5D000000000000000000000000000000000007B
+:10A5E000000000000000000000000000000000006B
+:10A5F000000000000000000000000000000000005B
+:10A600000000000000000000000000000000000248
+:10A61000020101000101000000000101010101002F
+:10A62000000000000000000000000000000000002A
+:10A63000000000000000000000000000000000001A
+:10A64000000000000000000000000000000000000A
+:10A6500000000000000000000000000000000000FA
+:10A6600001010100010000000000000000000000E6
+:10A6700000000000000000000000000000000000DA
+:10A6800000000000000000000000000000000000CA
+:10A6900000000000000000000000000000000000BA
+:10A6A00000000000000000000000000000000002A8
+:10A6B000000101010101010101010101010101028A
+:10A6C0000202020201020102010101020201010073
+:10A6D000000000000000000000000000000000007A
+:10A6E000000000000000000000000000000000006A
+:10A6F000000000000000000000000000000000005A
+:10A700000000000000000000000000000000000247
+:10A71000020201000201000000000101010101002C
+:10A720000000000000000000000000000000000029
+:10A730000000000000000000000000000000000019
+:10A740000000000000000000000000000000000009
+:10A7500000000000000000000000000000000002F7
+:10A7600001010100010000000000000000010000E4
+:10A7700000000000000000000000000000000000D9
+:10A7800000000000000000000000000000000000C9
+:10A7900000000000000000000000000000000000B9
+:10A7A00000000000000000000000000000000002A7
+:10A7B0000001010101010101010101010101010289
+:10A7C0000202020202020202010101020201010070
+:10A7D0000000000000000000000000000000000079
+:10A7E0000000000000000000000000000000000069
+:10A7F0000000000000000000000000000000000059
+:10A800000000000000000000000000000000000246
+:10A810000202020102010000000001010101010029
+:10A820000000000000000000000000000000000028
+:10A830000000000000000000000000000000000018
+:10A840000000000000000000000000000000000008
+:10A8500000000000000000000000000000000002F6
+:10A8600002010101010100000000000000010000E0
+:10A8700000000000000000000000000000000000D8
+:10A8800000000000000000000000000000000000C8
+:10A8900000000000000000000000000000000000B8
+:10A8A00000000000000000000000000000000002A6
+:10A8B0000201010101010101010101010101010286
+:10A8C000020202020202020202010102020101006E
+:10A8D0000000000000000000000000000000000078
+:10A8E0000000000000000000000000000000000068
+:10A8F0000000000000000000000000000000000058
+:10A900000000000000000000000000000000000245
+:10A910000202020102010000000001010101010028
+:10A920000000000000000000000000000000000027
+:10A930000000000000000000000000000000000017
+:10A940000000000000000000000000000000000007
+:10A9500000000000000000000000000000000002F5
+:10A9600002010101010101000000000000010100DD
+:10A9700000000000000000000000000000000000D7
+:10A9800000000000000000000000000000000000C7
+:10A9900000000000000000000000000000000000B7
+:10A9A00000000000000000000000000000000002A5
+:10A9B0000200000001010101010101010101010189
+:10A9C000020202020202020202020102010101006D
+:10A9D0000000000000000000000000000000000077
+:10A9E0000000000000000000000000000000000067
+:10A9F0000000000000000000000000000000000057
+:10AA00000000000000000000000000000000000244
+:10AA10000202020202020000000102010202020020
+:10AA20000000000000000000000000000000000026
+:10AA30000000000000000000000000000000000016
+:10AA40000000000000000000000000000000000006
+:10AA500000000000000000000000000000000002F4
+:10AA600002020201010101000000000000010100DA
+:10AA700000000000000000000000000000000000D6
+:10AA800000000000000000000000000000000000C6
+:10AA900000000000000000000000000000000000B6
+:10AAA00000000000000000000000000000000002A4
+:10AAB0000202020200000000010101010101010186
+:10AAC000020202020202020202020201010101006C
+:10AAD0000000000000000000000000000000000076
+:10AAE0000000000000000000000000000000000066
+:10AAF0000000000000000000000000000000000056
+:10AB00000000000000000000000000000000000243
+:10AB1000020202020202000000010202020202001E
+:10AB20000000000000000000000000000000000025
+:10AB30000000000000000000000000000000000015
+:10AB40000000000000000000000000000000000005
+:10AB500000000000000000000000000000000002F3
+:10AB600002020202020101010000010000010100D5
+:10AB700000000000000000000000000000000000D5
+:10AB800000000000000000000000000000000000C5
+:10AB900000000000000000000000000000000000B5
+:10ABA00000000000000000000000000000000002A3
+:10ABB0000202020202020202000000000001000183
+:10ABC000020202020202020202020201010201006A
+:10ABD0000000000000000000000000000000000075
+:10ABE0000000000000000000000000000000000065
+:10ABF0000000000000000000000000000000000055
+:10AC00000000000000000000000000000000000242
+:10AC1000020202020202000001020202020202001B
+:10AC20000000000000000000000000000000000024
+:10AC30000000000000000000000000000000000014
+:10AC40000000000000000000000000000000000004
+:10AC500000000000000000000000000000000002F2
+:10AC600002020202020201010101010000010100D1
+:10AC700000000000000000000000000000000000D4
+:10AC800000000000000000000000000000000000C4
+:10AC900000000000000000000000000000000000B4
+:10ACA00000000000000000000000000000000002A2
+:10ACB0000202020202020202020202020200020177
+:10ACC000020202020202020202020201010200006A
+:10ACD0000000000000000000000000000000000074
+:10ACE0000000000000000000000000000000000064
+:10ACF0000000000000000000000000000000000054
+:10AD00000000000000000000000000000000000241
+:10AD10000202020202020100020202020202020018
+:10AD20000000000000000000000000000000000023
+:10AD30000000000000000000000000000000000013
+:10AD40000000000000000000000000000000000003
+:10AD500000000000000000000000000000000002F1
+:10AD600002020202020202010101010100010100CE
+:10AD700000000000000000000000000000000000D3
+:10AD800000000000000000000000000000000000C3
+:10AD900000000000000000000000000000000000B3
+:10ADA00000000000000000000000000000000002A1
+:10ADB0000202020202020202020202020202020174
+:10ADC000010202020202020202020201010200006A
+:10ADD0000000000000000000000000000000000073
+:10ADE0000000000000000000000000000000000063
+:10ADF0000000000000000000000000000000000053
+:10AE00000000000000000000000000000000000240
+:10AE10000202020202020200020202020202020016
+:10AE20000000000000000000000000000000000022
+:10AE30000000000000000000000000000000000012
+:10AE40000000000000000000000000000000000002
+:10AE500000000000000000000000000000000002F0
+:10AE600002020202020202020101010100020100CB
+:10AE700000000000000000000000000000000000D2
+:10AE800000000000000000000000000000000000C2
+:10AE900000000000000000000000000000000000B2
+:10AEA00000000000000000000000000000000002A0
+:10AEB0000202020202020202020202020202020173
+:10AEC0000102020202020202020202010102000069
+:10AED0000000000000000000000000000000000072
+:10AEE0000000000000000000000000000000000062
+:10AEF0000000000000000000000000000000000052
+:10AF0000000000000000000000000000000000023F
+:10AF10000202020202020202020202020202020013
+:10AF20000000000000000000000000000000000021
+:10AF30000000000000000000000000000000000011
+:10AF40000000000000000000000000000000000001
+:10AF500000000000000000000000000000000002EF
+:10AF600002020202020202020202020100020200C6
+:10AF700000000000000000000000000000000000D1
+:10AF800000000000000000000000000000000000C1
+:10AF900000000000000000000000000000000000B1
+:10AFA00000000000000000000000000000000000A1
+:10AFB0000202020202020202020202020202020172
+:10AFC0000102020202020201020202010102000069
+:10AFD0000000000000000000000000000000000071
+:10AFE0000000000000000000000000000000000061
+:10AFF0000000000000000000000000000000000051
+:10B00000000000000000000000000000000000023E
+:10B010000202020202020202010102020102020015
+:10B020000000000000000000000000000000000020
+:10B030000000000000000000000000000000000010
+:10B040000000000000000000000000000000000000
+:10B0500000000000000000000000000000000002EE
+:10B0600002020202020202020202020200020200C4
+:10B0700000000000000000000000000000000000D0
+:10B0800000000000000000000000000000000000C0
+:10B0900000000000000000000000000000000000B0
+:10B0A00000000000000000000000000000000000A0
+:10B0B0000202020202020202020202020202020171
+:10B0C000010202010201010102020201010100006C
+:10B0D0000000000000000000000000000000000070
+:10B0E0000000000000000000000000000000000060
+:10B0F0000000000000000000000000000000000050
+:10B10000000000000000000000000000000000023D
+:10B110000202020202020202010102020102020014
+:10B12000000000000000000000000000000000001F
+:10B13000000000000000000000000000000000000F
+:10B1400000000000000000000000000000000000FF
+:10B1500000000000000000000000000000000002ED
+:10B1600002020202020202020202020200020200C3
+:10B1700000000000000000000000000000000000CF
+:10B1800000000000000000000000000000000000BF
+:10B1900000000000000000000000000000000000AF
+:10B1A000000000000000000000000000000000009F
+:10B1B0000202020202020202020202020202020170
+:10B1C000010101010101010101020201010100006F
+:10B1D000000000000000000000000000000000006F
+:10B1E000000000000000000000000000000000005F
+:10B1F000000000000000000000000000000000004F
+:10B20000000000000000000000000000000000013D
+:10B21000010101010101010102020101020201001B
+:10B22000000000000000000000000000000000001E
+:10B23000000000000000000000000000000000000E
+:10B2400000000000000000000000000000000000FE
+:10B2500000000000000000000000000000000002EC
+:10B2600002020202020202020202020200020200C2
+:10B2700000000000000000000000000000000000CE
+:10B2800000000000000000000000000000000000BE
+:10B2900000000000000000000000000000000000AE
+:10B2A000000000000000000000000000000000009E
+:10B2B000020202020202020202020202020202016F
+:10B2C0000101010101010101010101010101000070
+:10B2D000000000000000000000000000000000006E
+:10B2E000000000000000000000000000000000005E
+:10B2F000000000000000000000000000000000004E
+:10B30000000000000000000000000000000000023B
+:10B31000020202020202020202020202020202000F
+:10B32000000000000000000000000000000000001D
+:10B33000000000000000000000000000000000000D
+:10B3400000000000000000000000000000000000FD
+:10B3500000000000000000000000000000000002EB
+:10B3600002020202020202020202020202020200BF
+:10B3700000000000000000000000000000000000CD
+:10B3800000000000000000000000000000000000BD
+:10B3900000000000000000000000000000000000AD
+:10B3A000000000000000000000000000000000009D
+:10B3B000020202020202020202020202020202016E
+:10B3C000010101010101010101010101010100006F
+:10B3D000000000000000000000000000000000006D
+:10B3E000000000000000000000000000000000005D
+:10B3F000000000000000000000000000000000004D
+:10B40000000000000000000000000000000000003C
+:10B41000000000000000000000000000000100002B
+:10B42000000000000000000000000000000000001C
+:10B43000000000000000000000000000000000000C
+:10B4400000000000000000000000000000000000FC
+:10B4500000000000000000000000000000000002EA
+:10B4600002020202020202020202020202020200BE
+:10B4700000000000000000000000000000000000CC
+:10B4800000000000000000000000000000000000BC
+:10B4900000000000000000000000000000000000AC
+:10B4A000000000000000000000000000000000009C
+:10B4B000020202020202020202020202020202006E
+:10B4C0000101010101010101010101000001000070
+:10B4D000000000000000000000000000000000006C
+:10B4E000000000000000000000000000000000005C
+:10B4F000000000000000000000000000000000004C
+:10B50000000000000000000000000000000000003B
+:10B510000000000000000000000000000002000029
+:10B52000000000000000000000000000000000001B
+:10B53000000000000000000000000000000000000B
+:10B5400000000000000000000000000000000000FB
+:10B5500000000000000000000000000000000001EA
+:10B5600001010101010101010101010101010100CC
+:10B5700000000000000000000000000000000000CB
+:10B5800000000000000000000000000000000000BB
+:10B5900000000000000000000000000000000000AB
+:10B5A000000000000000000000000000000000009B
+:10B5B000020202020202020202020202020202006D
+:10B5C000010101010101010101010100000100006F
+:10B5D000000000000000000000000000000000006B
+:10B5E000000000000000000000000000000000005B
+:10B5F000000000000000000000000000000000004B
+:10B600000000000000000000000000000000000139
+:10B61000010101010101010101010101010101001B
+:10B62000000000000000000000000000000000001A
+:10B63000000000000000000000000000000000000A
+:10B6400000000000000000000000000000000000FA
+:10B6500000000000000000000000000000000001E9
+:10B6600001010101010101010101010101010100CB
+:10B6700000000000000000000000000000000000CA
+:10B6800000000000000000000000000000000000BA
+:10B6900000000000000000000000000000000000AA
+:10B6A000000000000000000000000000000000009A
+:10B6B000020202020202020202020202020202006C
+:10B6C000010101010101010101010100000000006F
+:10B6D000000000000000000000000000000000006A
+:10B6E000000000000000000000000000000000005A
+:10B6F000000000000000000000000000000000004A
+:10B700000000000000000000000000000000000138
+:10B71000010101010101010101010101010101001A
+:10B720000000000000000000000000000000000019
+:10B730000000000000000000000000000000000009
+:10B7400000000000000000000000000000000000F9
+:10B7500000000000000000000000000000000001E8
+:10B7600001010101010101010101010101010100CA
+:10B7700000000000000000000000000000000000C9
+:10B7800000000000000000000000000000000000B9
+:10B7900000000000000000000000000000000000A9
+:10B7A0000000000000000000000000000000000099
+:10B7B000020202020202020202020202020202006B
+:10B7C000010101010101010101010100000000006E
+:10B7D0000000000000000000000000000000000069
+:10B7E0000000000000000000000000000000000059
+:10B7F0000000000000000000000000000000000049
+:10B800000000000000000000000000000000000137
+:10B810000101010101010101010101010101010019
+:10B820000000000000000000000000000000000018
+:10B830000000000000000000000000000000000008
+:10B8400000000000000000000000000000000000F8
+:10B8500000000000000000000000000000000001E7
+:10B8600001010101010101010101010101010100C9
+:10B8700000000000000000000000000000000000C8
+:10B8800000000000000000000000000000000000B8
+:10B8900000000000000000000000000000000000A8
+:10B8A0000000000000000000000000000000000098
+:10B8B000020202020202020202020202020200006C
+:10B8C000000101010101010101010100000000006E
+:10B8D0000000000000000000000000000000000068
+:10B8E0000000000000000000000000000000000058
+:10B8F0000000000000000000000000000000000048
+:10B900000000000000000000000000000000000136
+:10B910000101010101010101010101010101010018
+:10B920000000000000000000000000000000000017
+:10B930000000000000000000000000000000000007
+:10B9400000000000000000000000000000000000F7
+:10B9500000000000000000000000000000000001E6
+:10B9600001010101010101010101010101010100C8
+:10B9700000000000000000000000000000000000C7
+:10B9800000000000000000000000000000000000B7
+:10B9900000000000000000000000000000000000A7
+:10B9A0000000000000000000000000000000000097
+:10B9B000000202020202020202020202020200006D
+:10B9C000000101010101010101010100000000006D
+:10B9D0000000000000000000000000000000000067
+:10B9E0000000000000000000000000000000000057
+:10B9F0000000000000000000000000000000000047
+:10BA00000000000000000000000000000000000135
+:10BA10000101010101010101010101010101010017
+:10BA20000000000000000000000000000000000016
+:10BA30000000000000000000000000000000000006
+:10BA400000000000000000000000000000000000F6
+:10BA500000000000000000000000000000000002E4
+:10BA600002020202020202020202020202020200B8
+:10BA700000000000000000000000000000000000C6
+:10BA800000000000000000000000000000000000B6
+:10BA900000000000000000000000000000000000A6
+:10BAA0000000000000000000000000000000000096
+:10BAB0000002020202020000020200000000000078
+:10BAC000000101010101000001010000000000006F
+:10BAD0000000000000000000000000000000000066
+:10BAE0000000000000000000000000000000000056
+:10BAF0000000000000000000000000000000000046
+:10BB00000000000000000000000000000000000233
+:10BB10000202020202020202020202020202020007
+:10BB20000000000000000000000000000000000015
+:10BB30000000000000000000000000000000000005
+:10BB400000000000000000000000000000000000F5
+:10BB500000000000000000000000000000000002E3
+:10BB600002020202020202020202020202020200B7
+:10BB700000000000000000000000000000000000C5
+:10BB800000000000000000000000000000000000B5
+:10BB900000000000000000000000000000000000A5
+:10BBA0000000000000000000000000000000000095
+:10BBB0000000000000000000000000000000000085
+:10BBC0000000000000000000000000000000000075
+:10BBD0000000000000000000000000000000000065
+:10BBE0000000000000000000000000000000000055
+:10BBF0000000000000000000000000000000000045
+:10BC00000000000000000000000000000000000034
+:10BC10000000000000000000000000000000000024
+:10BC20000000000000000000000000000000000014
+:10BC30000000000000000000000000000000000004
+:10BC400000000000000000000000000000000000F4
+:10BC500000000000000000000000000000000000E4
+:10BC600000000000000000000000000000000000D4
+:10BC700000000000000000000000000000000000C4
+:10BC800000000000000000000000000000000000B4
+:10BC900000000000000000000000000000000000A4
+:10BCA0000000000000000000000000000000000094
+:10BCB0000000000000000000000000000000001E66
+:10BCC000000000000000000101010101010101016B
+:10BCD000010101010201010000000000000000005C
+:10BCE0000000000000000000000000000000000054
+:10BCF0000000000000000000000000000000000044
+:10BD00000000000000000000000000000000000033
+:10BD10000000000000000000000000000000000023
+:10BD20000000000000000000000000000000000013
+:10BD30000000000000000000000000000000000003
+:10BD400000000000000000000000000000000000F3
+:10BD500000000000000000000000000000000000E3
+:10BD600000000000000000010000000000000000D2
+:10BD700000000000000001000000000000000000C2
+:10BD800000000000000000000000000000000000B3
+:10BD900000000000000000000000000000000000A3
+:10BDA0000000000000000000000000000000000093
+:10BDB000000000000000000001010101010101017B
+:10BDC0000101010101010102010101010101010162
+:10BDD0000201010202020100000000000000000058
+:10BDE0000000000000000000000000000000000053
+:10BDF0000000000000000000000000000000000043
+:10BE00000000000000000000000000000000000032
+:10BE10000000000000000000000000000000000022
+:10BE20000000000000000000000000000000000012
+:10BE30000000000000000000000000000000000002
+:10BE400000000000000000000000000000000000F2
+:10BE500000000000000000000000000000000000E2
+:10BE600000000000000000010000000000000000D1
+:10BE700000000000000001000000000000000000C1
+:10BE800000000000000000000000000000000000B2
+:10BE900000000000000000000000000000000000A2
+:10BEA0000000000000000000000000000000000092
+:10BEB000000000000000000000010101000101017C
+:10BEC0000101010101010102020101010101010160
+:10BED0000202010201020100000000000000000057
+:10BEE0000000000000000000000000000000000052
+:10BEF0000000000000000000000000000000000042
+:10BF00000000000000000000000000000000000031
+:10BF10000000000000000000000000000000000021
+:10BF20000000000000000000000000000000000011
+:10BF30000000000000000000000000000000000001
+:10BF400000000000000000000000000000000000F1
+:10BF500000000000000000000000000000000000E1
+:10BF600000000000000000010000000000000000D0
+:10BF700000000000010001000000000000000000BF
+:10BF800000000000000000000000000000000000B1
+:10BF900000000000000000000000000000000000A1
+:10BFA0000000000000000000000000000000000091
+:10BFB000000000000000000000010101000101017B
+:10BFC000010101010101010202020101010101015E
+:10BFD0000202020201010100000000000000000056
+:10BFE0000000000000000000000000000000000051
+:10BFF0000000000000000000000000000000000041
+:10C000000000000000000000000000000000000030
+:10C010000000000000000000000000000000000020
+:10C020000000000000000000000000000000000010
+:10C030000000000000000000000000000000000000
+:10C0400000000000000000000000000000000000F0
+:10C0500000000000000000000000000000000000E0
+:10C0600000000000000000010100000000000000CE
+:10C0700000000000010101000000000000000000BD
+:10C0800000000000000000000000000000000000B0
+:10C0900000000000000000000000000000000000A0
+:10C0A0000000000000000000000000000000000090
+:10C0B0000000000000000002000101010201010176
+:10C0C0000101010101010102020202020101020259
+:10C0D0000202020101010100000000000000000056
+:10C0E0000000000000000000000000000000000050
+:10C0F0000000000000000000000000000000000040
+:10C10000000000000000000000000000000000002F
+:10C11000000000000000000000000000000000001F
+:10C12000000000000000000000000000000000000F
+:10C1300000000000000000000000000000000000FF
+:10C1400000000000000000000000000000000000EF
+:10C1500000000000000000000000000000000000DF
+:10C1600000000000000000010100010100000000CB
+:10C1700000000000010101000000000000000000BC
+:10C1800000000000000000000000000000000000AF
+:10C19000000000000000000000000000000000009F
+:10C1A000000000000000000000000000000000008F
+:10C1B0000000000000000002000001000201010177
+:10C1C0000101010101010102020202020202020256
+:10C1D0000102020101010100000000000000000056
+:10C1E000000000000000000000000000000000004F
+:10C1F000000000000000000000000000000000003F
+:10C20000000000000000000000000000000000002E
+:10C21000000000000000000000000000000000001E
+:10C22000000000000000000000000000000000000E
+:10C2300000000000000000000000000000000000FE
+:10C2400000000000000000000000000000000000EE
+:10C2500000000000000000000000000000000000DE
+:10C2600000000000000000020101010101000000C7
+:10C2700000000000010101000000000000000000BB
+:10C2800000000000000000000000000000000000AE
+:10C29000000000000000000000000000000000009E
+:10C2A000000000000000000000000000000000008E
+:10C2B0000000000000000002000001000200010177
+:10C2C0000001010101010102020202020202020256
+:10C2D0000102020101010100000000000000000055
+:10C2E000000000000000000000000000000000004E
+:10C2F000000000000000000000000000000000003E
+:10C30000000000000000000000000000000000002D
+:10C31000000000000000000000000000000000001D
+:10C32000000000000000010000000000000000000C
+:10C3300000000000000000000000000000000000FD
+:10C3400000000000000000000000000000000000ED
+:10C3500000000000000000000000000000000000DD
+:10C3600000000000000000020101010101010000C5
+:10C3700000000000010101000000000000000000BA
+:10C3800000000000000000000000000000000000AD
+:10C39000000000000000000000000000000000009D
+:10C3A000000000000000000000000000000000008D
+:10C3B0000000000000000002000000000202010175
+:10C3C0000001000100010102020202020202020257
+:10C3D0000101020101010100000000000000000055
+:10C3E000000000000000000000000000000000004D
+:10C3F000000000000000000000000000000000003D
+:10C40000000000000000000000000000000000002C
+:10C41000000000000000000000000000000000001C
+:10C42000000000000001010000000000000000000A
+:10C4300000000000000000000000000000000000FC
+:10C4400000000000000000000000000000000000EC
+:10C4500000000000000000000000000000000000DC
+:10C4600000000000000000020201010101010000C3
+:10C4700000000000010101000000000000000000B9
+:10C4800000000000000000000000000000000000AC
+:10C49000000000000000000000000000000000009C
+:10C4A000000000000000000000000000000000008C
+:10C4B0000000000000000002000000000202000076
+:10C4C0000001000100010102020202020202020256
+:10C4D0000101010101010100000000000000000055
+:10C4E000000000000000000000000000000000004C
+:10C4F000000000000000000000000000000000003C
+:10C50000000000000000000000000000000000002B
+:10C51000000000000000000100000000000000001A
+:10C520000000000001010100000000000000000008
+:10C5300000000000000000000000000000000000FB
+:10C5400000000000000000000000000000000000EB
+:10C5500000000000000000000000000000000000DB
+:10C5600000000000000000020201010101010000C2
+:10C5700000000000010101000000000000000000B8
+:10C5800000000000000000000000000000000000AB
+:10C59000000000000000000000000000000000009B
+:10C5A000000000000000000000000000000000008B
+:10C5B0000000000000000002000000000202000075
+:10C5C0000200020000010002020202020202020254
+:10C5D0000101010101010100000000000000000054
+:10C5E000000000000000000000000000000000004B
+:10C5F000000000000000000000000000000000003B
+:10C60000000000000000000000000000000000002A
+:10C610000000000000000001010100000000000017
+:10C620000000000001010100000000000000000007
+:10C6300000000000000000000000000000000000FA
+:10C6400000000000000000000000000000000000EA
+:10C6500000000000000000000000000000000000DA
+:10C6600000000000000000020202020201010000BE
+:10C6700000000000010101000000000000000000B7
+:10C6800000000000000000000000000000000000AA
+:10C69000000000000000000000000000000000009A
+:10C6A000000000000000000000000000000000008A
+:10C6B0000000000000000002020200000002000072
+:10C6C0000200020002010001020202020202020153
+:10C6D0000101010101010000000000000000000054
+:10C6E000000000000000000000000000000000004A
+:10C6F000000000000000000000000000000000003A
+:10C700000000000000000000000000000000000029
+:10C710000000000000000002010101000000000014
+:10C720000001000001010100000000000000000005
+:10C7300000000000000000000000000000000000F9
+:10C7400000000000000000000000000000000000E9
+:10C7500000000000000000000000000000000000D9
+:10C7600000000000000000020202020202010000BC
+:10C7700000000000020102000000000000000000B4
+:10C7800000000000000000000000000000000000A9
+:10C790000000000000000000000000000000000099
+:10C7A0000000000000000000000000000000000089
+:10C7B000000000000000000202020200000200006F
+:10C7C0000200020002010201020202020202010151
+:10C7D0000101010101010000000000000000000053
+:10C7E0000000000000000000000000000000000049
+:10C7F0000000000000000000000000000000000039
+:10C800000000000000000000000000000000000028
+:10C810000000000000000002020101000000000012
+:10C820000001000001010100000000000000000004
+:10C8300000000000000000000000000000000000F8
+:10C8400000000000000000000000000000000000E8
+:10C8500000000000000000000000000000000000D8
+:10C8600000000000000000020202020202020000BA
+:10C8700000000000020202000000000000000000B2
+:10C8800000000000000000000000000000000000A8
+:10C890000000000000000000000000000000000098
+:10C8A0000000000000000000000000000000000088
+:10C8B000000000000000000202020200000200006E
+:10C8C0000202020002000201010102020202010151
+:10C8D0000101010100010000000000000000000053
+:10C8E0000000000000000000000000000000000048
+:10C8F0000000000000000000000000000000000038
+:10C900000000000000000000000000000000000027
+:10C910000000000000000002020201000000000010
+:10C920000001000101010100000000000000000002
+:10C9300000000000000000000000000000000000F7
+:10C9400000000000000000000000000000000000E7
+:10C9500000000000000000000000000000000000D7
+:10C9600000000000000000020202020202020000B9
+:10C9700000000000020202000000000000000000B1
+:10C9800000000000000000000000000000000000A7
+:10C990000000000000000000000000000000000097
+:10C9A0000000000000000000000000000000000087
+:10C9B000000000000000000202020200000202006B
+:10C9C000020202020202020101010101020101014F
+:10C9D0000101010100000000000000000000000053
+:10C9E0000000000000000000000000000000000047
+:10C9F0000000000000000000000000000000000037
+:10CA00000000000000000000000000000000000026
+:10CA1000000000000000000202020200010000000D
+:10CA20000001000102010100000000000000000000
+:10CA300000000000000000000000000000000000F6
+:10CA400000000000000000000000000000000000E6
+:10CA500000000000000000000000000000000000D6
+:10CA600000000000000000020202020202020001B7
+:10CA700000010000020202000000000000000000AF
+:10CA800000000000000000000000000000000000A6
+:10CA90000000000000000000000000000000000096
+:10CAA0000000000000000000000000000000000086
+:10CAB000000000000000000002020200000202026A
+:10CAC0000202020202020200010101010101010150
+:10CAD0000101010000000000000000000000000053
+:10CAE0000000000000000000000000000000000046
+:10CAF0000000000000000000000000000000000036
+:10CB00000000000000000000000000000000000025
+:10CB1000000000000000000202020201010000000B
+:10CB200000020001020202000000000000000000FC
+:10CB300000000000000000000000000000000000F5
+:10CB400000000000000000000000000000000000E5
+:10CB500000000000000000000000000000000000D5
+:10CB600000000000000000020202020202020101B5
+:10CB700000010000020202000000000000000000AE
+:10CB800000000000000000000000000000000000A5
+:10CB90000000000000000000000000000000000095
+:10CBA0000000000000000000000000000000000085
+:10CBB0000000000000000000020202020002020267
+:10CBC000020202020202020001010101010101014F
+:10CBD0000001010000000000000000000000000053
+:10CBE0000000000000000000000000000000000045
+:10CBF0000000000000000000000000000000000035
+:10CC00000000000000000000000000000000000024
+:10CC10000000000000000002020202020200000107
+:10CC200000020002020202000000000000000000FA
+:10CC300000000000000000000000000000000000F4
+:10CC400000000000000000000000000000000000E4
+:10CC500000000000000000000000000000000000D4
+:10CC600000000000000000020202020202020202B2
+:10CC700001020000020202000000000000000000AB
+:10CC800000000000000000000000000000000000A4
+:10CC90000000000000000000000000000000000094
+:10CCA0000000000000000000000000000000000084
+:10CCB0000000000000000000020202020000020268
+:10CCC000020202020202020001010101010101014E
+:10CCD0000001010000000000000000000000000052
+:10CCE0000000000000000000000000000000000044
+:10CCF0000000000000000000000000000000000034
+:10CD00000000000000000000000000000000000023
+:10CD10000000000000000002020202020201000105
+:10CD200000020002020202000000000000000000F9
+:10CD300000000000000000000000000000000000F3
+:10CD400000000000000000000000000000000000E3
+:10CD500000000000000000000000000000000000D3
+:10CD600000000000000000020202020202020202B1
+:10CD700002020000020202000000000000000000A9
+:10CD800000000000000000000000000000000000A3
+:10CD90000000000000000000000000000000000093
+:10CDA0000000000000000000000000000000000083
+:10CDB0000000000000000000020202020000020267
+:10CDC0000002000202020200010101010101010151
+:10CDD0000000010000000000000000000000000052
+:10CDE0000000000000000000000000000000000043
+:10CDF0000000000000000000000000000000000033
+:10CE00000000000000000000000000000000000022
+:10CE10000000000000000002020202020202000202
+:10CE200000020002020202000000000000000000F8
+:10CE300000000000000000000000000000000000F2
+:10CE400000000000000000000000000000000000E2
+:10CE500000000000000000000000000000000000D2
+:10CE600000000000000000020202020202020202B0
+:10CE700002020000020202000000000000000000A8
+:10CE800000000000000000000000000000000000A2
+:10CE90000000000000000000000000000000000092
+:10CEA0000000000000000000000000000000000082
+:10CEB0000000000000000000020202020000020266
+:10CEC0000002000200020200010101010101010152
+:10CED0000000000000000000000000000000000052
+:10CEE0000000000000000000000000000000000042
+:10CEF0000000000000000000000000000000000032
+:10CF00000000000000000000000000000000000021
+:10CF100000000000000000020202020202020202FF
+:10CF200000020202020202000000000000000000F5
+:10CF300000000000000000000000000000000000F1
+:10CF400000000000000000000000000000000000E1
+:10CF500000000000000000000000000000000000D1
+:10CF600000000000000000020202020202020202AF
+:10CF700002020202020202000000000000000000A3
+:10CF800000000000000000000000000000000000A1
+:10CF90000000000000000000000000000000000091
+:10CFA0000000000000000000000000000000000081
+:10CFB0000000000000000000020202020000020265
+:10CFC0000002000200020001010101010101010053
+:10CFD0000000000000000000000000000000000051
+:10CFE0000000000000000000000000000000000041
+:10CFF0000000000000000000000000000000000031
+:10D000000000000000000000000000000000000020
+:10D0100000000000000000020202020202020202FE
+:10D0200002020101010202000000000000000000F5
+:10D0300000000000000000000000000000000000F0
+:10D0400000000000000000000000000000000000E0
+:10D0500000000000000000000000000000000000D0
+:10D0600000000000000000020202020202020202AE
+:10D0700002020202020202000000000000000000A2
+:10D0800000000000000000000000000000000000A0
+:10D090000000000000000000000000000000000090
+:10D0A0000000000000000000000000000000000080
+:10D0B0000000000000000000000202020000020266
+:10D0C0000002000200020001010101010101000053
+:10D0D0000000000000000000000000000000000050
+:10D0E0000000000000000000000000000000000040
+:10D0F0000000000000000000000000000000000030
+:10D10000000000000000000000000000000000001F
+:10D1100000000000000000020202020202020202FD
+:10D1200002010202020202000000000000000000F2
+:10D1300000000000000000000000000000000000EF
+:10D1400000000000000000000000000000000000DF
+:10D1500000000000000000000000000000000000CF
+:10D1600000000000000000010101010101010101B6
+:10D1700001010101010101000000000000000000A8
+:10D18000000000000000000000000000000000009F
+:10D19000000000000000000000000000000000008F
+:10D1A000000000000000000000000000000000007F
+:10D1B0000000000000000000000002020000020267
+:10D1C0000002000200020001000001010101000054
+:10D1D000000000000000000000000000000000004F
+:10D1E000000000000000000000000000000000003F
+:10D1F000000000000000000000000000000000002F
+:10D20000000000000000000000000000000000001E
+:10D21000000000000000000000000000000000000E
+:10D2200000020000000000000000000000000000FC
+:10D2300000000000000000000000000000000000EE
+:10D2400000000000000000000000000000000000DE
+:10D2500000000000000000000000000000000000CE
+:10D2600000000000000000020202020202020202AC
+:10D2700002020202020202000000000000000000A0
+:10D28000000000000000000000000000000000009E
+:10D29000000000000000000000000000000000008E
+:10D2A000000000000000000000000000000000007E
+:10D2B0000000000000000000000002020000020266
+:10D2C0000002000200020001000000000100000056
+:10D2D000000000000000000000000000000000004E
+:10D2E000000000000000000000000000000000003E
+:10D2F000000000000000000000000000000000002E
+:10D30000000000000000000000000000000000001D
+:10D31000000000000000000000000000000000000D
+:10D3200000000000000000000000000000000000FD
+:10D3300000000000000000000000000000000000ED
+:10D3400000000000000000000000000000000000DD
+:10D3500000000000000000000000000000000000CD
+:10D3600000000000000000010101010101010101B4
+:10D3700001010101010101000000000000000000A6
+:10D38000000000000000000000000000000000009D
+:10D39000000000000000000000000000000000008D
+:10D3A000000000000000000000000000000000007D
+:10D3B0000000000000000000000000020000020267
+:10D3C000000000000002000000000000000000005B
+:10D3D000000000000000000000000000000000004D
+:10D3E000000000000000000000000000000000003D
+:10D3F000000000000000000000000000000000002D
+:10D40000000000000000000000000000000000001C
+:10D410000000000000000001010101010101010103
+:10D4200001010101010101000000000000000000F5
+:10D4300000000000000000000000000000000000EC
+:10D4400000000000000000000000000000000000DC
+:10D4500000000000000000000000000000000000CC
+:10D4600000000000000000010101010101010101B3
+:10D4700001010101010101000000000000000000A5
+:10D48000000000000000000000000000000000009C
+:10D49000000000000000000000000000000000008C
+:10D4A000000000000000000000000000000000007C
+:10D4B000000000000000000000000002000000006A
+:10D4C000000000000002000000000000000000005A
+:10D4D000000000000000000000000000000000004C
+:10D4E000000000000000000000000000000000003C
+:10D4F000000000000000000000000000000000002C
+:10D50000000000000000000000000000000000001B
+:10D510000000000000000001010101010101010102
+:10D5200001010101010101000000000000000000F4
+:10D5300000000000000000000000000000000000EB
+:10D5400000000000000000000000000000000000DB
+:10D5500000000000000000000000000000000000CB
+:10D5600000000000000000010101010101010101B2
+:10D5700001010101010101000000000000000000A4
+:10D58000000000000000000000000000000000009B
+:10D59000000000000000000000000000000000008B
+:10D5A000000000000000000000000000000000007B
+:10D5B000000000000000000000000000000000006B
+:10D5C000000000000000000000000000000000005B
+:10D5D000000000000000000000000000000000004B
+:10D5E000000000000000000000000000000000003B
+:10D5F000000000000000000000000000000000002B
+:10D60000000000000000000000000000000000001A
+:10D610000000000000000001010101010101010101
+:10D6200001010101010101000000000000000000F3
+:10D6300000000000000000000000000000000000EA
+:10D6400000000000000000000000000000000000DA
+:10D6500000000000000000000000000000000000CA
+:10D6600000000000000000010101010101010101B1
+:10D6700001010101010101000000000000000000A3
+:10D68000000000000000000000000000000000009A
+:10D69000000000000000000000000000000000008A
+:10D6A000000000000000000000000000000000007A
+:10D6B000000000000000000000000000000000006A
+:10D6C000000000000000000000000000000000005A
+:10D6D000000000000000000000000000000000004A
+:10D6E000000000000000000000000000000000003A
+:10D6F000000000000000000000000000000000002A
+:10D700000000000000000000000000000000000019
+:10D710000000000000000001010101010101010100
+:10D7200001010101010101000000000000000000F2
+:10D7300000000000000000000000000000000000E9
+:10D7400000000000000000000000000000000000D9
+:10D7500000000000000000000000000000000000C9
+:10D7600000000000000000010101010101010101B0
+:10D7700001010101010101000000000000000000A2
+:10D780000000000000000000000000000000000099
+:10D790000000000000000000000000000000000089
+:10D7A0000000000000000000000000000000000079
+:10D7B0000000000000000000000000000000000069
+:10D7C0000000000000000000000000000000000059
+:10D7D0000000000000000000000000000000000049
+:10D7E0000000000000000000000000000000000039
+:10D7F0000000000000000000000000000000000029
+:10D800000000000000000000000000000000000018
+:10D8100000000000000000010101010101010101FF
+:10D8200001010101010101000000000000000000F1
+:10D8300000000000000000000000000000000000E8
+:10D8400000000000000000000000000000000000D8
+:10D8500000000000000000000000000000000000C8
+:10D8600000000000000000020202020202020202A6
+:10D87000020202020202020000000000000000009A
+:10D880000000000000000000000000000000000098
+:10D890000000000000000000000000000000000088
+:10D8A0000000000000000000000000000000000078
+:10D8B0000000000000000000000000000000000068
+:10D8C0000000000000000000000000000000000058
+:10D8D0000000000000000000000000000000000048
+:10D8E0000000000000000000000000000000000038
+:10D8F0000000000000000000000000000000000028
+:10D900000000000000000000000000000000000017
+:10D9100000000000000000020202020202020202F5
+:10D9200002020202020202000000000000000000E9
+:10D9300000000000000000000000000000000000E7
+:10D9400000000000000000000000000000000000D7
+:10D9500000000000000000000000000000000000C7
+:10D9600000000000000000020202020202020202A5
+:10D970000202020202020200000000000000000099
+:10D980000000000000000000000000000000000097
+:10D990000000000000000000000000000000000087
+:10D9A0000000000000000000000000000000000077
+:10D9B0000000000000000000000000000000000067
+:10D9C0000000000000000000000000000000000057
+:10D9D0000000000000000000000000000000000047
+:10D9E0000000000000000000000000000000000037
+:10D9F0000000000000000000000000000000000027
+:10DA00000000000000000000000000000000000016
+:10DA10000000000000000000000000000000000006
+:10DA200000000000000000000000000000000000F6
+:10DA300000000000000000000000000000000000E6
+:10DA400000000000000000000000000000000000D6
+:10DA500000000000000000000000000000000000C6
+:10DA600000000000000000000000000000000000B6
+:10DA700000000000000000000000000000000000A6
+:10DA80000000000000000000000000000000000096
+:10DA90000000000000000000000000000000000086
+:10DAA0000000000000000000000000000000000076
+:10DAB0000000000000000000000000000000000066
+:10DAC000000000000000001E000000000000000038
+:10DAD0000000000001000001010000010001000041
+:10DAE0000000000000000000000000000000000036
+:10DAF0000000000000000000000000000000000026
+:10DB00000000000000000000000000000000000015
+:10DB10000000000000000000000000000000000005
+:10DB200000000000000000000000000000000000F5
+:10DB300000000000000000000000000000000000E5
+:10DB400000000000000000000000000000000000D5
+:10DB500000000000000000000000000000000000C5
+:10DB600000000000000000000000000000000000B5
+:10DB700000000000000000000000000000000000A5
+:10DB80000000000000000000000000000000000095
+:10DB90000000000000000000000000000000000085
+:10DBA0000000000000000000000000000000000075
+:10DBB0000000000000000000000000000000000065
+:10DBC0000000000000020200000000000000000150
+:10DBD000010101010100000101000101010100003A
+:10DBE0000000000000000000000000000000000035
+:10DBF0000000000000000000000000000000000025
+:10DC00000000000000000000000000000000000014
+:10DC10000000000000000000000000000000000004
+:10DC200000000000000000000000000000000000F4
+:10DC300000000000000000000000000000000000E4
+:10DC400000000000000000000000000000000000D4
+:10DC500000000000000000000000000000000000C4
+:10DC600000000000000000000000000000000000B4
+:10DC7000000000000002020000010000000000009F
+:10DC80000000000000000000000000000000000094
+:10DC90000000000000000000000000000000000084
+:10DCA0000000000000000000000000000000000074
+:10DCB0000000000000000000000000000000000064
+:10DCC000000000000002020000000000000000014F
+:10DCD0000101010101010101010001010101000037
+:10DCE0000000000000000000000000000000000034
+:10DCF0000000000000000000000000000000000024
+:10DD00000000000000000000000000000000000013
+:10DD10000000000000000000000000000000000003
+:10DD200000000000000000000000000000000000F3
+:10DD300000000000000000000000000000000000E3
+:10DD400000000000000000000000000000000000D3
+:10DD500000000000000000000000000000000000C3
+:10DD600000000000000000000000000000000000B3
+:10DD7000000100000002020000010000010001009B
+:10DD80000000000000000000000000000000000093
+:10DD90000000000000000000000000000000000083
+:10DDA0000000000000000000000000000000000073
+:10DDB0000000000000000000000000000000000063
+:10DDC000000000000002020000000000000000014E
+:10DDD0000101010101010101010001010101000036
+:10DDE0000000000000000000000000000000000033
+:10DDF0000000000000000000000000000000000023
+:10DE00000000000000000000000000000000000012
+:10DE10000000000000000000000000000000000002
+:10DE200000000000000000000000000000000000F2
+:10DE300000000000000000000000000000000000E2
+:10DE400000000000000000000000000000000000D2
+:10DE500000000000000000000000000000000000C2
+:10DE600000000000000000000000000000000000B2
+:10DE7000000100000002020000010000010001009A
+:10DE80000000000000000000000000000000000092
+:10DE90000000000000000000000000000000000082
+:10DEA0000000000000000000000000000000000072
+:10DEB0000000000000000000000000000000000062
+:10DEC000000000000002020000000000000000014D
+:10DED0000101010101020201010101010101000032
+:10DEE0000000000000000000000000000000000032
+:10DEF0000000000000000000000000000000000022
+:10DF00000000000000000000000000000000000011
+:10DF10000000000000000000000000000000000001
+:10DF200000000000000000000000000000000000F1
+:10DF300000000000000000000000000000000000E1
+:10DF400000000000000000000000000000000000D1
+:10DF500000000000000000000000000000000000C1
+:10DF600000000000000000000000000000000000B1
+:10DF70000001000000020200000100000100010099
+:10DF80000000000000000000000000000000000091
+:10DF90000000000000000000000000000000000081
+:10DFA0000000000000000000000000000000000071
+:10DFB0000000000000000000000000000000000061
+:10DFC0000000000000020202020000000000000247
+:10DFD0000101010101020201010101010101000031
+:10DFE0000000000000000000000000000000000031
+:10DFF0000000000000000000000000000000000021
+:10E000000000000000000000000000000000000010
+:10E010000000000000000000000000000000000000
+:10E0200000000000000000000000000000000000F0
+:10E0300000000000000000000000000000000000E0
+:10E0400000000000000000000000000000000000D0
+:10E0500000000000000000000000000000000000C0
+:10E0600000000000000000000000000000000000B0
+:10E070000001000000020200000100010101010096
+:10E080000000000000000000000000000000000090
+:10E090000000000000000000000000000000000080
+:10E0A0000000000000000000000000000000000070
+:10E0B0000000000000000000000000000000000060
+:10E0C0000000000000010102020000000000000248
+:10E0D000020101010102020201010101010100002E
+:10E0E0000000000000000000000000000000000030
+:10E0F0000000000000000000000000000000000020
+:10E10000000000000000000000000000000000000F
+:10E1100000000000000000000000000000000000FF
+:10E1200000000000000000000000000001000000EE
+:10E1300000000000000000000000000000000000DF
+:10E1400000000000000000000000000000000000CF
+:10E1500000000000000000000000000000000000BF
+:10E1600000000000000000000000000000000000AF
+:10E170000101000100010100000101010101010094
+:10E18000000000000000000000000000000000008F
+:10E19000000000000000000000000000000000007F
+:10E1A000000000000000000000000000000000006F
+:10E1B000000000000000000000000000000000005F
+:10E1C0000000000000010101010000000000000249
+:10E1D000020102010202020201010101010100002B
+:10E1E000000000000000000000000000000000002F
+:10E1F000000000000000000000000000000000001F
+:10E20000000000000000000000000000000000000E
+:10E2100000000000000000000000000000000000FE
+:10E2200000000000000000000000000001000000ED
+:10E2300000000000000000000000000000000000DE
+:10E2400000000000000000000000000000000000CE
+:10E2500000000000000000000000000000000000BE
+:10E2600000000000000000000000000000000000AE
+:10E270000101000100010100000101010101010093
+:10E28000000000000000000000000000000000008E
+:10E29000000000000000000000000000000000007E
+:10E2A000000000000000000000000000000000006E
+:10E2B000000000000000000000000000000000005E
+:10E2C0000000000000010101010000000000000248
+:10E2D0000202020202020202020101010101000027
+:10E2E000000000000000000000000000000000002E
+:10E2F000000000000000000000000000000000001E
+:10E30000000000000000000000000000000000000D
+:10E3100000000000000000000000000000000000FD
+:10E3200000010000000000000000000001000000EB
+:10E3300000000000000000000000000000000000DD
+:10E3400000000000000000000000000000000000CD
+:10E3500000000000000000000000000000000000BD
+:10E3600000000000000000000000000000000000AD
+:10E370000101010100010100000101010101010091
+:10E38000000000000000000000000000000000008D
+:10E39000000000000000000000000000000000007D
+:10E3A000000000000000000000000000000000006D
+:10E3B000000000000000000000000000000000005D
+:10E3C0000000000001010101010000000100000245
+:10E3D0000202020202020202020101010101000026
+:10E3E000000000000000000000000000000000002D
+:10E3F000000000000000000000000000000000001D
+:10E40000000000000000000000000000000000000C
+:10E4100000000000000000000000000000000000FC
+:10E4200000010000010000000001000001000000E8
+:10E4300000000000000000000000000000000000DC
+:10E4400000000000000000000000000000000000CC
+:10E4500000000000000000000000000000000000BC
+:10E4600000000000000000000000000000000000AC
+:10E470000101010100010100000101010101010090
+:10E48000000000000000000000000000000000008C
+:10E49000000000000000000000000000000000007C
+:10E4A000000000000000000000000000000000006C
+:10E4B000000000000000000000000000000000005C
+:10E4C0000000000001010101010000000100000244
+:10E4D0000202020202020202020102020102000022
+:10E4E000000000000000000000000000000000002C
+:10E4F000000000000000000000000000000000001C
+:10E50000000000000000000000000000000000000B
+:10E5100000000000000000000000000000000000FB
+:10E5200000010000010000000001000001000100E6
+:10E5300000000000000000000000000000000000DB
+:10E5400000000000000000000000000000000000CB
+:10E5500000000000000000000000000000000000BB
+:10E5600000000000000000000000000000000000AB
+:10E57000010101010001010000010101010101008F
+:10E58000000000000000000000000000000000008B
+:10E59000000000000000000000000000000000007B
+:10E5A000000000000000000000000000000000006B
+:10E5B000000000000000000000000000000000005B
+:10E5C0000000000001010101010000000100010242
+:10E5D0000202020202020202020102020102000021
+:10E5E000000000000000000000000000000000002B
+:10E5F000000000000000000000000000000000001B
+:10E60000000000000000000000000000000000000A
+:10E6100000000000000000000000000000000000FA
+:10E6200000010000010000000001000001000100E5
+:10E6300000000000000000000000000000000000DA
+:10E6400000000000000000000000000000000000CA
+:10E6500000000000000000000000000000000000BA
+:10E6600000000000000000000000000000000000AA
+:10E67000010201010101010101010101010101008A
+:10E68000000000000000000000000000000000008A
+:10E69000000000000000000000000000000000007A
+:10E6A000000000000000000000000000000000006A
+:10E6B000000000000000000000000000000000005A
+:10E6C0000000010000000000010100010101010241
+:10E6D000020202020202020202010202020200001F
+:10E6E000000000000000000000000000000000002A
+:10E6F000000000000000000000000000000000001A
+:10E700000000000000000000000000000000000009
+:10E7100000000000000000000000000000000000F9
+:10E7200001010000010000000001000001000100E3
+:10E7300000000000000000000000000000000000D9
+:10E7400000000000000000000000000000000000C9
+:10E7500000000000000000000000000000000000B9
+:10E7600000000000000000000000000000000001A8
+:10E770000202010101010101010201010101010087
+:10E780000000000000000000000000000000000089
+:10E790000000000000000000000000000000000079
+:10E7A0000000000000000000000000000000000069
+:10E7B0000000000000000000000000000000000059
+:10E7C0000000000000000000010101010101010240
+:10E7D000020202020202020202020202020200001D
+:10E7E0000000000000000000000000000000000029
+:10E7F0000000000000000000000000000000000019
+:10E800000000000000000000000000000000000008
+:10E8100000000000000000000000000000000000F8
+:10E8200001010000010000000001000101010100E0
+:10E8300000000000000000000000000000000000D8
+:10E8400000000000000000000000000000000000C8
+:10E8500000000000000000000000000000000000B8
+:10E8600000000000000000000000000000000001A7
+:10E870000202020201010101010201010201020082
+:10E880000000000000000000000000000000000088
+:10E890000000000000000000000000000000000078
+:10E8A0000000000000000000000000000000000068
+:10E8B0000000000000000000000000000000000058
+:10E8C0000000000000000000000101010101010240
+:10E8D000020202020202020202020202020200001C
+:10E8E0000000000000000000000000000000000028
+:10E8F0000000000000000000000000000000000018
+:10E900000000000000000000000000000000000007
+:10E9100000000000000000000000000000000000F7
+:10E9200001010001020000000001000101010100DD
+:10E9300000000000000000000000000000000000D7
+:10E9400000000000000000000000000000000000C7
+:10E9500000000000000000000000000000000000B7
+:10E9600000000000000000000000000000000002A5
+:10E97000020202020102020101020202020202007C
+:10E980000000000000000000000000000000000087
+:10E990000000000000000000000000000000000077
+:10E9A0000000000000000000000000000000000067
+:10E9B0000000000000000000000000000000000057
+:10E9C000000100010000000000010101010101023D
+:10E9D000020202020202020202020202020200001B
+:10E9E0000000000000000000000000000000000027
+:10E9F0000000000000000000000000000000000017
+:10EA00000000000000000000000000000000000006
+:10EA100000000000000000000000000000000000F6
+:10EA200001020001020101000001000101010100D9
+:10EA300000000000000000000000000000000000D6
+:10EA400000000000000000000000000000000000C6
+:10EA500000000000000000000000000000000000B6
+:10EA600000000000000000000000000000000002A4
+:10EA70000202020202020202010202020202020079
+:10EA80000000000000000000000000000000000086
+:10EA90000000000000000000000000000000000076
+:10EAA0000000000000000000000000000000000066
+:10EAB0000000000000000000000000000000000056
+:10EAC000000100010000000000010101010101023C
+:10EAD000020202020202020202020202020200001A
+:10EAE0000000000000000000000000000000000026
+:10EAF0000000000000000000000000000000000016
+:10EB00000000000000000000000000000000000005
+:10EB100000000000000000000000000000000000F5
+:10EB200002020101020202000001010102010100D2
+:10EB300000000000000000000000000000000000D5
+:10EB400000000000000000000000000000000000C5
+:10EB500000000000000000000000000000000000B5
+:10EB600000000000000000000000000000000002A3
+:10EB70000202020202020202020202020202020077
+:10EB80000000000000000000000000000000000085
+:10EB90000000000000000000000000000000000075
+:10EBA0000000000000000000000000000000000065
+:10EBB0000000000000000000000000000000000055
+:10EBC000010100010000000000010101010101023A
+:10EBD000020202020201010202020202020200001B
+:10EBE0000000000000000000000000000000000025
+:10EBF0000000000000000000000000000000000015
+:10EC00000000000000000000000000000000000004
+:10EC100000000000000000000000000000000000F4
+:10EC200002020101020202000002010102010100D0
+:10EC300000000000000000000000000000000000D4
+:10EC400000000000000000000000000000000000C4
+:10EC500000000000000000000000000000000000B4
+:10EC600000000000000000000000000000000002A2
+:10EC70000202020202020202020202020202020076
+:10EC80000000000000000000000000000000000084
+:10EC90000000000000000000000000000000000074
+:10ECA0000000000000000000000000000000000064
+:10ECB0000000000000000000000000000000000054
+:10ECC000010100010000000000010101000101023A
+:10ECD000020202020201010202020202020200001A
+:10ECE0000000000000000000000000000000000024
+:10ECF0000000000000000000000000000000000014
+:10ED00000000000000000000000000000000000003
+:10ED100000000000000000000000000000000002F1
+:10ED200002020202020202000002010102010200CC
+:10ED300000000000000000000000000000000000D3
+:10ED400000000000000000000000000000000000C3
+:10ED500000000000000000000000000000000000B3
+:10ED600000000000000000000000000000000002A1
+:10ED70000202020202020202020202020202020075
+:10ED80000000000000000000000000000000000083
+:10ED90000000000000000000000000000000000073
+:10EDA0000000000000000000000000000000000063
+:10EDB0000000000000000000000000000000000053
+:10EDC0000000000000000000000000000000000142
+:10EDD000010202020201010102020202020200001B
+:10EDE0000000000000000000000000000000000023
+:10EDF0000000000000000000000000000000000013
+:10EE00000000000000000000000000000000000002
+:10EE100000000000000000000000000000000002F0
+:10EE200002020202020202010002010202020200C8
+:10EE300000000000000000000000000000000000D2
+:10EE400000000000000000000000000000000000C2
+:10EE500000000000000000000000000000000000B2
+:10EE600000000000000000000000000000000002A0
+:10EE70000202020202020202020202020202020074
+:10EE80000000000000000000000000000000000082
+:10EE90000000000000000000000000000000000072
+:10EEA0000000000000000000000000000000000062
+:10EEB0000000000000000000000000000000000052
+:10EEC0000000000000000000000000000000000141
+:10EED000010101010101010101020202020200001F
+:10EEE0000000000000000000000000000000000022
+:10EEF0000000000000000000000000000000000012
+:10EF00000000000000000000000000000000000001
+:10EF100000000000000000000000000000000002EF
+:10EF200002020202020202020002020202020200C5
+:10EF300000000000000000000000000000000000D1
+:10EF400000000000000000000000000000000000C1
+:10EF500000000000000000000000000000000000B1
+:10EF6000000000000000000000000000000000029F
+:10EF70000202020202020202020202020202020073
+:10EF80000000000000000000000000000000000081
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB0000000000000000000000000000000000051
+:10EFC000000000000000000000000000020000013E
+:10EFD0000101010101010101010201010201010020
+:10EFE0000000000000000000000000000000000021
+:10EFF0000000000000000000000000000000000011
+:10F000000000000000000000000000000000000000
+:10F0100000000000000000000000000000000002EE
+:10F0200002020202020202020102020202020200C3
+:10F0300000000000000000000000000000000000D0
+:10F0400000000000000000000000000000000000C0
+:10F0500000000000000000000000000000000000B0
+:10F06000000000000000000000000000000000029E
+:10F070000202020202020202020202020202020072
+:10F080000000000000000000000000000000000080
+:10F090000000000000000000000000000000000070
+:10F0A0000000000000000000000000000000000060
+:10F0B000000000000000000000000000000000024E
+:10F0C0000202000202020202020202020202020123
+:10F0D0000101010101010101010101010101010021
+:10F0E0000000000000000000000000000000000020
+:10F0F0000000000000000000000000000000000010
+:10F1000000000000000000000000000000000000FF
+:10F1100000000000000000000000000000000002ED
+:10F1200002020202010101020202020202020200C4
+:10F1300000000000000000000000000000000000CF
+:10F1400000000000000000000000000000000000BF
+:10F1500000000000000000000000000000000000AF
+:10F16000000000000000000000000000000000029D
+:10F170000202020202020202020202020202020071
+:10F18000000000000000000000000000000000007F
+:10F19000000000000000000000000000000000006F
+:10F1A000000000000000000000000000000000005F
+:10F1B000000000000000000000000000000000024D
+:10F1C0000202020202020202020202020202020120
+:10F1D0000101010101010101010101010101010020
+:10F1E000000000000000000000000000000000001F
+:10F1F000000000000000000000000000000000000F
+:10F2000000000000000000000000000000000000FE
+:10F2100000000000000000000000000000000002EC
+:10F2200002020202020202020202020202020200C0
+:10F2300000000000000000000000000000000000CE
+:10F2400000000000000000000000000000000000BE
+:10F2500000000000000000000000000000000000AE
+:10F26000000000000000000000000000000000029C
+:10F270000202020202020202020202020202020070
+:10F28000000000000000000000000000000000007E
+:10F29000000000000000000000000000000000006E
+:10F2A000000000000000000000000000000000005E
+:10F2B000000000000000000000000000000000024C
+:10F2C000020202020202020202020202020202011F
+:10F2D000010101010101010101010101010101001F
+:10F2E000000000000000000000000000000000001E
+:10F2F000000000000000000000000000000000000E
+:10F3000000000000000000000000000000000000FD
+:10F3100000000000000000000000000000000001EC
+:10F3200001010101010101010101010101010100CE
+:10F3300000000000000000000000000000000000CD
+:10F3400000000000000000000000000000000000BD
+:10F3500000000000000000000000000000000000AD
+:10F36000000000000000000000000000000000029B
+:10F37000020202020202020202020202020202006F
+:10F38000000000000000000000000000000000007D
+:10F39000000000000000000000000000000000006D
+:10F3A000000000000000000000000000000000005D
+:10F3B000000000000000000000000000000000024B
+:10F3C000020202020202020202020202020202011E
+:10F3D000010101010101010101010101010101001E
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000001EB
+:10F4200001010101010101010101010101010100CD
+:10F4300000000000000000000000000000000000CC
+:10F4400000000000000000000000000000000000BC
+:10F4500000000000000000000000000000000000AC
+:10F46000000000000000000000000000000000019B
+:10F47000010101010101010101010101010101007D
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000024A
+:10F4C000020202020202020202020202020202011D
+:10F4D000010101010101010101010101010101001D
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000001EA
+:10F5200001010101010101010101010101010100CC
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000019A
+:10F57000010101010101010101010101010101007C
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B0000000000000000000000000000000000249
+:10F5C000020202020202020202020202020202011C
+:10F5D000010101010101010101010101010101001C
+:10F5E000000000000000000000000000000000001B
+:10F5F000000000000000000000000000000000000B
+:10F6000000000000000000000000000000000000FA
+:10F6100000000000000000000000000000000001E9
+:10F6200001010101010101010101010101010100CB
+:10F6300000000000000000000000000000000000CA
+:10F6400000000000000000000000000000000000BA
+:10F6500000000000000000000000000000000000AA
+:10F660000000000000000000000000000000000199
+:10F67000010101010101010101010101010101007B
+:10F68000000000000000000000000000000000007A
+:10F69000000000000000000000000000000000006A
+:10F6A000000000000000000000000000000000005A
+:10F6B0000000000000000000000000000000000248
+:10F6C000020202020202020202020202020202011B
+:10F6D000010101010101010101010101010101001B
+:10F6E000000000000000000000000000000000001A
+:10F6F000000000000000000000000000000000000A
+:10F7000000000000000000000000000000000000F9
+:10F7100000000000000000000000000000000002E7
+:10F7200002020202020202020202020202020200BB
+:10F7300000000000000000000000000000000000C9
+:10F7400000000000000000000000000000000000B9
+:10F7500000000000000000000000000000000000A9
+:10F760000000000000000000000000000000000297
+:10F77000020202020202020202020202020202006B
+:10F780000000000000000000000000000000000079
+:10F790000000000000000000000000000000000069
+:10F7A0000000000000000000000000000000000059
+:10F7B0000000000000000000000000000000000247
+:10F7C000020202020202020202020202020202001B
+:10F7D0000000000000000000000000000000000029
+:10F7E0000000000000000000000000000000000019
+:10F7F0000000000000000000000000000000000009
+:10F8000000000000000000000000000000000000F8
+:10F8100000000000000000000000000000000000E8
+:10F8200000000000000000000000000000000000D8
+:10F8300000000000000000000000000000000000C8
+:10F8400000000000000000000000000000000000B8
+:10F8500000000000000000000000000000000000A8
+:10F860000000000000000000000000000000000098
+:10F870000000000000000000000000000000000088
+:10F880000000000000000000000000000000000078
+:10F890000000000000000000000000000000000068
+:10F8A0000000000000000000000000000000000058
+:10F8B0000000000000000000000000000000000048
+:10F8C0000000000000000000000000000000001E1A
+:10F8D0000000000000000000000000000000000028
+:10F8E0000000000000000000000000000000000018
+:10F8F0000000000000000000000000000000000008
+:10F9000000000000000000000000000000000000F7
+:10F9100000000000000000000000000000000000E7
+:10F9200000000000000000000000000000000200D5
+:10F9300000000000000000000000000000000000C7
+:10F9400000000000000000000000000000000000B7
+:10F9500000000000000000000000000000000000A7
+:10F960000000000000000000000000000000000097
+:10F970000000000000000000000000000000000087
+:10F980000000000000000000000000000000000077
+:10F990000000000000000000000000000000000067
+:10F9A0000000000000000000000000000000000057
+:10F9B0000000000000000000000000000000000047
+:10F9C0000000000000000000000000010000000036
+:10F9D0000000000000000000000001000001000025
+:10F9E0000100010000010000000000000000000014
+:10F9F0000000000000000000000000000000000007
+:10FA000000000000000000000000000000000000F6
+:10FA100000000000000000000000000000000000E6
+:10FA200000000000000000000000000000000200D4
+:10FA300000000000000000000000000000000000C6
+:10FA400000000000000000000000000000000000B6
+:10FA500000000000000000000000000000000000A6
+:10FA60000000000000000000000000000000000096
+:10FA70000000000000000000000000000000000086
+:10FA80000000000000000000000000000000000076
+:10FA90000000000000000000000000000000000066
+:10FAA0000000000000000000000000000000000056
+:10FAB0000000000000000000000000000000000046
+:10FAC0000000000000000000000000010000000035
+:10FAD000000000000001000000010101010100011F
+:10FAE0000101010000010000000000000000000012
+:10FAF0000000000000000000000000000000000006
+:10FB000000000000000000000000000000000000F5
+:10FB100000000000000000000000000000000000E5
+:10FB200000000000000000000000000000000200D3
+:10FB300000000000000000000000000000000000C5
+:10FB400000000000000000000000000000000000B5
+:10FB500000000000000000000000000000000000A5
+:10FB60000000000000000000000000000000000095
+:10FB70000000000000000000000000000000000085
+:10FB80000000000000000000000000000000000075
+:10FB90000000000000000000000000000000000065
+:10FBA0000000000000000000000000000000000055
+:10FBB0000000000000000000000000000000000045
+:10FBC0000000000000000000000000010000020032
+:10FBD0000000000001010002010201010101010118
+:10FBE0000101010100010000000000000000000010
+:10FBF0000000000000000000000000000000000005
+:10FC000000000000000000000000000000000000F4
+:10FC100000000000000000000000000000000000E4
+:10FC200000000000000000000000000000000200D2
+:10FC300000000000000100000000000000000000C3
+:10FC400000000000000000000000000000000000B4
+:10FC500000000000000000000000000000000000A4
+:10FC60000000000000000000000000000000000094
+:10FC70000000000000000000000000000000000084
+:10FC80000000000000000000000000000000000074
+:10FC90000000000000000000000000000000000064
+:10FCA0000000000000000000000000000000000054
+:10FCB0000000000000000000000000000000000044
+:10FCC0000000000000000000000000010000020031
+:10FCD0000000000101010002010202010102020113
+:10FCE000020101010101000000000000000000000D
+:10FCF0000000000000000000000000000000000004
+:10FD000000000000000000000000000000000000F3
+:10FD100000000000000000000000000000000000E3
+:10FD200000000000000000000000000000000200D1
+:10FD300000000000000100000000000000000000C2
+:10FD400000000000000000000000000000000000B3
+:10FD500000000000000000000000000000000000A3
+:10FD60000000000000000000000000000000000093
+:10FD70000000000000000000000000000000000083
+:10FD80000000000000000000000000000000000073
+:10FD90000000000000000000000000000000000063
+:10FDA0000000000000000000000000000000000053
+:10FDB0000000000000000000000000000000000043
+:10FDC0000000000000000000000000010000010031
+:10FDD000000000010101000202020202010202020F
+:10FDE000020102010101000000000000000000000B
+:10FDF0000000000000000000000000000000000003
+:10FE000000000000000000000000000000000000F2
+:10FE100000000000000000000000000000000000E2
+:10FE200000000000000000000000000000000200D0
+:10FE300000000000000101000000000000000000C0
+:10FE400000000000000000000000000000000000B2
+:10FE500000000000000000000000000000000000A2
+:10FE60000000000000000000000000000000000092
+:10FE70000000000000000000000000000000000082
+:10FE80000000000000010000000000000000000071
+:10FE90000000000000000000000000000000000062
+:10FEA0000000000000000000000000000000000052
+:10FEB0000000000000000000000000000000000042
+:10FEC0000000000000000000000000010000010030
+:10FED000000000010101000202020202020202020D
+:10FEE000020102010101000000000000000000000A
+:10FEF0000000000000000000000000000000000002
+:10FF000000000000000000000000000000000000F1
+:10FF100000000000000000000000000000000000E1
+:10FF200000000000000000000000000000000100D0
+:10FF300000000000010101000000000000000000BE
+:10FF400000000000000000000000000000000000B1
+:10FF500000000000000000000000000000000000A1
+:10FF60000000000000000000000000000000000091
+:10FF70000000000000000000000000000000000081
+:10FF80000000000000010000000000000000000070
+:10FF90000000000000000000000000000000000061
+:10FFA0000000000000000000000000000000000051
+:10FFB0000000000000000000000000000000000041
+:10FFC000000000000000000000000001000001002F
+:10FFD000000000010101000202020202020202020C
+:10FFE0000201020101010000000000000000000009
+:10FFF0000000000000000000000000000000000001
+:02000002B0004C
+:1000000000000000000000000000000000000000F0
+:1000100000000000000000000000000000000000E0
+:1000200000000000000000010000000000000100CE
+:1000300000000000010101000000000000000000BD
+:1000400000000000000000000000000000000000B0
+:1000500000000000000000000000000000000000A0
+:100060000000000000000000000000000000000090
+:100070000000000000000000000000000000000080
+:10008000000000000001010000000000000000006E
+:100090000000000000000000000000000000000060
+:1000A0000000000000000000000000000000000050
+:1000B0000000000000000000000000000000000040
+:1000C000000000000000000001000001000001002D
+:1000D000000000010101010202020202020202020A
+:1000E0000201020101010000000000000000000008
+:1000F0000000000000000000000000000000000000
+:1001000000000000000000000000000000000000EF
+:1001100000000000000000000000000000000000DF
+:1001200000000000000000010000000100000100CC
+:1001300000000000010101000000000000000000BC
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000000000000000000000000000008F
+:10017000000000000000000000000000000002007D
+:10018000000000000101010000000000000000006C
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C000000000000000000001000000000001002D
+:1001D0000101000101010102020202020202020207
+:1001E0000202020201010000000000000000000005
+:1001F00000000000000000000000000000000000FF
+:1002000000000000000000000000000000000000EE
+:1002100000000000000000000000000000000000DE
+:1002200000000000000000020000010100000100C9
+:1002300000000000010101000000000000000000BB
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000002007C
+:100280000000020001010100000000000000000069
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000001000000000000012C
+:1002D0000101000101010102020202020202020206
+:1002E0000202020201010000000000000000000004
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000020001010101020100C4
+:1003300002000000010101000000000000000000B8
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000002007B
+:100380000000020001010100000000000000000068
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000001000000000000002C
+:1003D0000101000101010102020202020202020205
+:1003E0000202020201020000000000000000000002
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000020102020201020100BF
+:1004300002000000010101000000000000000000B7
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000002007A
+:100480000000010101010100000000000000000067
+:10049000000000000000000000000000000000005C
+:1004A000000000000000000000000000000000004C
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000001000000000000002B
+:1004D0000001010101010102020202020202020204
+:1004E0000202020202020000000000000000000000
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000020102020202010100BE
+:1005300002000000010201000000000000000000B5
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:100570000000000000000000000000000002020077
+:100580000200010101010100000000000000000064
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C0000000000000000000010000000001000029
+:1005D0000001010101010102020202020202020203
+:1005E00002020202020200000000000000000000FF
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000020202020202010200BB
+:1006300001000201020202000000000000000000B0
+:1006400000000000000000000000000000000000AA
+:10065000000000000000000000000000000000009A
+:10066000000000000000000000000000000000008A
+:100670000000000000000000010000000002010076
+:100680000200010101010100000000000000000063
+:10069000000000000000000000000000000000005A
+:1006A000000000000000000000000000000000004A
+:1006B000000000000000000000000000000000003A
+:1006C0000000000000000000010000000001000028
+:1006D0000001010101010102020202020202020202
+:1006E00002020202020200000000000000000000FE
+:1006F00000000000000000000000000000000000FA
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000020202020202020200B9
+:1007300001000201020202000000000000000000AF
+:1007400000000000000000000000000000000000A9
+:100750000000000000000000000000000000000099
+:100760000000000000000000000000000000000089
+:100770000000000000000000010000010201010073
+:100780000101010101010100000000000000000062
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000010000000001000027
+:1007D0000001010101010102020102020202020202
+:1007E00002020202020200000000000000000000FD
+:1007F00000000000000000000000000000000000F9
+:1008000000000000000000000000000000000000E8
+:1008100000000000000000000000000000000000D8
+:1008200000000000000000020202020202020200B8
+:1008300001000101020202000000000000000000AF
+:1008400000000000000000000000000000000000A8
+:100850000000000000000000000000000000000098
+:100860000000000000000000000000000000000088
+:100870000000000000000001010200010101010070
+:100880000101010101020100000000000000000060
+:100890000000000000000000000000000000000058
+:1008A0000000000000000000000000000000000048
+:1008B0000000000000000000000000000000000038
+:1008C0000000000000000000020000000001000025
+:1008D0000000010202020101020102020201010202
+:1008E00001020202020200000000000000000000FD
+:1008F00000000000000000000000000000000000F8
+:1009000000000000000000000000000000000000E7
+:1009100000000000000000000000000000000000D7
+:1009200000000000000000020202020202020202B5
+:1009300002000102020202000000000000000000AC
+:1009400000000000000000000000000000000000A7
+:100950000000000000000000000000000000000097
+:100960000000000000000000000000000000000087
+:10097000000000000000000202010001010101006E
+:10098000010101010202020000000000000000005D
+:100990000000000000000000000000000000000057
+:1009A0000000000000000000000000000000000047
+:1009B0000000000000000000000000000000000037
+:1009C0000000000000000000020000020000000023
+:1009D0000000000202020101010101010201010106
+:1009E00001020102020200000000000000000000FD
+:1009F00000000000000000000000000000000000F7
+:100A000000000000000000000000000000000000E6
+:100A100000000000000000000000000000000000D6
+:100A200000000000000000020202020202020202B4
+:100A300002000202020202000000000000000000AA
+:100A400000000000000000000000000000000000A6
+:100A50000000000000000000000000000000000096
+:100A60000000000000000000000000000000000086
+:100A7000000000000000000202020102010101006A
+:100A8000010102020202020000000000000000005A
+:100A90000000000000000000000000000000000056
+:100AA0000000000000000000000000000000000046
+:100AB0000000000000000000000000000000000036
+:100AC0000000000000000000020001020000000021
+:100AD0000000000202020101010101010101010106
+:100AE00001020102020200000000000000000000FC
+:100AF00000000000000000000000000000000000F6
+:100B000000000000000000000000000000000000E5
+:100B100000000000000000000000000000000000D5
+:100B200000000000000000010201010101010202B9
+:100B300002020202020202000000000000000000A7
+:100B400000000000000000000000000000000000A5
+:100B50000000000000000000000000000000000095
+:100B60000000000000000000000000000000000085
+:100B70000000000000000002020202020202020164
+:100B80000202020202020200000000000000000057
+:100B90000000000000000000000000000000000055
+:100BA0000000000000000000000000000000000045
+:100BB0000000000000000000000000000000000035
+:100BC0000000000000000000020001020000000020
+:100BD0000000000202020201010101010101010104
+:100BE00001020101020200000000000000000000FC
+:100BF00000000000000000000000000000000000F5
+:100C000000000000000000000000000000000000E4
+:100C100000000000000000000000000000000000D4
+:100C200000000000000000020202020202020202B2
+:100C300002020202020202000000000000000000A6
+:100C400000000000000000000000000000000000A4
+:100C50000000000000000000000000000000000094
+:100C60000000000000000000000000000000000084
+:100C70000000000000000002020202020202020262
+:100C80000202020202020200000000000000000056
+:100C90000000000000000000000000000000000054
+:100CA0000000000000000000000000000000000044
+:100CB0000000000000000000000000000000000034
+:100CC000000000000000000002000102010002001C
+:100CD0000002000202020201010101010101010101
+:100CE00001010101020200000000000000000000FC
+:100CF00000000000000000000000000000000000F4
+:100D000000000000000000000000000000000000E3
+:100D100000000000000000000000000000000000D3
+:100D200000000000000000000000000000000000C3
+:100D300000000000000000000000000000000000B3
+:100D400000000000000000000000000000000000A3
+:100D50000000000000000000000000000000000093
+:100D60000000000000000000000000000000000083
+:100D70000000000000000002020202020202020261
+:100D80000202020202020200000000000000000055
+:100D90000000000000000000000000000000000053
+:100DA0000000000000000000000000000000000043
+:100DB0000000000000000000000000000000000033
+:100DC0000000000000000000020102020102020017
+:100DD00000020202020202010100010101010101FF
+:100DE00001010101010101000000000000000000FC
+:100DF00000000000000000000000000000000000F3
+:100E000000000000000000000000000000000000E2
+:100E100000000000000000000000000000000000D2
+:100E200000000000000000000000000000000000C2
+:100E300000000000000000000000000000000000B2
+:100E400000000000000000000000000000000000A2
+:100E50000000000000000000000000000000000092
+:100E60000000000000000000000000000000000082
+:100E70000000000000000002020202020202020260
+:100E80000202020202020200000000000000000054
+:100E90000000000000000000000000000000000052
+:100EA0000000000000000000000000000000000042
+:100EB0000000000000000000000000000000000032
+:100EC0000000000000000002020202020002020014
+:100ED00002020202020202010100010101000001FE
+:100EE00000010101010101000000000000000000FC
+:100EF00000000000000000000000000000000000F2
+:100F000000000000000000000000000000000000E1
+:100F100000000000000000000000000000000000D1
+:100F200000000000000000000000000000000000C1
+:100F300000000000000000000000000000000000B1
+:100F400000000000000000000000000000000000A1
+:100F50000000000000000000000000000000000091
+:100F60000000000000000000000000000000000081
+:100F70000000000000000002020102020202020260
+:100F80000202020202020200000000000000000053
+:100F90000000000000000000000000000000000051
+:100FA0000000000000000000000000000000000041
+:100FB0000000000000000000000000000000000031
+:100FC0000000000000000002020202020202020011
+:100FD00002020202020202010101010101010101FA
+:100FE00001010101010101000000000000000000FA
+:100FF00000000000000000000000000000000000F1
+:1010000000000000000000000000000000000000E0
+:1010100000000000000000000000000000000000D0
+:1010200000000000000000010101010101010101B7
+:1010300001010101010101000000000000000000A9
+:1010400000000000000000000000000000000000A0
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000001010101010101010167
+:101080000101010101010100000000000000000059
+:101090000000000000000000000000000000000050
+:1010A0000000000000000000000000000000000040
+:1010B0000000000000000000000000000000000030
+:1010C000000000000000000202020202020202020E
+:1010D00002020202020202010101010101010101F9
+:1010E00001010101010101000000000000000000F9
+:1010F00000000000000000000000000000000000F0
+:1011000000000000000000000000000000000000DF
+:1011100000000000000000000000000000000000CF
+:1011200000000000000000010101010101010101B6
+:1011300001010101010101000000000000000000A8
+:10114000000000000000000000000000000000009F
+:10115000000000000000000000000000000000008F
+:10116000000000000000000000000000000000007F
+:10117000000000000000000202020202020202025D
+:101180000202020202020200000000000000000051
+:10119000000000000000000000000000000000004F
+:1011A000000000000000000000000000000000003F
+:1011B000000000000000000000000000000000002F
+:1011C000000000000000000202020202020202020D
+:1011D00002020202020202010101010101010101F8
+:1011E00001010101010101000000000000000000F8
+:1011F00000000000000000000000000000000000EF
+:1012000000000000000000000000000000000000DE
+:1012100000000000000000000000000000000000CE
+:1012200000000000000000010101010101010101B5
+:1012300001010101010101000000000000000000A7
+:10124000000000000000000000000000000000009E
+:10125000000000000000000000000000000000008E
+:10126000000000000000000000000000000000007E
+:10127000000000000000000000020000000000006C
+:10128000000000000000000000000000000000005E
+:10129000000000000000000000000000000000004E
+:1012A000000000000000000000000000000000003E
+:1012B000000000000000000000000000000000002E
+:1012C000000000000000000202020202020202020C
+:1012D00002020202020202010101010101010101F7
+:1012E00001010101010101000000000000000000F7
+:1012F00000000000000000000000000000000000EE
+:1013000000000000000000000000000000000000DD
+:1013100000000000000000000000000000000000CD
+:1013200000000000000000010101010101010101B4
+:1013300001010101010101000000000000000000A6
+:10134000000000000000000000000000000000009D
+:10135000000000000000000000000000000000008D
+:10136000000000000000000000000000000000007D
+:101370000000000000000001010101010101010164
+:101380000101010101010100000000000000000056
+:10139000000000000000000000000000000000004D
+:1013A000000000000000000000000000000000003D
+:1013B000000000000000000000000000000000002D
+:1013C000000000000000000202020202020202020B
+:1013D00002020202020202010101010101010101F6
+:1013E00001010101010101000000000000000000F6
+:1013F00000000000000000000000000000000000ED
+:1014000000000000000000000000000000000000DC
+:1014100000000000000000000000000000000000CC
+:1014200000000000000000010101010101010101B3
+:1014300001010101010101000000000000000000A5
+:10144000000000000000000000000000000000009C
+:10145000000000000000000000000000000000008C
+:10146000000000000000000000000000000000007C
+:101470000000000000000001010101010101010163
+:101480000101010101010100000000000000000055
+:10149000000000000000000000000000000000004C
+:1014A000000000000000000000000000000000003C
+:1014B000000000000000000000000000000000002C
+:1014C000000000000000000202020202020202020A
+:1014D00002020202020202010101010101010101F5
+:1014E00001010101010101000000000000000000F5
+:1014F00000000000000000000000000000000000EC
+:1015000000000000000000000000000000000000DB
+:1015100000000000000000000000000000000000CB
+:1015200000000000000000020202020202020202A9
+:10153000020202020202020000000000000000009D
+:10154000000000000000000000000000000000009B
+:10155000000000000000000000000000000000008B
+:10156000000000000000000000000000000000007B
+:101570000000000000000002020202020202020259
+:10158000020202020202020000000000000000004D
+:10159000000000000000000000000000000000004B
+:1015A000000000000000000000000000000000003B
+:1015B000000000000000000000000000000000002B
+:1015C0000000000000000002020202020202020209
+:1015D00002020202020202000000000000000000FD
+:1015E00000000000000000000000000000000000FB
+:1015F00000000000000000000000000000000000EB
+:1016000000000000000000000000000000000000DA
+:1016100000000000000000000000000000000000CA
+:1016200000000000000000000000000000000000BA
+:1016300000000000000000000000000000000000AA
+:10164000000000000000000000000000000000009A
+:10165000000000000000000000000000000000008A
+:10166000000000000000000000000000000000007A
+:10167000000000000000000000000000000000006A
+:10168000000000000000000000000000000000005A
+:10169000000000000000000000000000000000004A
+:1016A000000000000000000000000000000000003A
+:1016B000000000000000000000000000000000002A
+:1016C000000000000000000000000000000000001A
+:1016D000000000000000001E0000000000000002EA
+:1016E00000000000000000010001000001000000F7
+:1016F00000000000000000000000000000000000EA
+:1017000000000000000000000000000000000000D9
+:1017100000000000000000000000000000000000C9
+:1017200000000000000000000000000000000000B9
+:1017300000000000000000000000000000000000A9
+:101740000000000000000000000000000000000099
+:101750000000000000000000000000000000000089
+:101760000000000000000000000000000000000079
+:101770000000000000000000000000000000000069
+:101780000000000000000000000000000000000059
+:101790000000000000000000000000000000000049
+:1017A0000000000000000000000000000000000039
+:1017B0000000000000000000000000000000000029
+:1017C0000000000000000000000000000000000019
+:1017D0000101000100000000000000000000000204
+:1017E00000000000010101010001010101010000F0
+:1017F00000000000000000000000000000000000E9
+:1018000000000000000000000000000000000000D8
+:1018100000000000000000000000000000000000C8
+:1018200000000000000000000000000000000000B8
+:1018300000000000000000000000000000000000A8
+:101840000000000000000000000000000000000098
+:101850000000000000000000000000000000000088
+:101860000000000000000000000000000000000078
+:101870000000000000000000000000000000000068
+:101880000000000000000000000000000000000058
+:101890000000000000000000000000000000000048
+:1018A0000000000000000000000000000000000038
+:1018B0000000000000000000000000000000000028
+:1018C0000000000000000000000000000000000018
+:1018D0000101010101000000000000000000000201
+:1018E00000010001010101010101010101010000EC
+:1018F00000000000000000000000000000000000E8
+:1019000000000000000000000000000000000000D7
+:1019100000000000000000000000000000000000C7
+:1019200000000000000000000000000000000000B7
+:1019300000000000000000000000000000000000A7
+:101940000000000000000000000000000000000097
+:101950000000000000000000000000000000000087
+:101960000000000000000000000000000000000077
+:101970000000000000000000000000000000000067
+:101980000000000000000000000000000000000057
+:101990000000000000000000000000000000000047
+:1019A0000000000000000000000000000000000037
+:1019B0000000000000000000000000000000000027
+:1019C0000000000000000000000000000000000017
+:1019D00001010101010000000000010000000002FF
+:1019E00001010101020101010101010101010000E8
+:1019F00000000000000000000000000000000000E7
+:101A000000000000000000000000000000000000D6
+:101A100000000000000000000000000000000000C6
+:101A200000000000000000000000000000000000B6
+:101A300000000000000000000000000000000000A6
+:101A40000000000000000000000000000000000096
+:101A50000000000000000000000000000000000086
+:101A60000000000000000000000000000000000076
+:101A70000000000000000000000000000000000066
+:101A80000000000002000000000000000000010053
+:101A90000000000000000000000000000000000046
+:101AA0000000000000000000000000000000000036
+:101AB0000000000000000000000000000000000026
+:101AC0000000000000000000000000000000000016
+:101AD00001010101010000010001010000000002FC
+:101AE00002010101020101010101020201010000E4
+:101AF00000000000000000000000000000000000E6
+:101B000000000000000000000000000000000000D5
+:101B100000000000000000000000000000000000C5
+:101B200000000000000000000000000000000000B5
+:101B300000000000000000000000000000000000A5
+:101B40000000000000000000000000000000000095
+:101B50000000000000000000000000000000000085
+:101B60000000000000000000000000000000000075
+:101B70000000000000000000000000000000000065
+:101B80000000000002000000010000000000010051
+:101B90000000000000000000000000000000000045
+:101BA0000000000000000000000000000000000035
+:101BB0000000000000000000000000000000000025
+:101BC0000000000000000000000000000000000015
+:101BD00000010101010100010001010000000002FB
+:101BE00002020202020201020102020202010000DC
+:101BF00000000000000000000000000000000000E5
+:101C000000000000000000000000000000000000D4
+:101C100000000000000000000000000000000000C4
+:101C200000000000000000000000000000000000B4
+:101C300000000000000000000000000000000000A4
+:101C40000000000000000000000000000000000094
+:101C50000000000000000000000000000000000084
+:101C60000000000000000000000000000000000074
+:101C70000000000000000000000000000000000064
+:101C80000000000002000000010000000000010050
+:101C90000000000000000000000000000000000044
+:101CA0000000000000000000000000000000000034
+:101CB0000000000000000000000000000000000024
+:101CC0000000000000000000000000000000000014
+:101CD00000000000000100010001010000000102FD
+:101CE00002020202020201020102020202010000DB
+:101CF00000000000000000000000000000000000E4
+:101D000000000000000000000000000000000000D3
+:101D100000000000000000000000000000000000C3
+:101D200000000000000000000000000000000000B3
+:101D300000000000000000000000000000000000A3
+:101D40000000000000000000000000000000000093
+:101D50000000000000000000000000000000000083
+:101D60000000000000000000000000000000000073
+:101D70000000000000000000000000000000000063
+:101D8000000000000200000001000000000001004F
+:101D90000000000000000000000000000000000043
+:101DA0000000000000000000000000000000000033
+:101DB0000000000000000000000000000000000023
+:101DC0000000000000000000000000000000000013
+:101DD00000000000000100010001010001000102FB
+:101DE00002020202020202020102020202020000D8
+:101DF00000000000000000000000000000000000E3
+:101E000000000000000000000000000000000000D2
+:101E100000000000000000000000000000000000C2
+:101E200000000000000000000000000000000000B2
+:101E300000000000000000000000000000000100A1
+:101E40000000000000000000000000000000000092
+:101E50000000000000000000000000000000000082
+:101E60000000000000000000000000000000000072
+:101E70000000000000000000000000000000000062
+:101E8000000000000100010001000000000101004D
+:101E90000000000000000000000000000000000042
+:101EA0000000000000000000000000000000000032
+:101EB0000000000000000000000000000000000022
+:101EC0000000000000000000000000000000000012
+:101ED00000000000000100010101010101000102F8
+:101EE00002020202020202020102020202020000D7
+:101EF00000000000000000000000000000000000E2
+:101F000000000000000000000000000000000000D1
+:101F100000000000000000000000000000000000C1
+:101F200000000000000000000000000000000000B1
+:101F3000000000000000000001000000000001009F
+:101F40000000000000000000000000000000000091
+:101F50000000000000000000000000000000000081
+:101F60000000000000000000000000000000000071
+:101F70000000000000000000000000000000000061
+:101F8000000000000100010001000000000101004C
+:101F90000000000000000000000000000000000041
+:101FA0000000000000000000000000000000000031
+:101FB0000000000000000000000000000000000021
+:101FC0000000000000000000000000000000000011
+:101FD00000000000000101010101010101010102F5
+:101FE00002020202020202020202020202020000D5
+:101FF00000000000000000000000000000000000E1
+:1020000000000000000000000000000000000000D0
+:1020100000000000000000000000000000000000C0
+:1020200000000000000000000000000000000000B0
+:10203000000000000000010001000000000101009C
+:102040000000000000000000000000000000000090
+:102050000000000000000000000000000000000080
+:102060000000000000000000000000000000000070
+:102070000000000000000000000000000000000060
+:10208000000000000100010001000000000101004B
+:102090000000000000000000000000000000000040
+:1020A0000000000000000000000000000000000030
+:1020B0000000000000000000000000000000000020
+:1020C0000000000000000000000000000000000010
+:1020D00000000000000101010101000101010102F5
+:1020E00002020202020202020202020202020000D4
+:1020F00000000000000000000000000000000000E0
+:1021000000000000000000000000000000000000CF
+:1021100000000000000000000000000000000000BF
+:1021200000000000000000000000000000000000AF
+:10213000000000000000010001000000000101009B
+:10214000000000000000000000000000000000008F
+:10215000000000000000000000000000000000007F
+:10216000000000000000000000000000000000006F
+:10217000000000000000000000000000000000005F
+:102180000001000001000101010000000001010048
+:10219000000000000000000000000000000000003F
+:1021A000000000000000000000000000000000002F
+:1021B000000000000000000000000000000000001F
+:1021C000000000000000000000000000000000000F
+:1021D00000000000000101010101000101010102F4
+:1021E00002020202020202020202020202020000D3
+:1021F00000000000000000000000000000000000DF
+:1022000000000000000000000000000000000000CE
+:1022100000000000000000000000000000000000BE
+:1022200000000000000000000000000000000000AE
+:10223000000000000000010001000000000101009A
+:10224000000000000000000000000000000000008E
+:10225000000000000000000000000000000000007E
+:10226000000000000000000000000000000000006E
+:10227000000000000000000000000000000000015D
+:102280000001000001000101010000000101010046
+:10229000000000000000000000000000000000003E
+:1022A000000000000000000000000000000000002E
+:1022B000000000000000000000000000000000001E
+:1022C000000000000000000000000000000000000E
+:1022D00000000000000001000100000101010102F6
+:1022E00002020202020202020202020202020000D2
+:1022F00000000000000000000000000000000000DE
+:1023000000000000000000000000000000000000CD
+:1023100000000000000000000000000000000000BD
+:1023200000000000000000000000000000000000AD
+:102330000000000000000100010100000101010097
+:10234000000000000000000000000000000000008D
+:10235000000000000000000000000000000000007D
+:10236000000000000000000000000000000000006D
+:10237000000000000000000000000000000000015C
+:102380000101000101000101010100000101010042
+:10239000000000000000000000000000000000003D
+:1023A000000000000000000000000000000000002D
+:1023B000000000000000000000000000000000001D
+:1023C000000000000000000000000000000000000D
+:1023D00000000000000001000100000001010101F7
+:1023E00002020202020202020202020202020000D1
+:1023F00000000000000000000000000000000000DD
+:1024000000000000000000000000000000000000CC
+:1024100000000000000000000000000000000000BC
+:1024200000000000000000000000000000000001AB
+:102430000000000000000100010100000101010096
+:10244000000000000000000000000000000000008C
+:10245000000000000000000000000000000000007C
+:10246000000000000000000000000000000000006C
+:10247000000000000000000000000000000000025A
+:10248000010101010101010102010000010102003D
+:10249000000000000000000000000000000000003C
+:1024A000000000000000000000000000000000002C
+:1024B000000000000000000000000000000000001C
+:1024C000000000000000000000000000000000000C
+:1024D00000000000000001000100000001010101F6
+:1024E00002020202020202020202020202020000D0
+:1024F00000000000000000000000000000000000DC
+:1025000000000000000000000000000000000000CB
+:1025100000000000000000000000000000000000BB
+:1025200000000000000000000000000000000002A9
+:102530000001000001000101010100000101010092
+:10254000000000000000000000000000000000008B
+:10255000000000000000000000000000000000007B
+:10256000000000000000000000000000000000006B
+:102570000000000000000000000000000000000259
+:102580000202010102010201020101000102020036
+:10259000000000000000000000000000000000003B
+:1025A000000000000000000000000000000000002B
+:1025B000000000000000000000000000000000001B
+:1025C000000000000000000000000000000000000B
+:1025D00000000000000001000100000000010101F6
+:1025E00002020202010202020202010102020000D2
+:1025F00000000000000000000000000000000000DB
+:1026000000000000000000000000000000000000CA
+:1026100000000000000000000000000000000000BA
+:1026200000000000000000000000000000000002A8
+:102630000001000001010101010100000101010090
+:10264000000000000000000000000000000000008A
+:10265000000000000000000000000000000000007A
+:10266000000000000000000000000000000000006A
+:102670000000000000000000000000000000000258
+:102680000202020202010202020101000102020032
+:10269000000000000000000000000000000000003A
+:1026A000000000000000000000000000000000002A
+:1026B000000000000000000000000000000000001A
+:1026C000000000000000000000000000000000000A
+:1026D00000000000000001000100000000010101F5
+:1026E00001020202010202020202010102020000D2
+:1026F00000000000000000000000000000000000DA
+:1027000000000000000000000000000000000000C9
+:1027100000000000000000000000000000000000B9
+:1027200000000000000000000000000000000002A7
+:10273000000100010201010101010000010101008D
+:102740000000000000000000000000000000000089
+:102750000000000000000000000000000000000079
+:102760000000000000000000000000000000000069
+:102770000000000000000000000000000000000257
+:10278000020202020202020202020101020202002D
+:102790000000000000000000000000000000000039
+:1027A0000000000000000000000000000000000029
+:1027B0000000000000000000000000000000000019
+:1027C0000000000000000000000000000000000009
+:1027D00000000000000001000100000000010201F3
+:1027E00001010101010102010201010101020000D8
+:1027F00000000000000000000000000000000000D9
+:1028000000000000000000000000000000000000C8
+:1028100000000000000000000000000000000000B8
+:1028200000000000000000000000000000000002A6
+:102830000001000102010201020101000102020087
+:102840000000000000000000000000000000000088
+:102850000000000000000000000000000000000078
+:102860000000000000000000000000000000000068
+:102870000000000000000000000000000000000256
+:10288000020202020202020202020201020202002B
+:102890000000000000000000000000000000000038
+:1028A0000000000000000000000000000000000028
+:1028B0000000000000000000000000000000000018
+:1028C0000000000000000000000000000000000008
+:1028D00000000000000202020202020002020201E5
+:1028E00001010101010101010201010101010000D9
+:1028F00000000000000000000000000000000000D8
+:1029000000000000000000000000000000000000C7
+:1029100000000000000000000000000000000000B7
+:1029200000000000000000000000000000000002A5
+:102930000102000102010201020201000202020082
+:102940000000000000000000000000000000000087
+:102950000000000000000000000000000000000077
+:102960000000000000000000000000000000000067
+:102970000000000000000000000000000000000255
+:102980000202020202020202020202020202020029
+:102990000000000000000000000000000000000037
+:1029A0000000000000000000000000000000000027
+:1029B0000000000000000000000000000000000017
+:1029C0000000000000000000000000000000000007
+:1029D00002000000000202020202020002020201E2
+:1029E00001010101010101010101010101010000D9
+:1029F00000000000000000000000000000000000D7
+:102A000000000000000000000000000000000000C6
+:102A100000000000000000000000000000000000B6
+:102A200000000000000000000000000000000002A4
+:102A3000020201020202020202020100020202007C
+:102A40000000000000000000000000000000000086
+:102A50000000000000000000000000000000000076
+:102A60000000000000000000000000000000000066
+:102A70000000000000000000000000000000000254
+:102A80000202020202020202020202020202020028
+:102A90000000000000000000000000000000000036
+:102AA0000000000000000000000000000000000026
+:102AB0000000000000000000000000000000000016
+:102AC0000000000000000000000000000000000006
+:102AD00002020202020202020202020002020201D9
+:102AE00001010101010101010101010101010000D8
+:102AF00000000000000000000000000000000000D6
+:102B000000000000000000000000000000000000C5
+:102B100000000000000000000000000000000000B5
+:102B200000000000000000000000000000000001A4
+:102B30000202020202020202020202000202020079
+:102B40000000000000000000000000000000000085
+:102B50000000000000000000000000000000000075
+:102B60000000000000000000000000000000000065
+:102B70000000000000000000000000000000000253
+:102B80000202020202020202020202020202020027
+:102B90000000000000000000000000000000000035
+:102BA0000000000000000000000000000000000025
+:102BB0000000000000000000000000000000000015
+:102BC0000000000000000000000000000000000005
+:102BD00002020202020202020202020202020201D6
+:102BE00001010101010101010101010101010100D6
+:102BF00000000000000000000000000000000000D5
+:102C000000000000000000000000000000000000C4
+:102C100000000000000000000000000000000000B4
+:102C200000000000000000000000000000000002A2
+:102C30000202020201020202020202000202020079
+:102C40000000000000000000000000000000000084
+:102C50000000000000000000000000000000000074
+:102C60000000000000000000000000000000000064
+:102C70000000000000000000000000000000000153
+:102C80000101010101010101010102020201010032
+:102C90000000000000000000000000000000000034
+:102CA0000000000000000000000000000000000024
+:102CB0000000000000000000000000000000000014
+:102CC0000000000000000000000000000000000202
+:102CD00002020202020202020202020202020200D6
+:102CE00001010101010101010101010101010100D5
+:102CF00000000000000000000000000000000000D4
+:102D000000000000000000000000000000000000C3
+:102D100000000000000000000000000000000000B3
+:102D200000000000000000000000000000000000A3
+:102D30000202020202020202020202000202020077
+:102D40000000000000000000000000000000000083
+:102D50000000000000000000000000000000000073
+:102D60000000000000000000000000000000000063
+:102D70000000000000000000000000000000000152
+:102D80000202020201020202020201010102020029
+:102D90000000000000000000000000000000000033
+:102DA0000000000000000000000000000000000023
+:102DB0000000000000000000000000000000000013
+:102DC0000000000000000000000000000000000201
+:102DD00002020202020202020202020202020000D7
+:102DE00001010101000101010101000001010100D7
+:102DF00000000000000000000000000000000000D3
+:102E000000000000000000000000000000000000C2
+:102E100000000000000000000000000000000000B2
+:102E200000000000000000000000000000000000A2
+:102E30000202020200020202020202020202020076
+:102E40000000000000000000000000000000000082
+:102E50000000000000000000000000000000000072
+:102E60000000000000000000000000000000000062
+:102E70000000000000000000000000000000000250
+:102E8000000000000200000000000202020000003A
+:102E90000000000000000000000000000000000032
+:102EA0000000000000000000000000000000000022
+:102EB0000000000000000000000000000000000012
+:102EC0000000000000000000000000000000000200
+:102ED00002020202020000000000000200000000E6
+:102EE00000010101000101010101000001010100D7
+:102EF00000000000000000000000000000000000D2
+:102F000000000000000000000000000000000000C1
+:102F100000000000000000000000000000000000B1
+:102F200000000000000000000000000000000001A0
+:102F30000101010101010101010101010101010082
+:102F40000000000000000000000000000000000081
+:102F50000000000000000000000000000000000071
+:102F60000000000000000000000000000000000061
+:102F7000000000000000000000000000000000024F
+:102F8000000000000200000000000000000000003F
+:102F90000000000000000000000000000000000031
+:102FA0000000000000000000000000000000000021
+:102FB0000000000000000000000000000000000011
+:102FC00000000000000000000000000000000002FF
+:102FD00002020202020202020202020202020201D2
+:102FE00001010101010101010101010101010100D2
+:102FF00000000000000000000000000000000000D1
+:1030000000000000000000000000000000000000C0
+:1030100000000000000000000000000000000000B0
+:10302000000000000000000000000000000000019F
+:103030000101010101010101010101010101010081
+:103040000000000000000000000000000000000080
+:103050000000000000000000000000000000000070
+:103060000000000000000000000000000000000060
+:103070000000000000000000000000000000000050
+:103080000000000000000000000000000000000040
+:103090000000000000000000000000000000000030
+:1030A0000000000000000000000000000000000020
+:1030B0000000000000000000000000000000000010
+:1030C00000000000000000000000000000000002FE
+:1030D00002020202020202020202020202020201D1
+:1030E00001010101010101010101010101010100D1
+:1030F00000000000000000000000000000000000D0
+:1031000000000000000000000000000000000000BF
+:1031100000000000000000000000000000000000AF
+:10312000000000000000000000000000000000019E
+:103130000101010101010101010101010101010080
+:10314000000000000000000000000000000000007F
+:10315000000000000000000000000000000000006F
+:10316000000000000000000000000000000000005F
+:10317000000000000000000000000000000000014E
+:103180000101010101010101010101010101010030
+:10319000000000000000000000000000000000002F
+:1031A000000000000000000000000000000000001F
+:1031B000000000000000000000000000000000000F
+:1031C00000000000000000000000000000000002FD
+:1031D00002020202020202020202020202020201D0
+:1031E00001010101010101010101010101010100D0
+:1031F00000000000000000000000000000000000CF
+:1032000000000000000000000000000000000000BE
+:1032100000000000000000000000000000000000AE
+:10322000000000000000000000000000000000019D
+:10323000010101010101010101010101010101007F
+:10324000000000000000000000000000000000007E
+:10325000000000000000000000000000000000006E
+:10326000000000000000000000000000000000005E
+:10327000000000000000000000000000000000014D
+:10328000010101010101010101010101010101002F
+:10329000000000000000000000000000000000002E
+:1032A000000000000000000000000000000000001E
+:1032B000000000000000000000000000000000000E
+:1032C00000000000000000000000000000000002FC
+:1032D00002020202020202020202020202020201CF
+:1032E00001010101010101010101010101010100CF
+:1032F00000000000000000000000000000000000CE
+:1033000000000000000000000000000000000000BD
+:1033100000000000000000000000000000000000AD
+:10332000000000000000000000000000000000029B
+:10333000020202020202020202020202020202006F
+:10334000000000000000000000000000000000007D
+:10335000000000000000000000000000000000006D
+:10336000000000000000000000000000000000005D
+:10337000000000000000000000000000000000024B
+:10338000020202020202020202020202020202001F
+:10339000000000000000000000000000000000002D
+:1033A000000000000000000000000000000000001D
+:1033B000000000000000000000000000000000000D
+:1033C00000000000000000000000000000000002FB
+:1033D00002020202020202020202020202020200CF
+:1033E00000000000000000000000000000000000DD
+:1033F00000000000000000000000000000000000CD
+:1034000000000000000000000000000000000000BC
+:1034100000000000000000000000000000000000AC
+:10342000000000000000000000000000000000009C
+:10343000000000000000000000000000000000008C
+:10344000000000000000000000000000000000007C
+:10345000000000000000000000000000000000006C
+:10346000000000000000000000000000000000005C
+:10347000000000000000000000000000000000004C
+:10348000000000000000000000000000000000003C
+:10349000000000000000000000000000000000002C
+:1034A000000000000000000000000000000000001C
+:1034B000000000000000000000000000000000000C
+:1034C00000000000000000000000000000000000FC
+:0F34D000000000000000000000000000000000ED
+:00000001FF
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c
index b639dcf7c778..0133b5a30413 100644
--- a/fs/binfmt_aout.c
+++ b/fs/binfmt_aout.c
@@ -263,6 +263,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs)
#else
set_personality(PER_LINUX);
#endif
+ setup_new_exec(bprm);
current->mm->end_code = ex.a_text +
(current->mm->start_code = N_TXTADDR(ex));
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index b7c1603cd4bd..e9b214a1dfc8 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -501,22 +501,22 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
}
}
- /*
- * Now fill out the bss section. First pad the last page up
- * to the page boundary, and then perform a mmap to make sure
- * that there are zero-mapped pages up to and including the
- * last bss page.
- */
- if (padzero(elf_bss)) {
- error = -EFAULT;
- goto out_close;
- }
+ if (last_bss > elf_bss) {
+ /*
+ * Now fill out the bss section. First pad the last page up
+ * to the page boundary, and then perform a mmap to make sure
+ * that there are zero-mapped pages up to and including the
+ * last bss page.
+ */
+ if (padzero(elf_bss)) {
+ error = -EFAULT;
+ goto out_close;
+ }
- /* What we have mapped so far */
- elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
+ /* What we have mapped so far */
+ elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
- /* Map the last of the bss segment */
- if (last_bss > elf_bss) {
+ /* Map the last of the bss segment */
down_write(&current->mm->mmap_sem);
error = do_brk(elf_bss, last_bss - elf_bss);
up_write(&current->mm->mmap_sem);
@@ -662,27 +662,6 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
goto out_free_interp;
- /*
- * The early SET_PERSONALITY here is so that the lookup
- * for the interpreter happens in the namespace of the
- * to-be-execed image. SET_PERSONALITY can select an
- * alternate root.
- *
- * However, SET_PERSONALITY is NOT allowed to switch
- * this task into the new images's memory mapping
- * policy - that is, TASK_SIZE must still evaluate to
- * that which is appropriate to the execing application.
- * This is because exit_mmap() needs to have TASK_SIZE
- * evaluate to the size of the old image.
- *
- * So if (say) a 64-bit application is execing a 32-bit
- * application it is the architecture's responsibility
- * to defer changing the value of TASK_SIZE until the
- * switch really is going to happen - do this in
- * flush_thread(). - akpm
- */
- SET_PERSONALITY(loc->elf_ex);
-
interpreter = open_exec(elf_interpreter);
retval = PTR_ERR(interpreter);
if (IS_ERR(interpreter))
@@ -730,9 +709,6 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
/* Verify the interpreter has a valid arch */
if (!elf_check_arch(&loc->interp_elf_ex))
goto out_free_dentry;
- } else {
- /* Executables without an interpreter also need a personality */
- SET_PERSONALITY(loc->elf_ex);
}
/* Flush all traces of the currently running executable */
@@ -752,7 +728,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
current->flags |= PF_RANDOMIZE;
- arch_pick_mmap_layout(current->mm);
+
+ setup_new_exec(bprm);
/* Do this so that we can load the interpreter, if need be. We will
change some of these later */
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
index 20fbeced472b..9fdbda927875 100644
--- a/fs/binfmt_elf_fdpic.c
+++ b/fs/binfmt_elf_fdpic.c
@@ -313,6 +313,9 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm,
* defunct, deceased, etc. after this point we have to exit via
* error_kill */
set_personality(PER_LINUX_FDPIC);
+
+ setup_new_exec(bprm);
+
set_binfmt(&elf_fdpic_format);
current->mm->start_code = 0;
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index e92f229e3c6e..4510022659c5 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -521,6 +521,7 @@ static int load_flat_file(struct linux_binprm * bprm,
/* OK, This is the point of no return */
set_personality(PER_LINUX_32BIT);
+ setup_new_exec(bprm);
}
/*
diff --git a/fs/binfmt_som.c b/fs/binfmt_som.c
index eff74b9c9e77..35cf0023ddb8 100644
--- a/fs/binfmt_som.c
+++ b/fs/binfmt_som.c
@@ -227,6 +227,7 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs)
/* OK, This is the point of no return */
current->flags &= ~PF_FORKNOEXEC;
current->personality = PER_HPUX;
+ setup_new_exec(bprm);
/* Set the task size for HP-UX processes such that
* the gateway page is outside the address space.
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 94dfda24c06e..9d544ea02c0a 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1243,8 +1243,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9);
}
} else {
- put_disk(disk);
module_put(disk->fops->owner);
+ put_disk(disk);
disk = NULL;
if (bdev->bd_contains == bdev) {
if (bdev->bd_disk->fops->open) {
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 6084d6379c03..3cfec696af9c 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -572,9 +572,9 @@ require use of the stronger protocol */
#define CIFSSEC_MUST_LANMAN 0x10010
#define CIFSSEC_MUST_PLNTXT 0x20020
#ifdef CONFIG_CIFS_UPCALL
-#define CIFSSEC_MASK 0xAF0AF /* allows weak security but also krb5 */
+#define CIFSSEC_MASK 0xBF0BF /* allows weak security but also krb5 */
#else
-#define CIFSSEC_MASK 0xA70A7 /* current flags supported if weak */
+#define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */
#endif /* UPCALL */
#else /* do not allow weak pw hash */
#ifdef CONFIG_CIFS_UPCALL
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index da8fbf565991..3949ae197809 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -389,4 +389,5 @@ extern int CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
const struct nls_table *nls_codepage, int remap_special_chars);
extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon,
const int netfid, __u64 *pExtAttrBits, __u64 *pMask);
+extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb);
#endif /* _CIFSPROTO_H */
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 1f3345d7fa79..08a44ca2a8db 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -1556,7 +1556,8 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
out_err:
if (tcp_ses) {
- kfree(tcp_ses->hostname);
+ if (!IS_ERR(tcp_ses->hostname))
+ kfree(tcp_ses->hostname);
if (tcp_ses->ssocket)
sock_release(tcp_ses->ssocket);
kfree(tcp_ses);
@@ -2199,16 +2200,8 @@ is_path_accessible(int xid, struct cifsTconInfo *tcon,
struct cifs_sb_info *cifs_sb, const char *full_path)
{
int rc;
- __u64 inode_num;
FILE_ALL_INFO *pfile_info;
- rc = CIFSGetSrvInodeNumber(xid, tcon, full_path, &inode_num,
- cifs_sb->local_nls,
- cifs_sb->mnt_cifs_flags &
- CIFS_MOUNT_MAP_SPECIAL_CHR);
- if (rc != -EOPNOTSUPP)
- return rc;
-
pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
if (pfile_info == NULL)
return -ENOMEM;
@@ -2274,12 +2267,12 @@ int
cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
char *mount_data_global, const char *devname)
{
- int rc = 0;
+ int rc;
int xid;
struct smb_vol *volume_info;
- struct cifsSesInfo *pSesInfo = NULL;
- struct cifsTconInfo *tcon = NULL;
- struct TCP_Server_Info *srvTcp = NULL;
+ struct cifsSesInfo *pSesInfo;
+ struct cifsTconInfo *tcon;
+ struct TCP_Server_Info *srvTcp;
char *full_path;
char *mount_data = mount_data_global;
#ifdef CONFIG_CIFS_DFS_UPCALL
@@ -2288,6 +2281,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
int referral_walks_count = 0;
try_mount_again:
#endif
+ rc = 0;
+ tcon = NULL;
+ pSesInfo = NULL;
+ srvTcp = NULL;
full_path = NULL;
xid = GetXid();
@@ -2584,6 +2581,7 @@ remote_path_check:
cleanup_volume_info(&volume_info);
referral_walks_count++;
+ FreeXid(xid);
goto try_mount_again;
}
#else /* No DFS support, return error on mount */
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index 4326ffd90fa9..965269041c31 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -212,8 +212,6 @@ int cifs_posix_open(char *full_path, struct inode **pinode,
posix_flags |= SMB_O_EXCL;
if (oflags & O_TRUNC)
posix_flags |= SMB_O_TRUNC;
- if (oflags & O_APPEND)
- posix_flags |= SMB_O_APPEND;
if (oflags & O_SYNC)
posix_flags |= SMB_O_SYNC;
if (oflags & O_DIRECTORY)
@@ -648,7 +646,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
* O_EXCL: optimize away the lookup, but don't hash the dentry. Let
* the VFS handle the create.
*/
- if (nd->flags & LOOKUP_EXCL) {
+ if (nd && (nd->flags & LOOKUP_EXCL)) {
d_instantiate(direntry, NULL);
return 0;
}
@@ -680,7 +678,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
* reduction in network traffic in the other paths.
*/
if (pTcon->unix_ext) {
- if (!(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) &&
+ if (nd && !(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) &&
(nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open &&
(nd->intent.open.flags & O_CREAT)) {
rc = cifs_posix_open(full_path, &newInode,
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index 82d83839655e..9a77a30756c4 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -512,13 +512,10 @@ int cifs_get_inode_info(struct inode **pinode,
cifs_sb->local_nls,
cifs_sb->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR);
- if (rc1) {
+ if (rc1 || !fattr.cf_uniqueid) {
cFYI(1, ("GetSrvInodeNum rc %d", rc1));
fattr.cf_uniqueid = iunique(sb, ROOT_I);
- /* disable serverino if call not supported */
- if (rc1 == -EINVAL)
- cifs_sb->mnt_cifs_flags &=
- ~CIFS_MOUNT_SERVER_INUM;
+ cifs_autodisable_serverino(cifs_sb);
}
} else {
fattr.cf_uniqueid = iunique(sb, ROOT_I);
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
index e079a9190ec4..b8dc3ed5d46c 100644
--- a/fs/cifs/misc.c
+++ b/fs/cifs/misc.c
@@ -705,3 +705,17 @@ cifsConvertToUCS(__le16 *target, const char *source, int maxlen,
ctoUCS_out:
return i;
}
+
+void
+cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb)
+{
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
+ cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM;
+ cERROR(1, ("Autodisabling the use of server inode numbers on "
+ "%s. This server doesn't seem to support them "
+ "properly. Hardlinks will not be recognized on this "
+ "mount. Consider mounting with the \"noserverino\" "
+ "option to silence this message.",
+ cifs_sb->tcon->treeName));
+ }
+}
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
index f823a4a208a7..f55d42bbf7e8 100644
--- a/fs/cifs/readdir.c
+++ b/fs/cifs/readdir.c
@@ -666,6 +666,7 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst,
min(len, max_len), nlt,
cifs_sb->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR);
+ pqst->len -= nls_nullsize(nlt);
} else {
pqst->name = filename;
pqst->len = len;
@@ -727,11 +728,12 @@ static int cifs_filldir(char *pfindEntry, struct file *file, filldir_t filldir,
cifs_dir_info_to_fattr(&fattr, (FILE_DIRECTORY_INFO *)
pfindEntry, cifs_sb);
- /* FIXME: make _to_fattr functions fill this out */
- if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_ID_FULL_DIR_INFO)
+ if (inum && (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
fattr.cf_uniqueid = inum;
- else
+ } else {
fattr.cf_uniqueid = iunique(sb, ROOT_I);
+ cifs_autodisable_serverino(cifs_sb);
+ }
ino = cifs_uniqueid_to_ino_t(fattr.cf_uniqueid);
tmp_dentry = cifs_readdir_lookup(file->f_dentry, &qstring, &fattr);
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index f91fd51b32e3..d84e7058c298 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -1800,7 +1800,7 @@ struct space_resv_32 {
/* just account for different alignment */
static int compat_ioctl_preallocate(struct file *file, unsigned long arg)
{
- struct space_resv_32 __user *p32 = (void __user *)arg;
+ struct space_resv_32 __user *p32 = compat_ptr(arg);
struct space_resv __user *p = compat_alloc_user_space(sizeof(*p));
if (copy_in_user(&p->l_type, &p32->l_type, sizeof(s16)) ||
@@ -2802,7 +2802,7 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
#else
case FS_IOC_RESVSP:
case FS_IOC_RESVSP64:
- error = ioctl_preallocate(filp, (void __user *)arg);
+ error = ioctl_preallocate(filp, compat_ptr(arg));
goto out_fput;
#endif
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index d22438ef7674..39c6ee868d7b 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -32,7 +32,9 @@ static struct vfsmount *debugfs_mount;
static int debugfs_mount_count;
static bool debugfs_registered;
-static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t dev)
+static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t dev,
+ void *data, const struct file_operations *fops)
+
{
struct inode *inode = new_inode(sb);
@@ -44,14 +46,18 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d
init_special_inode(inode, mode, dev);
break;
case S_IFREG:
- inode->i_fop = &debugfs_file_operations;
+ inode->i_fop = fops ? fops : &debugfs_file_operations;
+ inode->i_private = data;
break;
case S_IFLNK:
inode->i_op = &debugfs_link_operations;
+ inode->i_fop = fops;
+ inode->i_private = data;
break;
case S_IFDIR:
inode->i_op = &simple_dir_inode_operations;
- inode->i_fop = &simple_dir_operations;
+ inode->i_fop = fops ? fops : &simple_dir_operations;
+ inode->i_private = data;
/* directory inodes start off with i_nlink == 2
* (for "." entry) */
@@ -64,7 +70,8 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d
/* SMP-safe */
static int debugfs_mknod(struct inode *dir, struct dentry *dentry,
- int mode, dev_t dev)
+ int mode, dev_t dev, void *data,
+ const struct file_operations *fops)
{
struct inode *inode;
int error = -EPERM;
@@ -72,7 +79,7 @@ static int debugfs_mknod(struct inode *dir, struct dentry *dentry,
if (dentry->d_inode)
return -EEXIST;
- inode = debugfs_get_inode(dir->i_sb, mode, dev);
+ inode = debugfs_get_inode(dir->i_sb, mode, dev, data, fops);
if (inode) {
d_instantiate(dentry, inode);
dget(dentry);
@@ -81,12 +88,13 @@ static int debugfs_mknod(struct inode *dir, struct dentry *dentry,
return error;
}
-static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode,
+ void *data, const struct file_operations *fops)
{
int res;
mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR;
- res = debugfs_mknod(dir, dentry, mode, 0);
+ res = debugfs_mknod(dir, dentry, mode, 0, data, fops);
if (!res) {
inc_nlink(dir);
fsnotify_mkdir(dir, dentry);
@@ -94,18 +102,20 @@ static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
return res;
}
-static int debugfs_link(struct inode *dir, struct dentry *dentry, int mode)
+static int debugfs_link(struct inode *dir, struct dentry *dentry, int mode,
+ void *data, const struct file_operations *fops)
{
mode = (mode & S_IALLUGO) | S_IFLNK;
- return debugfs_mknod(dir, dentry, mode, 0);
+ return debugfs_mknod(dir, dentry, mode, 0, data, fops);
}
-static int debugfs_create(struct inode *dir, struct dentry *dentry, int mode)
+static int debugfs_create(struct inode *dir, struct dentry *dentry, int mode,
+ void *data, const struct file_operations *fops)
{
int res;
mode = (mode & S_IALLUGO) | S_IFREG;
- res = debugfs_mknod(dir, dentry, mode, 0);
+ res = debugfs_mknod(dir, dentry, mode, 0, data, fops);
if (!res)
fsnotify_create(dir, dentry);
return res;
@@ -139,7 +149,9 @@ static struct file_system_type debug_fs_type = {
static int debugfs_create_by_name(const char *name, mode_t mode,
struct dentry *parent,
- struct dentry **dentry)
+ struct dentry **dentry,
+ void *data,
+ const struct file_operations *fops)
{
int error = 0;
@@ -164,13 +176,16 @@ static int debugfs_create_by_name(const char *name, mode_t mode,
if (!IS_ERR(*dentry)) {
switch (mode & S_IFMT) {
case S_IFDIR:
- error = debugfs_mkdir(parent->d_inode, *dentry, mode);
+ error = debugfs_mkdir(parent->d_inode, *dentry, mode,
+ data, fops);
break;
case S_IFLNK:
- error = debugfs_link(parent->d_inode, *dentry, mode);
+ error = debugfs_link(parent->d_inode, *dentry, mode,
+ data, fops);
break;
default:
- error = debugfs_create(parent->d_inode, *dentry, mode);
+ error = debugfs_create(parent->d_inode, *dentry, mode,
+ data, fops);
break;
}
dput(*dentry);
@@ -221,19 +236,13 @@ struct dentry *debugfs_create_file(const char *name, mode_t mode,
if (error)
goto exit;
- error = debugfs_create_by_name(name, mode, parent, &dentry);
+ error = debugfs_create_by_name(name, mode, parent, &dentry,
+ data, fops);
if (error) {
dentry = NULL;
simple_release_fs(&debugfs_mount, &debugfs_mount_count);
goto exit;
}
-
- if (dentry->d_inode) {
- if (data)
- dentry->d_inode->i_private = data;
- if (fops)
- dentry->d_inode->i_fop = fops;
- }
exit:
return dentry;
}
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c
index 75efb028974b..e1925c71cd3b 100644
--- a/fs/devpts/inode.c
+++ b/fs/devpts/inode.c
@@ -518,11 +518,23 @@ int devpts_pty_new(struct inode *ptmx_inode, struct tty_struct *tty)
struct tty_struct *devpts_get_tty(struct inode *pts_inode, int number)
{
+ struct dentry *dentry;
+ struct tty_struct *tty;
+
BUG_ON(pts_inode->i_rdev == MKDEV(TTYAUX_MAJOR, PTMX_MINOR));
+ /* Ensure dentry has not been deleted by devpts_pty_kill() */
+ dentry = d_find_alias(pts_inode);
+ if (!dentry)
+ return NULL;
+
+ tty = NULL;
if (pts_inode->i_sb->s_magic == DEVPTS_SUPER_MAGIC)
- return (struct tty_struct *)pts_inode->i_private;
- return NULL;
+ tty = (struct tty_struct *)pts_inode->i_private;
+
+ dput(dentry);
+
+ return tty;
}
void devpts_pty_kill(struct tty_struct *tty)
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index b91851f1cda3..e7c0bc406fa0 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -797,6 +797,7 @@ int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat)
kfree(full_alg_name);
if (IS_ERR(crypt_stat->tfm)) {
rc = PTR_ERR(crypt_stat->tfm);
+ crypt_stat->tfm = NULL;
ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): "
"Error initializing cipher [%s]\n",
crypt_stat->cipher);
@@ -1702,7 +1703,7 @@ ecryptfs_encrypt_filename(struct ecryptfs_filename *filename,
} else {
printk(KERN_ERR "%s: No support for requested filename "
"encryption method in this release\n", __func__);
- rc = -ENOTSUPP;
+ rc = -EOPNOTSUPP;
goto out;
}
out:
@@ -1744,7 +1745,7 @@ ecryptfs_process_key_cipher(struct crypto_blkcipher **key_tfm,
char *cipher_name, size_t *key_size)
{
char dummy_key[ECRYPTFS_MAX_KEY_BYTES];
- char *full_alg_name;
+ char *full_alg_name = NULL;
int rc;
*key_tfm = NULL;
@@ -1759,7 +1760,6 @@ ecryptfs_process_key_cipher(struct crypto_blkcipher **key_tfm,
if (rc)
goto out;
*key_tfm = crypto_alloc_blkcipher(full_alg_name, 0, CRYPTO_ALG_ASYNC);
- kfree(full_alg_name);
if (IS_ERR(*key_tfm)) {
rc = PTR_ERR(*key_tfm);
printk(KERN_ERR "Unable to allocate crypto cipher with name "
@@ -1781,6 +1781,7 @@ ecryptfs_process_key_cipher(struct crypto_blkcipher **key_tfm,
goto out;
}
out:
+ kfree(full_alg_name);
return rc;
}
@@ -2166,7 +2167,7 @@ int ecryptfs_encrypt_and_encode_filename(
(*encoded_name)[(*encoded_name_size)] = '\0';
(*encoded_name_size)++;
} else {
- rc = -ENOTSUPP;
+ rc = -EOPNOTSUPP;
}
if (rc) {
printk(KERN_ERR "%s: Error attempting to encode "
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c
index 9e944057001b..1744f17ce96e 100644
--- a/fs/ecryptfs/file.c
+++ b/fs/ecryptfs/file.c
@@ -191,13 +191,6 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
| ECRYPTFS_ENCRYPTED);
}
mutex_unlock(&crypt_stat->cs_mutex);
- if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_RDONLY)
- && !(file->f_flags & O_RDONLY)) {
- rc = -EPERM;
- printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs "
- "file must hence be opened RO\n", __func__);
- goto out;
- }
if (!ecryptfs_inode_to_private(inode)->lower_file) {
rc = ecryptfs_init_persistent_file(ecryptfs_dentry);
if (rc) {
@@ -208,6 +201,13 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
goto out;
}
}
+ if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_RDONLY)
+ && !(file->f_flags & O_RDONLY)) {
+ rc = -EPERM;
+ printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs "
+ "file must hence be opened RO\n", __func__);
+ goto out;
+ }
ecryptfs_set_file_lower(
file, ecryptfs_inode_to_private(inode)->lower_file);
if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) {
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
index 2f0945d63297..056fed62d0de 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -476,6 +476,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir);
struct dentry *lower_dir_dentry;
+ dget(lower_dentry);
lower_dir_dentry = lock_parent(lower_dentry);
rc = vfs_unlink(lower_dir_inode, lower_dentry);
if (rc) {
@@ -489,6 +490,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
d_drop(dentry);
out_unlock:
unlock_dir(lower_dir_dentry);
+ dput(lower_dentry);
return rc;
}
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c
index 259525c9abb8..c77438f70bbd 100644
--- a/fs/ecryptfs/keystore.c
+++ b/fs/ecryptfs/keystore.c
@@ -416,7 +416,9 @@ ecryptfs_find_global_auth_tok_for_sig(
&mount_crypt_stat->global_auth_tok_list,
mount_crypt_stat_list) {
if (memcmp(walker->sig, sig, ECRYPTFS_SIG_SIZE_HEX) == 0) {
- (*global_auth_tok) = walker;
+ rc = key_validate(walker->global_auth_tok_key);
+ if (!rc)
+ (*global_auth_tok) = walker;
goto out;
}
}
@@ -612,7 +614,12 @@ ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes,
}
/* TODO: Support other key modules than passphrase for
* filename encryption */
- BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD);
+ if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) {
+ rc = -EOPNOTSUPP;
+ printk(KERN_INFO "%s: Filename encryption only supports "
+ "password tokens\n", __func__);
+ goto out_free_unlock;
+ }
sg_init_one(
&s->hash_sg,
(u8 *)s->auth_tok->token.password.session_key_encryption_key,
@@ -910,7 +917,12 @@ ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size,
}
/* TODO: Support other key modules than passphrase for
* filename encryption */
- BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD);
+ if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) {
+ rc = -EOPNOTSUPP;
+ printk(KERN_INFO "%s: Filename encryption only supports "
+ "password tokens\n", __func__);
+ goto out_free_unlock;
+ }
rc = crypto_blkcipher_setkey(
s->desc.tfm,
s->auth_tok->token.password.session_key_encryption_key,
@@ -1316,8 +1328,10 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat,
rc = -EINVAL;
goto out_free;
}
- ecryptfs_cipher_code_to_string(crypt_stat->cipher,
- (u16)data[(*packet_size)]);
+ rc = ecryptfs_cipher_code_to_string(crypt_stat->cipher,
+ (u16)data[(*packet_size)]);
+ if (rc)
+ goto out_free;
/* A little extra work to differentiate among the AES key
* sizes; see RFC2440 */
switch(data[(*packet_size)++]) {
@@ -1328,7 +1342,9 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat,
crypt_stat->key_size =
(*new_auth_tok)->session_key.encrypted_key_size;
}
- ecryptfs_init_crypt_ctx(crypt_stat);
+ rc = ecryptfs_init_crypt_ctx(crypt_stat);
+ if (rc)
+ goto out_free;
if (unlikely(data[(*packet_size)++] != 0x03)) {
printk(KERN_WARNING "Only S2K ID 3 is currently supported\n");
rc = -ENOSYS;
diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c
index c6d7a4d748a0..e14cf7e588db 100644
--- a/fs/ecryptfs/kthread.c
+++ b/fs/ecryptfs/kthread.c
@@ -136,6 +136,7 @@ int ecryptfs_privileged_open(struct file **lower_file,
const struct cred *cred)
{
struct ecryptfs_open_req *req;
+ int flags = O_LARGEFILE;
int rc = 0;
/* Corresponding dput() and mntput() are done when the
@@ -143,10 +144,14 @@ int ecryptfs_privileged_open(struct file **lower_file,
* destroyed. */
dget(lower_dentry);
mntget(lower_mnt);
- (*lower_file) = dentry_open(lower_dentry, lower_mnt,
- (O_RDWR | O_LARGEFILE), cred);
+ flags |= IS_RDONLY(lower_dentry->d_inode) ? O_RDONLY : O_RDWR;
+ (*lower_file) = dentry_open(lower_dentry, lower_mnt, flags, cred);
if (!IS_ERR(*lower_file))
goto out;
+ if (flags & O_RDONLY) {
+ rc = PTR_ERR((*lower_file));
+ goto out;
+ }
req = kmem_cache_alloc(ecryptfs_open_req_cache, GFP_KERNEL);
if (!req) {
rc = -ENOMEM;
@@ -180,21 +185,8 @@ int ecryptfs_privileged_open(struct file **lower_file,
__func__);
goto out_unlock;
}
- if (IS_ERR(*req->lower_file)) {
+ if (IS_ERR(*req->lower_file))
rc = PTR_ERR(*req->lower_file);
- dget(lower_dentry);
- mntget(lower_mnt);
- (*lower_file) = dentry_open(lower_dentry, lower_mnt,
- (O_RDONLY | O_LARGEFILE), cred);
- if (IS_ERR(*lower_file)) {
- rc = PTR_ERR(*req->lower_file);
- (*lower_file) = NULL;
- printk(KERN_WARNING "%s: Error attempting privileged "
- "open of lower file with either RW or RO "
- "perms; rc = [%d]. Giving up.\n",
- __func__, rc);
- }
- }
out_unlock:
mutex_unlock(&req->mux);
out_free:
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
index 9f0aa9883c28..c6ac85d6c701 100644
--- a/fs/ecryptfs/main.c
+++ b/fs/ecryptfs/main.c
@@ -35,6 +35,7 @@
#include <linux/key.h>
#include <linux/parser.h>
#include <linux/fs_stack.h>
+#include <linux/ima.h>
#include "ecryptfs_kernel.h"
/**
@@ -118,6 +119,7 @@ int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry)
const struct cred *cred = current_cred();
struct ecryptfs_inode_info *inode_info =
ecryptfs_inode_to_private(ecryptfs_dentry->d_inode);
+ int opened_lower_file = 0;
int rc = 0;
mutex_lock(&inode_info->lower_file_mutex);
@@ -129,15 +131,17 @@ int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry)
lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry);
rc = ecryptfs_privileged_open(&inode_info->lower_file,
lower_dentry, lower_mnt, cred);
- if (rc || IS_ERR(inode_info->lower_file)) {
+ if (rc) {
printk(KERN_ERR "Error opening lower persistent file "
"for lower_dentry [0x%p] and lower_mnt [0x%p]; "
"rc = [%d]\n", lower_dentry, lower_mnt, rc);
- rc = PTR_ERR(inode_info->lower_file);
inode_info->lower_file = NULL;
- }
+ } else
+ opened_lower_file = 1;
}
mutex_unlock(&inode_info->lower_file_mutex);
+ if (opened_lower_file)
+ ima_counts_get(inode_info->lower_file);
return rc;
}
diff --git a/fs/exec.c b/fs/exec.c
index 172ceb6edde4..62cd056adde9 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -928,9 +928,7 @@ void set_task_comm(struct task_struct *tsk, char *buf)
int flush_old_exec(struct linux_binprm * bprm)
{
- char * name;
- int i, ch, retval;
- char tcomm[sizeof(current->comm)];
+ int retval;
/*
* Make sure we have a private signal table and that
@@ -951,6 +949,25 @@ int flush_old_exec(struct linux_binprm * bprm)
bprm->mm = NULL; /* We're using it now */
+ current->flags &= ~PF_RANDOMIZE;
+ flush_thread();
+ current->personality &= ~bprm->per_clear;
+
+ return 0;
+
+out:
+ return retval;
+}
+EXPORT_SYMBOL(flush_old_exec);
+
+void setup_new_exec(struct linux_binprm * bprm)
+{
+ int i, ch;
+ char * name;
+ char tcomm[sizeof(current->comm)];
+
+ arch_pick_mmap_layout(current->mm);
+
/* This is the point of no return */
current->sas_ss_sp = current->sas_ss_size = 0;
@@ -972,9 +989,6 @@ int flush_old_exec(struct linux_binprm * bprm)
tcomm[i] = '\0';
set_task_comm(current, tcomm);
- current->flags &= ~PF_RANDOMIZE;
- flush_thread();
-
/* Set the new mm task size. We have to do that late because it may
* depend on TIF_32BIT which is only updated in flush_thread() on
* some architectures like powerpc
@@ -990,8 +1004,6 @@ int flush_old_exec(struct linux_binprm * bprm)
set_dumpable(current->mm, suid_dumpable);
}
- current->personality &= ~bprm->per_clear;
-
/*
* Flush performance counters when crossing a
* security domain:
@@ -1006,14 +1018,8 @@ int flush_old_exec(struct linux_binprm * bprm)
flush_signal_handlers(current, 0);
flush_old_files(current->files);
-
- return 0;
-
-out:
- return retval;
}
-
-EXPORT_SYMBOL(flush_old_exec);
+EXPORT_SYMBOL(setup_new_exec);
/*
* Prepare credentials and lock ->cred_guard_mutex.
@@ -1855,8 +1861,9 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
/*
* Dont allow local users get cute and trick others to coredump
* into their pre-created files:
+ * Note, this is not relevant for pipes
*/
- if (inode->i_uid != current_fsuid())
+ if (!ispipe && (inode->i_uid != current_fsuid()))
goto close_fail;
if (!file->f_op)
goto close_fail;
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
index b49908a167ae..6244b0cb98c5 100644
--- a/fs/ext3/inode.c
+++ b/fs/ext3/inode.c
@@ -1137,6 +1137,16 @@ static int do_journal_get_write_access(handle_t *handle,
return ext3_journal_get_write_access(handle, bh);
}
+/*
+ * Truncate blocks that were not used by write. We have to truncate the
+ * pagecache as well so that corresponding buffers get properly unmapped.
+ */
+static void ext3_truncate_failed_write(struct inode *inode)
+{
+ truncate_inode_pages(inode->i_mapping, inode->i_size);
+ ext3_truncate(inode);
+}
+
static int ext3_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata)
@@ -1195,7 +1205,7 @@ write_begin_failed:
unlock_page(page);
page_cache_release(page);
if (pos + len > inode->i_size)
- ext3_truncate(inode);
+ ext3_truncate_failed_write(inode);
}
if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))
goto retry;
@@ -1290,7 +1300,7 @@ static int ext3_ordered_write_end(struct file *file,
page_cache_release(page);
if (pos + len > inode->i_size)
- ext3_truncate(inode);
+ ext3_truncate_failed_write(inode);
return ret ? ret : copied;
}
@@ -1316,7 +1326,7 @@ static int ext3_writeback_write_end(struct file *file,
page_cache_release(page);
if (pos + len > inode->i_size)
- ext3_truncate(inode);
+ ext3_truncate_failed_write(inode);
return ret ? ret : copied;
}
@@ -1369,7 +1379,7 @@ static int ext3_journalled_write_end(struct file *file,
page_cache_release(page);
if (pos + len > inode->i_size)
- ext3_truncate(inode);
+ ext3_truncate_failed_write(inode);
return ret ? ret : copied;
}
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
index e2126d70dff5..34bb79799dba 100644
--- a/fs/ext4/balloc.c
+++ b/fs/ext4/balloc.c
@@ -761,7 +761,13 @@ static unsigned long ext4_bg_num_gdb_meta(struct super_block *sb,
static unsigned long ext4_bg_num_gdb_nometa(struct super_block *sb,
ext4_group_t group)
{
- return ext4_bg_has_super(sb, group) ? EXT4_SB(sb)->s_gdb_count : 0;
+ if (!ext4_bg_has_super(sb, group))
+ return 0;
+
+ if (EXT4_HAS_INCOMPAT_FEATURE(sb,EXT4_FEATURE_INCOMPAT_META_BG))
+ return le32_to_cpu(EXT4_SB(sb)->s_es->s_first_meta_bg);
+ else
+ return EXT4_SB(sb)->s_gdb_count;
}
/**
diff --git a/fs/ext4/block_validity.c b/fs/ext4/block_validity.c
index 50784ef07563..dc79b75d8f70 100644
--- a/fs/ext4/block_validity.c
+++ b/fs/ext4/block_validity.c
@@ -160,7 +160,7 @@ int ext4_setup_system_zone(struct super_block *sb)
if (ext4_bg_has_super(sb, i) &&
((i < 5) || ((i % flex_size) == 0)))
add_system_zone(sbi, ext4_group_first_block_no(sb, i),
- sbi->s_gdb_count + 1);
+ ext4_bg_num_gdb(sb, i) + 1);
gdp = ext4_get_group_desc(sb, i, NULL);
ret = add_system_zone(sbi, ext4_block_bitmap(sb, gdp), 1);
if (ret)
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 9714db393efe..9bd595a78168 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -88,6 +88,8 @@ typedef unsigned int ext4_group_t;
#define EXT4_MB_HINT_TRY_GOAL 512
/* blocks already pre-reserved by delayed allocation */
#define EXT4_MB_DELALLOC_RESERVED 1024
+/* We are doing stream allocation */
+#define EXT4_MB_STREAM_ALLOC 2048
struct ext4_allocation_request {
@@ -111,6 +113,33 @@ struct ext4_allocation_request {
unsigned int flags;
};
+#define DIO_AIO_UNWRITTEN 0x1
+typedef struct ext4_io_end {
+ struct list_head list; /* per-file finished AIO list */
+ struct inode *inode; /* file being written to */
+ unsigned int flag; /* sync IO or AIO */
+ int error; /* I/O error code */
+ ext4_lblk_t offset; /* offset in the file */
+ size_t size; /* size of the extent */
+ struct work_struct work; /* data work queue */
+} ext4_io_end_t;
+
+/*
+ * Delayed allocation stuff
+ */
+
+struct mpage_da_data {
+ struct inode *inode;
+ sector_t b_blocknr; /* start block number of extent */
+ size_t b_size; /* size of extent */
+ unsigned long b_state; /* state of the extent */
+ unsigned long first_page, next_page; /* extent of pages */
+ struct writeback_control *wbc;
+ int io_done;
+ int pages_written;
+ int retval;
+};
+
/*
* Special inodes numbers
*/
@@ -251,7 +280,6 @@ struct flex_groups {
#define EXT4_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/
#define EXT4_HUGE_FILE_FL 0x00040000 /* Set to each huge file */
#define EXT4_EXTENTS_FL 0x00080000 /* Inode uses extents */
-#define EXT4_EXT_MIGRATE 0x00100000 /* Inode is migrating */
#define EXT4_RESERVED_FL 0x80000000 /* reserved for ext4 lib */
#define EXT4_FL_USER_VISIBLE 0x000BDFFF /* User visible flags */
@@ -289,6 +317,8 @@ static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags)
#define EXT4_STATE_XATTR 0x00000004 /* has in-inode xattrs */
#define EXT4_STATE_NO_EXPAND 0x00000008 /* No space for expansion */
#define EXT4_STATE_DA_ALLOC_CLOSE 0x00000010 /* Alloc DA blks on close */
+#define EXT4_STATE_EXT_MIGRATE 0x00000020 /* Inode is migrating */
+#define EXT4_STATE_DIO_UNWRITTEN 0x00000040 /* need convert on dio done*/
/* Used to pass group descriptor data when online resize is done */
struct ext4_new_group_input {
@@ -330,7 +360,16 @@ struct ext4_new_group_data {
/* Call ext4_da_update_reserve_space() after successfully
allocating the blocks */
#define EXT4_GET_BLOCKS_UPDATE_RESERVE_SPACE 0x0008
-
+ /* caller is from the direct IO path, request to creation of an
+ unitialized extents if not allocated, split the uninitialized
+ extent if blocks has been preallocated already*/
+#define EXT4_GET_BLOCKS_DIO 0x0010
+#define EXT4_GET_BLOCKS_CONVERT 0x0020
+#define EXT4_GET_BLOCKS_DIO_CREATE_EXT (EXT4_GET_BLOCKS_DIO|\
+ EXT4_GET_BLOCKS_CREATE_UNINIT_EXT)
+ /* Convert extent to initialized after direct IO complete */
+#define EXT4_GET_BLOCKS_DIO_CONVERT_EXT (EXT4_GET_BLOCKS_CONVERT|\
+ EXT4_GET_BLOCKS_DIO_CREATE_EXT)
/*
* ioctl commands
@@ -386,6 +425,9 @@ struct ext4_mount_options {
#endif
};
+/* Max physical block we can addres w/o extents */
+#define EXT4_MAX_BLOCK_FILE_PHYS 0xFFFFFFFF
+
/*
* Structure of an inode on the disk
*/
@@ -481,8 +523,8 @@ struct move_extent {
static inline __le32 ext4_encode_extra_time(struct timespec *time)
{
return cpu_to_le32((sizeof(time->tv_sec) > 4 ?
- time->tv_sec >> 32 : 0) |
- ((time->tv_nsec << 2) & EXT4_NSEC_MASK));
+ (time->tv_sec >> 32) & EXT4_EPOCH_MASK : 0) |
+ ((time->tv_nsec << EXT4_EPOCH_BITS) & EXT4_NSEC_MASK));
}
static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra)
@@ -490,7 +532,7 @@ static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra)
if (sizeof(time->tv_sec) > 4)
time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK)
<< 32;
- time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> 2;
+ time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS;
}
#define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \
@@ -653,6 +695,22 @@ struct ext4_inode_info {
__u16 i_extra_isize;
spinlock_t i_block_reservation_lock;
+#ifdef CONFIG_QUOTA
+ /* quota space reservation, managed internally by quota code */
+ qsize_t i_reserved_quota;
+#endif
+
+ /* completed async DIOs that might need unwritten extents handling */
+ struct list_head i_aio_dio_complete_list;
+ /* current io_end structure for async DIO write*/
+ ext4_io_end_t *cur_aio_dio;
+
+ /*
+ * Transactions that contain inode's metadata needed to complete
+ * fsync and fdatasync, respectively.
+ */
+ tid_t i_sync_tid;
+ tid_t i_datasync_tid;
};
/*
@@ -700,6 +758,7 @@ struct ext4_inode_info {
#define EXT4_MOUNT_DELALLOC 0x8000000 /* Delalloc support */
#define EXT4_MOUNT_DATA_ERR_ABORT 0x10000000 /* Abort on file data write */
#define EXT4_MOUNT_BLOCK_VALIDITY 0x20000000 /* Block validity checking */
+#define EXT4_MOUNT_DISCARD 0x40000000 /* Issue DISCARD requests */
#define clear_opt(o, opt) o &= ~EXT4_MOUNT_##opt
#define set_opt(o, opt) o |= EXT4_MOUNT_##opt
@@ -841,6 +900,7 @@ struct ext4_sb_info {
unsigned long s_gdb_count; /* Number of group descriptor blocks */
unsigned long s_desc_per_block; /* Number of group descriptors per block */
ext4_group_t s_groups_count; /* Number of groups in the fs */
+ ext4_group_t s_blockfile_groups;/* Groups acceptable for non-extent files */
unsigned long s_overhead_last; /* Last calculated overhead */
unsigned long s_blocks_last; /* Last seen block count */
loff_t s_bitmap_maxbytes; /* max bytes for bitmap files */
@@ -923,6 +983,7 @@ struct ext4_sb_info {
unsigned int s_mb_stats;
unsigned int s_mb_order2_reqs;
unsigned int s_mb_group_prealloc;
+ unsigned int s_max_writeback_mb_bump;
/* where last allocation was done - for stream allocation */
unsigned long s_mb_last_group;
unsigned long s_mb_last_start;
@@ -950,6 +1011,7 @@ struct ext4_sb_info {
atomic_t s_mb_lost_chunks;
atomic_t s_mb_preallocated;
atomic_t s_mb_discarded;
+ atomic_t s_lock_busy;
/* locality groups */
struct ext4_locality_group *s_locality_groups;
@@ -960,6 +1022,9 @@ struct ext4_sb_info {
unsigned int s_log_groups_per_flex;
struct flex_groups *s_flex_groups;
+
+ /* workqueue for dio unwritten */
+ struct workqueue_struct *dio_unwritten_wq;
};
static inline struct ext4_sb_info *EXT4_SB(struct super_block *sb)
@@ -1367,6 +1432,7 @@ extern int ext4_change_inode_journal_flag(struct inode *, int);
extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *);
extern int ext4_can_truncate(struct inode *inode);
extern void ext4_truncate(struct inode *);
+extern int ext4_truncate_restart_trans(handle_t *, struct inode *, int nblocks);
extern void ext4_set_inode_flags(struct inode *);
extern void ext4_get_inode_flags(struct ext4_inode_info *);
extern int ext4_alloc_da_blocks(struct inode *inode);
@@ -1377,8 +1443,8 @@ extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks);
extern int ext4_block_truncate_page(handle_t *handle,
struct address_space *mapping, loff_t from);
extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf);
-extern qsize_t ext4_get_reserved_space(struct inode *inode);
-
+extern qsize_t *ext4_get_reserved_space(struct inode *inode);
+extern int flush_aio_dio_completed_IO(struct inode *inode);
/* ioctl.c */
extern long ext4_ioctl(struct file *, unsigned int, unsigned long);
extern long ext4_compat_ioctl(struct file *, unsigned int, unsigned long);
@@ -1591,15 +1657,42 @@ struct ext4_group_info {
#define EXT4_MB_GRP_NEED_INIT(grp) \
(test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state)))
+#define EXT4_MAX_CONTENTION 8
+#define EXT4_CONTENTION_THRESHOLD 2
+
static inline spinlock_t *ext4_group_lock_ptr(struct super_block *sb,
ext4_group_t group)
{
return bgl_lock_ptr(EXT4_SB(sb)->s_blockgroup_lock, group);
}
+/*
+ * Returns true if the filesystem is busy enough that attempts to
+ * access the block group locks has run into contention.
+ */
+static inline int ext4_fs_is_busy(struct ext4_sb_info *sbi)
+{
+ return (atomic_read(&sbi->s_lock_busy) > EXT4_CONTENTION_THRESHOLD);
+}
+
static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group)
{
- spin_lock(ext4_group_lock_ptr(sb, group));
+ spinlock_t *lock = ext4_group_lock_ptr(sb, group);
+ if (spin_trylock(lock))
+ /*
+ * We're able to grab the lock right away, so drop the
+ * lock contention counter.
+ */
+ atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, -1, 0);
+ else {
+ /*
+ * The lock is busy, so bump the contention counter,
+ * and then wait on the spin lock.
+ */
+ atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, 1,
+ EXT4_MAX_CONTENTION);
+ spin_lock(lock);
+ }
}
static inline void ext4_unlock_group(struct super_block *sb,
@@ -1650,6 +1743,8 @@ extern void ext4_ext_init(struct super_block *);
extern void ext4_ext_release(struct super_block *);
extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset,
loff_t len);
+extern int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset,
+ loff_t len);
extern int ext4_get_blocks(handle_t *handle, struct inode *inode,
sector_t block, unsigned int max_blocks,
struct buffer_head *bh, int flags);
diff --git a/fs/ext4/ext4_extents.h b/fs/ext4/ext4_extents.h
index 20a84105a10b..1c2db3fc4656 100644
--- a/fs/ext4/ext4_extents.h
+++ b/fs/ext4/ext4_extents.h
@@ -220,6 +220,11 @@ static inline int ext4_ext_get_actual_len(struct ext4_extent *ext)
(le16_to_cpu(ext->ee_len) - EXT_INIT_MAX_LEN));
}
+static inline void ext4_ext_mark_initialized(struct ext4_extent *ext)
+{
+ ext->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ext));
+}
+
extern int ext4_ext_calc_metadata_amount(struct inode *inode, int blocks);
extern ext4_fsblk_t ext_pblock(struct ext4_extent *ex);
extern ext4_fsblk_t idx_pblock(struct ext4_extent_idx *);
@@ -235,7 +240,7 @@ extern int ext4_ext_try_to_merge(struct inode *inode,
struct ext4_ext_path *path,
struct ext4_extent *);
extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *);
-extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *);
+extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *, int);
extern int ext4_ext_walk_space(struct inode *, ext4_lblk_t, ext4_lblk_t,
ext_prepare_callback, void *);
extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t,
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c
index eb27fd0f2ee8..6a9409920dee 100644
--- a/fs/ext4/ext4_jbd2.c
+++ b/fs/ext4/ext4_jbd2.c
@@ -44,7 +44,7 @@ int __ext4_journal_forget(const char *where, handle_t *handle,
handle, err);
}
else
- brelse(bh);
+ bforget(bh);
return err;
}
@@ -60,7 +60,7 @@ int __ext4_journal_revoke(const char *where, handle_t *handle,
handle, err);
}
else
- brelse(bh);
+ bforget(bh);
return err;
}
@@ -89,7 +89,10 @@ int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
ext4_journal_abort_handle(where, __func__, bh,
handle, err);
} else {
- mark_buffer_dirty(bh);
+ if (inode && bh)
+ mark_buffer_dirty_inode(bh, inode);
+ else
+ mark_buffer_dirty(bh);
if (inode && inode_needs_sync(inode)) {
sync_dirty_buffer(bh);
if (buffer_req(bh) && !buffer_uptodate(bh)) {
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h
index 139fb8cb87e4..1892a7763426 100644
--- a/fs/ext4/ext4_jbd2.h
+++ b/fs/ext4/ext4_jbd2.h
@@ -49,7 +49,7 @@
#define EXT4_DATA_TRANS_BLOCKS(sb) (EXT4_SINGLEDATA_TRANS_BLOCKS(sb) + \
EXT4_XATTR_TRANS_BLOCKS - 2 + \
- 2*EXT4_QUOTA_TRANS_BLOCKS(sb))
+ EXT4_MAXQUOTAS_TRANS_BLOCKS(sb))
/*
* Define the number of metadata blocks we need to account to modify data.
@@ -57,7 +57,7 @@
* This include super block, inode block, quota blocks and xattr blocks
*/
#define EXT4_META_TRANS_BLOCKS(sb) (EXT4_XATTR_TRANS_BLOCKS + \
- 2*EXT4_QUOTA_TRANS_BLOCKS(sb))
+ EXT4_MAXQUOTAS_TRANS_BLOCKS(sb))
/* Delete operations potentially hit one directory's namespace plus an
* entire inode, plus arbitrary amounts of bitmap/indirection data. Be
@@ -92,6 +92,7 @@
* but inode, sb and group updates are done only once */
#define EXT4_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\
(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_INIT_REWRITE) : 0)
+
#define EXT4_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\
(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_DEL_REWRITE) : 0)
#else
@@ -99,6 +100,9 @@
#define EXT4_QUOTA_INIT_BLOCKS(sb) 0
#define EXT4_QUOTA_DEL_BLOCKS(sb) 0
#endif
+#define EXT4_MAXQUOTAS_TRANS_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_TRANS_BLOCKS(sb))
+#define EXT4_MAXQUOTAS_INIT_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_INIT_BLOCKS(sb))
+#define EXT4_MAXQUOTAS_DEL_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_DEL_BLOCKS(sb))
int
ext4_mark_iloc_dirty(handle_t *handle,
@@ -161,11 +165,13 @@ int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks);
int __ext4_journal_stop(const char *where, handle_t *handle);
-#define EXT4_NOJOURNAL_HANDLE ((handle_t *) 0x1)
+#define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096)
+/* Note: Do not use this for NULL handles. This is only to determine if
+ * a properly allocated handle is using a journal or not. */
static inline int ext4_handle_valid(handle_t *handle)
{
- if (handle == EXT4_NOJOURNAL_HANDLE)
+ if ((unsigned long)handle < EXT4_NOJOURNAL_MAX_REF_COUNT)
return 0;
return 1;
}
@@ -252,6 +258,19 @@ static inline int ext4_jbd2_file_inode(handle_t *handle, struct inode *inode)
return 0;
}
+static inline void ext4_update_inode_fsync_trans(handle_t *handle,
+ struct inode *inode,
+ int datasync)
+{
+ struct ext4_inode_info *ei = EXT4_I(inode);
+
+ if (ext4_handle_valid(handle)) {
+ ei->i_sync_tid = handle->h_transaction->t_tid;
+ if (datasync)
+ ei->i_datasync_tid = handle->h_transaction->t_tid;
+ }
+}
+
/* super.c */
int ext4_force_commit(struct super_block *sb);
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 73ebfb44ad75..24fb20b2ed25 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -93,7 +93,9 @@ static void ext4_idx_store_pblock(struct ext4_extent_idx *ix, ext4_fsblk_t pb)
ix->ei_leaf_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) & 0xffff);
}
-static int ext4_ext_journal_restart(handle_t *handle, int needed)
+static int ext4_ext_truncate_extend_restart(handle_t *handle,
+ struct inode *inode,
+ int needed)
{
int err;
@@ -104,7 +106,14 @@ static int ext4_ext_journal_restart(handle_t *handle, int needed)
err = ext4_journal_extend(handle, needed);
if (err <= 0)
return err;
- return ext4_journal_restart(handle, needed);
+ err = ext4_truncate_restart_trans(handle, inode, needed);
+ /*
+ * We have dropped i_data_sem so someone might have cached again
+ * an extent we are going to truncate.
+ */
+ ext4_ext_invalidate_cache(inode);
+
+ return err;
}
/*
@@ -701,7 +710,7 @@ err:
* insert new index [@logical;@ptr] into the block at @curp;
* check where to insert: before @curp or after @curp
*/
-static int ext4_ext_insert_index(handle_t *handle, struct inode *inode,
+int ext4_ext_insert_index(handle_t *handle, struct inode *inode,
struct ext4_ext_path *curp,
int logical, ext4_fsblk_t ptr)
{
@@ -1563,7 +1572,7 @@ out:
*/
int ext4_ext_insert_extent(handle_t *handle, struct inode *inode,
struct ext4_ext_path *path,
- struct ext4_extent *newext)
+ struct ext4_extent *newext, int flag)
{
struct ext4_extent_header *eh;
struct ext4_extent *ex, *fex;
@@ -1579,7 +1588,8 @@ int ext4_ext_insert_extent(handle_t *handle, struct inode *inode,
BUG_ON(path[depth].p_hdr == NULL);
/* try to insert block into found extent and return */
- if (ex && ext4_can_extents_be_merged(inode, ex, newext)) {
+ if (ex && (flag != EXT4_GET_BLOCKS_DIO_CREATE_EXT)
+ && ext4_can_extents_be_merged(inode, ex, newext)) {
ext_debug("append %d block to %d:%d (from %llu)\n",
ext4_ext_get_actual_len(newext),
le32_to_cpu(ex->ee_block),
@@ -1694,7 +1704,8 @@ has_space:
merge:
/* try to merge extents to the right */
- ext4_ext_try_to_merge(inode, path, nearex);
+ if (flag != EXT4_GET_BLOCKS_DIO_CREATE_EXT)
+ ext4_ext_try_to_merge(inode, path, nearex);
/* try to merge extents to the left */
@@ -1731,7 +1742,9 @@ int ext4_ext_walk_space(struct inode *inode, ext4_lblk_t block,
while (block < last && block != EXT_MAX_BLOCK) {
num = last - block;
/* find extent for this block */
+ down_read(&EXT4_I(inode)->i_data_sem);
path = ext4_ext_find_extent(inode, block, path);
+ up_read(&EXT4_I(inode)->i_data_sem);
if (IS_ERR(path)) {
err = PTR_ERR(path);
path = NULL;
@@ -2044,7 +2057,7 @@ static int ext4_remove_blocks(handle_t *handle, struct inode *inode,
ext_debug("free last %u blocks starting %llu\n", num, start);
for (i = 0; i < num; i++) {
bh = sb_find_get_block(inode->i_sb, start + i);
- ext4_forget(handle, 0, inode, bh, start + i);
+ ext4_forget(handle, metadata, inode, bh, start + i);
}
ext4_free_blocks(handle, inode, start, num, metadata);
} else if (from == le32_to_cpu(ex->ee_block)
@@ -2136,9 +2149,9 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode,
correct_index = 1;
credits += (ext_depth(inode)) + 1;
}
- credits += 2 * EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb);
+ credits += EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb);
- err = ext4_ext_journal_restart(handle, credits);
+ err = ext4_ext_truncate_extend_restart(handle, inode, credits);
if (err)
goto out;
@@ -2461,7 +2474,6 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex)
}
#define EXT4_EXT_ZERO_LEN 7
-
/*
* This function is called by ext4_ext_get_blocks() if someone tries to write
* to an uninitialized extent. It may result in splitting the uninitialized
@@ -2554,7 +2566,8 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
ex3->ee_block = cpu_to_le32(iblock);
ext4_ext_store_pblock(ex3, newblock);
ex3->ee_len = cpu_to_le16(allocated);
- err = ext4_ext_insert_extent(handle, inode, path, ex3);
+ err = ext4_ext_insert_extent(handle, inode, path,
+ ex3, 0);
if (err == -ENOSPC) {
err = ext4_ext_zeroout(inode, &orig_ex);
if (err)
@@ -2610,7 +2623,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
ext4_ext_store_pblock(ex3, newblock + max_blocks);
ex3->ee_len = cpu_to_le16(allocated - max_blocks);
ext4_ext_mark_uninitialized(ex3);
- err = ext4_ext_insert_extent(handle, inode, path, ex3);
+ err = ext4_ext_insert_extent(handle, inode, path, ex3, 0);
if (err == -ENOSPC) {
err = ext4_ext_zeroout(inode, &orig_ex);
if (err)
@@ -2728,7 +2741,191 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
err = ext4_ext_dirty(handle, inode, path + depth);
goto out;
insert:
- err = ext4_ext_insert_extent(handle, inode, path, &newex);
+ err = ext4_ext_insert_extent(handle, inode, path, &newex, 0);
+ if (err == -ENOSPC) {
+ err = ext4_ext_zeroout(inode, &orig_ex);
+ if (err)
+ goto fix_extent_len;
+ /* update the extent length and mark as initialized */
+ ex->ee_block = orig_ex.ee_block;
+ ex->ee_len = orig_ex.ee_len;
+ ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
+ ext4_ext_dirty(handle, inode, path + depth);
+ /* zero out the first half */
+ return allocated;
+ } else if (err)
+ goto fix_extent_len;
+out:
+ return err ? err : allocated;
+
+fix_extent_len:
+ ex->ee_block = orig_ex.ee_block;
+ ex->ee_len = orig_ex.ee_len;
+ ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
+ ext4_ext_mark_uninitialized(ex);
+ ext4_ext_dirty(handle, inode, path + depth);
+ return err;
+}
+
+/*
+ * This function is called by ext4_ext_get_blocks() from
+ * ext4_get_blocks_dio_write() when DIO to write
+ * to an uninitialized extent.
+ *
+ * Writing to an uninitized extent may result in splitting the uninitialized
+ * extent into multiple /intialized unintialized extents (up to three)
+ * There are three possibilities:
+ * a> There is no split required: Entire extent should be uninitialized
+ * b> Splits in two extents: Write is happening at either end of the extent
+ * c> Splits in three extents: Somone is writing in middle of the extent
+ *
+ * One of more index blocks maybe needed if the extent tree grow after
+ * the unintialized extent split. To prevent ENOSPC occur at the IO
+ * complete, we need to split the uninitialized extent before DIO submit
+ * the IO. The uninitilized extent called at this time will be split
+ * into three uninitialized extent(at most). After IO complete, the part
+ * being filled will be convert to initialized by the end_io callback function
+ * via ext4_convert_unwritten_extents().
+ *
+ * Returns the size of uninitialized extent to be written on success.
+ */
+static int ext4_split_unwritten_extents(handle_t *handle,
+ struct inode *inode,
+ struct ext4_ext_path *path,
+ ext4_lblk_t iblock,
+ unsigned int max_blocks,
+ int flags)
+{
+ struct ext4_extent *ex, newex, orig_ex;
+ struct ext4_extent *ex1 = NULL;
+ struct ext4_extent *ex2 = NULL;
+ struct ext4_extent *ex3 = NULL;
+ struct ext4_extent_header *eh;
+ ext4_lblk_t ee_block;
+ unsigned int allocated, ee_len, depth;
+ ext4_fsblk_t newblock;
+ int err = 0;
+
+ ext_debug("ext4_split_unwritten_extents: inode %lu,"
+ "iblock %llu, max_blocks %u\n", inode->i_ino,
+ (unsigned long long)iblock, max_blocks);
+ depth = ext_depth(inode);
+ eh = path[depth].p_hdr;
+ ex = path[depth].p_ext;
+ ee_block = le32_to_cpu(ex->ee_block);
+ ee_len = ext4_ext_get_actual_len(ex);
+ allocated = ee_len - (iblock - ee_block);
+ newblock = iblock - ee_block + ext_pblock(ex);
+ ex2 = ex;
+ orig_ex.ee_block = ex->ee_block;
+ orig_ex.ee_len = cpu_to_le16(ee_len);
+ ext4_ext_store_pblock(&orig_ex, ext_pblock(ex));
+
+ /*
+ * If the uninitialized extent begins at the same logical
+ * block where the write begins, and the write completely
+ * covers the extent, then we don't need to split it.
+ */
+ if ((iblock == ee_block) && (allocated <= max_blocks))
+ return allocated;
+
+ err = ext4_ext_get_access(handle, inode, path + depth);
+ if (err)
+ goto out;
+ /* ex1: ee_block to iblock - 1 : uninitialized */
+ if (iblock > ee_block) {
+ ex1 = ex;
+ ex1->ee_len = cpu_to_le16(iblock - ee_block);
+ ext4_ext_mark_uninitialized(ex1);
+ ex2 = &newex;
+ }
+ /*
+ * for sanity, update the length of the ex2 extent before
+ * we insert ex3, if ex1 is NULL. This is to avoid temporary
+ * overlap of blocks.
+ */
+ if (!ex1 && allocated > max_blocks)
+ ex2->ee_len = cpu_to_le16(max_blocks);
+ /* ex3: to ee_block + ee_len : uninitialised */
+ if (allocated > max_blocks) {
+ unsigned int newdepth;
+ ex3 = &newex;
+ ex3->ee_block = cpu_to_le32(iblock + max_blocks);
+ ext4_ext_store_pblock(ex3, newblock + max_blocks);
+ ex3->ee_len = cpu_to_le16(allocated - max_blocks);
+ ext4_ext_mark_uninitialized(ex3);
+ err = ext4_ext_insert_extent(handle, inode, path, ex3, flags);
+ if (err == -ENOSPC) {
+ err = ext4_ext_zeroout(inode, &orig_ex);
+ if (err)
+ goto fix_extent_len;
+ /* update the extent length and mark as initialized */
+ ex->ee_block = orig_ex.ee_block;
+ ex->ee_len = orig_ex.ee_len;
+ ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
+ ext4_ext_dirty(handle, inode, path + depth);
+ /* zeroed the full extent */
+ /* blocks available from iblock */
+ return allocated;
+
+ } else if (err)
+ goto fix_extent_len;
+ /*
+ * The depth, and hence eh & ex might change
+ * as part of the insert above.
+ */
+ newdepth = ext_depth(inode);
+ /*
+ * update the extent length after successful insert of the
+ * split extent
+ */
+ orig_ex.ee_len = cpu_to_le16(ee_len -
+ ext4_ext_get_actual_len(ex3));
+ depth = newdepth;
+ ext4_ext_drop_refs(path);
+ path = ext4_ext_find_extent(inode, iblock, path);
+ if (IS_ERR(path)) {
+ err = PTR_ERR(path);
+ goto out;
+ }
+ eh = path[depth].p_hdr;
+ ex = path[depth].p_ext;
+ if (ex2 != &newex)
+ ex2 = ex;
+
+ err = ext4_ext_get_access(handle, inode, path + depth);
+ if (err)
+ goto out;
+
+ allocated = max_blocks;
+ }
+ /*
+ * If there was a change of depth as part of the
+ * insertion of ex3 above, we need to update the length
+ * of the ex1 extent again here
+ */
+ if (ex1 && ex1 != ex) {
+ ex1 = ex;
+ ex1->ee_len = cpu_to_le16(iblock - ee_block);
+ ext4_ext_mark_uninitialized(ex1);
+ ex2 = &newex;
+ }
+ /*
+ * ex2: iblock to iblock + maxblocks-1 : to be direct IO written,
+ * uninitialised still.
+ */
+ ex2->ee_block = cpu_to_le32(iblock);
+ ext4_ext_store_pblock(ex2, newblock);
+ ex2->ee_len = cpu_to_le16(allocated);
+ ext4_ext_mark_uninitialized(ex2);
+ if (ex2 != ex)
+ goto insert;
+ /* Mark modified extent as dirty */
+ err = ext4_ext_dirty(handle, inode, path + depth);
+ ext_debug("out here\n");
+ goto out;
+insert:
+ err = ext4_ext_insert_extent(handle, inode, path, &newex, flags);
if (err == -ENOSPC) {
err = ext4_ext_zeroout(inode, &orig_ex);
if (err)
@@ -2743,6 +2940,7 @@ insert:
} else if (err)
goto fix_extent_len;
out:
+ ext4_ext_show_leaf(inode, path);
return err ? err : allocated;
fix_extent_len:
@@ -2753,7 +2951,151 @@ fix_extent_len:
ext4_ext_dirty(handle, inode, path + depth);
return err;
}
+static int ext4_convert_unwritten_extents_dio(handle_t *handle,
+ struct inode *inode,
+ struct ext4_ext_path *path)
+{
+ struct ext4_extent *ex;
+ struct ext4_extent_header *eh;
+ int depth;
+ int err = 0;
+ int ret = 0;
+
+ depth = ext_depth(inode);
+ eh = path[depth].p_hdr;
+ ex = path[depth].p_ext;
+
+ err = ext4_ext_get_access(handle, inode, path + depth);
+ if (err)
+ goto out;
+ /* first mark the extent as initialized */
+ ext4_ext_mark_initialized(ex);
+
+ /*
+ * We have to see if it can be merged with the extent
+ * on the left.
+ */
+ if (ex > EXT_FIRST_EXTENT(eh)) {
+ /*
+ * To merge left, pass "ex - 1" to try_to_merge(),
+ * since it merges towards right _only_.
+ */
+ ret = ext4_ext_try_to_merge(inode, path, ex - 1);
+ if (ret) {
+ err = ext4_ext_correct_indexes(handle, inode, path);
+ if (err)
+ goto out;
+ depth = ext_depth(inode);
+ ex--;
+ }
+ }
+ /*
+ * Try to Merge towards right.
+ */
+ ret = ext4_ext_try_to_merge(inode, path, ex);
+ if (ret) {
+ err = ext4_ext_correct_indexes(handle, inode, path);
+ if (err)
+ goto out;
+ depth = ext_depth(inode);
+ }
+ /* Mark modified extent as dirty */
+ err = ext4_ext_dirty(handle, inode, path + depth);
+out:
+ ext4_ext_show_leaf(inode, path);
+ return err;
+}
+
+static int
+ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode,
+ ext4_lblk_t iblock, unsigned int max_blocks,
+ struct ext4_ext_path *path, int flags,
+ unsigned int allocated, struct buffer_head *bh_result,
+ ext4_fsblk_t newblock)
+{
+ int ret = 0;
+ int err = 0;
+ ext4_io_end_t *io = EXT4_I(inode)->cur_aio_dio;
+
+ ext_debug("ext4_ext_handle_uninitialized_extents: inode %lu, logical"
+ "block %llu, max_blocks %u, flags %d, allocated %u",
+ inode->i_ino, (unsigned long long)iblock, max_blocks,
+ flags, allocated);
+ ext4_ext_show_leaf(inode, path);
+ /* DIO get_block() before submit the IO, split the extent */
+ if (flags == EXT4_GET_BLOCKS_DIO_CREATE_EXT) {
+ ret = ext4_split_unwritten_extents(handle,
+ inode, path, iblock,
+ max_blocks, flags);
+ /*
+ * Flag the inode(non aio case) or end_io struct (aio case)
+ * that this IO needs to convertion to written when IO is
+ * completed
+ */
+ if (io)
+ io->flag = DIO_AIO_UNWRITTEN;
+ else
+ EXT4_I(inode)->i_state |= EXT4_STATE_DIO_UNWRITTEN;
+ goto out;
+ }
+ /* async DIO end_io complete, convert the filled extent to written */
+ if (flags == EXT4_GET_BLOCKS_DIO_CONVERT_EXT) {
+ ret = ext4_convert_unwritten_extents_dio(handle, inode,
+ path);
+ if (ret >= 0)
+ ext4_update_inode_fsync_trans(handle, inode, 1);
+ goto out2;
+ }
+ /* buffered IO case */
+ /*
+ * repeat fallocate creation request
+ * we already have an unwritten extent
+ */
+ if (flags & EXT4_GET_BLOCKS_UNINIT_EXT)
+ goto map_out;
+
+ /* buffered READ or buffered write_begin() lookup */
+ if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) {
+ /*
+ * We have blocks reserved already. We
+ * return allocated blocks so that delalloc
+ * won't do block reservation for us. But
+ * the buffer head will be unmapped so that
+ * a read from the block returns 0s.
+ */
+ set_buffer_unwritten(bh_result);
+ goto out1;
+ }
+
+ /* buffered write, writepage time, convert*/
+ ret = ext4_ext_convert_to_initialized(handle, inode,
+ path, iblock,
+ max_blocks);
+ if (ret >= 0)
+ ext4_update_inode_fsync_trans(handle, inode, 1);
+out:
+ if (ret <= 0) {
+ err = ret;
+ goto out2;
+ } else
+ allocated = ret;
+ set_buffer_new(bh_result);
+map_out:
+ set_buffer_mapped(bh_result);
+out1:
+ if (allocated > max_blocks)
+ allocated = max_blocks;
+ ext4_ext_show_leaf(inode, path);
+ bh_result->b_bdev = inode->i_sb->s_bdev;
+ bh_result->b_blocknr = newblock;
+out2:
+ if (path) {
+ ext4_ext_drop_refs(path);
+ kfree(path);
+ }
+ return err ? err : allocated;
+}
/*
* Block allocation/map/preallocation routine for extents based files
*
@@ -2784,6 +3126,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
int err = 0, depth, ret, cache_type;
unsigned int allocated = 0;
struct ext4_allocation_request ar;
+ ext4_io_end_t *io = EXT4_I(inode)->cur_aio_dio;
__clear_bit(BH_New, &bh_result->b_state);
ext_debug("blocks %u/%u requested for inode %u\n",
@@ -2859,33 +3202,10 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
EXT4_EXT_CACHE_EXTENT);
goto out;
}
- if (flags & EXT4_GET_BLOCKS_UNINIT_EXT)
- goto out;
- if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) {
- if (allocated > max_blocks)
- allocated = max_blocks;
- /*
- * We have blocks reserved already. We
- * return allocated blocks so that delalloc
- * won't do block reservation for us. But
- * the buffer head will be unmapped so that
- * a read from the block returns 0s.
- */
- set_buffer_unwritten(bh_result);
- bh_result->b_bdev = inode->i_sb->s_bdev;
- bh_result->b_blocknr = newblock;
- goto out2;
- }
-
- ret = ext4_ext_convert_to_initialized(handle, inode,
- path, iblock,
- max_blocks);
- if (ret <= 0) {
- err = ret;
- goto out2;
- } else
- allocated = ret;
- goto outnew;
+ ret = ext4_ext_handle_uninitialized_extents(handle,
+ inode, iblock, max_blocks, path,
+ flags, allocated, bh_result, newblock);
+ return ret;
}
}
@@ -2956,9 +3276,27 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
/* try to insert new extent into found leaf and return */
ext4_ext_store_pblock(&newex, newblock);
newex.ee_len = cpu_to_le16(ar.len);
- if (flags & EXT4_GET_BLOCKS_UNINIT_EXT) /* Mark uninitialized */
+ /* Mark uninitialized */
+ if (flags & EXT4_GET_BLOCKS_UNINIT_EXT){
ext4_ext_mark_uninitialized(&newex);
- err = ext4_ext_insert_extent(handle, inode, path, &newex);
+ /*
+ * io_end structure was created for every async
+ * direct IO write to the middle of the file.
+ * To avoid unecessary convertion for every aio dio rewrite
+ * to the mid of file, here we flag the IO that is really
+ * need the convertion.
+ * For non asycn direct IO case, flag the inode state
+ * that we need to perform convertion when IO is done.
+ */
+ if (flags == EXT4_GET_BLOCKS_DIO_CREATE_EXT) {
+ if (io)
+ io->flag = DIO_AIO_UNWRITTEN;
+ else
+ EXT4_I(inode)->i_state |=
+ EXT4_STATE_DIO_UNWRITTEN;;
+ }
+ }
+ err = ext4_ext_insert_extent(handle, inode, path, &newex, flags);
if (err) {
/* free data blocks we just allocated */
/* not a good idea to call discard here directly,
@@ -2972,13 +3310,18 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
/* previous routine could use block we allocated */
newblock = ext_pblock(&newex);
allocated = ext4_ext_get_actual_len(&newex);
-outnew:
set_buffer_new(bh_result);
- /* Cache only when it is _not_ an uninitialized extent */
- if ((flags & EXT4_GET_BLOCKS_UNINIT_EXT) == 0)
+ /*
+ * Cache the extent and update transaction to commit on fdatasync only
+ * when it is _not_ an uninitialized extent.
+ */
+ if ((flags & EXT4_GET_BLOCKS_UNINIT_EXT) == 0) {
ext4_ext_put_in_cache(inode, iblock, allocated, newblock,
EXT4_EXT_CACHE_EXTENT);
+ ext4_update_inode_fsync_trans(handle, inode, 1);
+ } else
+ ext4_update_inode_fsync_trans(handle, inode, 0);
out:
if (allocated > max_blocks)
allocated = max_blocks;
@@ -3171,6 +3514,64 @@ retry:
}
/*
+ * This function convert a range of blocks to written extents
+ * The caller of this function will pass the start offset and the size.
+ * all unwritten extents within this range will be converted to
+ * written extents.
+ *
+ * This function is called from the direct IO end io call back
+ * function, to convert the fallocated extents after IO is completed.
+ * Returns 0 on success.
+ */
+int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset,
+ loff_t len)
+{
+ handle_t *handle;
+ ext4_lblk_t block;
+ unsigned int max_blocks;
+ int ret = 0;
+ int ret2 = 0;
+ struct buffer_head map_bh;
+ unsigned int credits, blkbits = inode->i_blkbits;
+
+ block = offset >> blkbits;
+ /*
+ * We can't just convert len to max_blocks because
+ * If blocksize = 4096 offset = 3072 and len = 2048
+ */
+ max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits)
+ - block;
+ /*
+ * credits to insert 1 extent into extent tree
+ */
+ credits = ext4_chunk_trans_blocks(inode, max_blocks);
+ while (ret >= 0 && ret < max_blocks) {
+ block = block + ret;
+ max_blocks = max_blocks - ret;
+ handle = ext4_journal_start(inode, credits);
+ if (IS_ERR(handle)) {
+ ret = PTR_ERR(handle);
+ break;
+ }
+ map_bh.b_state = 0;
+ ret = ext4_get_blocks(handle, inode, block,
+ max_blocks, &map_bh,
+ EXT4_GET_BLOCKS_DIO_CONVERT_EXT);
+ if (ret <= 0) {
+ WARN_ON(ret <= 0);
+ printk(KERN_ERR "%s: ext4_ext_get_blocks "
+ "returned error inode#%lu, block=%u, "
+ "max_blocks=%u", __func__,
+ inode->i_ino, block, max_blocks);
+ }
+ ext4_mark_inode_dirty(handle, inode);
+ ret2 = ext4_journal_stop(handle);
+ if (ret <= 0 || ret2 )
+ break;
+ }
+ return ret > 0 ? ret2 : ret;
+}
+/*
* Callback function called for each extent to gather FIEMAP information.
*/
static int ext4_ext_fiemap_cb(struct inode *inode, struct ext4_ext_path *path,
@@ -3308,10 +3709,8 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
* Walk the extent tree gathering extent information.
* ext4_ext_fiemap_cb will push extents back to user.
*/
- down_read(&EXT4_I(inode)->i_data_sem);
error = ext4_ext_walk_space(inode, start_blk, len_blks,
ext4_ext_fiemap_cb, fieinfo);
- up_read(&EXT4_I(inode)->i_data_sem);
}
return error;
diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c
index 83cf6415f599..d6049e40b161 100644
--- a/fs/ext4/fsync.c
+++ b/fs/ext4/fsync.c
@@ -44,27 +44,37 @@
*
* What we do is just kick off a commit and wait on it. This will snapshot the
* inode to disk.
+ *
+ * i_mutex lock is held when entering and exiting this function
*/
int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync)
{
struct inode *inode = dentry->d_inode;
+ struct ext4_inode_info *ei = EXT4_I(inode);
journal_t *journal = EXT4_SB(inode->i_sb)->s_journal;
- int ret = 0;
+ int ret;
+ tid_t commit_tid;
J_ASSERT(ext4_journal_current_handle() == NULL);
trace_ext4_sync_file(file, dentry, datasync);
+ if (inode->i_sb->s_flags & MS_RDONLY)
+ return 0;
+
+ ret = flush_aio_dio_completed_IO(inode);
+ if (ret < 0)
+ return ret;
+
+ if (!journal)
+ return simple_fsync(file, dentry, datasync);
+
/*
- * data=writeback:
+ * data=writeback,ordered:
* The caller's filemap_fdatawrite()/wait will sync the data.
- * sync_inode() will sync the metadata
- *
- * data=ordered:
- * The caller's filemap_fdatawrite() will write the data and
- * sync_inode() will write the inode if it is dirty. Then the caller's
- * filemap_fdatawait() will wait on the pages.
+ * Metadata is in the journal, we wait for proper transaction to
+ * commit here.
*
* data=journal:
* filemap_fdatawrite won't do anything (the buffers are clean).
@@ -74,27 +84,13 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync)
* (they were dirtied by commit). But that's OK - the blocks are
* safe in-journal, which is all fsync() needs to ensure.
*/
- if (ext4_should_journal_data(inode)) {
- ret = ext4_force_commit(inode->i_sb);
- goto out;
- }
-
- if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
- goto out;
+ if (ext4_should_journal_data(inode))
+ return ext4_force_commit(inode->i_sb);
- /*
- * The VFS has written the file data. If the inode is unaltered
- * then we need not start a commit.
- */
- if (inode->i_state & (I_DIRTY_SYNC|I_DIRTY_DATASYNC)) {
- struct writeback_control wbc = {
- .sync_mode = WB_SYNC_ALL,
- .nr_to_write = 0, /* sys_fsync did this */
- };
- ret = sync_inode(inode, &wbc);
- if (journal && (journal->j_flags & JBD2_BARRIER))
- blkdev_issue_flush(inode->i_sb->s_bdev, NULL);
- }
-out:
+ commit_tid = datasync ? ei->i_datasync_tid : ei->i_sync_tid;
+ if (jbd2_log_start_commit(journal, commit_tid))
+ jbd2_log_wait_commit(journal, commit_tid);
+ else if (journal->j_flags & JBD2_BARRIER)
+ blkdev_issue_flush(inode->i_sb->s_bdev, NULL);
return ret;
}
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index f9c642b22efa..ef06da68dc88 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -37,6 +37,7 @@
#include <linux/namei.h>
#include <linux/uio.h>
#include <linux/bio.h>
+#include <linux/workqueue.h>
#include "ext4_jbd2.h"
#include "xattr.h"
@@ -192,11 +193,25 @@ static int try_to_extend_transaction(handle_t *handle, struct inode *inode)
* so before we call here everything must be consistently dirtied against
* this transaction.
*/
-static int ext4_journal_test_restart(handle_t *handle, struct inode *inode)
+int ext4_truncate_restart_trans(handle_t *handle, struct inode *inode,
+ int nblocks)
{
+ int ret;
+
+ /*
+ * Drop i_data_sem to avoid deadlock with ext4_get_blocks At this
+ * moment, get_block can be called only for blocks inside i_size since
+ * page cache has been already dropped and writes are blocked by
+ * i_mutex. So we can safely drop the i_data_sem here.
+ */
BUG_ON(EXT4_JOURNAL(inode) == NULL);
jbd_debug(2, "restarting handle %p\n", handle);
- return ext4_journal_restart(handle, blocks_for_truncate(inode));
+ up_write(&EXT4_I(inode)->i_data_sem);
+ ret = ext4_journal_restart(handle, blocks_for_truncate(inode));
+ down_write(&EXT4_I(inode)->i_data_sem);
+ ext4_discard_preallocations(inode);
+
+ return ret;
}
/*
@@ -551,15 +566,21 @@ static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind)
*
* Normally this function find the preferred place for block allocation,
* returns it.
+ * Because this is only used for non-extent files, we limit the block nr
+ * to 32 bits.
*/
static ext4_fsblk_t ext4_find_goal(struct inode *inode, ext4_lblk_t block,
Indirect *partial)
{
+ ext4_fsblk_t goal;
+
/*
* XXX need to get goal block from mballoc's data structures
*/
- return ext4_find_near(inode, partial);
+ goal = ext4_find_near(inode, partial);
+ goal = goal & EXT4_MAX_BLOCK_FILE_PHYS;
+ return goal;
}
/**
@@ -640,6 +661,8 @@ static int ext4_alloc_blocks(handle_t *handle, struct inode *inode,
if (*err)
goto failed_out;
+ BUG_ON(current_block + count > EXT4_MAX_BLOCK_FILE_PHYS);
+
target -= count;
/* allocate blocks for indirect blocks */
while (index < indirect_blks && count) {
@@ -674,6 +697,7 @@ static int ext4_alloc_blocks(handle_t *handle, struct inode *inode,
ar.flags = EXT4_MB_HINT_DATA;
current_block = ext4_mb_new_blocks(handle, &ar, err);
+ BUG_ON(current_block + ar.len > EXT4_MAX_BLOCK_FILE_PHYS);
if (*err && (target == blks)) {
/*
@@ -998,10 +1022,12 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode,
if (!err)
err = ext4_splice_branch(handle, inode, iblock,
partial, indirect_blks, count);
- else
+ if (err)
goto cleanup;
set_buffer_new(bh_result);
+
+ ext4_update_inode_fsync_trans(handle, inode, 1);
got_it:
map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key));
if (count > blocks_to_boundary)
@@ -1020,17 +1046,12 @@ out:
return err;
}
-qsize_t ext4_get_reserved_space(struct inode *inode)
+#ifdef CONFIG_QUOTA
+qsize_t *ext4_get_reserved_space(struct inode *inode)
{
- unsigned long long total;
-
- spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
- total = EXT4_I(inode)->i_reserved_data_blocks +
- EXT4_I(inode)->i_reserved_meta_blocks;
- spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
-
- return total;
+ return &EXT4_I(inode)->i_reserved_quota;
}
+#endif
/*
* Calculate the number of metadata blocks need to reserve
* to allocate @blocks for non extent file based file
@@ -1109,22 +1130,79 @@ static void ext4_da_update_reserve_space(struct inode *inode, int used)
ext4_discard_preallocations(inode);
}
-static int check_block_validity(struct inode *inode, sector_t logical,
- sector_t phys, int len)
+static int check_block_validity(struct inode *inode, const char *msg,
+ sector_t logical, sector_t phys, int len)
{
if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), phys, len)) {
- ext4_error(inode->i_sb, "check_block_validity",
+ ext4_error(inode->i_sb, msg,
"inode #%lu logical block %llu mapped to %llu "
"(size %d)", inode->i_ino,
(unsigned long long) logical,
(unsigned long long) phys, len);
- WARN_ON(1);
return -EIO;
}
return 0;
}
/*
+ * Return the number of contiguous dirty pages in a given inode
+ * starting at page frame idx.
+ */
+static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx,
+ unsigned int max_pages)
+{
+ struct address_space *mapping = inode->i_mapping;
+ pgoff_t index;
+ struct pagevec pvec;
+ pgoff_t num = 0;
+ int i, nr_pages, done = 0;
+
+ if (max_pages == 0)
+ return 0;
+ pagevec_init(&pvec, 0);
+ while (!done) {
+ index = idx;
+ nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
+ PAGECACHE_TAG_DIRTY,
+ (pgoff_t)PAGEVEC_SIZE);
+ if (nr_pages == 0)
+ break;
+ for (i = 0; i < nr_pages; i++) {
+ struct page *page = pvec.pages[i];
+ struct buffer_head *bh, *head;
+
+ lock_page(page);
+ if (unlikely(page->mapping != mapping) ||
+ !PageDirty(page) ||
+ PageWriteback(page) ||
+ page->index != idx) {
+ done = 1;
+ unlock_page(page);
+ break;
+ }
+ if (page_has_buffers(page)) {
+ bh = head = page_buffers(page);
+ do {
+ if (!buffer_delay(bh) &&
+ !buffer_unwritten(bh))
+ done = 1;
+ bh = bh->b_this_page;
+ } while (!done && (bh != head));
+ }
+ unlock_page(page);
+ if (done)
+ break;
+ idx++;
+ num++;
+ if (num >= max_pages)
+ break;
+ }
+ pagevec_release(&pvec);
+ }
+ return num;
+}
+
+/*
* The ext4_get_blocks() function tries to look up the requested blocks,
* and returns if the blocks are already mapped.
*
@@ -1155,6 +1233,9 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block,
clear_buffer_mapped(bh);
clear_buffer_unwritten(bh);
+ ext_debug("ext4_get_blocks(): inode %lu, flag %d, max_blocks %u,"
+ "logical block %lu\n", inode->i_ino, flags, max_blocks,
+ (unsigned long)block);
/*
* Try to see if we can get the block without requesting a new
* file system block.
@@ -1170,8 +1251,8 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block,
up_read((&EXT4_I(inode)->i_data_sem));
if (retval > 0 && buffer_mapped(bh)) {
- int ret = check_block_validity(inode, block,
- bh->b_blocknr, retval);
+ int ret = check_block_validity(inode, "file system corruption",
+ block, bh->b_blocknr, retval);
if (ret != 0)
return ret;
}
@@ -1235,8 +1316,7 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block,
* i_data's format changing. Force the migrate
* to fail by clearing migrate flags
*/
- EXT4_I(inode)->i_flags = EXT4_I(inode)->i_flags &
- ~EXT4_EXT_MIGRATE;
+ EXT4_I(inode)->i_state &= ~EXT4_STATE_EXT_MIGRATE;
}
}
@@ -1252,8 +1332,9 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block,
up_write((&EXT4_I(inode)->i_data_sem));
if (retval > 0 && buffer_mapped(bh)) {
- int ret = check_block_validity(inode, block,
- bh->b_blocknr, retval);
+ int ret = check_block_validity(inode, "file system "
+ "corruption after allocation",
+ block, bh->b_blocknr, retval);
if (ret != 0)
return ret;
}
@@ -1451,6 +1532,16 @@ static int do_journal_get_write_access(handle_t *handle,
return ext4_journal_get_write_access(handle, bh);
}
+/*
+ * Truncate blocks that were not used by write. We have to truncate the
+ * pagecache as well so that corresponding buffers get properly unmapped.
+ */
+static void ext4_truncate_failed_write(struct inode *inode)
+{
+ truncate_inode_pages(inode->i_mapping, inode->i_size);
+ ext4_truncate(inode);
+}
+
static int ext4_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata)
@@ -1516,7 +1607,7 @@ retry:
ext4_journal_stop(handle);
if (pos + len > inode->i_size) {
- ext4_truncate(inode);
+ ext4_truncate_failed_write(inode);
/*
* If truncate failed early the inode might
* still be on the orphan list; we need to
@@ -1626,7 +1717,7 @@ static int ext4_ordered_write_end(struct file *file,
ret = ret2;
if (pos + len > inode->i_size) {
- ext4_truncate(inode);
+ ext4_truncate_failed_write(inode);
/*
* If truncate failed early the inode might still be
* on the orphan list; we need to make sure the inode
@@ -1668,7 +1759,7 @@ static int ext4_writeback_write_end(struct file *file,
ret = ret2;
if (pos + len > inode->i_size) {
- ext4_truncate(inode);
+ ext4_truncate_failed_write(inode);
/*
* If truncate failed early the inode might still be
* on the orphan list; we need to make sure the inode
@@ -1731,7 +1822,7 @@ static int ext4_journalled_write_end(struct file *file,
if (!ret)
ret = ret2;
if (pos + len > inode->i_size) {
- ext4_truncate(inode);
+ ext4_truncate_failed_write(inode);
/*
* If truncate failed early the inode might still be
* on the orphan list; we need to make sure the inode
@@ -1763,30 +1854,29 @@ repeat:
md_needed = mdblocks - EXT4_I(inode)->i_reserved_meta_blocks;
total = md_needed + nrblocks;
+ spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
/*
* Make quota reservation here to prevent quota overflow
* later. Real quota accounting is done at pages writeout
* time.
*/
- if (vfs_dq_reserve_block(inode, total)) {
- spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
+ if (vfs_dq_reserve_block(inode, total))
return -EDQUOT;
- }
if (ext4_claim_free_blocks(sbi, total)) {
- spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
+ vfs_dq_release_reservation_block(inode, total);
if (ext4_should_retry_alloc(inode->i_sb, &retries)) {
yield();
goto repeat;
}
- vfs_dq_release_reservation_block(inode, total);
return -ENOSPC;
}
+ spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
EXT4_I(inode)->i_reserved_data_blocks += nrblocks;
- EXT4_I(inode)->i_reserved_meta_blocks = mdblocks;
-
+ EXT4_I(inode)->i_reserved_meta_blocks += md_needed;
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
+
return 0; /* success */
}
@@ -1860,22 +1950,6 @@ static void ext4_da_page_release_reservation(struct page *page,
}
/*
- * Delayed allocation stuff
- */
-
-struct mpage_da_data {
- struct inode *inode;
- sector_t b_blocknr; /* start block number of extent */
- size_t b_size; /* size of extent */
- unsigned long b_state; /* state of the extent */
- unsigned long first_page, next_page; /* extent of pages */
- struct writeback_control *wbc;
- int io_done;
- int pages_written;
- int retval;
-};
-
-/*
* mpage_da_submit_io - walks through extent of pages and try to write
* them with writepage() call back
*
@@ -2717,7 +2791,7 @@ static int ext4_da_writepages_trans_blocks(struct inode *inode)
* number of contiguous block. So we will limit
* number of contiguous block to a sane value
*/
- if (!(inode->i_flags & EXT4_EXTENTS_FL) &&
+ if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) &&
(max_blocks > EXT4_MAX_TRANS_DATA))
max_blocks = EXT4_MAX_TRANS_DATA;
@@ -2735,8 +2809,11 @@ static int ext4_da_writepages(struct address_space *mapping,
int no_nrwrite_index_update;
int pages_written = 0;
long pages_skipped;
+ unsigned int max_pages;
int range_cyclic, cycled = 1, io_done = 0;
- int needed_blocks, ret = 0, nr_to_writebump = 0;
+ int needed_blocks, ret = 0;
+ long desired_nr_to_write, nr_to_writebump = 0;
+ loff_t range_start = wbc->range_start;
struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb);
trace_ext4_da_writepages(inode, wbc);
@@ -2762,16 +2839,6 @@ static int ext4_da_writepages(struct address_space *mapping,
if (unlikely(sbi->s_mount_flags & EXT4_MF_FS_ABORTED))
return -EROFS;
- /*
- * Make sure nr_to_write is >= sbi->s_mb_stream_request
- * This make sure small files blocks are allocated in
- * single attempt. This ensure that small files
- * get less fragmented.
- */
- if (wbc->nr_to_write < sbi->s_mb_stream_request) {
- nr_to_writebump = sbi->s_mb_stream_request - wbc->nr_to_write;
- wbc->nr_to_write = sbi->s_mb_stream_request;
- }
if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
range_whole = 1;
@@ -2786,6 +2853,36 @@ static int ext4_da_writepages(struct address_space *mapping,
} else
index = wbc->range_start >> PAGE_CACHE_SHIFT;
+ /*
+ * This works around two forms of stupidity. The first is in
+ * the writeback code, which caps the maximum number of pages
+ * written to be 1024 pages. This is wrong on multiple
+ * levels; different architectues have a different page size,
+ * which changes the maximum amount of data which gets
+ * written. Secondly, 4 megabytes is way too small. XFS
+ * forces this value to be 16 megabytes by multiplying
+ * nr_to_write parameter by four, and then relies on its
+ * allocator to allocate larger extents to make them
+ * contiguous. Unfortunately this brings us to the second
+ * stupidity, which is that ext4's mballoc code only allocates
+ * at most 2048 blocks. So we force contiguous writes up to
+ * the number of dirty blocks in the inode, or
+ * sbi->max_writeback_mb_bump whichever is smaller.
+ */
+ max_pages = sbi->s_max_writeback_mb_bump << (20 - PAGE_CACHE_SHIFT);
+ if (!range_cyclic && range_whole)
+ desired_nr_to_write = wbc->nr_to_write * 8;
+ else
+ desired_nr_to_write = ext4_num_dirty_pages(inode, index,
+ max_pages);
+ if (desired_nr_to_write > max_pages)
+ desired_nr_to_write = max_pages;
+
+ if (wbc->nr_to_write < desired_nr_to_write) {
+ nr_to_writebump = desired_nr_to_write - wbc->nr_to_write;
+ wbc->nr_to_write = desired_nr_to_write;
+ }
+
mpd.wbc = wbc;
mpd.inode = mapping->host;
@@ -2904,7 +3001,9 @@ retry:
out_writepages:
if (!no_nrwrite_index_update)
wbc->no_nrwrite_index_update = 0;
- wbc->nr_to_write -= nr_to_writebump;
+ if (wbc->nr_to_write > nr_to_writebump)
+ wbc->nr_to_write -= nr_to_writebump;
+ wbc->range_start = range_start;
trace_ext4_da_writepages_result(inode, wbc, ret, pages_written);
return ret;
}
@@ -2994,7 +3093,7 @@ retry:
* i_size_read because we hold i_mutex.
*/
if (pos + len > inode->i_size)
- ext4_truncate(inode);
+ ext4_truncate_failed_write(inode);
}
if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
@@ -3259,6 +3358,8 @@ static int ext4_releasepage(struct page *page, gfp_t wait)
}
/*
+ * O_DIRECT for ext3 (or indirect map) based files
+ *
* If the O_DIRECT write will extend the file then add this inode to the
* orphan list. So recovery will truncate it back to the original size
* if the machine crashes during the write.
@@ -3267,7 +3368,7 @@ static int ext4_releasepage(struct page *page, gfp_t wait)
* crashes then stale disk data _may_ be exposed inside the file. But current
* VFS code falls back into buffered path in that case so we are safe.
*/
-static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb,
+static ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb,
const struct iovec *iov, loff_t offset,
unsigned long nr_segs)
{
@@ -3278,6 +3379,7 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb,
ssize_t ret;
int orphan = 0;
size_t count = iov_length(iov, nr_segs);
+ int retries = 0;
if (rw == WRITE) {
loff_t final_size = offset + count;
@@ -3300,9 +3402,12 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb,
}
}
+retry:
ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
offset, nr_segs,
ext4_get_block, NULL);
+ if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
+ goto retry;
if (orphan) {
int err;
@@ -3341,6 +3446,364 @@ out:
return ret;
}
+static int ext4_get_block_dio_write(struct inode *inode, sector_t iblock,
+ struct buffer_head *bh_result, int create)
+{
+ handle_t *handle = NULL;
+ int ret = 0;
+ unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
+ int dio_credits;
+
+ ext4_debug("ext4_get_block_dio_write: inode %lu, create flag %d\n",
+ inode->i_ino, create);
+ /*
+ * DIO VFS code passes create = 0 flag for write to
+ * the middle of file. It does this to avoid block
+ * allocation for holes, to prevent expose stale data
+ * out when there is parallel buffered read (which does
+ * not hold the i_mutex lock) while direct IO write has
+ * not completed. DIO request on holes finally falls back
+ * to buffered IO for this reason.
+ *
+ * For ext4 extent based file, since we support fallocate,
+ * new allocated extent as uninitialized, for holes, we
+ * could fallocate blocks for holes, thus parallel
+ * buffered IO read will zero out the page when read on
+ * a hole while parallel DIO write to the hole has not completed.
+ *
+ * when we come here, we know it's a direct IO write to
+ * to the middle of file (<i_size)
+ * so it's safe to override the create flag from VFS.
+ */
+ create = EXT4_GET_BLOCKS_DIO_CREATE_EXT;
+
+ if (max_blocks > DIO_MAX_BLOCKS)
+ max_blocks = DIO_MAX_BLOCKS;
+ dio_credits = ext4_chunk_trans_blocks(inode, max_blocks);
+ handle = ext4_journal_start(inode, dio_credits);
+ if (IS_ERR(handle)) {
+ ret = PTR_ERR(handle);
+ goto out;
+ }
+ ret = ext4_get_blocks(handle, inode, iblock, max_blocks, bh_result,
+ create);
+ if (ret > 0) {
+ bh_result->b_size = (ret << inode->i_blkbits);
+ ret = 0;
+ }
+ ext4_journal_stop(handle);
+out:
+ return ret;
+}
+
+static void ext4_free_io_end(ext4_io_end_t *io)
+{
+ BUG_ON(!io);
+ iput(io->inode);
+ kfree(io);
+}
+static void dump_aio_dio_list(struct inode * inode)
+{
+#ifdef EXT4_DEBUG
+ struct list_head *cur, *before, *after;
+ ext4_io_end_t *io, *io0, *io1;
+
+ if (list_empty(&EXT4_I(inode)->i_aio_dio_complete_list)){
+ ext4_debug("inode %lu aio dio list is empty\n", inode->i_ino);
+ return;
+ }
+
+ ext4_debug("Dump inode %lu aio_dio_completed_IO list \n", inode->i_ino);
+ list_for_each_entry(io, &EXT4_I(inode)->i_aio_dio_complete_list, list){
+ cur = &io->list;
+ before = cur->prev;
+ io0 = container_of(before, ext4_io_end_t, list);
+ after = cur->next;
+ io1 = container_of(after, ext4_io_end_t, list);
+
+ ext4_debug("io 0x%p from inode %lu,prev 0x%p,next 0x%p\n",
+ io, inode->i_ino, io0, io1);
+ }
+#endif
+}
+
+/*
+ * check a range of space and convert unwritten extents to written.
+ */
+static int ext4_end_aio_dio_nolock(ext4_io_end_t *io)
+{
+ struct inode *inode = io->inode;
+ loff_t offset = io->offset;
+ size_t size = io->size;
+ int ret = 0;
+
+ ext4_debug("end_aio_dio_onlock: io 0x%p from inode %lu,list->next 0x%p,"
+ "list->prev 0x%p\n",
+ io, inode->i_ino, io->list.next, io->list.prev);
+
+ if (list_empty(&io->list))
+ return ret;
+
+ if (io->flag != DIO_AIO_UNWRITTEN)
+ return ret;
+
+ if (offset + size <= i_size_read(inode))
+ ret = ext4_convert_unwritten_extents(inode, offset, size);
+
+ if (ret < 0) {
+ printk(KERN_EMERG "%s: failed to convert unwritten"
+ "extents to written extents, error is %d"
+ " io is still on inode %lu aio dio list\n",
+ __func__, ret, inode->i_ino);
+ return ret;
+ }
+
+ /* clear the DIO AIO unwritten flag */
+ io->flag = 0;
+ return ret;
+}
+/*
+ * work on completed aio dio IO, to convert unwritten extents to extents
+ */
+static void ext4_end_aio_dio_work(struct work_struct *work)
+{
+ ext4_io_end_t *io = container_of(work, ext4_io_end_t, work);
+ struct inode *inode = io->inode;
+ int ret = 0;
+
+ mutex_lock(&inode->i_mutex);
+ ret = ext4_end_aio_dio_nolock(io);
+ if (ret >= 0) {
+ if (!list_empty(&io->list))
+ list_del_init(&io->list);
+ ext4_free_io_end(io);
+ }
+ mutex_unlock(&inode->i_mutex);
+}
+/*
+ * This function is called from ext4_sync_file().
+ *
+ * When AIO DIO IO is completed, the work to convert unwritten
+ * extents to written is queued on workqueue but may not get immediately
+ * scheduled. When fsync is called, we need to ensure the
+ * conversion is complete before fsync returns.
+ * The inode keeps track of a list of completed AIO from DIO path
+ * that might needs to do the conversion. This function walks through
+ * the list and convert the related unwritten extents to written.
+ */
+int flush_aio_dio_completed_IO(struct inode *inode)
+{
+ ext4_io_end_t *io;
+ int ret = 0;
+ int ret2 = 0;
+
+ if (list_empty(&EXT4_I(inode)->i_aio_dio_complete_list))
+ return ret;
+
+ dump_aio_dio_list(inode);
+ while (!list_empty(&EXT4_I(inode)->i_aio_dio_complete_list)){
+ io = list_entry(EXT4_I(inode)->i_aio_dio_complete_list.next,
+ ext4_io_end_t, list);
+ /*
+ * Calling ext4_end_aio_dio_nolock() to convert completed
+ * IO to written.
+ *
+ * When ext4_sync_file() is called, run_queue() may already
+ * about to flush the work corresponding to this io structure.
+ * It will be upset if it founds the io structure related
+ * to the work-to-be schedule is freed.
+ *
+ * Thus we need to keep the io structure still valid here after
+ * convertion finished. The io structure has a flag to
+ * avoid double converting from both fsync and background work
+ * queue work.
+ */
+ ret = ext4_end_aio_dio_nolock(io);
+ if (ret < 0)
+ ret2 = ret;
+ else
+ list_del_init(&io->list);
+ }
+ return (ret2 < 0) ? ret2 : 0;
+}
+
+static ext4_io_end_t *ext4_init_io_end (struct inode *inode)
+{
+ ext4_io_end_t *io = NULL;
+
+ io = kmalloc(sizeof(*io), GFP_NOFS);
+
+ if (io) {
+ igrab(inode);
+ io->inode = inode;
+ io->flag = 0;
+ io->offset = 0;
+ io->size = 0;
+ io->error = 0;
+ INIT_WORK(&io->work, ext4_end_aio_dio_work);
+ INIT_LIST_HEAD(&io->list);
+ }
+
+ return io;
+}
+
+static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
+ ssize_t size, void *private)
+{
+ ext4_io_end_t *io_end = iocb->private;
+ struct workqueue_struct *wq;
+
+ /* if not async direct IO or dio with 0 bytes write, just return */
+ if (!io_end || !size)
+ return;
+
+ ext_debug("ext4_end_io_dio(): io_end 0x%p"
+ "for inode %lu, iocb 0x%p, offset %llu, size %llu\n",
+ iocb->private, io_end->inode->i_ino, iocb, offset,
+ size);
+
+ /* if not aio dio with unwritten extents, just free io and return */
+ if (io_end->flag != DIO_AIO_UNWRITTEN){
+ ext4_free_io_end(io_end);
+ iocb->private = NULL;
+ return;
+ }
+
+ io_end->offset = offset;
+ io_end->size = size;
+ wq = EXT4_SB(io_end->inode->i_sb)->dio_unwritten_wq;
+
+ /* queue the work to convert unwritten extents to written */
+ queue_work(wq, &io_end->work);
+
+ /* Add the io_end to per-inode completed aio dio list*/
+ list_add_tail(&io_end->list,
+ &EXT4_I(io_end->inode)->i_aio_dio_complete_list);
+ iocb->private = NULL;
+}
+/*
+ * For ext4 extent files, ext4 will do direct-io write to holes,
+ * preallocated extents, and those write extend the file, no need to
+ * fall back to buffered IO.
+ *
+ * For holes, we fallocate those blocks, mark them as unintialized
+ * If those blocks were preallocated, we mark sure they are splited, but
+ * still keep the range to write as unintialized.
+ *
+ * The unwrritten extents will be converted to written when DIO is completed.
+ * For async direct IO, since the IO may still pending when return, we
+ * set up an end_io call back function, which will do the convertion
+ * when async direct IO completed.
+ *
+ * If the O_DIRECT write will extend the file then add this inode to the
+ * orphan list. So recovery will truncate it back to the original size
+ * if the machine crashes during the write.
+ *
+ */
+static ssize_t ext4_ext_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 ret;
+ size_t count = iov_length(iov, nr_segs);
+
+ loff_t final_size = offset + count;
+ if (rw == WRITE && final_size <= inode->i_size) {
+ /*
+ * We could direct write to holes and fallocate.
+ *
+ * Allocated blocks to fill the hole are marked as uninitialized
+ * to prevent paralel buffered read to expose the stale data
+ * before DIO complete the data IO.
+ *
+ * As to previously fallocated extents, ext4 get_block
+ * will just simply mark the buffer mapped but still
+ * keep the extents uninitialized.
+ *
+ * for non AIO case, we will convert those unwritten extents
+ * to written after return back from blockdev_direct_IO.
+ *
+ * for async DIO, the conversion needs to be defered when
+ * the IO is completed. The ext4 end_io callback function
+ * will be called to take care of the conversion work.
+ * Here for async case, we allocate an io_end structure to
+ * hook to the iocb.
+ */
+ iocb->private = NULL;
+ EXT4_I(inode)->cur_aio_dio = NULL;
+ if (!is_sync_kiocb(iocb)) {
+ iocb->private = ext4_init_io_end(inode);
+ if (!iocb->private)
+ return -ENOMEM;
+ /*
+ * we save the io structure for current async
+ * direct IO, so that later ext4_get_blocks()
+ * could flag the io structure whether there
+ * is a unwritten extents needs to be converted
+ * when IO is completed.
+ */
+ EXT4_I(inode)->cur_aio_dio = iocb->private;
+ }
+
+ ret = blockdev_direct_IO(rw, iocb, inode,
+ inode->i_sb->s_bdev, iov,
+ offset, nr_segs,
+ ext4_get_block_dio_write,
+ ext4_end_io_dio);
+ if (iocb->private)
+ EXT4_I(inode)->cur_aio_dio = NULL;
+ /*
+ * The io_end structure takes a reference to the inode,
+ * that structure needs to be destroyed and the
+ * reference to the inode need to be dropped, when IO is
+ * complete, even with 0 byte write, or failed.
+ *
+ * In the successful AIO DIO case, the io_end structure will be
+ * desctroyed and the reference to the inode will be dropped
+ * after the end_io call back function is called.
+ *
+ * In the case there is 0 byte write, or error case, since
+ * VFS direct IO won't invoke the end_io call back function,
+ * we need to free the end_io structure here.
+ */
+ if (ret != -EIOCBQUEUED && ret <= 0 && iocb->private) {
+ ext4_free_io_end(iocb->private);
+ iocb->private = NULL;
+ } else if (ret > 0 && (EXT4_I(inode)->i_state &
+ EXT4_STATE_DIO_UNWRITTEN)) {
+ int err;
+ /*
+ * for non AIO case, since the IO is already
+ * completed, we could do the convertion right here
+ */
+ err = ext4_convert_unwritten_extents(inode,
+ offset, ret);
+ if (err < 0)
+ ret = err;
+ EXT4_I(inode)->i_state &= ~EXT4_STATE_DIO_UNWRITTEN;
+ }
+ return ret;
+ }
+
+ /* for write the the end of file case, we fall back to old way */
+ return ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs);
+}
+
+static ssize_t ext4_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;
+
+ if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
+ return ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs);
+
+ return ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs);
+}
+
/*
* Pages can be marked dirty completely asynchronously from ext4's journalling
* activity. By filemap_sync_pte(), try_to_unmap_one(), etc. We cannot do
@@ -3653,13 +4116,16 @@ static void ext4_clear_blocks(handle_t *handle, struct inode *inode,
__le32 *last)
{
__le32 *p;
+ int is_metadata = S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode);
+
if (try_to_extend_transaction(handle, inode)) {
if (bh) {
BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
ext4_handle_dirty_metadata(handle, inode, bh);
}
ext4_mark_inode_dirty(handle, inode);
- ext4_journal_test_restart(handle, inode);
+ ext4_truncate_restart_trans(handle, inode,
+ blocks_for_truncate(inode));
if (bh) {
BUFFER_TRACE(bh, "retaking write access");
ext4_journal_get_write_access(handle, bh);
@@ -3682,11 +4148,11 @@ static void ext4_clear_blocks(handle_t *handle, struct inode *inode,
*p = 0;
tbh = sb_find_get_block(inode->i_sb, nr);
- ext4_forget(handle, 0, inode, tbh, nr);
+ ext4_forget(handle, is_metadata, inode, tbh, nr);
}
}
- ext4_free_blocks(handle, inode, block_to_free, count, 0);
+ ext4_free_blocks(handle, inode, block_to_free, count, is_metadata);
}
/**
@@ -3870,7 +4336,8 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode,
return;
if (try_to_extend_transaction(handle, inode)) {
ext4_mark_inode_dirty(handle, inode);
- ext4_journal_test_restart(handle, inode);
+ ext4_truncate_restart_trans(handle, inode,
+ blocks_for_truncate(inode));
}
ext4_free_blocks(handle, inode, nr, 1, 1);
@@ -3958,8 +4425,7 @@ void ext4_truncate(struct inode *inode)
if (!ext4_can_truncate(inode))
return;
- if (ei->i_disksize && inode->i_size == 0 &&
- !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC))
+ if (inode->i_size == 0 && !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC))
ei->i_state |= EXT4_STATE_DA_ALLOC_CLOSE;
if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) {
@@ -4313,8 +4779,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
struct ext4_iloc iloc;
struct ext4_inode *raw_inode;
struct ext4_inode_info *ei;
- struct buffer_head *bh;
struct inode *inode;
+ journal_t *journal = EXT4_SB(sb)->s_journal;
long ret;
int block;
@@ -4325,11 +4791,11 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
return inode;
ei = EXT4_I(inode);
+ iloc.bh = 0;
ret = __ext4_get_inode_loc(inode, &iloc, 0);
if (ret < 0)
goto bad_inode;
- bh = iloc.bh;
raw_inode = ext4_raw_inode(&iloc);
inode->i_mode = le16_to_cpu(raw_inode->i_mode);
inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
@@ -4352,7 +4818,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
if (inode->i_mode == 0 ||
!(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) {
/* this inode is deleted */
- brelse(bh);
ret = -ESTALE;
goto bad_inode;
}
@@ -4369,6 +4834,9 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32;
inode->i_size = ext4_isize(raw_inode);
ei->i_disksize = inode->i_size;
+#ifdef CONFIG_QUOTA
+ ei->i_reserved_quota = 0;
+#endif
inode->i_generation = le32_to_cpu(raw_inode->i_generation);
ei->i_block_group = iloc.block_group;
ei->i_last_alloc_group = ~0;
@@ -4380,11 +4848,35 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
ei->i_data[block] = raw_inode->i_block[block];
INIT_LIST_HEAD(&ei->i_orphan);
+ /*
+ * Set transaction id's of transactions that have to be committed
+ * to finish f[data]sync. We set them to currently running transaction
+ * as we cannot be sure that the inode or some of its metadata isn't
+ * part of the transaction - the inode could have been reclaimed and
+ * now it is reread from disk.
+ */
+ if (journal) {
+ transaction_t *transaction;
+ tid_t tid;
+
+ spin_lock(&journal->j_state_lock);
+ if (journal->j_running_transaction)
+ transaction = journal->j_running_transaction;
+ else
+ transaction = journal->j_committing_transaction;
+ if (transaction)
+ tid = transaction->t_tid;
+ else
+ tid = journal->j_commit_sequence;
+ spin_unlock(&journal->j_state_lock);
+ ei->i_sync_tid = tid;
+ ei->i_datasync_tid = tid;
+ }
+
if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) {
ei->i_extra_isize = le16_to_cpu(raw_inode->i_extra_isize);
if (EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize >
EXT4_INODE_SIZE(inode->i_sb)) {
- brelse(bh);
ret = -EIO;
goto bad_inode;
}
@@ -4416,10 +4908,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
ret = 0;
if (ei->i_file_acl &&
- ((ei->i_file_acl <
- (le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) +
- EXT4_SB(sb)->s_gdb_count)) ||
- (ei->i_file_acl >= ext4_blocks_count(EXT4_SB(sb)->s_es)))) {
+ !ext4_data_block_valid(EXT4_SB(sb), ei->i_file_acl, 1)) {
ext4_error(sb, __func__,
"bad extended attribute block %llu in inode #%lu",
ei->i_file_acl, inode->i_ino);
@@ -4437,10 +4926,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
/* Validate block references which are part of inode */
ret = ext4_check_inode_blockref(inode);
}
- if (ret) {
- brelse(bh);
+ if (ret)
goto bad_inode;
- }
if (S_ISREG(inode->i_mode)) {
inode->i_op = &ext4_file_inode_operations;
@@ -4468,7 +4955,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
init_special_inode(inode, inode->i_mode,
new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
} else {
- brelse(bh);
ret = -EIO;
ext4_error(inode->i_sb, __func__,
"bogus i_mode (%o) for inode=%lu",
@@ -4481,6 +4967,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
return inode;
bad_inode:
+ brelse(iloc.bh);
iget_failed(inode);
return ERR_PTR(ret);
}
@@ -4581,8 +5068,7 @@ static int ext4_do_update_inode(handle_t *handle,
if (ext4_inode_blocks_set(handle, raw_inode, ei))
goto out_brelse;
raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
- /* clear the migrate flag in the raw_inode */
- raw_inode->i_flags = cpu_to_le32(ei->i_flags & ~EXT4_EXT_MIGRATE);
+ raw_inode->i_flags = cpu_to_le32(ei->i_flags);
if (EXT4_SB(inode->i_sb)->s_es->s_creator_os !=
cpu_to_le32(EXT4_OS_HURD))
raw_inode->i_file_acl_high =
@@ -4641,6 +5127,7 @@ static int ext4_do_update_inode(handle_t *handle,
err = rc;
ei->i_state &= ~EXT4_STATE_NEW;
+ ext4_update_inode_fsync_trans(handle, inode, 0);
out_brelse:
brelse(bh);
ext4_std_error(inode->i_sb, err);
@@ -4684,19 +5171,40 @@ out_brelse:
*/
int ext4_write_inode(struct inode *inode, int wait)
{
+ int err;
+
if (current->flags & PF_MEMALLOC)
return 0;
- if (ext4_journal_current_handle()) {
- jbd_debug(1, "called recursively, non-PF_MEMALLOC!\n");
- dump_stack();
- return -EIO;
- }
+ if (EXT4_SB(inode->i_sb)->s_journal) {
+ if (ext4_journal_current_handle()) {
+ jbd_debug(1, "called recursively, non-PF_MEMALLOC!\n");
+ dump_stack();
+ return -EIO;
+ }
- if (!wait)
- return 0;
+ if (!wait)
+ return 0;
- return ext4_force_commit(inode->i_sb);
+ err = ext4_force_commit(inode->i_sb);
+ } else {
+ struct ext4_iloc iloc;
+
+ err = ext4_get_inode_loc(inode, &iloc);
+ if (err)
+ return err;
+ if (wait)
+ sync_dirty_buffer(iloc.bh);
+ if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) {
+ ext4_error(inode->i_sb, __func__,
+ "IO error syncing inode, "
+ "inode=%lu, block=%llu",
+ inode->i_ino,
+ (unsigned long long)iloc.bh->b_blocknr);
+ err = -EIO;
+ }
+ }
+ return err;
}
/*
@@ -4739,8 +5247,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
/* (user+group)*(old+new) structure, inode write (sb,
* inode block, ? - but truncate inode update has it) */
- handle = ext4_journal_start(inode, 2*(EXT4_QUOTA_INIT_BLOCKS(inode->i_sb)+
- EXT4_QUOTA_DEL_BLOCKS(inode->i_sb))+3);
+ handle = ext4_journal_start(inode, (EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb)+
+ EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb))+3);
if (IS_ERR(handle)) {
error = PTR_ERR(handle);
goto err_out;
@@ -5137,24 +5645,13 @@ void ext4_dirty_inode(struct inode *inode)
handle_t *current_handle = ext4_journal_current_handle();
handle_t *handle;
- if (!ext4_handle_valid(current_handle)) {
- ext4_mark_inode_dirty(current_handle, inode);
- return;
- }
-
handle = ext4_journal_start(inode, 2);
if (IS_ERR(handle))
goto out;
- if (current_handle &&
- current_handle->h_transaction != handle->h_transaction) {
- /* This task has a transaction open against a different fs */
- printk(KERN_EMERG "%s: transactions do not match!\n",
- __func__);
- } else {
- jbd_debug(5, "marking dirty. outer handle=%p\n",
- current_handle);
- ext4_mark_inode_dirty(handle, inode);
- }
+
+ jbd_debug(5, "marking dirty. outer handle=%p\n", current_handle);
+ ext4_mark_inode_dirty(handle, inode);
+
ext4_journal_stop(handle);
out:
return;
@@ -5281,12 +5778,21 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
else
len = PAGE_CACHE_SIZE;
+ lock_page(page);
+ /*
+ * return if we have all the buffers mapped. This avoid
+ * the need to call write_begin/write_end which does a
+ * journal_start/journal_stop which can block and take
+ * long time
+ */
if (page_has_buffers(page)) {
- /* return if we have all the buffers mapped */
if (!walk_page_buffers(NULL, page_buffers(page), 0, len, NULL,
- ext4_bh_unmapped))
+ ext4_bh_unmapped)) {
+ unlock_page(page);
goto out_unlock;
+ }
}
+ unlock_page(page);
/*
* OK, we need to fill the hole... Do write_begin write_end
* to do block allocation/reservation.We are not holding
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
index 7050a9cd04a4..b63d193126db 100644
--- a/fs/ext4/ioctl.c
+++ b/fs/ext4/ioctl.c
@@ -221,32 +221,38 @@ setversion_out:
struct file *donor_filp;
int err;
+ if (!(filp->f_mode & FMODE_READ) ||
+ !(filp->f_mode & FMODE_WRITE))
+ return -EBADF;
+
if (copy_from_user(&me,
(struct move_extent __user *)arg, sizeof(me)))
return -EFAULT;
+ me.moved_len = 0;
donor_filp = fget(me.donor_fd);
if (!donor_filp)
return -EBADF;
- if (!capable(CAP_DAC_OVERRIDE)) {
- if ((current->real_cred->fsuid != inode->i_uid) ||
- !(inode->i_mode & S_IRUSR) ||
- !(donor_filp->f_dentry->d_inode->i_mode &
- S_IRUSR)) {
- fput(donor_filp);
- return -EACCES;
- }
+ if (!(donor_filp->f_mode & FMODE_WRITE)) {
+ err = -EBADF;
+ goto mext_out;
}
+ err = mnt_want_write(filp->f_path.mnt);
+ if (err)
+ goto mext_out;
+
err = ext4_move_extents(filp, donor_filp, me.orig_start,
me.donor_start, me.len, &me.moved_len);
- fput(donor_filp);
+ mnt_drop_write(filp->f_path.mnt);
+ if (me.moved_len > 0)
+ file_remove_suid(donor_filp);
- if (!err)
- if (copy_to_user((struct move_extent *)arg,
- &me, sizeof(me)))
- return -EFAULT;
+ if (copy_to_user((struct move_extent *)arg, &me, sizeof(me)))
+ err = -EFAULT;
+mext_out:
+ fput(donor_filp);
return err;
}
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index cd258463e2a9..099fd476273e 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -908,6 +908,97 @@ out:
return err;
}
+static noinline_for_stack
+int ext4_mb_init_group(struct super_block *sb, ext4_group_t group)
+{
+
+ int ret = 0;
+ void *bitmap;
+ int blocks_per_page;
+ int block, pnum, poff;
+ int num_grp_locked = 0;
+ struct ext4_group_info *this_grp;
+ struct ext4_sb_info *sbi = EXT4_SB(sb);
+ struct inode *inode = sbi->s_buddy_cache;
+ struct page *page = NULL, *bitmap_page = NULL;
+
+ mb_debug("init group %lu\n", group);
+ blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
+ this_grp = ext4_get_group_info(sb, group);
+ /*
+ * This ensures we don't add group
+ * to this buddy cache via resize
+ */
+ num_grp_locked = ext4_mb_get_buddy_cache_lock(sb, group);
+ if (!EXT4_MB_GRP_NEED_INIT(this_grp)) {
+ /*
+ * somebody initialized the group
+ * return without doing anything
+ */
+ ret = 0;
+ goto err;
+ }
+ /*
+ * the buddy cache inode stores the block bitmap
+ * and buddy information in consecutive blocks.
+ * So for each group we need two blocks.
+ */
+ block = group * 2;
+ pnum = block / blocks_per_page;
+ poff = block % blocks_per_page;
+ page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS);
+ if (page) {
+ BUG_ON(page->mapping != inode->i_mapping);
+ ret = ext4_mb_init_cache(page, NULL);
+ if (ret) {
+ unlock_page(page);
+ goto err;
+ }
+ unlock_page(page);
+ }
+ if (page == NULL || !PageUptodate(page)) {
+ ret = -EIO;
+ goto err;
+ }
+ mark_page_accessed(page);
+ bitmap_page = page;
+ bitmap = page_address(page) + (poff * sb->s_blocksize);
+
+ /* init buddy cache */
+ block++;
+ pnum = block / blocks_per_page;
+ poff = block % blocks_per_page;
+ page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS);
+ if (page == bitmap_page) {
+ /*
+ * If both the bitmap and buddy are in
+ * the same page we don't need to force
+ * init the buddy
+ */
+ unlock_page(page);
+ } else if (page) {
+ BUG_ON(page->mapping != inode->i_mapping);
+ ret = ext4_mb_init_cache(page, bitmap);
+ if (ret) {
+ unlock_page(page);
+ goto err;
+ }
+ unlock_page(page);
+ }
+ if (page == NULL || !PageUptodate(page)) {
+ ret = -EIO;
+ goto err;
+ }
+ mark_page_accessed(page);
+err:
+ ext4_mb_put_buddy_cache_lock(sb, group, num_grp_locked);
+ if (bitmap_page)
+ page_cache_release(bitmap_page);
+ if (page)
+ page_cache_release(page);
+ return ret;
+}
+
static noinline_for_stack int
ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
struct ext4_buddy *e4b)
@@ -941,8 +1032,26 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
* groups mapped by the page is blocked
* till we are done with allocation
*/
+repeat_load_buddy:
down_read(e4b->alloc_semp);
+ if (unlikely(EXT4_MB_GRP_NEED_INIT(grp))) {
+ /* we need to check for group need init flag
+ * with alloc_semp held so that we can be sure
+ * that new blocks didn't get added to the group
+ * when we are loading the buddy cache
+ */
+ up_read(e4b->alloc_semp);
+ /*
+ * we need full data about the group
+ * to make a good selection
+ */
+ ret = ext4_mb_init_group(sb, group);
+ if (ret)
+ return ret;
+ goto repeat_load_buddy;
+ }
+
/*
* the buddy cache inode stores the block bitmap
* and buddy information in consecutive blocks.
@@ -1360,7 +1469,7 @@ static void ext4_mb_use_best_found(struct ext4_allocation_context *ac,
ac->alloc_semp = e4b->alloc_semp;
e4b->alloc_semp = NULL;
/* store last allocated for subsequent stream allocation */
- if ((ac->ac_flags & EXT4_MB_HINT_DATA)) {
+ if (ac->ac_flags & EXT4_MB_STREAM_ALLOC) {
spin_lock(&sbi->s_md_lock);
sbi->s_mb_last_group = ac->ac_f_ex.fe_group;
sbi->s_mb_last_start = ac->ac_f_ex.fe_start;
@@ -1837,97 +1946,6 @@ void ext4_mb_put_buddy_cache_lock(struct super_block *sb,
}
-static noinline_for_stack
-int ext4_mb_init_group(struct super_block *sb, ext4_group_t group)
-{
-
- int ret;
- void *bitmap;
- int blocks_per_page;
- int block, pnum, poff;
- int num_grp_locked = 0;
- struct ext4_group_info *this_grp;
- struct ext4_sb_info *sbi = EXT4_SB(sb);
- struct inode *inode = sbi->s_buddy_cache;
- struct page *page = NULL, *bitmap_page = NULL;
-
- mb_debug("init group %lu\n", group);
- blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
- this_grp = ext4_get_group_info(sb, group);
- /*
- * This ensures we don't add group
- * to this buddy cache via resize
- */
- num_grp_locked = ext4_mb_get_buddy_cache_lock(sb, group);
- if (!EXT4_MB_GRP_NEED_INIT(this_grp)) {
- /*
- * somebody initialized the group
- * return without doing anything
- */
- ret = 0;
- goto err;
- }
- /*
- * the buddy cache inode stores the block bitmap
- * and buddy information in consecutive blocks.
- * So for each group we need two blocks.
- */
- block = group * 2;
- pnum = block / blocks_per_page;
- poff = block % blocks_per_page;
- page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS);
- if (page) {
- BUG_ON(page->mapping != inode->i_mapping);
- ret = ext4_mb_init_cache(page, NULL);
- if (ret) {
- unlock_page(page);
- goto err;
- }
- unlock_page(page);
- }
- if (page == NULL || !PageUptodate(page)) {
- ret = -EIO;
- goto err;
- }
- mark_page_accessed(page);
- bitmap_page = page;
- bitmap = page_address(page) + (poff * sb->s_blocksize);
-
- /* init buddy cache */
- block++;
- pnum = block / blocks_per_page;
- poff = block % blocks_per_page;
- page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS);
- if (page == bitmap_page) {
- /*
- * If both the bitmap and buddy are in
- * the same page we don't need to force
- * init the buddy
- */
- unlock_page(page);
- } else if (page) {
- BUG_ON(page->mapping != inode->i_mapping);
- ret = ext4_mb_init_cache(page, bitmap);
- if (ret) {
- unlock_page(page);
- goto err;
- }
- unlock_page(page);
- }
- if (page == NULL || !PageUptodate(page)) {
- ret = -EIO;
- goto err;
- }
- mark_page_accessed(page);
-err:
- ext4_mb_put_buddy_cache_lock(sb, group, num_grp_locked);
- if (bitmap_page)
- page_cache_release(bitmap_page);
- if (page)
- page_cache_release(page);
- return ret;
-}
-
static noinline_for_stack int
ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
{
@@ -1938,11 +1956,14 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
struct ext4_sb_info *sbi;
struct super_block *sb;
struct ext4_buddy e4b;
- loff_t size, isize;
sb = ac->ac_sb;
sbi = EXT4_SB(sb);
ngroups = ext4_get_groups_count(sb);
+ /* non-extent files are limited to low blocks/groups */
+ if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL))
+ ngroups = sbi->s_blockfile_groups;
+
BUG_ON(ac->ac_status == AC_STATUS_FOUND);
/* first, try the goal */
@@ -1974,20 +1995,16 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
}
bsbits = ac->ac_sb->s_blocksize_bits;
- /* if stream allocation is enabled, use global goal */
- size = ac->ac_o_ex.fe_logical + ac->ac_o_ex.fe_len;
- isize = i_size_read(ac->ac_inode) >> bsbits;
- if (size < isize)
- size = isize;
- if (size < sbi->s_mb_stream_request &&
- (ac->ac_flags & EXT4_MB_HINT_DATA)) {
+ /* if stream allocation is enabled, use global goal */
+ if (ac->ac_flags & EXT4_MB_STREAM_ALLOC) {
/* TBD: may be hot point */
spin_lock(&sbi->s_md_lock);
ac->ac_g_ex.fe_group = sbi->s_mb_last_group;
ac->ac_g_ex.fe_start = sbi->s_mb_last_start;
spin_unlock(&sbi->s_md_lock);
}
+
/* Let's just scan groups to find more-less suitable blocks */
cr = ac->ac_2order ? 0 : 1;
/*
@@ -2015,27 +2032,6 @@ repeat:
if (grp->bb_free == 0)
continue;
- /*
- * if the group is already init we check whether it is
- * a good group and if not we don't load the buddy
- */
- if (EXT4_MB_GRP_NEED_INIT(grp)) {
- /*
- * we need full data about the group
- * to make a good selection
- */
- err = ext4_mb_init_group(sb, group);
- if (err)
- goto out;
- }
-
- /*
- * If the particular group doesn't satisfy our
- * criteria we continue with the next group
- */
- if (!ext4_mb_good_group(ac, group, cr))
- continue;
-
err = ext4_mb_load_buddy(sb, group, &e4b);
if (err)
goto out;
@@ -2571,13 +2567,11 @@ static int ext4_mb_init_backend(struct super_block *sb)
{
ext4_group_t ngroups = ext4_get_groups_count(sb);
ext4_group_t i;
- int metalen;
struct ext4_sb_info *sbi = EXT4_SB(sb);
struct ext4_super_block *es = sbi->s_es;
int num_meta_group_infos;
int num_meta_group_infos_max;
int array_size;
- struct ext4_group_info **meta_group_info;
struct ext4_group_desc *desc;
/* This is the number of blocks used by GDT */
@@ -2622,22 +2616,6 @@ static int ext4_mb_init_backend(struct super_block *sb)
goto err_freesgi;
}
EXT4_I(sbi->s_buddy_cache)->i_disksize = 0;
-
- metalen = sizeof(*meta_group_info) << EXT4_DESC_PER_BLOCK_BITS(sb);
- for (i = 0; i < num_meta_group_infos; i++) {
- if ((i + 1) == num_meta_group_infos)
- metalen = sizeof(*meta_group_info) *
- (ngroups -
- (i << EXT4_DESC_PER_BLOCK_BITS(sb)));
- meta_group_info = kmalloc(metalen, GFP_KERNEL);
- if (meta_group_info == NULL) {
- printk(KERN_ERR "EXT4-fs: can't allocate mem for a "
- "buddy group\n");
- goto err_freemeta;
- }
- sbi->s_group_info[i] = meta_group_info;
- }
-
for (i = 0; i < ngroups; i++) {
desc = ext4_get_group_desc(sb, i, NULL);
if (desc == NULL) {
@@ -2655,7 +2633,6 @@ err_freebuddy:
while (i-- > 0)
kfree(ext4_get_group_info(sb, i));
i = num_meta_group_infos;
-err_freemeta:
while (i-- > 0)
kfree(sbi->s_group_info[i]);
iput(sbi->s_buddy_cache);
@@ -2833,7 +2810,6 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn)
struct ext4_group_info *db;
int err, count = 0, count2 = 0;
struct ext4_free_data *entry;
- ext4_fsblk_t discard_block;
struct list_head *l, *ltmp;
list_for_each_safe(l, ltmp, &txn->t_private_list) {
@@ -2863,13 +2839,19 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn)
page_cache_release(e4b.bd_bitmap_page);
}
ext4_unlock_group(sb, entry->group);
- discard_block = (ext4_fsblk_t) entry->group * EXT4_BLOCKS_PER_GROUP(sb)
- + entry->start_blk
- + le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block);
- trace_ext4_discard_blocks(sb, (unsigned long long)discard_block,
- entry->count);
- sb_issue_discard(sb, discard_block, entry->count);
-
+ if (test_opt(sb, DISCARD)) {
+ ext4_fsblk_t discard_block;
+ struct ext4_super_block *es = EXT4_SB(sb)->s_es;
+
+ discard_block = (ext4_fsblk_t)entry->group *
+ EXT4_BLOCKS_PER_GROUP(sb)
+ + entry->start_blk
+ + le32_to_cpu(es->s_first_data_block);
+ trace_ext4_discard_blocks(sb,
+ (unsigned long long)discard_block,
+ entry->count);
+ sb_issue_discard(sb, discard_block, entry->count);
+ }
kmem_cache_free(ext4_free_ext_cachep, entry);
ext4_mb_release_desc(&e4b);
}
@@ -3276,6 +3258,24 @@ static void ext4_mb_collect_stats(struct ext4_allocation_context *ac)
}
/*
+ * Called on failure; free up any blocks from the inode PA for this
+ * context. We don't need this for MB_GROUP_PA because we only change
+ * pa_free in ext4_mb_release_context(), but on failure, we've already
+ * zeroed out ac->ac_b_ex.fe_len, so group_pa->pa_free is not changed.
+ */
+static void ext4_discard_allocated_blocks(struct ext4_allocation_context *ac)
+{
+ struct ext4_prealloc_space *pa = ac->ac_pa;
+ int len;
+
+ if (pa && pa->pa_type == MB_INODE_PA) {
+ len = ac->ac_b_ex.fe_len;
+ pa->pa_free += len;
+ }
+
+}
+
+/*
* use blocks preallocated to inode
*/
static void ext4_mb_use_inode_pa(struct ext4_allocation_context *ac,
@@ -3382,6 +3382,11 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac)
ac->ac_o_ex.fe_logical >= pa->pa_lstart + pa->pa_len)
continue;
+ /* non-extent files can't have physical blocks past 2^32 */
+ if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL) &&
+ pa->pa_pstart + pa->pa_len > EXT4_MAX_BLOCK_FILE_PHYS)
+ continue;
+
/* found preallocated blocks, use them */
spin_lock(&pa->pa_lock);
if (pa->pa_deleted == 0 && pa->pa_free) {
@@ -4174,16 +4179,26 @@ static void ext4_mb_group_or_file(struct ext4_allocation_context *ac)
if (!(ac->ac_flags & EXT4_MB_HINT_DATA))
return;
+ if (unlikely(ac->ac_flags & EXT4_MB_HINT_GOAL_ONLY))
+ return;
+
size = ac->ac_o_ex.fe_logical + ac->ac_o_ex.fe_len;
- isize = i_size_read(ac->ac_inode) >> bsbits;
- size = max(size, isize);
+ isize = (i_size_read(ac->ac_inode) + ac->ac_sb->s_blocksize - 1)
+ >> bsbits;
- /* don't use group allocation for large files */
- if (size >= sbi->s_mb_stream_request)
+ if ((size == isize) &&
+ !ext4_fs_is_busy(sbi) &&
+ (atomic_read(&ac->ac_inode->i_writecount) == 0)) {
+ ac->ac_flags |= EXT4_MB_HINT_NOPREALLOC;
return;
+ }
- if (unlikely(ac->ac_flags & EXT4_MB_HINT_GOAL_ONLY))
+ /* don't use group allocation for large files */
+ size = max(size, isize);
+ if (size >= sbi->s_mb_stream_request) {
+ ac->ac_flags |= EXT4_MB_STREAM_ALLOC;
return;
+ }
BUG_ON(ac->ac_lg != NULL);
/*
@@ -4549,6 +4564,7 @@ repeat:
ac->ac_status = AC_STATUS_CONTINUE;
goto repeat;
} else if (*errp) {
+ ext4_discard_allocated_blocks(ac);
ac->ac_b_ex.fe_len = 0;
ar->len = 0;
ext4_mb_show_ac(ac);
diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c
index 313a50b39741..864614974536 100644
--- a/fs/ext4/migrate.c
+++ b/fs/ext4/migrate.c
@@ -75,7 +75,7 @@ static int finish_range(handle_t *handle, struct inode *inode,
goto err_out;
}
}
- retval = ext4_ext_insert_extent(handle, inode, path, &newext);
+ retval = ext4_ext_insert_extent(handle, inode, path, &newext, 0);
err_out:
if (path) {
ext4_ext_drop_refs(path);
@@ -238,7 +238,7 @@ static int extend_credit_for_blkdel(handle_t *handle, struct inode *inode)
* So allocate a credit of 3. We may update
* quota (user and group).
*/
- needed = 3 + 2*EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb);
+ needed = 3 + EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb);
if (ext4_journal_extend(handle, needed) != 0)
retval = ext4_journal_restart(handle, needed);
@@ -353,17 +353,16 @@ static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode,
down_write(&EXT4_I(inode)->i_data_sem);
/*
- * if EXT4_EXT_MIGRATE is cleared a block allocation
+ * if EXT4_STATE_EXT_MIGRATE is cleared a block allocation
* happened after we started the migrate. We need to
* fail the migrate
*/
- if (!(EXT4_I(inode)->i_flags & EXT4_EXT_MIGRATE)) {
+ if (!(EXT4_I(inode)->i_state & EXT4_STATE_EXT_MIGRATE)) {
retval = -EAGAIN;
up_write(&EXT4_I(inode)->i_data_sem);
goto err_out;
} else
- EXT4_I(inode)->i_flags = EXT4_I(inode)->i_flags &
- ~EXT4_EXT_MIGRATE;
+ EXT4_I(inode)->i_state &= ~EXT4_STATE_EXT_MIGRATE;
/*
* We have the extent map build with the tmp inode.
* Now copy the i_data across
@@ -478,7 +477,7 @@ int ext4_ext_migrate(struct inode *inode)
handle = ext4_journal_start(inode,
EXT4_DATA_TRANS_BLOCKS(inode->i_sb) +
EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 +
- 2 * EXT4_QUOTA_INIT_BLOCKS(inode->i_sb)
+ EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb)
+ 1);
if (IS_ERR(handle)) {
retval = PTR_ERR(handle);
@@ -517,14 +516,15 @@ int ext4_ext_migrate(struct inode *inode)
* when we add extents we extent the journal
*/
/*
- * Even though we take i_mutex we can still cause block allocation
- * via mmap write to holes. If we have allocated new blocks we fail
- * migrate. New block allocation will clear EXT4_EXT_MIGRATE flag.
- * The flag is updated with i_data_sem held to prevent racing with
- * block allocation.
+ * Even though we take i_mutex we can still cause block
+ * allocation via mmap write to holes. If we have allocated
+ * new blocks we fail migrate. New block allocation will
+ * clear EXT4_STATE_EXT_MIGRATE flag. The flag is updated
+ * with i_data_sem held to prevent racing with block
+ * allocation.
*/
down_read((&EXT4_I(inode)->i_data_sem));
- EXT4_I(inode)->i_flags = EXT4_I(inode)->i_flags | EXT4_EXT_MIGRATE;
+ EXT4_I(inode)->i_state |= EXT4_STATE_EXT_MIGRATE;
up_read((&EXT4_I(inode)->i_data_sem));
handle = ext4_journal_start(inode, 1);
@@ -618,7 +618,7 @@ err_out:
tmp_inode->i_nlink = 0;
ext4_journal_stop(handle);
-
+ unlock_new_inode(tmp_inode);
iput(tmp_inode);
return retval;
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
index bbf2dd9404dc..9a573a62dd63 100644
--- a/fs/ext4/move_extent.c
+++ b/fs/ext4/move_extent.c
@@ -19,14 +19,31 @@
#include "ext4_extents.h"
#include "ext4.h"
-#define get_ext_path(path, inode, block, ret) \
- do { \
- path = ext4_ext_find_extent(inode, block, path); \
- if (IS_ERR(path)) { \
- ret = PTR_ERR(path); \
- path = NULL; \
- } \
- } while (0)
+/**
+ * get_ext_path - Find an extent path for designated logical block number.
+ *
+ * @inode: an inode which is searched
+ * @lblock: logical block number to find an extent path
+ * @path: pointer to an extent path pointer (for output)
+ *
+ * ext4_ext_find_extent wrapper. Return 0 on success, or a negative error value
+ * on failure.
+ */
+static inline int
+get_ext_path(struct inode *inode, ext4_lblk_t lblock,
+ struct ext4_ext_path **path)
+{
+ int ret = 0;
+
+ *path = ext4_ext_find_extent(inode, lblock, *path);
+ if (IS_ERR(*path)) {
+ ret = PTR_ERR(*path);
+ *path = NULL;
+ } else if ((*path)[ext_depth(inode)].p_ext == NULL)
+ ret = -ENODATA;
+
+ return ret;
+}
/**
* copy_extent_status - Copy the extent's initialization status
@@ -60,12 +77,14 @@ static int
mext_next_extent(struct inode *inode, struct ext4_ext_path *path,
struct ext4_extent **extent)
{
+ struct ext4_extent_header *eh;
int ppos, leaf_ppos = path->p_depth;
ppos = leaf_ppos;
if (EXT_LAST_EXTENT(path[ppos].p_hdr) > path[ppos].p_ext) {
/* leaf block */
*extent = ++path[ppos].p_ext;
+ path[ppos].p_block = ext_pblock(path[ppos].p_ext);
return 0;
}
@@ -102,9 +121,18 @@ mext_next_extent(struct inode *inode, struct ext4_ext_path *path,
ext_block_hdr(path[cur_ppos+1].p_bh);
}
+ path[leaf_ppos].p_ext = *extent = NULL;
+
+ eh = path[leaf_ppos].p_hdr;
+ if (le16_to_cpu(eh->eh_entries) == 0)
+ /* empty leaf is found */
+ return -ENODATA;
+
/* leaf block */
path[leaf_ppos].p_ext = *extent =
EXT_FIRST_EXTENT(path[leaf_ppos].p_hdr);
+ path[leaf_ppos].p_block =
+ ext_pblock(path[leaf_ppos].p_ext);
return 0;
}
}
@@ -113,47 +141,43 @@ mext_next_extent(struct inode *inode, struct ext4_ext_path *path,
}
/**
- * mext_double_down_read - Acquire two inodes' read semaphore
+ * mext_check_null_inode - NULL check for two inodes
*
- * @orig_inode: original inode structure
- * @donor_inode: donor inode structure
- * Acquire read semaphore of the two inodes (orig and donor) by i_ino order.
+ * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0.
*/
-static void
-mext_double_down_read(struct inode *orig_inode, struct inode *donor_inode)
+static int
+mext_check_null_inode(struct inode *inode1, struct inode *inode2,
+ const char *function)
{
- struct inode *first = orig_inode, *second = donor_inode;
-
- BUG_ON(orig_inode == NULL || donor_inode == NULL);
-
- /*
- * Use the inode number to provide the stable locking order instead
- * of its address, because the C language doesn't guarantee you can
- * compare pointers that don't come from the same array.
- */
- if (donor_inode->i_ino < orig_inode->i_ino) {
- first = donor_inode;
- second = orig_inode;
+ int ret = 0;
+
+ if (inode1 == NULL) {
+ ext4_error(inode2->i_sb, function,
+ "Both inodes should not be NULL: "
+ "inode1 NULL inode2 %lu", inode2->i_ino);
+ ret = -EIO;
+ } else if (inode2 == NULL) {
+ ext4_error(inode1->i_sb, function,
+ "Both inodes should not be NULL: "
+ "inode1 %lu inode2 NULL", inode1->i_ino);
+ ret = -EIO;
}
-
- down_read(&EXT4_I(first)->i_data_sem);
- down_read(&EXT4_I(second)->i_data_sem);
+ return ret;
}
/**
- * mext_double_down_write - Acquire two inodes' write semaphore
+ * double_down_write_data_sem - Acquire two inodes' write lock of i_data_sem
*
* @orig_inode: original inode structure
* @donor_inode: donor inode structure
- * Acquire write semaphore of the two inodes (orig and donor) by i_ino order.
+ * Acquire write lock of i_data_sem of the two inodes (orig and donor) by
+ * i_ino order.
*/
static void
-mext_double_down_write(struct inode *orig_inode, struct inode *donor_inode)
+double_down_write_data_sem(struct inode *orig_inode, struct inode *donor_inode)
{
struct inode *first = orig_inode, *second = donor_inode;
- BUG_ON(orig_inode == NULL || donor_inode == NULL);
-
/*
* Use the inode number to provide the stable locking order instead
* of its address, because the C language doesn't guarantee you can
@@ -165,37 +189,19 @@ mext_double_down_write(struct inode *orig_inode, struct inode *donor_inode)
}
down_write(&EXT4_I(first)->i_data_sem);
- down_write(&EXT4_I(second)->i_data_sem);
-}
-
-/**
- * mext_double_up_read - Release two inodes' read semaphore
- *
- * @orig_inode: original inode structure to be released its lock first
- * @donor_inode: donor inode structure to be released its lock second
- * Release read semaphore of two inodes (orig and donor).
- */
-static void
-mext_double_up_read(struct inode *orig_inode, struct inode *donor_inode)
-{
- BUG_ON(orig_inode == NULL || donor_inode == NULL);
-
- up_read(&EXT4_I(orig_inode)->i_data_sem);
- up_read(&EXT4_I(donor_inode)->i_data_sem);
+ down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING);
}
/**
- * mext_double_up_write - Release two inodes' write semaphore
+ * double_up_write_data_sem - Release two inodes' write lock of i_data_sem
*
* @orig_inode: original inode structure to be released its lock first
* @donor_inode: donor inode structure to be released its lock second
- * Release write semaphore of two inodes (orig and donor).
+ * Release write lock of i_data_sem of two inodes (orig and donor).
*/
static void
-mext_double_up_write(struct inode *orig_inode, struct inode *donor_inode)
+double_up_write_data_sem(struct inode *orig_inode, struct inode *donor_inode)
{
- BUG_ON(orig_inode == NULL || donor_inode == NULL);
-
up_write(&EXT4_I(orig_inode)->i_data_sem);
up_write(&EXT4_I(donor_inode)->i_data_sem);
}
@@ -283,23 +289,23 @@ mext_insert_across_blocks(handle_t *handle, struct inode *orig_inode,
}
if (new_flag) {
- get_ext_path(orig_path, orig_inode, eblock, err);
- if (orig_path == NULL)
+ err = get_ext_path(orig_inode, eblock, &orig_path);
+ if (err)
goto out;
if (ext4_ext_insert_extent(handle, orig_inode,
- orig_path, new_ext))
+ orig_path, new_ext, 0))
goto out;
}
if (end_flag) {
- get_ext_path(orig_path, orig_inode,
- le32_to_cpu(end_ext->ee_block) - 1, err);
- if (orig_path == NULL)
+ err = get_ext_path(orig_inode,
+ le32_to_cpu(end_ext->ee_block) - 1, &orig_path);
+ if (err)
goto out;
if (ext4_ext_insert_extent(handle, orig_inode,
- orig_path, end_ext))
+ orig_path, end_ext, 0))
goto out;
}
out:
@@ -519,7 +525,15 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode,
* oext |-----------|
* new_ext |-------|
*/
- BUG_ON(le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end);
+ if (le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end) {
+ ext4_error(orig_inode->i_sb, __func__,
+ "new_ext_end(%u) should be less than or equal to "
+ "oext->ee_block(%u) + oext_alen(%d) - 1",
+ new_ext_end, le32_to_cpu(oext->ee_block),
+ oext_alen);
+ ret = -EIO;
+ goto out;
+ }
/*
* Case: new_ext is smaller than original extent
@@ -543,6 +557,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode,
ret = mext_insert_extents(handle, orig_inode, orig_path, o_start,
o_end, &start_ext, &new_ext, &end_ext);
+out:
return ret;
}
@@ -554,8 +569,10 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode,
* @orig_off: block offset of original inode
* @donor_off: block offset of donor inode
* @max_count: the maximun length of extents
+ *
+ * Return 0 on success, or a negative error value on failure.
*/
-static void
+static int
mext_calc_swap_extents(struct ext4_extent *tmp_dext,
struct ext4_extent *tmp_oext,
ext4_lblk_t orig_off, ext4_lblk_t donor_off,
@@ -564,6 +581,19 @@ mext_calc_swap_extents(struct ext4_extent *tmp_dext,
ext4_lblk_t diff, orig_diff;
struct ext4_extent dext_old, oext_old;
+ BUG_ON(orig_off != donor_off);
+
+ /* original and donor extents have to cover the same block offset */
+ if (orig_off < le32_to_cpu(tmp_oext->ee_block) ||
+ le32_to_cpu(tmp_oext->ee_block) +
+ ext4_ext_get_actual_len(tmp_oext) - 1 < orig_off)
+ return -ENODATA;
+
+ if (orig_off < le32_to_cpu(tmp_dext->ee_block) ||
+ le32_to_cpu(tmp_dext->ee_block) +
+ ext4_ext_get_actual_len(tmp_dext) - 1 < orig_off)
+ return -ENODATA;
+
dext_old = *tmp_dext;
oext_old = *tmp_oext;
@@ -591,6 +621,8 @@ mext_calc_swap_extents(struct ext4_extent *tmp_dext,
copy_extent_status(&oext_old, tmp_dext);
copy_extent_status(&dext_old, tmp_oext);
+
+ return 0;
}
/**
@@ -601,6 +633,7 @@ mext_calc_swap_extents(struct ext4_extent *tmp_dext,
* @donor_inode: donor inode
* @from: block offset of orig_inode
* @count: block count to be replaced
+ * @err: pointer to save return value
*
* Replace original inode extents and donor inode extents page by page.
* We implement this replacement in the following three steps:
@@ -611,33 +644,33 @@ mext_calc_swap_extents(struct ext4_extent *tmp_dext,
* 3. Change the block information of donor inode to point at the saved
* original inode blocks in the dummy extents.
*
- * Return 0 on success, or a negative error value on failure.
+ * Return replaced block count.
*/
static int
mext_replace_branches(handle_t *handle, struct inode *orig_inode,
struct inode *donor_inode, ext4_lblk_t from,
- ext4_lblk_t count)
+ ext4_lblk_t count, int *err)
{
struct ext4_ext_path *orig_path = NULL;
struct ext4_ext_path *donor_path = NULL;
struct ext4_extent *oext, *dext;
struct ext4_extent tmp_dext, tmp_oext;
ext4_lblk_t orig_off = from, donor_off = from;
- int err = 0;
int depth;
int replaced_count = 0;
int dext_alen;
- mext_double_down_write(orig_inode, donor_inode);
+ /* Protect extent trees against block allocations via delalloc */
+ double_down_write_data_sem(orig_inode, donor_inode);
/* Get the original extent for the block "orig_off" */
- get_ext_path(orig_path, orig_inode, orig_off, err);
- if (orig_path == NULL)
+ *err = get_ext_path(orig_inode, orig_off, &orig_path);
+ if (*err)
goto out;
/* Get the donor extent for the head */
- get_ext_path(donor_path, donor_inode, donor_off, err);
- if (donor_path == NULL)
+ *err = get_ext_path(donor_inode, donor_off, &donor_path);
+ if (*err)
goto out;
depth = ext_depth(orig_inode);
oext = orig_path[depth].p_ext;
@@ -647,24 +680,39 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode,
dext = donor_path[depth].p_ext;
tmp_dext = *dext;
- mext_calc_swap_extents(&tmp_dext, &tmp_oext, orig_off,
+ *err = mext_calc_swap_extents(&tmp_dext, &tmp_oext, orig_off,
donor_off, count);
+ if (*err)
+ goto out;
/* Loop for the donor extents */
while (1) {
/* The extent for donor must be found. */
- BUG_ON(!dext || donor_off != le32_to_cpu(tmp_dext.ee_block));
+ if (!dext) {
+ ext4_error(donor_inode->i_sb, __func__,
+ "The extent for donor must be found");
+ *err = -EIO;
+ goto out;
+ } else if (donor_off != le32_to_cpu(tmp_dext.ee_block)) {
+ ext4_error(donor_inode->i_sb, __func__,
+ "Donor offset(%u) and the first block of donor "
+ "extent(%u) should be equal",
+ donor_off,
+ le32_to_cpu(tmp_dext.ee_block));
+ *err = -EIO;
+ goto out;
+ }
/* Set donor extent to orig extent */
- err = mext_leaf_block(handle, orig_inode,
+ *err = mext_leaf_block(handle, orig_inode,
orig_path, &tmp_dext, &orig_off);
- if (err < 0)
+ if (*err)
goto out;
/* Set orig extent to donor extent */
- err = mext_leaf_block(handle, donor_inode,
+ *err = mext_leaf_block(handle, donor_inode,
donor_path, &tmp_oext, &donor_off);
- if (err < 0)
+ if (*err)
goto out;
dext_alen = ext4_ext_get_actual_len(&tmp_dext);
@@ -678,36 +726,26 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode,
if (orig_path)
ext4_ext_drop_refs(orig_path);
- get_ext_path(orig_path, orig_inode, orig_off, err);
- if (orig_path == NULL)
+ *err = get_ext_path(orig_inode, orig_off, &orig_path);
+ if (*err)
goto out;
depth = ext_depth(orig_inode);
oext = orig_path[depth].p_ext;
- if (le32_to_cpu(oext->ee_block) +
- ext4_ext_get_actual_len(oext) <= orig_off) {
- err = 0;
- goto out;
- }
tmp_oext = *oext;
if (donor_path)
ext4_ext_drop_refs(donor_path);
- get_ext_path(donor_path, donor_inode,
- donor_off, err);
- if (donor_path == NULL)
+ *err = get_ext_path(donor_inode, donor_off, &donor_path);
+ if (*err)
goto out;
depth = ext_depth(donor_inode);
dext = donor_path[depth].p_ext;
- if (le32_to_cpu(dext->ee_block) +
- ext4_ext_get_actual_len(dext) <= donor_off) {
- err = 0;
- goto out;
- }
tmp_dext = *dext;
- mext_calc_swap_extents(&tmp_dext, &tmp_oext, orig_off,
- donor_off,
- count - replaced_count);
+ *err = mext_calc_swap_extents(&tmp_dext, &tmp_oext, orig_off,
+ donor_off, count - replaced_count);
+ if (*err)
+ goto out;
}
out:
@@ -720,8 +758,12 @@ out:
kfree(donor_path);
}
- mext_double_up_write(orig_inode, donor_inode);
- return err;
+ ext4_ext_invalidate_cache(orig_inode);
+ ext4_ext_invalidate_cache(donor_inode);
+
+ double_up_write_data_sem(orig_inode, donor_inode);
+
+ return replaced_count;
}
/**
@@ -733,16 +775,17 @@ out:
* @data_offset_in_page: block index where data swapping starts
* @block_len_in_page: the number of blocks to be swapped
* @uninit: orig extent is uninitialized or not
+ * @err: pointer to save return value
*
* Save the data in original inode blocks and replace original inode extents
* with donor inode extents by calling mext_replace_branches().
- * Finally, write out the saved data in new original inode blocks. Return 0
- * on success, or a negative error value on failure.
+ * Finally, write out the saved data in new original inode blocks. Return
+ * replaced block count.
*/
static int
-move_extent_par_page(struct file *o_filp, struct inode *donor_inode,
+move_extent_per_page(struct file *o_filp, struct inode *donor_inode,
pgoff_t orig_page_offset, int data_offset_in_page,
- int block_len_in_page, int uninit)
+ int block_len_in_page, int uninit, int *err)
{
struct inode *orig_inode = o_filp->f_dentry->d_inode;
struct address_space *mapping = orig_inode->i_mapping;
@@ -754,9 +797,11 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode,
long long offs = orig_page_offset << PAGE_CACHE_SHIFT;
unsigned long blocksize = orig_inode->i_sb->s_blocksize;
unsigned int w_flags = 0;
- unsigned int tmp_data_len, data_len;
+ unsigned int tmp_data_size, data_size, replaced_size;
void *fsdata;
- int ret, i, jblocks;
+ int i, jblocks;
+ int err2 = 0;
+ int replaced_count = 0;
int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits;
/*
@@ -766,8 +811,8 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode,
jblocks = ext4_writepage_trans_blocks(orig_inode) * 2;
handle = ext4_journal_start(orig_inode, jblocks);
if (IS_ERR(handle)) {
- ret = PTR_ERR(handle);
- return ret;
+ *err = PTR_ERR(handle);
+ return 0;
}
if (segment_eq(get_fs(), KERNEL_DS))
@@ -783,39 +828,36 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode,
* Just swap data blocks between orig and donor.
*/
if (uninit) {
- ret = mext_replace_branches(handle, orig_inode,
- donor_inode, orig_blk_offset,
- block_len_in_page);
-
- /* Clear the inode cache not to refer to the old data */
- ext4_ext_invalidate_cache(orig_inode);
- ext4_ext_invalidate_cache(donor_inode);
+ replaced_count = mext_replace_branches(handle, orig_inode,
+ donor_inode, orig_blk_offset,
+ block_len_in_page, err);
goto out2;
}
offs = (long long)orig_blk_offset << orig_inode->i_blkbits;
- /* Calculate data_len */
+ /* Calculate data_size */
if ((orig_blk_offset + block_len_in_page - 1) ==
((orig_inode->i_size - 1) >> orig_inode->i_blkbits)) {
/* Replace the last block */
- tmp_data_len = orig_inode->i_size & (blocksize - 1);
+ tmp_data_size = orig_inode->i_size & (blocksize - 1);
/*
- * If data_len equal zero, it shows data_len is multiples of
+ * If data_size equal zero, it shows data_size is multiples of
* blocksize. So we set appropriate value.
*/
- if (tmp_data_len == 0)
- tmp_data_len = blocksize;
+ if (tmp_data_size == 0)
+ tmp_data_size = blocksize;
- data_len = tmp_data_len +
+ data_size = tmp_data_size +
((block_len_in_page - 1) << orig_inode->i_blkbits);
- } else {
- data_len = block_len_in_page << orig_inode->i_blkbits;
- }
+ } else
+ data_size = block_len_in_page << orig_inode->i_blkbits;
+
+ replaced_size = data_size;
- ret = a_ops->write_begin(o_filp, mapping, offs, data_len, w_flags,
+ *err = a_ops->write_begin(o_filp, mapping, offs, data_size, w_flags,
&page, &fsdata);
- if (unlikely(ret < 0))
+ if (unlikely(*err < 0))
goto out;
if (!PageUptodate(page)) {
@@ -836,14 +878,17 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode,
/* Release old bh and drop refs */
try_to_release_page(page, 0);
- ret = mext_replace_branches(handle, orig_inode, donor_inode,
- orig_blk_offset, block_len_in_page);
- if (ret < 0)
- goto out;
-
- /* Clear the inode cache not to refer to the old data */
- ext4_ext_invalidate_cache(orig_inode);
- ext4_ext_invalidate_cache(donor_inode);
+ replaced_count = mext_replace_branches(handle, orig_inode, donor_inode,
+ orig_blk_offset, block_len_in_page,
+ &err2);
+ if (err2) {
+ if (replaced_count) {
+ block_len_in_page = replaced_count;
+ replaced_size =
+ block_len_in_page << orig_inode->i_blkbits;
+ } else
+ goto out;
+ }
if (!page_has_buffers(page))
create_empty_buffers(page, 1 << orig_inode->i_blkbits, 0);
@@ -853,16 +898,16 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode,
bh = bh->b_this_page;
for (i = 0; i < block_len_in_page; i++) {
- ret = ext4_get_block(orig_inode,
+ *err = ext4_get_block(orig_inode,
(sector_t)(orig_blk_offset + i), bh, 0);
- if (ret < 0)
+ if (*err < 0)
goto out;
if (bh->b_this_page != NULL)
bh = bh->b_this_page;
}
- ret = a_ops->write_end(o_filp, mapping, offs, data_len, data_len,
+ *err = a_ops->write_end(o_filp, mapping, offs, data_size, replaced_size,
page, fsdata);
page = NULL;
@@ -871,11 +916,15 @@ out:
if (PageLocked(page))
unlock_page(page);
page_cache_release(page);
+ ext4_journal_stop(handle);
}
out2:
ext4_journal_stop(handle);
- return ret < 0 ? ret : 0;
+ if (err2)
+ *err = err2;
+
+ return replaced_count;
}
/**
@@ -886,7 +935,6 @@ out2:
* @orig_start: logical start offset in block for orig
* @donor_start: logical start offset in block for donor
* @len: the number of blocks to be moved
- * @moved_len: moved block length
*
* Check the arguments of ext4_move_extents() whether the files can be
* exchanged with each other.
@@ -894,9 +942,13 @@ out2:
*/
static int
mext_check_arguments(struct inode *orig_inode,
- struct inode *donor_inode, __u64 orig_start,
- __u64 donor_start, __u64 *len, __u64 moved_len)
+ struct inode *donor_inode, __u64 orig_start,
+ __u64 donor_start, __u64 *len)
{
+ ext4_lblk_t orig_blocks, donor_blocks;
+ unsigned int blkbits = orig_inode->i_blkbits;
+ unsigned int blocksize = 1 << blkbits;
+
/* Regular file check */
if (!S_ISREG(orig_inode->i_mode) || !S_ISREG(donor_inode->i_mode)) {
ext4_debug("ext4 move extent: The argument files should be "
@@ -905,6 +957,13 @@ mext_check_arguments(struct inode *orig_inode,
return -EINVAL;
}
+ if (donor_inode->i_mode & (S_ISUID|S_ISGID)) {
+ ext4_debug("ext4 move extent: suid or sgid is set"
+ " to donor file [ino:orig %lu, donor %lu]\n",
+ orig_inode->i_ino, donor_inode->i_ino);
+ return -EINVAL;
+ }
+
/* Ext4 move extent does not support swapfile */
if (IS_SWAPFILE(orig_inode) || IS_SWAPFILE(donor_inode)) {
ext4_debug("ext4 move extent: The argument files should "
@@ -921,14 +980,6 @@ mext_check_arguments(struct inode *orig_inode,
return -EINVAL;
}
- /* orig and donor should be different file */
- if (orig_inode->i_ino == donor_inode->i_ino) {
- ext4_debug("ext4 move extent: The argument files should not "
- "be same file [ino:orig %lu, donor %lu]\n",
- orig_inode->i_ino, donor_inode->i_ino);
- return -EINVAL;
- }
-
/* Ext4 move extent supports only extent based file */
if (!(EXT4_I(orig_inode)->i_flags & EXT4_EXTENTS_FL)) {
ext4_debug("ext4 move extent: orig file is not extents "
@@ -953,13 +1004,6 @@ mext_check_arguments(struct inode *orig_inode,
return -EINVAL;
}
- if (moved_len) {
- ext4_debug("ext4 move extent: moved_len should be 0 "
- "[ino:orig %lu, donor %lu]\n", orig_inode->i_ino,
- donor_inode->i_ino);
- return -EINVAL;
- }
-
if ((orig_start > MAX_DEFRAG_SIZE) ||
(donor_start > MAX_DEFRAG_SIZE) ||
(*len > MAX_DEFRAG_SIZE) ||
@@ -971,43 +1015,47 @@ mext_check_arguments(struct inode *orig_inode,
}
if (orig_inode->i_size > donor_inode->i_size) {
- if (orig_start >= donor_inode->i_size) {
+ donor_blocks = (donor_inode->i_size + blocksize - 1) >> blkbits;
+ /* TODO: eliminate this artificial restriction */
+ if (orig_start >= donor_blocks) {
ext4_debug("ext4 move extent: orig start offset "
- "[%llu] should be less than donor file size "
- "[%lld] [ino:orig %lu, donor_inode %lu]\n",
- orig_start, donor_inode->i_size,
+ "[%llu] should be less than donor file blocks "
+ "[%u] [ino:orig %lu, donor %lu]\n",
+ orig_start, donor_blocks,
orig_inode->i_ino, donor_inode->i_ino);
return -EINVAL;
}
- if (orig_start + *len > donor_inode->i_size) {
+ /* TODO: eliminate this artificial restriction */
+ if (orig_start + *len > donor_blocks) {
ext4_debug("ext4 move extent: End offset [%llu] should "
- "be less than donor file size [%lld]."
- "So adjust length from %llu to %lld "
+ "be less than donor file blocks [%u]."
+ "So adjust length from %llu to %llu "
"[ino:orig %lu, donor %lu]\n",
- orig_start + *len, donor_inode->i_size,
- *len, donor_inode->i_size - orig_start,
+ orig_start + *len, donor_blocks,
+ *len, donor_blocks - orig_start,
orig_inode->i_ino, donor_inode->i_ino);
- *len = donor_inode->i_size - orig_start;
+ *len = donor_blocks - orig_start;
}
} else {
- if (orig_start >= orig_inode->i_size) {
+ orig_blocks = (orig_inode->i_size + blocksize - 1) >> blkbits;
+ if (orig_start >= orig_blocks) {
ext4_debug("ext4 move extent: start offset [%llu] "
- "should be less than original file size "
- "[%lld] [inode:orig %lu, donor %lu]\n",
- orig_start, orig_inode->i_size,
+ "should be less than original file blocks "
+ "[%u] [ino:orig %lu, donor %lu]\n",
+ orig_start, orig_blocks,
orig_inode->i_ino, donor_inode->i_ino);
return -EINVAL;
}
- if (orig_start + *len > orig_inode->i_size) {
+ if (orig_start + *len > orig_blocks) {
ext4_debug("ext4 move extent: Adjust length "
- "from %llu to %lld. Because it should be "
- "less than original file size "
+ "from %llu to %llu. Because it should be "
+ "less than original file blocks "
"[ino:orig %lu, donor %lu]\n",
- *len, orig_inode->i_size - orig_start,
+ *len, orig_blocks - orig_start,
orig_inode->i_ino, donor_inode->i_ino);
- *len = orig_inode->i_size - orig_start;
+ *len = orig_blocks - orig_start;
}
}
@@ -1027,18 +1075,23 @@ mext_check_arguments(struct inode *orig_inode,
* @inode1: the inode structure
* @inode2: the inode structure
*
- * Lock two inodes' i_mutex by i_ino order. This function is moved from
- * fs/inode.c.
+ * Lock two inodes' i_mutex by i_ino order.
+ * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0.
*/
-static void
+static int
mext_inode_double_lock(struct inode *inode1, struct inode *inode2)
{
- if (inode1 == NULL || inode2 == NULL || inode1 == inode2) {
- if (inode1)
- mutex_lock(&inode1->i_mutex);
- else if (inode2)
- mutex_lock(&inode2->i_mutex);
- return;
+ int ret = 0;
+
+ BUG_ON(inode1 == NULL && inode2 == NULL);
+
+ ret = mext_check_null_inode(inode1, inode2, __func__);
+ if (ret < 0)
+ goto out;
+
+ if (inode1 == inode2) {
+ mutex_lock(&inode1->i_mutex);
+ goto out;
}
if (inode1->i_ino < inode2->i_ino) {
@@ -1048,6 +1101,9 @@ mext_inode_double_lock(struct inode *inode1, struct inode *inode2)
mutex_lock_nested(&inode2->i_mutex, I_MUTEX_PARENT);
mutex_lock_nested(&inode1->i_mutex, I_MUTEX_CHILD);
}
+
+out:
+ return ret;
}
/**
@@ -1056,17 +1112,28 @@ mext_inode_double_lock(struct inode *inode1, struct inode *inode2)
* @inode1: the inode that is released first
* @inode2: the inode that is released second
*
- * This function is moved from fs/inode.c.
+ * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0.
*/
-static void
+static int
mext_inode_double_unlock(struct inode *inode1, struct inode *inode2)
{
+ int ret = 0;
+
+ BUG_ON(inode1 == NULL && inode2 == NULL);
+
+ ret = mext_check_null_inode(inode1, inode2, __func__);
+ if (ret < 0)
+ goto out;
+
if (inode1)
mutex_unlock(&inode1->i_mutex);
if (inode2 && inode2 != inode1)
mutex_unlock(&inode2->i_mutex);
+
+out:
+ return ret;
}
/**
@@ -1123,70 +1190,84 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
ext4_lblk_t block_end, seq_start, add_blocks, file_end, seq_blocks = 0;
ext4_lblk_t rest_blocks;
pgoff_t orig_page_offset = 0, seq_end_page;
- int ret, depth, last_extent = 0;
+ int ret1, ret2, depth, last_extent = 0;
int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits;
int data_offset_in_page;
int block_len_in_page;
int uninit;
- /* protect orig and donor against a truncate */
- mext_inode_double_lock(orig_inode, donor_inode);
+ /* orig and donor should be different file */
+ if (orig_inode->i_ino == donor_inode->i_ino) {
+ ext4_debug("ext4 move extent: The argument files should not "
+ "be same file [ino:orig %lu, donor %lu]\n",
+ orig_inode->i_ino, donor_inode->i_ino);
+ return -EINVAL;
+ }
+
+ /* Protect orig and donor inodes against a truncate */
+ ret1 = mext_inode_double_lock(orig_inode, donor_inode);
+ if (ret1 < 0)
+ return ret1;
- mext_double_down_read(orig_inode, donor_inode);
+ /* Protect extent tree against block allocations via delalloc */
+ double_down_write_data_sem(orig_inode, donor_inode);
/* Check the filesystem environment whether move_extent can be done */
- ret = mext_check_arguments(orig_inode, donor_inode, orig_start,
- donor_start, &len, *moved_len);
- mext_double_up_read(orig_inode, donor_inode);
- if (ret)
- goto out2;
+ ret1 = mext_check_arguments(orig_inode, donor_inode, orig_start,
+ donor_start, &len);
+ if (ret1)
+ goto out;
file_end = (i_size_read(orig_inode) - 1) >> orig_inode->i_blkbits;
block_end = block_start + len - 1;
if (file_end < block_end)
len -= block_end - file_end;
- get_ext_path(orig_path, orig_inode, block_start, ret);
- if (orig_path == NULL)
- goto out2;
+ ret1 = get_ext_path(orig_inode, block_start, &orig_path);
+ if (ret1)
+ goto out;
/* Get path structure to check the hole */
- get_ext_path(holecheck_path, orig_inode, block_start, ret);
- if (holecheck_path == NULL)
+ ret1 = get_ext_path(orig_inode, block_start, &holecheck_path);
+ if (ret1)
goto out;
depth = ext_depth(orig_inode);
ext_cur = holecheck_path[depth].p_ext;
- if (ext_cur == NULL) {
- ret = -EINVAL;
- goto out;
- }
/*
- * Get proper extent whose ee_block is beyond block_start
- * if block_start was within the hole.
+ * Get proper starting location of block replacement if block_start was
+ * within the hole.
*/
if (le32_to_cpu(ext_cur->ee_block) +
ext4_ext_get_actual_len(ext_cur) - 1 < block_start) {
+ /*
+ * The hole exists between extents or the tail of
+ * original file.
+ */
last_extent = mext_next_extent(orig_inode,
holecheck_path, &ext_cur);
if (last_extent < 0) {
- ret = last_extent;
+ ret1 = last_extent;
goto out;
}
last_extent = mext_next_extent(orig_inode, orig_path,
&ext_dummy);
if (last_extent < 0) {
- ret = last_extent;
+ ret1 = last_extent;
goto out;
}
- }
- seq_start = block_start;
+ seq_start = le32_to_cpu(ext_cur->ee_block);
+ } else if (le32_to_cpu(ext_cur->ee_block) > block_start)
+ /* The hole exists at the beginning of original file. */
+ seq_start = le32_to_cpu(ext_cur->ee_block);
+ else
+ seq_start = block_start;
/* No blocks within the specified range. */
if (le32_to_cpu(ext_cur->ee_block) > block_end) {
ext4_debug("ext4 move extent: The specified range of file "
"may be the hole\n");
- ret = -EINVAL;
+ ret1 = -EINVAL;
goto out;
}
@@ -1206,7 +1287,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
last_extent = mext_next_extent(orig_inode, holecheck_path,
&ext_cur);
if (last_extent < 0) {
- ret = last_extent;
+ ret1 = last_extent;
break;
}
add_blocks = ext4_ext_get_actual_len(ext_cur);
@@ -1246,29 +1327,39 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
seq_start = le32_to_cpu(ext_cur->ee_block);
rest_blocks = seq_blocks;
- /* Discard preallocations of two inodes */
- down_write(&EXT4_I(orig_inode)->i_data_sem);
- ext4_discard_preallocations(orig_inode);
- up_write(&EXT4_I(orig_inode)->i_data_sem);
-
- down_write(&EXT4_I(donor_inode)->i_data_sem);
- ext4_discard_preallocations(donor_inode);
- up_write(&EXT4_I(donor_inode)->i_data_sem);
+ /*
+ * Up semaphore to avoid following problems:
+ * a. transaction deadlock among ext4_journal_start,
+ * ->write_begin via pagefault, and jbd2_journal_commit
+ * b. racing with ->readpage, ->write_begin, and ext4_get_block
+ * in move_extent_per_page
+ */
+ double_up_write_data_sem(orig_inode, donor_inode);
while (orig_page_offset <= seq_end_page) {
/* Swap original branches with new branches */
- ret = move_extent_par_page(o_filp, donor_inode,
+ block_len_in_page = move_extent_per_page(
+ o_filp, donor_inode,
orig_page_offset,
data_offset_in_page,
- block_len_in_page, uninit);
- if (ret < 0)
- goto out;
- orig_page_offset++;
+ block_len_in_page, uninit,
+ &ret1);
+
/* Count how many blocks we have exchanged */
*moved_len += block_len_in_page;
- BUG_ON(*moved_len > len);
+ if (ret1 < 0)
+ break;
+ if (*moved_len > len) {
+ ext4_error(orig_inode->i_sb, __func__,
+ "We replaced blocks too much! "
+ "sum of replaced: %llu requested: %llu",
+ *moved_len, len);
+ ret1 = -EIO;
+ break;
+ }
+ orig_page_offset++;
data_offset_in_page = 0;
rest_blocks -= block_len_in_page;
if (rest_blocks > blocks_per_page)
@@ -1277,20 +1368,23 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
block_len_in_page = rest_blocks;
}
+ double_down_write_data_sem(orig_inode, donor_inode);
+ if (ret1 < 0)
+ break;
+
/* Decrease buffer counter */
if (holecheck_path)
ext4_ext_drop_refs(holecheck_path);
- get_ext_path(holecheck_path, orig_inode,
- seq_start, ret);
- if (holecheck_path == NULL)
+ ret1 = get_ext_path(orig_inode, seq_start, &holecheck_path);
+ if (ret1)
break;
depth = holecheck_path->p_depth;
/* Decrease buffer counter */
if (orig_path)
ext4_ext_drop_refs(orig_path);
- get_ext_path(orig_path, orig_inode, seq_start, ret);
- if (orig_path == NULL)
+ ret1 = get_ext_path(orig_inode, seq_start, &orig_path);
+ if (ret1)
break;
ext_cur = holecheck_path[depth].p_ext;
@@ -1299,6 +1393,11 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
}
out:
+ if (*moved_len) {
+ ext4_discard_preallocations(orig_inode);
+ ext4_discard_preallocations(donor_inode);
+ }
+
if (orig_path) {
ext4_ext_drop_refs(orig_path);
kfree(orig_path);
@@ -1307,14 +1406,13 @@ out:
ext4_ext_drop_refs(holecheck_path);
kfree(holecheck_path);
}
-out2:
- mext_inode_double_unlock(orig_inode, donor_inode);
-
- if (ret)
- return ret;
+ double_up_write_data_sem(orig_inode, donor_inode);
+ ret2 = mext_inode_double_unlock(orig_inode, donor_inode);
- /* All of the specified blocks must be exchanged in succeed */
- BUG_ON(*moved_len != len);
+ if (ret1)
+ return ret1;
+ else if (ret2)
+ return ret2;
return 0;
}
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index de04013d16ff..9dcd6863c1a3 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1292,9 +1292,6 @@ errout:
* add_dirent_to_buf will attempt search the directory block for
* space. It will return -ENOSPC if no space is available, and -EIO
* and -EEXIST if directory entry already exists.
- *
- * NOTE! bh is NOT released in the case where ENOSPC is returned. In
- * all other cases bh is released.
*/
static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
struct inode *inode, struct ext4_dir_entry_2 *de,
@@ -1315,14 +1312,10 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
top = bh->b_data + blocksize - reclen;
while ((char *) de <= top) {
if (!ext4_check_dir_entry("ext4_add_entry", dir, de,
- bh, offset)) {
- brelse(bh);
+ bh, offset))
return -EIO;
- }
- if (ext4_match(namelen, name, de)) {
- brelse(bh);
+ if (ext4_match(namelen, name, de))
return -EEXIST;
- }
nlen = EXT4_DIR_REC_LEN(de->name_len);
rlen = ext4_rec_len_from_disk(de->rec_len, blocksize);
if ((de->inode? rlen - nlen: rlen) >= reclen)
@@ -1337,7 +1330,6 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
err = ext4_journal_get_write_access(handle, bh);
if (err) {
ext4_std_error(dir->i_sb, err);
- brelse(bh);
return err;
}
@@ -1377,7 +1369,6 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
err = ext4_handle_dirty_metadata(handle, dir, bh);
if (err)
ext4_std_error(dir->i_sb, err);
- brelse(bh);
return 0;
}
@@ -1471,7 +1462,9 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
if (!(de))
return retval;
- return add_dirent_to_buf(handle, dentry, inode, de, bh);
+ retval = add_dirent_to_buf(handle, dentry, inode, de, bh);
+ brelse(bh);
+ return retval;
}
/*
@@ -1514,8 +1507,10 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
if(!bh)
return retval;
retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh);
- if (retval != -ENOSPC)
+ if (retval != -ENOSPC) {
+ brelse(bh);
return retval;
+ }
if (blocks == 1 && !dx_fallback &&
EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX))
@@ -1528,7 +1523,9 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
de = (struct ext4_dir_entry_2 *) bh->b_data;
de->inode = 0;
de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize);
- return add_dirent_to_buf(handle, dentry, inode, de, bh);
+ retval = add_dirent_to_buf(handle, dentry, inode, de, bh);
+ brelse(bh);
+ return retval;
}
/*
@@ -1561,10 +1558,8 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry,
goto journal_error;
err = add_dirent_to_buf(handle, dentry, inode, NULL, bh);
- if (err != -ENOSPC) {
- bh = NULL;
+ if (err != -ENOSPC)
goto cleanup;
- }
/* Block full, should compress but for now just split */
dxtrace(printk(KERN_DEBUG "using %u of %u node entries\n",
@@ -1590,9 +1585,9 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry,
goto cleanup;
node2 = (struct dx_node *)(bh2->b_data);
entries2 = node2->entries;
+ memset(&node2->fake, 0, sizeof(struct fake_dirent));
node2->fake.rec_len = ext4_rec_len_to_disk(sb->s_blocksize,
sb->s_blocksize);
- node2->fake.inode = 0;
BUFFER_TRACE(frame->bh, "get_write_access");
err = ext4_journal_get_write_access(handle, frame->bh);
if (err)
@@ -1657,7 +1652,6 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry,
if (!de)
goto cleanup;
err = add_dirent_to_buf(handle, dentry, inode, de, bh);
- bh = NULL;
goto cleanup;
journal_error:
@@ -1775,7 +1769,7 @@ static int ext4_create(struct inode *dir, struct dentry *dentry, int mode,
retry:
handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 +
- 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb));
+ EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb));
if (IS_ERR(handle))
return PTR_ERR(handle);
@@ -1809,7 +1803,7 @@ static int ext4_mknod(struct inode *dir, struct dentry *dentry,
retry:
handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 +
- 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb));
+ EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb));
if (IS_ERR(handle))
return PTR_ERR(handle);
@@ -1846,7 +1840,7 @@ static int ext4_mkdir(struct inode *dir, struct dentry *dentry, int mode)
retry:
handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 +
- 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb));
+ EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb));
if (IS_ERR(handle))
return PTR_ERR(handle);
@@ -2068,7 +2062,8 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode)
struct ext4_iloc iloc;
int err = 0;
- if (!ext4_handle_valid(handle))
+ /* ext4_handle_valid() assumes a valid handle_t pointer */
+ if (handle && !ext4_handle_valid(handle))
return 0;
mutex_lock(&EXT4_SB(inode->i_sb)->s_orphan_lock);
@@ -2258,7 +2253,7 @@ static int ext4_symlink(struct inode *dir,
retry:
handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
EXT4_INDEX_EXTRA_TRANS_BLOCKS + 5 +
- 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb));
+ EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb));
if (IS_ERR(handle))
return PTR_ERR(handle);
@@ -2310,7 +2305,7 @@ static int ext4_link(struct dentry *old_dentry,
struct inode *inode = old_dentry->d_inode;
int err, retries = 0;
- if (EXT4_DIR_LINK_MAX(inode))
+ if (inode->i_nlink >= EXT4_LINK_MAX)
return -EMLINK;
/*
@@ -2413,7 +2408,7 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
goto end_rename;
retval = -EMLINK;
if (!new_inode && new_dir != old_dir &&
- new_dir->i_nlink >= EXT4_LINK_MAX)
+ EXT4_DIR_LINK_MAX(new_dir))
goto end_rename;
}
if (!new_bh) {
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
index 68b0351fc647..96302cdb8dc3 100644
--- a/fs/ext4/resize.c
+++ b/fs/ext4/resize.c
@@ -247,7 +247,7 @@ static int setup_new_group_blocks(struct super_block *sb,
goto exit_bh;
if (IS_ERR(gdb = bclean(handle, sb, block))) {
- err = PTR_ERR(bh);
+ err = PTR_ERR(gdb);
goto exit_bh;
}
ext4_handle_dirty_metadata(handle, NULL, gdb);
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 8f4f079e6b9a..3278acf50423 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -45,6 +45,7 @@
#include "ext4_jbd2.h"
#include "xattr.h"
#include "acl.h"
+#include "mballoc.h"
#define CREATE_TRACE_POINTS
#include <trace/events/ext4.h>
@@ -188,6 +189,36 @@ void ext4_itable_unused_set(struct super_block *sb,
bg->bg_itable_unused_hi = cpu_to_le16(count >> 16);
}
+
+/* Just increment the non-pointer handle value */
+static handle_t *ext4_get_nojournal(void)
+{
+ handle_t *handle = current->journal_info;
+ unsigned long ref_cnt = (unsigned long)handle;
+
+ BUG_ON(ref_cnt >= EXT4_NOJOURNAL_MAX_REF_COUNT);
+
+ ref_cnt++;
+ handle = (handle_t *)ref_cnt;
+
+ current->journal_info = handle;
+ return handle;
+}
+
+
+/* Decrement the non-pointer handle value */
+static void ext4_put_nojournal(handle_t *handle)
+{
+ unsigned long ref_cnt = (unsigned long)handle;
+
+ BUG_ON(ref_cnt == 0);
+
+ ref_cnt--;
+ handle = (handle_t *)ref_cnt;
+
+ current->journal_info = handle;
+}
+
/*
* Wrappers for jbd2_journal_start/end.
*
@@ -214,11 +245,7 @@ handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks)
}
return jbd2_journal_start(journal, nblocks);
}
- /*
- * We're not journaling, return the appropriate indication.
- */
- current->journal_info = EXT4_NOJOURNAL_HANDLE;
- return current->journal_info;
+ return ext4_get_nojournal();
}
/*
@@ -234,11 +261,7 @@ int __ext4_journal_stop(const char *where, handle_t *handle)
int rc;
if (!ext4_handle_valid(handle)) {
- /*
- * Do this here since we don't call jbd2_journal_stop() in
- * no-journal mode.
- */
- current->journal_info = NULL;
+ ext4_put_nojournal(handle);
return 0;
}
sb = handle->h_transaction->t_journal->j_private;
@@ -344,7 +367,8 @@ static const char *ext4_decode_error(struct super_block *sb, int errno,
errstr = "Out of memory";
break;
case -EROFS:
- if (!sb || EXT4_SB(sb)->s_journal->j_flags & JBD2_ABORT)
+ if (!sb || (EXT4_SB(sb)->s_journal &&
+ EXT4_SB(sb)->s_journal->j_flags & JBD2_ABORT))
errstr = "Journal has aborted";
else
errstr = "Readonly filesystem";
@@ -578,15 +602,14 @@ static void ext4_put_super(struct super_block *sb)
struct ext4_super_block *es = sbi->s_es;
int i, err;
+ flush_workqueue(sbi->dio_unwritten_wq);
+ destroy_workqueue(sbi->dio_unwritten_wq);
+
lock_super(sb);
lock_kernel();
if (sb->s_dirt)
ext4_commit_super(sb, 1);
- ext4_release_system_zone(sb);
- ext4_mb_release(sb);
- ext4_ext_release(sb);
- ext4_xattr_put_super(sb);
if (sbi->s_journal) {
err = jbd2_journal_destroy(sbi->s_journal);
sbi->s_journal = NULL;
@@ -594,6 +617,12 @@ static void ext4_put_super(struct super_block *sb)
ext4_abort(sb, __func__,
"Couldn't clean up the journal");
}
+
+ ext4_release_system_zone(sb);
+ ext4_mb_release(sb);
+ ext4_ext_release(sb);
+ ext4_xattr_put_super(sb);
+
if (!(sb->s_flags & MS_RDONLY)) {
EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
es->s_state = cpu_to_le16(sbi->s_mount_state);
@@ -682,6 +711,13 @@ static struct inode *ext4_alloc_inode(struct super_block *sb)
ei->i_allocated_meta_blocks = 0;
ei->i_delalloc_reserved_flag = 0;
spin_lock_init(&(ei->i_block_reservation_lock));
+#ifdef CONFIG_QUOTA
+ ei->i_reserved_quota = 0;
+#endif
+ INIT_LIST_HEAD(&ei->i_aio_dio_complete_list);
+ ei->cur_aio_dio = NULL;
+ ei->i_sync_tid = 0;
+ ei->i_datasync_tid = 0;
return &ei->vfs_inode;
}
@@ -877,6 +913,12 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs)
if (test_opt(sb, NO_AUTO_DA_ALLOC))
seq_puts(seq, ",noauto_da_alloc");
+ if (test_opt(sb, DISCARD))
+ seq_puts(seq, ",discard");
+
+ if (test_opt(sb, NOLOAD))
+ seq_puts(seq, ",norecovery");
+
ext4_show_quota_options(seq, sb);
return 0;
@@ -969,7 +1011,9 @@ static struct dquot_operations ext4_quota_operations = {
.reserve_space = dquot_reserve_space,
.claim_space = dquot_claim_space,
.release_rsv = dquot_release_reserved_space,
+#ifdef CONFIG_QUOTA
.get_reserved_space = ext4_get_reserved_space,
+#endif
.alloc_inode = dquot_alloc_inode,
.free_space = dquot_free_space,
.free_inode = dquot_free_inode,
@@ -1057,7 +1101,8 @@ enum {
Opt_usrquota, Opt_grpquota, Opt_i_version,
Opt_stripe, Opt_delalloc, Opt_nodelalloc,
Opt_block_validity, Opt_noblock_validity,
- Opt_inode_readahead_blks, Opt_journal_ioprio
+ Opt_inode_readahead_blks, Opt_journal_ioprio,
+ Opt_discard, Opt_nodiscard,
};
static const match_table_t tokens = {
@@ -1082,6 +1127,7 @@ static const match_table_t tokens = {
{Opt_acl, "acl"},
{Opt_noacl, "noacl"},
{Opt_noload, "noload"},
+ {Opt_noload, "norecovery"},
{Opt_nobh, "nobh"},
{Opt_bh, "bh"},
{Opt_commit, "commit=%u"},
@@ -1123,6 +1169,8 @@ static const match_table_t tokens = {
{Opt_auto_da_alloc, "auto_da_alloc=%u"},
{Opt_auto_da_alloc, "auto_da_alloc"},
{Opt_noauto_da_alloc, "noauto_da_alloc"},
+ {Opt_discard, "discard"},
+ {Opt_nodiscard, "nodiscard"},
{Opt_err, NULL},
};
@@ -1551,6 +1599,12 @@ set_qf_format:
else
set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC);
break;
+ case Opt_discard:
+ set_opt(sbi->s_mount_opt, DISCARD);
+ break;
+ case Opt_nodiscard:
+ clear_opt(sbi->s_mount_opt, DISCARD);
+ break;
default:
ext4_msg(sb, KERN_ERR,
"Unrecognized mount option \"%s\" "
@@ -1666,14 +1720,14 @@ static int ext4_fill_flex_info(struct super_block *sb)
size_t size;
int i;
- if (!sbi->s_es->s_log_groups_per_flex) {
+ sbi->s_log_groups_per_flex = sbi->s_es->s_log_groups_per_flex;
+ groups_per_flex = 1 << sbi->s_log_groups_per_flex;
+
+ if (groups_per_flex < 2) {
sbi->s_log_groups_per_flex = 0;
return 1;
}
- sbi->s_log_groups_per_flex = sbi->s_es->s_log_groups_per_flex;
- groups_per_flex = 1 << sbi->s_log_groups_per_flex;
-
/* We allocate both existing and potentially added groups */
flex_group_count = ((sbi->s_groups_count + groups_per_flex - 1) +
((le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) + 1) <<
@@ -1695,12 +1749,12 @@ static int ext4_fill_flex_info(struct super_block *sb)
gdp = ext4_get_group_desc(sb, i, NULL);
flex_group = ext4_flex_group(sbi, i);
- atomic_set(&sbi->s_flex_groups[flex_group].free_inodes,
- ext4_free_inodes_count(sb, gdp));
- atomic_set(&sbi->s_flex_groups[flex_group].free_blocks,
- ext4_free_blks_count(sb, gdp));
- atomic_set(&sbi->s_flex_groups[flex_group].used_dirs,
- ext4_used_dirs_count(sb, gdp));
+ atomic_add(ext4_free_inodes_count(sb, gdp),
+ &sbi->s_flex_groups[flex_group].free_inodes);
+ atomic_add(ext4_free_blks_count(sb, gdp),
+ &sbi->s_flex_groups[flex_group].free_blocks);
+ atomic_add(ext4_used_dirs_count(sb, gdp),
+ &sbi->s_flex_groups[flex_group].used_dirs);
}
return 1;
@@ -2197,6 +2251,7 @@ EXT4_RW_ATTR_SBI_UI(mb_min_to_scan, s_mb_min_to_scan);
EXT4_RW_ATTR_SBI_UI(mb_order2_req, s_mb_order2_reqs);
EXT4_RW_ATTR_SBI_UI(mb_stream_req, s_mb_stream_request);
EXT4_RW_ATTR_SBI_UI(mb_group_prealloc, s_mb_group_prealloc);
+EXT4_RW_ATTR_SBI_UI(max_writeback_mb_bump, s_max_writeback_mb_bump);
static struct attribute *ext4_attrs[] = {
ATTR_LIST(delayed_allocation_blocks),
@@ -2210,6 +2265,7 @@ static struct attribute *ext4_attrs[] = {
ATTR_LIST(mb_order2_req),
ATTR_LIST(mb_stream_req),
ATTR_LIST(mb_group_prealloc),
+ ATTR_LIST(max_writeback_mb_bump),
NULL,
};
@@ -2253,6 +2309,49 @@ static struct kobj_type ext4_ktype = {
.release = ext4_sb_release,
};
+/*
+ * Check whether this filesystem can be mounted based on
+ * the features present and the RDONLY/RDWR mount requested.
+ * Returns 1 if this filesystem can be mounted as requested,
+ * 0 if it cannot be.
+ */
+static int ext4_feature_set_ok(struct super_block *sb, int readonly)
+{
+ if (EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT4_FEATURE_INCOMPAT_SUPP)) {
+ ext4_msg(sb, KERN_ERR,
+ "Couldn't mount because of "
+ "unsupported optional features (%x)",
+ (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_incompat) &
+ ~EXT4_FEATURE_INCOMPAT_SUPP));
+ return 0;
+ }
+
+ if (readonly)
+ return 1;
+
+ /* Check that feature set is OK for a read-write mount */
+ if (EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT4_FEATURE_RO_COMPAT_SUPP)) {
+ ext4_msg(sb, KERN_ERR, "couldn't mount RDWR because of "
+ "unsupported optional features (%x)",
+ (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_ro_compat) &
+ ~EXT4_FEATURE_RO_COMPAT_SUPP));
+ return 0;
+ }
+ /*
+ * Large file size enabled file system can only be mounted
+ * read-write on 32-bit systems if kernel is built with CONFIG_LBDAF
+ */
+ if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) {
+ if (sizeof(blkcnt_t) < sizeof(u64)) {
+ ext4_msg(sb, KERN_ERR, "Filesystem with huge files "
+ "cannot be mounted RDWR without "
+ "CONFIG_LBDAF");
+ return 0;
+ }
+ }
+ return 1;
+}
+
static int ext4_fill_super(struct super_block *sb, void *data, int silent)
__releases(kernel_lock)
__acquires(kernel_lock)
@@ -2274,7 +2373,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
unsigned int db_count;
unsigned int i;
int needs_recovery, has_huge_files;
- int features;
__u64 blocks_count;
int err;
unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO;
@@ -2401,39 +2499,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
* previously didn't change the revision level when setting the flags,
* so there is a chance incompat flags are set on a rev 0 filesystem.
*/
- features = EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT4_FEATURE_INCOMPAT_SUPP);
- if (features) {
- ext4_msg(sb, KERN_ERR,
- "Couldn't mount because of "
- "unsupported optional features (%x)",
- (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_incompat) &
- ~EXT4_FEATURE_INCOMPAT_SUPP));
- goto failed_mount;
- }
- features = EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT4_FEATURE_RO_COMPAT_SUPP);
- if (!(sb->s_flags & MS_RDONLY) && features) {
- ext4_msg(sb, KERN_ERR,
- "Couldn't mount RDWR because of "
- "unsupported optional features (%x)",
- (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_ro_compat) &
- ~EXT4_FEATURE_RO_COMPAT_SUPP));
+ if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY)))
goto failed_mount;
- }
- has_huge_files = EXT4_HAS_RO_COMPAT_FEATURE(sb,
- EXT4_FEATURE_RO_COMPAT_HUGE_FILE);
- if (has_huge_files) {
- /*
- * Large file size enabled file system can only be
- * mount if kernel is build with CONFIG_LBDAF
- */
- if (sizeof(root->i_blocks) < sizeof(u64) &&
- !(sb->s_flags & MS_RDONLY)) {
- ext4_msg(sb, KERN_ERR, "Filesystem with huge "
- "files cannot be mounted read-write "
- "without CONFIG_LBDAF");
- goto failed_mount;
- }
- }
+
blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size);
if (blocksize < EXT4_MIN_BLOCK_SIZE ||
@@ -2469,6 +2537,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
}
}
+ has_huge_files = EXT4_HAS_RO_COMPAT_FEATURE(sb,
+ EXT4_FEATURE_RO_COMPAT_HUGE_FILE);
sbi->s_bitmap_maxbytes = ext4_max_bitmap_size(sb->s_blocksize_bits,
has_huge_files);
sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files);
@@ -2549,12 +2619,19 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
goto failed_mount;
}
- if (ext4_blocks_count(es) >
- (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) {
+ /*
+ * Test whether we have more sectors than will fit in sector_t,
+ * and whether the max offset is addressable by the page cache.
+ */
+ if ((ext4_blocks_count(es) >
+ (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) ||
+ (ext4_blocks_count(es) >
+ (pgoff_t)(~0ULL) >> (PAGE_CACHE_SHIFT - sb->s_blocksize_bits))) {
ext4_msg(sb, KERN_ERR, "filesystem"
- " too large to mount safely");
+ " too large to mount safely on this system");
if (sizeof(sector_t) < 8)
ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled");
+ ret = -EFBIG;
goto failed_mount;
}
@@ -2595,6 +2672,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
goto failed_mount;
}
sbi->s_groups_count = blocks_count;
+ sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count,
+ (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb)));
db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) /
EXT4_DESC_PER_BLOCK(sb);
sbi->s_group_desc = kmalloc(db_count * sizeof(struct buffer_head *),
@@ -2656,6 +2735,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
}
sbi->s_stripe = ext4_get_stripe_size(sbi);
+ sbi->s_max_writeback_mb_bump = 128;
/*
* set up enough so that it can read an inode
@@ -2781,6 +2861,12 @@ no_journal:
clear_opt(sbi->s_mount_opt, NOBH);
}
}
+ EXT4_SB(sb)->dio_unwritten_wq = create_workqueue("ext4-dio-unwritten");
+ if (!EXT4_SB(sb)->dio_unwritten_wq) {
+ printk(KERN_ERR "EXT4-fs: failed to create DIO workqueue\n");
+ goto failed_mount_wq;
+ }
+
/*
* The jbd2_journal_load will have done any necessary log recovery,
* so we can safely mount the rest of the filesystem now.
@@ -2893,6 +2979,8 @@ cantfind_ext4:
failed_mount4:
ext4_msg(sb, KERN_ERR, "mount failed");
+ destroy_workqueue(EXT4_SB(sb)->dio_unwritten_wq);
+failed_mount_wq:
ext4_release_system_zone(sb);
if (sbi->s_journal) {
jbd2_journal_destroy(sbi->s_journal);
@@ -3208,7 +3296,18 @@ static int ext4_commit_super(struct super_block *sb, int sync)
clear_buffer_write_io_error(sbh);
set_buffer_uptodate(sbh);
}
- es->s_wtime = cpu_to_le32(get_seconds());
+ /*
+ * If the file system is mounted read-only, don't update the
+ * superblock write time. This avoids updating the superblock
+ * write time when we are mounting the root file system
+ * read/only but we need to replay the journal; at that point,
+ * for people who are east of GMT and who make their clock
+ * tick in localtime for Windows bug-for-bug compatibility,
+ * the clock is set in the future, and this will cause e2fsck
+ * to complain and force a full file system check.
+ */
+ if (!(sb->s_flags & MS_RDONLY))
+ es->s_wtime = cpu_to_le32(get_seconds());
es->s_kbytes_written =
cpu_to_le64(EXT4_SB(sb)->s_kbytes_written +
((part_stat_read(sb->s_bdev->bd_part, sectors[1]) -
@@ -3333,11 +3432,13 @@ static int ext4_sync_fs(struct super_block *sb, int wait)
{
int ret = 0;
tid_t target;
+ struct ext4_sb_info *sbi = EXT4_SB(sb);
trace_ext4_sync_fs(sb, wait);
- if (jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, &target)) {
+ flush_workqueue(sbi->dio_unwritten_wq);
+ if (jbd2_journal_start_commit(sbi->s_journal, &target)) {
if (wait)
- jbd2_log_wait_commit(EXT4_SB(sb)->s_journal, target);
+ jbd2_log_wait_commit(sbi->s_journal, target);
}
return ret;
}
@@ -3477,18 +3578,11 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
if (sbi->s_journal)
ext4_mark_recovery_complete(sb, es);
} else {
- int ret;
- if ((ret = EXT4_HAS_RO_COMPAT_FEATURE(sb,
- ~EXT4_FEATURE_RO_COMPAT_SUPP))) {
- ext4_msg(sb, KERN_WARNING, "couldn't "
- "remount RDWR because of unsupported "
- "optional features (%x)",
- (le32_to_cpu(sbi->s_es->s_feature_ro_compat) &
- ~EXT4_FEATURE_RO_COMPAT_SUPP));
+ /* Make sure we can mount this feature set readwrite */
+ if (!ext4_feature_set_ok(sb, 0)) {
err = -EROFS;
goto restore_opts;
}
-
/*
* Make sure the group descriptor checksums
* are sane. If they aren't, refuse to remount r/w.
@@ -3624,13 +3718,11 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf)
buf->f_blocks = ext4_blocks_count(es) - sbi->s_overhead_last;
buf->f_bfree = percpu_counter_sum_positive(&sbi->s_freeblocks_counter) -
percpu_counter_sum_positive(&sbi->s_dirtyblocks_counter);
- ext4_free_blocks_count_set(es, buf->f_bfree);
buf->f_bavail = buf->f_bfree - ext4_r_blocks_count(es);
if (buf->f_bfree < ext4_r_blocks_count(es))
buf->f_bavail = 0;
buf->f_files = le32_to_cpu(es->s_inodes_count);
buf->f_ffree = percpu_counter_sum_positive(&sbi->s_freeinodes_counter);
- es->s_free_inodes_count = cpu_to_le32(buf->f_ffree);
buf->f_namelen = EXT4_NAME_LEN;
fsid = le64_to_cpup((void *)es->s_uuid) ^
le64_to_cpup((void *)es->s_uuid + sizeof(u64));
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
index 62b31c246994..025701926f9a 100644
--- a/fs/ext4/xattr.c
+++ b/fs/ext4/xattr.c
@@ -810,12 +810,23 @@ inserted:
get_bh(new_bh);
} else {
/* We need to allocate a new block */
- ext4_fsblk_t goal = ext4_group_first_block_no(sb,
+ ext4_fsblk_t goal, block;
+
+ goal = ext4_group_first_block_no(sb,
EXT4_I(inode)->i_block_group);
- ext4_fsblk_t block = ext4_new_meta_blocks(handle, inode,
+
+ /* non-extent files can't have physical blocks past 2^32 */
+ if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL))
+ goal = goal & EXT4_MAX_BLOCK_FILE_PHYS;
+
+ block = ext4_new_meta_blocks(handle, inode,
goal, NULL, &error);
if (error)
goto cleanup;
+
+ if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL))
+ BUG_ON(block > EXT4_MAX_BLOCK_FILE_PHYS);
+
ea_idebug(inode, "creating block %d", block);
new_bh = sb_getblk(sb, block);
@@ -977,6 +988,10 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
if (error)
goto cleanup;
+ error = ext4_journal_get_write_access(handle, is.iloc.bh);
+ if (error)
+ goto cleanup;
+
if (EXT4_I(inode)->i_state & EXT4_STATE_NEW) {
struct ext4_inode *raw_inode = ext4_raw_inode(&is.iloc);
memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
@@ -1002,9 +1017,6 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
if (flags & XATTR_CREATE)
goto cleanup;
}
- error = ext4_journal_get_write_access(handle, is.iloc.bh);
- if (error)
- goto cleanup;
if (!value) {
if (!is.s.not_found)
error = ext4_xattr_ibody_set(handle, inode, &i, &is);
diff --git a/fs/fat/dir.c b/fs/fat/dir.c
index 4ceff5110417..530b4ca01510 100644
--- a/fs/fat/dir.c
+++ b/fs/fat/dir.c
@@ -758,13 +758,6 @@ static int fat_ioctl_readdir(struct inode *inode, struct file *filp,
return ret;
}
-static int fat_ioctl_volume_id(struct inode *dir)
-{
- struct super_block *sb = dir->i_sb;
- struct msdos_sb_info *sbi = MSDOS_SB(sb);
- return sbi->vol_id;
-}
-
static int fat_dir_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
@@ -780,8 +773,6 @@ static int fat_dir_ioctl(struct inode *inode, struct file *filp,
short_only = 0;
both = 1;
break;
- case VFAT_IOCTL_GET_VOLUME_ID:
- return fat_ioctl_volume_id(inode);
default:
return fat_generic_ioctl(inode, filp, cmd, arg);
}
diff --git a/fs/fat/fat.h b/fs/fat/fat.h
index 09305185330f..adb0e72a176d 100644
--- a/fs/fat/fat.h
+++ b/fs/fat/fat.h
@@ -76,7 +76,6 @@ struct msdos_sb_info {
const void *dir_ops; /* Opaque; default directory operations */
int dir_per_block; /* dir entries per block */
int dir_per_block_bits; /* log2(dir_per_block) */
- unsigned long vol_id; /* volume ID */
int fatent_shift;
struct fatent_operations *fatent_ops;
diff --git a/fs/fcntl.c b/fs/fcntl.c
index ae413086db97..11fd78c4b07e 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -526,60 +526,90 @@ static DEFINE_RWLOCK(fasync_lock);
static struct kmem_cache *fasync_cache __read_mostly;
/*
- * fasync_helper() is used by almost all character device drivers
- * to set up the fasync queue. It returns negative on error, 0 if it did
- * no changes and positive if it added/deleted the entry.
+ * Remove a fasync entry. If successfully removed, return
+ * positive and clear the FASYNC flag. If no entry exists,
+ * do nothing and return 0.
+ *
+ * NOTE! It is very important that the FASYNC flag always
+ * match the state "is the filp on a fasync list".
+ *
+ * We always take the 'filp->f_lock', in since fasync_lock
+ * needs to be irq-safe.
*/
-int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
+static int fasync_remove_entry(struct file *filp, struct fasync_struct **fapp)
{
struct fasync_struct *fa, **fp;
- struct fasync_struct *new = NULL;
int result = 0;
- if (on) {
- new = kmem_cache_alloc(fasync_cache, GFP_KERNEL);
- if (!new)
- return -ENOMEM;
+ spin_lock(&filp->f_lock);
+ write_lock_irq(&fasync_lock);
+ for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
+ if (fa->fa_file != filp)
+ continue;
+ *fp = fa->fa_next;
+ kmem_cache_free(fasync_cache, fa);
+ filp->f_flags &= ~FASYNC;
+ result = 1;
+ break;
}
+ write_unlock_irq(&fasync_lock);
+ spin_unlock(&filp->f_lock);
+ return result;
+}
+
+/*
+ * Add a fasync entry. Return negative on error, positive if
+ * added, and zero if did nothing but change an existing one.
+ *
+ * NOTE! It is very important that the FASYNC flag always
+ * match the state "is the filp on a fasync list".
+ */
+static int fasync_add_entry(int fd, struct file *filp, struct fasync_struct **fapp)
+{
+ struct fasync_struct *new, *fa, **fp;
+ int result = 0;
+
+ new = kmem_cache_alloc(fasync_cache, GFP_KERNEL);
+ if (!new)
+ return -ENOMEM;
- /*
- * We need to take f_lock first since it's not an IRQ-safe
- * lock.
- */
spin_lock(&filp->f_lock);
write_lock_irq(&fasync_lock);
for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
- if (fa->fa_file == filp) {
- if(on) {
- fa->fa_fd = fd;
- kmem_cache_free(fasync_cache, new);
- } else {
- *fp = fa->fa_next;
- kmem_cache_free(fasync_cache, fa);
- result = 1;
- }
- goto out;
- }
+ if (fa->fa_file != filp)
+ continue;
+ fa->fa_fd = fd;
+ kmem_cache_free(fasync_cache, new);
+ goto out;
}
- if (on) {
- new->magic = FASYNC_MAGIC;
- new->fa_file = filp;
- new->fa_fd = fd;
- new->fa_next = *fapp;
- *fapp = new;
- result = 1;
- }
+ new->magic = FASYNC_MAGIC;
+ new->fa_file = filp;
+ new->fa_fd = fd;
+ new->fa_next = *fapp;
+ *fapp = new;
+ result = 1;
+ filp->f_flags |= FASYNC;
+
out:
- if (on)
- filp->f_flags |= FASYNC;
- else
- filp->f_flags &= ~FASYNC;
write_unlock_irq(&fasync_lock);
spin_unlock(&filp->f_lock);
return result;
}
+/*
+ * fasync_helper() is used by almost all character device drivers
+ * to set up the fasync queue, and for regular files by the file
+ * lease code. It returns negative on error, 0 if it did no changes
+ * and positive if it added/deleted the entry.
+ */
+int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
+{
+ if (!on)
+ return fasync_remove_entry(filp, fapp);
+ return fasync_add_entry(fd, filp, fapp);
+}
+
EXPORT_SYMBOL(fasync_helper);
void __kill_fasync(struct fasync_struct *fa, int sig, int band)
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index e703654e7f40..d0dcaef04e46 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -385,6 +385,9 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
if (fc->no_create)
return -ENOSYS;
+ if (flags & O_DIRECT)
+ return -EINVAL;
+
forget_req = fuse_get_req(fc);
if (IS_ERR(forget_req))
return PTR_ERR(forget_req);
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index cbc464043b6f..899870ada138 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1063,7 +1063,8 @@ ssize_t fuse_direct_io(struct file *file, const char __user *buf,
break;
}
}
- fuse_put_request(fc, req);
+ if (!IS_ERR(req))
+ fuse_put_request(fc, req);
if (res > 0)
*ppos = pos;
@@ -1599,7 +1600,7 @@ static int fuse_ioctl_copy_user(struct page **pages, struct iovec *iov,
kaddr += copy;
}
- kunmap(map);
+ kunmap(page);
}
return 0;
diff --git a/fs/hfs/catalog.c b/fs/hfs/catalog.c
index 6d98f116ca03..424b0337f524 100644
--- a/fs/hfs/catalog.c
+++ b/fs/hfs/catalog.c
@@ -289,6 +289,10 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, struct qstr *src_name,
err = hfs_brec_find(&src_fd);
if (err)
goto out;
+ if (src_fd.entrylength > sizeof(entry) || src_fd.entrylength < 0) {
+ err = -EIO;
+ goto out;
+ }
hfs_bnode_read(src_fd.bnode, &entry, src_fd.entryoffset,
src_fd.entrylength);
diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c
index 7c69b98a2e45..2b3b8611b41b 100644
--- a/fs/hfs/dir.c
+++ b/fs/hfs/dir.c
@@ -79,6 +79,11 @@ static int hfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
filp->f_pos++;
/* fall through */
case 1:
+ if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) {
+ err = -EIO;
+ goto out;
+ }
+
hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, fd.entrylength);
if (entry.type != HFS_CDR_THD) {
printk(KERN_ERR "hfs: bad catalog folder thread\n");
@@ -109,6 +114,12 @@ static int hfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
err = -EIO;
goto out;
}
+
+ if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) {
+ err = -EIO;
+ goto out;
+ }
+
hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, fd.entrylength);
type = entry.type;
len = hfs_mac2asc(sb, strbuf, &fd.key->cat.CName);
diff --git a/fs/hfs/super.c b/fs/hfs/super.c
index f7fcbe49da72..5ed7252b7b23 100644
--- a/fs/hfs/super.c
+++ b/fs/hfs/super.c
@@ -409,8 +409,13 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
/* try to get the root inode */
hfs_find_init(HFS_SB(sb)->cat_tree, &fd);
res = hfs_cat_find_brec(sb, HFS_ROOT_CNID, &fd);
- if (!res)
+ if (!res) {
+ if (fd.entrylength > sizeof(rec) || fd.entrylength < 0) {
+ res = -EIO;
+ goto bail;
+ }
hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength);
+ }
if (res) {
hfs_find_exit(&fd);
goto bail_no_root;
diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c
index 175d08eacc86..bed78ac8f6d1 100644
--- a/fs/hfsplus/wrapper.c
+++ b/fs/hfsplus/wrapper.c
@@ -99,6 +99,10 @@ int hfsplus_read_wrapper(struct super_block *sb)
if (hfsplus_get_last_session(sb, &part_start, &part_size))
return -EINVAL;
+ if ((u64)part_start + part_size > 0x100000000ULL) {
+ pr_err("hfs: volumes larger than 2TB are not supported yet\n");
+ return -EINVAL;
+ }
while (1) {
bh = sb_bread512(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, vhdr);
if (!bh)
diff --git a/fs/inode.c b/fs/inode.c
index ae7b67e48661..1a959c081514 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -697,13 +697,15 @@ void unlock_new_inode(struct inode *inode)
}
#endif
/*
- * This is special! We do not need the spinlock
- * when clearing I_LOCK, because we're guaranteed
- * that nobody else tries to do anything about the
- * state of the inode when it is locked, as we
- * just created it (so there can be no old holders
- * that haven't tested I_LOCK).
+ * This is special! We do not need the spinlock when clearing I_LOCK,
+ * because we're guaranteed that nobody else tries to do anything about
+ * the state of the inode when it is locked, as we just created it (so
+ * there can be no old holders that haven't tested I_LOCK).
+ * However we must emit the memory barrier so that other CPUs reliably
+ * see the clearing of I_LOCK after the other inode initialisation has
+ * completed.
*/
+ smp_mb();
WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW));
inode->i_state &= ~(I_LOCK|I_NEW);
wake_up_inode(inode);
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index 7b4088b2364d..8cf902ae7147 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -636,6 +636,10 @@ void jbd2_journal_commit_transaction(journal_t *journal)
JBUFFER_TRACE(jh, "ph3: write metadata");
flags = jbd2_journal_write_metadata_buffer(commit_transaction,
jh, &new_jh, blocknr);
+ if (flags < 0) {
+ jbd2_journal_abort(journal, flags);
+ continue;
+ }
set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
wbuf[bufs++] = jh2bh(new_jh);
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index e378cb383979..ead427ced0a6 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -78,6 +78,7 @@ EXPORT_SYMBOL(jbd2_journal_errno);
EXPORT_SYMBOL(jbd2_journal_ack_err);
EXPORT_SYMBOL(jbd2_journal_clear_err);
EXPORT_SYMBOL(jbd2_log_wait_commit);
+EXPORT_SYMBOL(jbd2_log_start_commit);
EXPORT_SYMBOL(jbd2_journal_start_commit);
EXPORT_SYMBOL(jbd2_journal_force_commit_nested);
EXPORT_SYMBOL(jbd2_journal_wipe);
@@ -361,6 +362,10 @@ repeat:
jbd_unlock_bh_state(bh_in);
tmp = jbd2_alloc(bh_in->b_size, GFP_NOFS);
+ if (!tmp) {
+ jbd2_journal_put_journal_head(new_jh);
+ return -ENOMEM;
+ }
jbd_lock_bh_state(bh_in);
if (jh_in->b_frozen_data) {
jbd2_free(tmp, bh_in->b_size);
@@ -1187,6 +1192,12 @@ static int journal_reset(journal_t *journal)
first = be32_to_cpu(sb->s_first);
last = be32_to_cpu(sb->s_maxlen);
+ if (first + JBD2_MIN_JOURNAL_BLOCKS > last + 1) {
+ printk(KERN_ERR "JBD: Journal too short (blocks %llu-%llu).\n",
+ first, last);
+ journal_fail_superblock(journal);
+ return -EINVAL;
+ }
journal->j_first = first;
journal->j_last = last;
@@ -1410,6 +1421,13 @@ int jbd2_journal_load(journal_t *journal)
if (jbd2_journal_recover(journal))
goto recovery_error;
+ if (journal->j_failed_commit) {
+ printk(KERN_ERR "JBD2: journal transaction %u on %s "
+ "is corrupt.\n", journal->j_failed_commit,
+ journal->j_devname);
+ return -EIO;
+ }
+
/* OK, we've finished with the dynamic journal bits:
* reinitialise the dynamic contents of the superblock in memory
* and reset them on disk. */
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
index 6213ac728f30..a0512700542f 100644
--- a/fs/jbd2/transaction.c
+++ b/fs/jbd2/transaction.c
@@ -57,7 +57,7 @@ jbd2_get_transaction(journal_t *journal, transaction_t *transaction)
INIT_LIST_HEAD(&transaction->t_private_list);
/* Set up the commit timer for the new transaction. */
- journal->j_commit_timer.expires = round_jiffies(transaction->t_expires);
+ journal->j_commit_timer.expires = round_jiffies_up(transaction->t_expires);
add_timer(&journal->j_commit_timer);
J_ASSERT(journal->j_running_transaction == NULL);
@@ -238,6 +238,8 @@ repeat_locked:
__jbd2_log_space_left(journal));
spin_unlock(&transaction->t_handle_lock);
spin_unlock(&journal->j_state_lock);
+
+ lock_map_acquire(&handle->h_lockdep_map);
out:
if (unlikely(new_transaction)) /* It's usually NULL */
kfree(new_transaction);
@@ -303,8 +305,6 @@ handle_t *jbd2_journal_start(journal_t *journal, int nblocks)
handle = ERR_PTR(err);
goto out;
}
-
- lock_map_acquire(&handle->h_lockdep_map);
out:
return handle;
}
@@ -426,6 +426,7 @@ int jbd2_journal_restart(handle_t *handle, int nblocks)
__jbd2_log_start_commit(journal, transaction->t_tid);
spin_unlock(&journal->j_state_lock);
+ lock_map_release(&handle->h_lockdep_map);
handle->h_buffer_credits = nblocks;
ret = start_this_handle(journal, handle);
return ret;
diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c
index 090c556ffed2..3b6f2fa12cff 100644
--- a/fs/jffs2/gc.c
+++ b/fs/jffs2/gc.c
@@ -700,7 +700,8 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_
struct jffs2_raw_inode ri;
struct jffs2_node_frag *last_frag;
union jffs2_device_node dev;
- char *mdata = NULL, mdatalen = 0;
+ char *mdata = NULL;
+ int mdatalen = 0;
uint32_t alloclen, ilen;
int ret;
diff --git a/fs/jffs2/read.c b/fs/jffs2/read.c
index cfe05c1966a5..3f39be1b0455 100644
--- a/fs/jffs2/read.c
+++ b/fs/jffs2/read.c
@@ -164,12 +164,15 @@ int jffs2_read_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
/* XXX FIXME: Where a single physical node actually shows up in two
frags, we read it twice. Don't do that. */
- /* Now we're pointing at the first frag which overlaps our page */
+ /* Now we're pointing at the first frag which overlaps our page
+ * (or perhaps is before it, if we've been asked to read off the
+ * end of the file). */
while(offset < end) {
D2(printk(KERN_DEBUG "jffs2_read_inode_range: offset %d, end %d\n", offset, end));
- if (unlikely(!frag || frag->ofs > offset)) {
+ if (unlikely(!frag || frag->ofs > offset ||
+ frag->ofs + frag->size <= offset)) {
uint32_t holesize = end - offset;
- if (frag) {
+ if (frag && frag->ofs > offset) {
D1(printk(KERN_NOTICE "Eep. Hole in ino #%u fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", f->inocache->ino, frag->ofs, offset));
holesize = min(holesize, frag->ofs - offset);
}
diff --git a/fs/namei.c b/fs/namei.c
index 1f13751693a5..20ab69f3320a 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -221,6 +221,7 @@ int generic_permission(struct inode *inode, int mask,
/*
* Searching includes executable on directories, else just read.
*/
+ mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
if (mask == MAY_READ || (S_ISDIR(inode->i_mode) && !(mask & MAY_WRITE)))
if (capable(CAP_DAC_READ_SEARCH))
return 0;
@@ -822,6 +823,17 @@ fail:
}
/*
+ * This is a temporary kludge to deal with "automount" symlinks; proper
+ * solution is to trigger them on follow_mount(), so that do_lookup()
+ * would DTRT. To be killed before 2.6.34-final.
+ */
+static inline int follow_on_final(struct inode *inode, unsigned lookup_flags)
+{
+ return inode && unlikely(inode->i_op->follow_link) &&
+ ((lookup_flags & LOOKUP_FOLLOW) || S_ISDIR(inode->i_mode));
+}
+
+/*
* Name resolution.
* This is the basic name resolution function, turning a pathname into
* the final dentry. We expect 'base' to be positive and a directory.
@@ -963,8 +975,7 @@ last_component:
if (err)
break;
inode = next.dentry->d_inode;
- if ((lookup_flags & LOOKUP_FOLLOW)
- && inode && inode->i_op->follow_link) {
+ if (follow_on_final(inode, lookup_flags)) {
err = do_follow_link(&next, nd);
if (err)
goto return_err;
@@ -1533,9 +1544,11 @@ int may_open(struct path *path, int acc_mode, int flag)
if (error)
return error;
- error = ima_path_check(path,
- acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC),
+ error = ima_path_check(path, acc_mode ?
+ acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC) :
+ ACC_MODE(flag) & (MAY_READ | MAY_WRITE),
IMA_COUNT_UPDATE);
+
if (error)
return error;
/*
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 8d25ccb2d51d..bdd76b9b5700 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -1171,7 +1171,7 @@ static int nfs4_init_client(struct nfs_client *clp,
1, flags & NFS_MOUNT_NORESVPORT);
if (error < 0)
goto error;
- memcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
+ strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
error = nfs_idmap_new(clp);
if (error < 0) {
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 32062c33c859..7cb298525eef 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -1536,6 +1536,8 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
old_dentry->d_parent->d_name.name, old_dentry->d_name.name,
dentry->d_parent->d_name.name, dentry->d_name.name);
+ nfs_inode_return_delegation(inode);
+
d_drop(dentry);
error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
if (error == 0) {
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index e4e089a8f294..1af78ffbe337 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -457,6 +457,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
};
struct rpc_task_setup task_setup_data = {
.rpc_client = NFS_CLIENT(inode),
+ .rpc_message = &msg,
.callback_ops = &nfs_write_direct_ops,
.workqueue = nfsiod_workqueue,
.flags = RPC_TASK_ASYNC,
diff --git a/fs/nfs/fscache.c b/fs/nfs/fscache.c
index 379be678cb7e..a81d05b693f9 100644
--- a/fs/nfs/fscache.c
+++ b/fs/nfs/fscache.c
@@ -337,21 +337,20 @@ void nfs_fscache_reset_inode_cookie(struct inode *inode)
*/
int nfs_fscache_release_page(struct page *page, gfp_t gfp)
{
- struct nfs_inode *nfsi = NFS_I(page->mapping->host);
- struct fscache_cookie *cookie = nfsi->fscache;
-
- BUG_ON(!cookie);
-
- if (fscache_check_page_write(cookie, page)) {
- if (!(gfp & __GFP_WAIT))
- return 0;
- fscache_wait_on_page_write(cookie, page);
- }
-
if (PageFsCache(page)) {
+ struct nfs_inode *nfsi = NFS_I(page->mapping->host);
+ struct fscache_cookie *cookie = nfsi->fscache;
+
+ BUG_ON(!cookie);
dfprintk(FSCACHE, "NFS: fscache releasepage (0x%p/0x%p/0x%p)\n",
cookie, page, nfsi);
+ if (fscache_check_page_write(cookie, page)) {
+ if (!(gfp & __GFP_WAIT))
+ return 0;
+ fscache_wait_on_page_write(cookie, page);
+ }
+
fscache_uncache_page(cookie, page);
nfs_add_fscache_stats(page->mapping->host,
NFSIOS_FSCACHE_PAGES_UNCACHED, 1);
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 6917311f201c..54baaef8998e 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -71,12 +71,17 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
/* Prevent leaks of NFSv4 errors into userland */
static int nfs4_map_errors(int err)
{
- if (err < -1000) {
+ if (err >= -1000)
+ return err;
+ switch (err) {
+ case -NFS4ERR_RESOURCE:
+ return -EREMOTEIO;
+ default:
dprintk("%s could not handle NFSv4 error %d\n",
__func__, -err);
- return -EIO;
+ break;
}
- return err;
+ return -EIO;
}
/*
@@ -2735,7 +2740,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
.pages = &page,
.pgbase = 0,
.count = count,
- .bitmask = NFS_SERVER(dentry->d_inode)->cache_consistency_bitmask,
+ .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask,
};
struct nfs4_readdir_res res;
struct rpc_message msg = {
@@ -3033,9 +3038,6 @@ static void nfs4_renew_done(struct rpc_task *task, void *data)
if (time_before(clp->cl_last_renewal,timestamp))
clp->cl_last_renewal = timestamp;
spin_unlock(&clp->cl_lock);
- dprintk("%s calling put_rpccred on rpc_cred %p\n", __func__,
- task->tk_msg.rpc_cred);
- put_rpccred(task->tk_msg.rpc_cred);
}
static const struct rpc_call_ops nfs4_renew_ops = {
@@ -4850,7 +4852,6 @@ void nfs41_sequence_call_done(struct rpc_task *task, void *data)
nfs41_sequence_free_slot(clp, task->tk_msg.rpc_resp);
dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred);
- put_rpccred(task->tk_msg.rpc_cred);
kfree(task->tk_msg.rpc_argp);
kfree(task->tk_msg.rpc_resp);
diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c
index e27c6cef18f2..0156c01c212c 100644
--- a/fs/nfs/nfs4renewd.c
+++ b/fs/nfs/nfs4renewd.c
@@ -127,12 +127,6 @@ nfs4_schedule_state_renewal(struct nfs_client *clp)
}
void
-nfs4_renewd_prepare_shutdown(struct nfs_server *server)
-{
- cancel_delayed_work(&server->nfs_client->cl_renewd);
-}
-
-void
nfs4_kill_renewd(struct nfs_client *clp)
{
cancel_delayed_work_sync(&clp->cl_renewd);
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 617273e7d47f..f4c9e1a0d9ce 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -5406,7 +5406,6 @@ static struct {
{ NFS4ERR_SERVERFAULT, -ESERVERFAULT },
{ NFS4ERR_BADTYPE, -EBADTYPE },
{ NFS4ERR_LOCKED, -EAGAIN },
- { NFS4ERR_RESOURCE, -EREMOTEIO },
{ NFS4ERR_SYMLINK, -ELOOP },
{ NFS4ERR_OP_ILLEGAL, -EOPNOTSUPP },
{ NFS4ERR_DEADLOCK, -EDEADLK },
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 0b4cbdc60abd..98481693665e 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -1323,6 +1323,7 @@ static int nfs_parse_mount_options(char *raw,
default:
dfprintk(MOUNT, "NFS: unrecognized "
"transport protocol\n");
+ kfree(string);
return 0;
}
break;
@@ -2669,7 +2670,6 @@ static void nfs4_kill_super(struct super_block *sb)
dprintk("--> %s\n", __func__);
nfs_super_return_all_delegations(sb);
kill_anon_super(sb);
- nfs4_renewd_prepare_shutdown(server);
nfs_fscache_release_super_cookie(sb);
nfs_free_server(server);
dprintk("<-- %s\n", __func__);
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 3fd23f7aceca..bf9b470f4d00 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -444,6 +444,7 @@ static struct rpc_cred *lookup_cb_cred(struct nfs4_cb_conn *cb)
struct auth_cred acred = {
.machine_cred = 1
};
+ struct rpc_auth *auth = cb->cb_client->cl_auth;
/*
* Note in the gss case this doesn't actually have to wait for a
@@ -451,8 +452,7 @@ static struct rpc_cred *lookup_cb_cred(struct nfs4_cb_conn *cb)
* non-uptodate cred which the rpc state machine will fill in with
* a refresh_upcall later.
*/
- return rpcauth_lookup_credcache(cb->cb_client->cl_auth, &acred,
- RPCAUTH_LOOKUP_NEW);
+ return auth->au_ops->lookup_cred(auth, &acred, RPCAUTH_LOOKUP_NEW);
}
void do_probe_callback(struct nfs4_client *clp)
diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c
index c668bca579c1..862ad299aad0 100644
--- a/fs/nilfs2/btnode.c
+++ b/fs/nilfs2/btnode.c
@@ -36,6 +36,7 @@
void nilfs_btnode_cache_init_once(struct address_space *btnc)
{
+ memset(btnc, 0, sizeof(*btnc));
INIT_RADIX_TREE(&btnc->page_tree, GFP_ATOMIC);
spin_lock_init(&btnc->tree_lock);
INIT_LIST_HEAD(&btnc->private_list);
@@ -275,8 +276,7 @@ void nilfs_btnode_commit_change_key(struct address_space *btnc,
"invalid oldkey %lld (newkey=%lld)",
(unsigned long long)oldkey,
(unsigned long long)newkey);
- if (!test_set_buffer_dirty(obh) && TestSetPageDirty(opage))
- BUG();
+ nilfs_btnode_mark_dirty(obh);
spin_lock_irq(&btnc->tree_lock);
radix_tree_delete(&btnc->page_tree, oldkey);
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c
index 6ea5f872e2de..f6b6016e60f2 100644
--- a/fs/nilfs2/ioctl.c
+++ b/fs/nilfs2/ioctl.c
@@ -297,7 +297,18 @@ static int nilfs_ioctl_move_inode_block(struct inode *inode,
(unsigned long long)vdesc->vd_vblocknr);
return ret;
}
- bh->b_private = vdesc;
+ if (unlikely(!list_empty(&bh->b_assoc_buffers))) {
+ 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);
+ brelse(bh);
+ return -EEXIST;
+ }
list_add_tail(&bh->b_assoc_buffers, buffers);
return 0;
}
@@ -335,24 +346,10 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs,
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);
- }
+ WARN_ON(ret == -EEXIST);
goto failed;
}
list_del_init(&bh->b_assoc_buffers);
- bh->b_private = NULL;
brelse(bh);
}
return nmembs;
@@ -360,7 +357,6 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs,
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;
diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c
index 828a889be909..7e54e52964dd 100644
--- a/fs/notify/dnotify/dnotify.c
+++ b/fs/notify/dnotify/dnotify.c
@@ -91,6 +91,7 @@ static int dnotify_handle_event(struct fsnotify_group *group,
struct dnotify_struct *dn;
struct dnotify_struct **prev;
struct fown_struct *fown;
+ __u32 test_mask = event->mask & ~FS_EVENT_ON_CHILD;
to_tell = event->to_tell;
@@ -106,7 +107,7 @@ static int dnotify_handle_event(struct fsnotify_group *group,
spin_lock(&entry->lock);
prev = &dnentry->dn;
while ((dn = *prev) != NULL) {
- if ((dn->dn_mask & event->mask) == 0) {
+ if ((dn->dn_mask & test_mask) == 0) {
prev = &dn->dn_next;
continue;
}
diff --git a/fs/notify/inode_mark.c b/fs/notify/inode_mark.c
index c8a07c65482b..3165d85aada2 100644
--- a/fs/notify/inode_mark.c
+++ b/fs/notify/inode_mark.c
@@ -324,11 +324,11 @@ int fsnotify_add_mark(struct fsnotify_mark_entry *entry,
spin_lock(&group->mark_lock);
spin_lock(&inode->i_lock);
- entry->group = group;
- entry->inode = inode;
-
lentry = fsnotify_find_mark_entry(group, inode);
if (!lentry) {
+ entry->group = group;
+ entry->inode = inode;
+
hlist_add_head(&entry->i_list, &inode->i_fsnotify_mark_entries);
list_add(&entry->g_list, &group->mark_entries);
diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c
index c9ee67b442e1..1afb0a10229f 100644
--- a/fs/notify/inotify/inotify_fsnotify.c
+++ b/fs/notify/inotify/inotify_fsnotify.c
@@ -121,7 +121,7 @@ static int idr_callback(int id, void *p, void *data)
if (warned)
return 0;
- warned = false;
+ warned = true;
entry = p;
ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry);
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
index dcd2040d330c..ca44337b06ce 100644
--- a/fs/notify/inotify/inotify_user.c
+++ b/fs/notify/inotify/inotify_user.c
@@ -558,7 +558,7 @@ retry:
spin_lock(&group->inotify_data.idr_lock);
ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry,
- group->inotify_data.last_wd,
+ group->inotify_data.last_wd+1,
&tmp_ientry->wd);
spin_unlock(&group->inotify_data.idr_lock);
if (ret) {
@@ -638,7 +638,7 @@ static struct fsnotify_group *inotify_new_group(struct user_struct *user, unsign
spin_lock_init(&group->inotify_data.idr_lock);
idr_init(&group->inotify_data.idr);
- group->inotify_data.last_wd = 1;
+ group->inotify_data.last_wd = 0;
group->inotify_data.user = user;
group->inotify_data.fa = NULL;
diff --git a/fs/notify/notification.c b/fs/notify/notification.c
index 3816d5750dd5..b8bf53b4c108 100644
--- a/fs/notify/notification.c
+++ b/fs/notify/notification.c
@@ -143,7 +143,7 @@ static bool event_compare(struct fsnotify_event *old, struct fsnotify_event *new
/* remember, after old was put on the wait_q we aren't
* allowed to look at the inode any more, only thing
* left to check was if the file_name is the same */
- if (old->name_len &&
+ if (!old->name_len ||
!strcmp(old->file_name, new->file_name))
return true;
break;
diff --git a/fs/ntfs/malloc.h b/fs/ntfs/malloc.h
index cd0be3f5c3cd..a44b14cbceeb 100644
--- a/fs/ntfs/malloc.h
+++ b/fs/ntfs/malloc.h
@@ -47,7 +47,7 @@ static inline void *__ntfs_malloc(unsigned long size, gfp_t gfp_mask)
return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM);
/* return (void *)__get_free_page(gfp_mask); */
}
- if (likely(size >> PAGE_SHIFT < num_physpages))
+ if (likely((size >> PAGE_SHIFT) < totalram_pages))
return __vmalloc(size, gfp_mask, PAGE_KERNEL);
return NULL;
}
diff --git a/fs/partitions/check.c b/fs/partitions/check.c
index 5ff78a202e0a..ea4e6cb29e13 100644
--- a/fs/partitions/check.c
+++ b/fs/partitions/check.c
@@ -317,19 +317,10 @@ static void part_release(struct device *dev)
kfree(p);
}
-static int part_uevent(struct device *dev, struct kobj_uevent_env *env)
-{
- struct hd_struct *part = dev_to_part(dev);
-
- add_uevent_var(env, "PARTN=%u", part->partno);
- return 0;
-}
-
struct device_type part_type = {
.name = "partition",
.groups = part_attr_groups,
.release = part_release,
- .uevent = part_uevent,
};
static void delete_partition_rcu_cb(struct rcu_head *head)
diff --git a/fs/partitions/efi.c b/fs/partitions/efi.c
index 038a6022152f..49cfd5f54238 100644
--- a/fs/partitions/efi.c
+++ b/fs/partitions/efi.c
@@ -1,7 +1,9 @@
/************************************************************
* EFI GUID Partition Table handling
- * Per Intel EFI Specification v1.02
- * http://developer.intel.com/technology/efi/efi.htm
+ *
+ * http://www.uefi.org/specs/
+ * http://www.intel.com/technology/efi/
+ *
* efi.[ch] by Matt Domsch <Matt_Domsch@dell.com>
* Copyright 2000,2001,2002,2004 Dell Inc.
*
@@ -92,6 +94,7 @@
*
************************************************************/
#include <linux/crc32.h>
+#include <linux/math64.h>
#include "check.h"
#include "efi.h"
@@ -141,7 +144,8 @@ last_lba(struct block_device *bdev)
{
if (!bdev || !bdev->bd_inode)
return 0;
- return (bdev->bd_inode->i_size >> 9) - 1ULL;
+ return div_u64(bdev->bd_inode->i_size,
+ bdev_logical_block_size(bdev)) - 1ULL;
}
static inline int
@@ -188,6 +192,7 @@ static size_t
read_lba(struct block_device *bdev, u64 lba, u8 * buffer, size_t count)
{
size_t totalreadcount = 0;
+ sector_t n = lba * (bdev_logical_block_size(bdev) / 512);
if (!bdev || !buffer || lba > last_lba(bdev))
return 0;
@@ -195,7 +200,7 @@ read_lba(struct block_device *bdev, u64 lba, u8 * buffer, size_t count)
while (count) {
int copied = 512;
Sector sect;
- unsigned char *data = read_dev_sector(bdev, lba++, &sect);
+ unsigned char *data = read_dev_sector(bdev, n++, &sect);
if (!data)
break;
if (copied > count)
@@ -257,15 +262,16 @@ static gpt_header *
alloc_read_gpt_header(struct block_device *bdev, u64 lba)
{
gpt_header *gpt;
+ unsigned ssz = bdev_logical_block_size(bdev);
+
if (!bdev)
return NULL;
- gpt = kzalloc(sizeof (gpt_header), GFP_KERNEL);
+ gpt = kzalloc(ssz, GFP_KERNEL);
if (!gpt)
return NULL;
- if (read_lba(bdev, lba, (u8 *) gpt,
- sizeof (gpt_header)) < sizeof (gpt_header)) {
+ if (read_lba(bdev, lba, (u8 *) gpt, ssz) < ssz) {
kfree(gpt);
gpt=NULL;
return NULL;
@@ -601,6 +607,7 @@ efi_partition(struct parsed_partitions *state, struct block_device *bdev)
gpt_header *gpt = NULL;
gpt_entry *ptes = NULL;
u32 i;
+ unsigned ssz = bdev_logical_block_size(bdev) / 512;
if (!find_valid_gpt(bdev, &gpt, &ptes) || !gpt || !ptes) {
kfree(gpt);
@@ -611,13 +618,14 @@ efi_partition(struct parsed_partitions *state, struct block_device *bdev)
pr_debug("GUID Partition Table is valid! Yea!\n");
for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < state->limit-1; i++) {
+ u64 start = le64_to_cpu(ptes[i].starting_lba);
+ u64 size = le64_to_cpu(ptes[i].ending_lba) -
+ le64_to_cpu(ptes[i].starting_lba) + 1ULL;
+
if (!is_pte_valid(&ptes[i], last_lba(bdev)))
continue;
- put_partition(state, i+1, le64_to_cpu(ptes[i].starting_lba),
- (le64_to_cpu(ptes[i].ending_lba) -
- le64_to_cpu(ptes[i].starting_lba) +
- 1ULL));
+ put_partition(state, i+1, start * ssz, size * ssz);
/* If this is a RAID volume, tell md */
if (!efi_guidcmp(ptes[i].partition_type_guid,
diff --git a/fs/partitions/efi.h b/fs/partitions/efi.h
index 2cc89d0475bf..6998b589abf9 100644
--- a/fs/partitions/efi.h
+++ b/fs/partitions/efi.h
@@ -37,7 +37,6 @@
#define EFI_PMBR_OSTYPE_EFI 0xEF
#define EFI_PMBR_OSTYPE_EFI_GPT 0xEE
-#define GPT_BLOCK_SIZE 512
#define GPT_HEADER_SIGNATURE 0x5452415020494645ULL
#define GPT_HEADER_REVISION_V1 0x00010000
#define GPT_PRIMARY_PARTITION_TABLE_LBA 1
@@ -79,7 +78,12 @@ typedef struct _gpt_header {
__le32 num_partition_entries;
__le32 sizeof_partition_entry;
__le32 partition_entry_array_crc32;
- u8 reserved2[GPT_BLOCK_SIZE - 92];
+
+ /* The rest of the logical block is reserved by UEFI and must be zero.
+ * EFI standard handles this by:
+ *
+ * uint8_t reserved2[ BlockSize - 92 ];
+ */
} __attribute__ ((packed)) gpt_header;
typedef struct _gpt_entry_attributes {
diff --git a/fs/pipe.c b/fs/pipe.c
index 52c415114838..ae17d026aaa3 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -777,36 +777,55 @@ pipe_rdwr_release(struct inode *inode, struct file *filp)
static int
pipe_read_open(struct inode *inode, struct file *filp)
{
- /* We could have perhaps used atomic_t, but this and friends
- below are the only places. So it doesn't seem worthwhile. */
+ int ret = -ENOENT;
+
mutex_lock(&inode->i_mutex);
- inode->i_pipe->readers++;
+
+ if (inode->i_pipe) {
+ ret = 0;
+ inode->i_pipe->readers++;
+ }
+
mutex_unlock(&inode->i_mutex);
- return 0;
+ return ret;
}
static int
pipe_write_open(struct inode *inode, struct file *filp)
{
+ int ret = -ENOENT;
+
mutex_lock(&inode->i_mutex);
- inode->i_pipe->writers++;
+
+ if (inode->i_pipe) {
+ ret = 0;
+ inode->i_pipe->writers++;
+ }
+
mutex_unlock(&inode->i_mutex);
- return 0;
+ return ret;
}
static int
pipe_rdwr_open(struct inode *inode, struct file *filp)
{
+ int ret = -ENOENT;
+
mutex_lock(&inode->i_mutex);
- if (filp->f_mode & FMODE_READ)
- inode->i_pipe->readers++;
- if (filp->f_mode & FMODE_WRITE)
- inode->i_pipe->writers++;
+
+ if (inode->i_pipe) {
+ ret = 0;
+ if (filp->f_mode & FMODE_READ)
+ inode->i_pipe->readers++;
+ if (filp->f_mode & FMODE_WRITE)
+ inode->i_pipe->writers++;
+ }
+
mutex_unlock(&inode->i_mutex);
- return 0;
+ return ret;
}
/*
diff --git a/fs/proc/base.c b/fs/proc/base.c
index a0f94952faf2..baf53d92081a 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -127,8 +127,6 @@ struct pid_entry {
NOD(NAME, (S_IFREG|(MODE)), \
NULL, &proc_single_file_operations, \
{ .proc_show = show } )
-#define ARD(NAME, MODE, iops, fops) \
- NOD(NAME, (S_IFREG|(MODE)), &iops, &fops, {} )
/*
* Count the number of hardlinks for the pid_entry table, excluding the .
@@ -1045,35 +1043,6 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf,
return end - buffer;
}
-#ifdef CONFIG_ANDROID
-static int oom_adjust_permission(struct inode *inode, int mask)
-{
- uid_t uid;
- struct task_struct *p = get_proc_task(inode);
- if(p) {
- uid = task_uid(p);
- put_task_struct(p);
- }
-
- /*
- * System Server (uid == 1000) is granted access to oom_adj of all
- * android applications (uid > 10000) as and services (uid >= 1000)
- */
- if (p && (current_fsuid() == 1000) && (uid >= 1000)) {
- if (inode->i_mode >> 6 & mask) {
- return 0;
- }
- }
-
- /* Fall back to default. */
- return generic_permission(inode, mask, NULL);
-}
-
-static const struct inode_operations proc_oom_adjust_inode_operations = {
- .permission = oom_adjust_permission,
-};
-#endif
-
static const struct file_operations proc_oom_adjust_operations = {
.read = oom_adjust_read,
.write = oom_adjust_write,
@@ -2562,11 +2531,7 @@ static const struct pid_entry tgid_base_stuff[] = {
REG("cgroup", S_IRUGO, proc_cgroup_operations),
#endif
INF("oom_score", S_IRUGO, proc_oom_score),
-#ifndef CONFIG_ANDROID
REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adjust_operations),
-#else
- ARD("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adjust_inode_operations, proc_oom_adjust_operations),
-#endif
#ifdef CONFIG_AUDITSYSCALL
REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations),
REG("sessionid", S_IRUGO, proc_sessionid_operations),
@@ -2615,8 +2580,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid)
name.len = snprintf(buf, sizeof(buf), "%d", pid);
dentry = d_hash_and_lookup(mnt->mnt_root, &name);
if (dentry) {
- if (!(current->flags & PF_EXITING))
- shrink_dcache_parent(dentry);
+ shrink_dcache_parent(dentry);
d_drop(dentry);
dput(dentry);
}
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c
index 59b43a068872..5fd7d2b3da82 100644
--- a/fs/proc/kcore.c
+++ b/fs/proc/kcore.c
@@ -361,7 +361,13 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos)
/* don't dump ioremap'd stuff! (TA) */
if (m->flags & VM_IOREMAP)
continue;
- memcpy(elf_buf + (vmstart - start),
+ /*
+ * we may access memory holes, then use
+ * ex_table. checking return value just for
+ * avoid warnings.
+ */
+ vmsize = __copy_from_user_inatomic(
+ elf_buf + (vmstart - start),
(char *)vmstart, vmsize);
}
read_unlock(&vmlist_lock);
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 07376a4a3ed1..9bd8be1d235c 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -689,6 +689,8 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
down_read(&current->mm->mmap_sem);
ret = get_user_pages(current, current->mm, uaddr, pagecount,
1, 0, pages, NULL);
+ up_read(&current->mm->mmap_sem);
+
if (ret < 0)
goto out_free;
@@ -737,7 +739,6 @@ out_pages:
page_cache_release(page);
}
out_free:
- up_read(&current->mm->mmap_sem);
kfree(pages);
out_mm:
mmput(mm);
diff --git a/fs/proc/uptime.c b/fs/proc/uptime.c
index 0c10a0b3f146..766b1d456050 100644
--- a/fs/proc/uptime.c
+++ b/fs/proc/uptime.c
@@ -4,13 +4,18 @@
#include <linux/sched.h>
#include <linux/seq_file.h>
#include <linux/time.h>
+#include <linux/kernel_stat.h>
#include <asm/cputime.h>
static int uptime_proc_show(struct seq_file *m, void *v)
{
struct timespec uptime;
struct timespec idle;
- cputime_t idletime = cputime_add(init_task.utime, init_task.stime);
+ int i;
+ cputime_t idletime = cputime_zero;
+
+ for_each_possible_cpu(i)
+ idletime = cputime64_add(idletime, kstat_cpu(i).cpustat.idle);
do_posix_clock_monotonic_gettime(&uptime);
monotonic_to_bootbased(&uptime);
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 38f7bd559f35..86034fe03059 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -1388,6 +1388,70 @@ void vfs_dq_drop(struct inode *inode)
EXPORT_SYMBOL(vfs_dq_drop);
/*
+ * inode_reserved_space is managed internally by quota, and protected by
+ * i_lock similar to i_blocks+i_bytes.
+ */
+static qsize_t *inode_reserved_space(struct inode * inode)
+{
+ /* Filesystem must explicitly define it's own method in order to use
+ * quota reservation interface */
+ BUG_ON(!inode->i_sb->dq_op->get_reserved_space);
+ return inode->i_sb->dq_op->get_reserved_space(inode);
+}
+
+static void inode_add_rsv_space(struct inode *inode, qsize_t number)
+{
+ spin_lock(&inode->i_lock);
+ *inode_reserved_space(inode) += number;
+ spin_unlock(&inode->i_lock);
+}
+
+
+static void inode_claim_rsv_space(struct inode *inode, qsize_t number)
+{
+ spin_lock(&inode->i_lock);
+ *inode_reserved_space(inode) -= number;
+ __inode_add_bytes(inode, number);
+ spin_unlock(&inode->i_lock);
+}
+
+static void inode_sub_rsv_space(struct inode *inode, qsize_t number)
+{
+ spin_lock(&inode->i_lock);
+ *inode_reserved_space(inode) -= number;
+ spin_unlock(&inode->i_lock);
+}
+
+static qsize_t inode_get_rsv_space(struct inode *inode)
+{
+ qsize_t ret;
+
+ if (!inode->i_sb->dq_op->get_reserved_space)
+ return 0;
+ spin_lock(&inode->i_lock);
+ ret = *inode_reserved_space(inode);
+ spin_unlock(&inode->i_lock);
+ return ret;
+}
+
+static void inode_incr_space(struct inode *inode, qsize_t number,
+ int reserve)
+{
+ if (reserve)
+ inode_add_rsv_space(inode, number);
+ else
+ inode_add_bytes(inode, number);
+}
+
+static void inode_decr_space(struct inode *inode, qsize_t number, int reserve)
+{
+ if (reserve)
+ inode_sub_rsv_space(inode, number);
+ else
+ inode_sub_bytes(inode, number);
+}
+
+/*
* Following four functions update i_blocks+i_bytes fields and
* quota information (together with appropriate checks)
* NOTE: We absolutely rely on the fact that caller dirties
@@ -1405,6 +1469,21 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number,
int cnt, ret = QUOTA_OK;
char warntype[MAXQUOTAS];
+ /*
+ * First test before acquiring mutex - solves deadlocks when we
+ * re-enter the quota code and are already holding the mutex
+ */
+ if (IS_NOQUOTA(inode)) {
+ inode_incr_space(inode, number, reserve);
+ goto out;
+ }
+
+ down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
+ if (IS_NOQUOTA(inode)) {
+ inode_incr_space(inode, number, reserve);
+ goto out_unlock;
+ }
+
for (cnt = 0; cnt < MAXQUOTAS; cnt++)
warntype[cnt] = QUOTA_NL_NOWARN;
@@ -1415,7 +1494,8 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number,
if (check_bdq(inode->i_dquot[cnt], number, warn, warntype+cnt)
== NO_QUOTA) {
ret = NO_QUOTA;
- goto out_unlock;
+ spin_unlock(&dq_data_lock);
+ goto out_flush_warn;
}
}
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
@@ -1426,64 +1506,32 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number,
else
dquot_incr_space(inode->i_dquot[cnt], number);
}
- if (!reserve)
- inode_add_bytes(inode, number);
-out_unlock:
+ inode_incr_space(inode, number, reserve);
spin_unlock(&dq_data_lock);
- flush_warnings(inode->i_dquot, warntype);
- return ret;
-}
-
-int dquot_alloc_space(struct inode *inode, qsize_t number, int warn)
-{
- int cnt, ret = QUOTA_OK;
-
- /*
- * First test before acquiring mutex - solves deadlocks when we
- * re-enter the quota code and are already holding the mutex
- */
- if (IS_NOQUOTA(inode)) {
- inode_add_bytes(inode, number);
- goto out;
- }
-
- down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
- if (IS_NOQUOTA(inode)) {
- inode_add_bytes(inode, number);
- goto out_unlock;
- }
-
- ret = __dquot_alloc_space(inode, number, warn, 0);
- if (ret == NO_QUOTA)
- goto out_unlock;
+ if (reserve)
+ goto out_flush_warn;
/* Dirtify all the dquots - this can block when journalling */
for (cnt = 0; cnt < MAXQUOTAS; cnt++)
if (inode->i_dquot[cnt])
mark_dquot_dirty(inode->i_dquot[cnt]);
+out_flush_warn:
+ flush_warnings(inode->i_dquot, warntype);
out_unlock:
up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
out:
return ret;
}
+
+int dquot_alloc_space(struct inode *inode, qsize_t number, int warn)
+{
+ return __dquot_alloc_space(inode, number, warn, 0);
+}
EXPORT_SYMBOL(dquot_alloc_space);
int dquot_reserve_space(struct inode *inode, qsize_t number, int warn)
{
- int ret = QUOTA_OK;
-
- if (IS_NOQUOTA(inode))
- goto out;
-
- down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
- if (IS_NOQUOTA(inode))
- goto out_unlock;
-
- ret = __dquot_alloc_space(inode, number, warn, 1);
-out_unlock:
- up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
-out:
- return ret;
+ return __dquot_alloc_space(inode, number, warn, 1);
}
EXPORT_SYMBOL(dquot_reserve_space);
@@ -1540,14 +1588,14 @@ int dquot_claim_space(struct inode *inode, qsize_t number)
int ret = QUOTA_OK;
if (IS_NOQUOTA(inode)) {
- inode_add_bytes(inode, number);
+ inode_claim_rsv_space(inode, number);
goto out;
}
down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
if (IS_NOQUOTA(inode)) {
up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
- inode_add_bytes(inode, number);
+ inode_claim_rsv_space(inode, number);
goto out;
}
@@ -1559,7 +1607,7 @@ int dquot_claim_space(struct inode *inode, qsize_t number)
number);
}
/* Update inode bytes */
- inode_add_bytes(inode, number);
+ inode_claim_rsv_space(inode, number);
spin_unlock(&dq_data_lock);
/* Dirtify all the dquots - this can block when journalling */
for (cnt = 0; cnt < MAXQUOTAS; cnt++)
@@ -1572,38 +1620,9 @@ out:
EXPORT_SYMBOL(dquot_claim_space);
/*
- * Release reserved quota space
- */
-void dquot_release_reserved_space(struct inode *inode, qsize_t number)
-{
- int cnt;
-
- if (IS_NOQUOTA(inode))
- goto out;
-
- down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
- if (IS_NOQUOTA(inode))
- goto out_unlock;
-
- spin_lock(&dq_data_lock);
- /* Release reserved dquots */
- for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
- if (inode->i_dquot[cnt])
- dquot_free_reserved_space(inode->i_dquot[cnt], number);
- }
- spin_unlock(&dq_data_lock);
-
-out_unlock:
- up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
-out:
- return;
-}
-EXPORT_SYMBOL(dquot_release_reserved_space);
-
-/*
* This operation can block, but only after everything is updated
*/
-int dquot_free_space(struct inode *inode, qsize_t number)
+int __dquot_free_space(struct inode *inode, qsize_t number, int reserve)
{
unsigned int cnt;
char warntype[MAXQUOTAS];
@@ -1612,7 +1631,7 @@ int dquot_free_space(struct inode *inode, qsize_t number)
* re-enter the quota code and are already holding the mutex */
if (IS_NOQUOTA(inode)) {
out_sub:
- inode_sub_bytes(inode, number);
+ inode_decr_space(inode, number, reserve);
return QUOTA_OK;
}
@@ -1627,21 +1646,43 @@ out_sub:
if (!inode->i_dquot[cnt])
continue;
warntype[cnt] = info_bdq_free(inode->i_dquot[cnt], number);
- dquot_decr_space(inode->i_dquot[cnt], number);
+ if (reserve)
+ dquot_free_reserved_space(inode->i_dquot[cnt], number);
+ else
+ dquot_decr_space(inode->i_dquot[cnt], number);
}
- inode_sub_bytes(inode, number);
+ inode_decr_space(inode, number, reserve);
spin_unlock(&dq_data_lock);
+
+ if (reserve)
+ goto out_unlock;
/* Dirtify all the dquots - this can block when journalling */
for (cnt = 0; cnt < MAXQUOTAS; cnt++)
if (inode->i_dquot[cnt])
mark_dquot_dirty(inode->i_dquot[cnt]);
+out_unlock:
flush_warnings(inode->i_dquot, warntype);
up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
return QUOTA_OK;
}
+
+int dquot_free_space(struct inode *inode, qsize_t number)
+{
+ return __dquot_free_space(inode, number, 0);
+}
EXPORT_SYMBOL(dquot_free_space);
/*
+ * Release reserved quota space
+ */
+void dquot_release_reserved_space(struct inode *inode, qsize_t number)
+{
+ __dquot_free_space(inode, number, 1);
+
+}
+EXPORT_SYMBOL(dquot_release_reserved_space);
+
+/*
* This operation can block, but only after everything is updated
*/
int dquot_free_inode(const struct inode *inode, qsize_t number)
@@ -1679,19 +1720,6 @@ int dquot_free_inode(const struct inode *inode, qsize_t number)
EXPORT_SYMBOL(dquot_free_inode);
/*
- * call back function, get reserved quota space from underlying fs
- */
-qsize_t dquot_get_reserved_space(struct inode *inode)
-{
- qsize_t reserved_space = 0;
-
- if (sb_any_quota_active(inode->i_sb) &&
- inode->i_sb->dq_op->get_reserved_space)
- reserved_space = inode->i_sb->dq_op->get_reserved_space(inode);
- return reserved_space;
-}
-
-/*
* Transfer the number of inode and blocks from one diskquota to an other.
*
* This operation can block, but only after everything is updated
@@ -1734,7 +1762,7 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr)
}
spin_lock(&dq_data_lock);
cur_space = inode_get_bytes(inode);
- rsv_space = dquot_get_reserved_space(inode);
+ rsv_space = inode_get_rsv_space(inode);
space = cur_space + rsv_space;
/* Build the transfer_from list and check the limits */
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c
index 6d2668fdc384..d42c30ceaee5 100644
--- a/fs/reiserfs/dir.c
+++ b/fs/reiserfs/dir.c
@@ -45,8 +45,6 @@ static inline bool is_privroot_deh(struct dentry *dir,
struct reiserfs_de_head *deh)
{
struct dentry *privroot = REISERFS_SB(dir->d_sb)->priv_root;
- if (reiserfs_expose_privroot(dir->d_sb))
- return 0;
return (dir == dir->d_parent && privroot->d_inode &&
deh->deh_objectid == INODE_PKEY(privroot->d_inode)->k_objectid);
}
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
index a14d6cd9eeda..d240c15bf086 100644
--- a/fs/reiserfs/inode.c
+++ b/fs/reiserfs/inode.c
@@ -2531,6 +2531,12 @@ static int reiserfs_writepage(struct page *page, struct writeback_control *wbc)
return reiserfs_write_full_page(page, wbc);
}
+static void reiserfs_truncate_failed_write(struct inode *inode)
+{
+ truncate_inode_pages(inode->i_mapping, inode->i_size);
+ reiserfs_truncate_file(inode, 0);
+}
+
static int reiserfs_write_begin(struct file *file,
struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
@@ -2597,6 +2603,8 @@ static int reiserfs_write_begin(struct file *file,
if (ret) {
unlock_page(page);
page_cache_release(page);
+ /* Truncate allocated blocks */
+ reiserfs_truncate_failed_write(inode);
}
return ret;
}
@@ -2689,8 +2697,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping,
** transaction tracking stuff when the size changes. So, we have
** to do the i_size updates here.
*/
- pos += copied;
- if (pos > inode->i_size) {
+ if (pos + copied > inode->i_size) {
struct reiserfs_transaction_handle myth;
reiserfs_write_lock(inode->i_sb);
/* If the file have grown beyond the border where it
@@ -2708,7 +2715,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping,
goto journal_error;
}
reiserfs_update_inode_transaction(inode);
- inode->i_size = pos;
+ inode->i_size = pos + copied;
/*
* this will just nest into our transaction. It's important
* to use mark_inode_dirty so the inode gets pushed around on the
@@ -2735,6 +2742,10 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping,
out:
unlock_page(page);
page_cache_release(page);
+
+ if (pos + len > inode->i_size)
+ reiserfs_truncate_failed_write(inode);
+
return ret == 0 ? copied : ret;
journal_error:
diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c
index 6925b835a43b..cc1caa26be52 100644
--- a/fs/reiserfs/xattr.c
+++ b/fs/reiserfs/xattr.c
@@ -536,7 +536,7 @@ reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
if (!err && new_size < i_size_read(dentry->d_inode)) {
struct iattr newattrs = {
.ia_ctime = current_fs_time(inode->i_sb),
- .ia_size = buffer_size,
+ .ia_size = new_size,
.ia_valid = ATTR_SIZE | ATTR_CTIME,
};
mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
@@ -952,21 +952,13 @@ int reiserfs_permission(struct inode *inode, int mask)
return generic_permission(inode, mask, NULL);
}
-/* This will catch lookups from the fs root to .reiserfs_priv */
-static int
-xattr_lookup_poison(struct dentry *dentry, struct qstr *q1, struct qstr *name)
+static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd)
{
- struct dentry *priv_root = REISERFS_SB(dentry->d_sb)->priv_root;
- if (container_of(q1, struct dentry, d_name) == priv_root)
- return -ENOENT;
- if (q1->len == name->len &&
- !memcmp(q1->name, name->name, name->len))
- return 0;
- return 1;
+ return -EPERM;
}
static const struct dentry_operations xattr_lookup_poison_ops = {
- .d_compare = xattr_lookup_poison,
+ .d_revalidate = xattr_hide_revalidate,
};
int reiserfs_lookup_privroot(struct super_block *s)
@@ -980,8 +972,7 @@ int reiserfs_lookup_privroot(struct super_block *s)
strlen(PRIVROOT_NAME));
if (!IS_ERR(dentry)) {
REISERFS_SB(s)->priv_root = dentry;
- if (!reiserfs_expose_privroot(s))
- s->s_root->d_op = &xattr_lookup_poison_ops;
+ dentry->d_op = &xattr_lookup_poison_ops;
if (dentry->d_inode)
dentry->d_inode->i_flags |= S_PRIVATE;
} else
diff --git a/fs/stat.c b/fs/stat.c
index 075694e31d8b..c4ecd52c5737 100644
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -401,9 +401,9 @@ SYSCALL_DEFINE4(fstatat64, int, dfd, char __user *, filename,
}
#endif /* __ARCH_WANT_STAT64 */
-void inode_add_bytes(struct inode *inode, loff_t bytes)
+/* Caller is here responsible for sufficient locking (ie. inode->i_lock) */
+void __inode_add_bytes(struct inode *inode, loff_t bytes)
{
- spin_lock(&inode->i_lock);
inode->i_blocks += bytes >> 9;
bytes &= 511;
inode->i_bytes += bytes;
@@ -411,6 +411,12 @@ void inode_add_bytes(struct inode *inode, loff_t bytes)
inode->i_blocks++;
inode->i_bytes -= 512;
}
+}
+
+void inode_add_bytes(struct inode *inode, loff_t bytes)
+{
+ spin_lock(&inode->i_lock);
+ __inode_add_bytes(inode, bytes);
spin_unlock(&inode->i_lock);
}
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 561a9c050cef..f5ea4680f15f 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -268,7 +268,7 @@ static int sysfs_get_open_dirent(struct sysfs_dirent *sd,
struct sysfs_open_dirent *od, *new_od = NULL;
retry:
- spin_lock(&sysfs_open_dirent_lock);
+ spin_lock_irq(&sysfs_open_dirent_lock);
if (!sd->s_attr.open && new_od) {
sd->s_attr.open = new_od;
@@ -281,7 +281,7 @@ static int sysfs_get_open_dirent(struct sysfs_dirent *sd,
list_add_tail(&buffer->list, &od->buffers);
}
- spin_unlock(&sysfs_open_dirent_lock);
+ spin_unlock_irq(&sysfs_open_dirent_lock);
if (od) {
kfree(new_od);
@@ -315,8 +315,9 @@ static void sysfs_put_open_dirent(struct sysfs_dirent *sd,
struct sysfs_buffer *buffer)
{
struct sysfs_open_dirent *od = sd->s_attr.open;
+ unsigned long flags;
- spin_lock(&sysfs_open_dirent_lock);
+ spin_lock_irqsave(&sysfs_open_dirent_lock, flags);
list_del(&buffer->list);
if (atomic_dec_and_test(&od->refcnt))
@@ -324,7 +325,7 @@ static void sysfs_put_open_dirent(struct sysfs_dirent *sd,
else
od = NULL;
- spin_unlock(&sysfs_open_dirent_lock);
+ spin_unlock_irqrestore(&sysfs_open_dirent_lock, flags);
kfree(od);
}
@@ -456,8 +457,9 @@ static unsigned int sysfs_poll(struct file *filp, poll_table *wait)
void sysfs_notify_dirent(struct sysfs_dirent *sd)
{
struct sysfs_open_dirent *od;
+ unsigned long flags;
- spin_lock(&sysfs_open_dirent_lock);
+ spin_lock_irqsave(&sysfs_open_dirent_lock, flags);
od = sd->s_attr.open;
if (od) {
@@ -465,7 +467,7 @@ void sysfs_notify_dirent(struct sysfs_dirent *sd)
wake_up_interruptible(&od->poll);
}
- spin_unlock(&sysfs_open_dirent_lock);
+ spin_unlock_irqrestore(&sysfs_open_dirent_lock, flags);
}
EXPORT_SYMBOL_GPL(sysfs_notify_dirent);
diff --git a/fs/udf/super.c b/fs/udf/super.c
index 9d1b8c2e6c45..1e4543cbcd27 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -1078,21 +1078,39 @@ static int udf_fill_partdesc_info(struct super_block *sb,
return 0;
}
-static int udf_load_vat(struct super_block *sb, int p_index, int type1_index)
+static void udf_find_vat_block(struct super_block *sb, int p_index,
+ int type1_index, sector_t start_block)
{
struct udf_sb_info *sbi = UDF_SB(sb);
struct udf_part_map *map = &sbi->s_partmaps[p_index];
+ sector_t vat_block;
struct kernel_lb_addr ino;
+
+ /*
+ * VAT file entry is in the last recorded block. Some broken disks have
+ * it a few blocks before so try a bit harder...
+ */
+ ino.partitionReferenceNum = type1_index;
+ for (vat_block = start_block;
+ vat_block >= map->s_partition_root &&
+ vat_block >= start_block - 3 &&
+ !sbi->s_vat_inode; vat_block--) {
+ ino.logicalBlockNum = vat_block - map->s_partition_root;
+ sbi->s_vat_inode = udf_iget(sb, &ino);
+ }
+}
+
+static int udf_load_vat(struct super_block *sb, int p_index, int type1_index)
+{
+ struct udf_sb_info *sbi = UDF_SB(sb);
+ struct udf_part_map *map = &sbi->s_partmaps[p_index];
struct buffer_head *bh = NULL;
struct udf_inode_info *vati;
uint32_t pos;
struct virtualAllocationTable20 *vat20;
sector_t blocks = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits;
- /* VAT file entry is in the last recorded block */
- ino.partitionReferenceNum = type1_index;
- ino.logicalBlockNum = sbi->s_last_block - map->s_partition_root;
- sbi->s_vat_inode = udf_iget(sb, &ino);
+ udf_find_vat_block(sb, p_index, type1_index, sbi->s_last_block);
if (!sbi->s_vat_inode &&
sbi->s_last_block != blocks - 1) {
printk(KERN_NOTICE "UDF-fs: Failed to read VAT inode from the"
@@ -1100,9 +1118,7 @@ static int udf_load_vat(struct super_block *sb, int p_index, int type1_index)
"block of the device (%lu).\n",
(unsigned long)sbi->s_last_block,
(unsigned long)blocks - 1);
- ino.partitionReferenceNum = type1_index;
- ino.logicalBlockNum = blocks - 1 - map->s_partition_root;
- sbi->s_vat_inode = udf_iget(sb, &ino);
+ udf_find_vat_block(sb, p_index, type1_index, blocks - 1);
}
if (!sbi->s_vat_inode)
return 1;
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 47da2fb45377..83ebd523bf74 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -1980,7 +1980,7 @@ xlog_recover_do_reg_buffer(
"XFS: NULL dquot in %s.", __func__);
goto next;
}
- if (item->ri_buf[i].i_len < sizeof(xfs_dqblk_t)) {
+ if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) {
cmn_err(CE_ALERT,
"XFS: dquot too small (%d) in %s.",
item->ri_buf[i].i_len, __func__);
@@ -2635,7 +2635,7 @@ xlog_recover_do_dquot_trans(
"XFS: NULL dquot in %s.", __func__);
return XFS_ERROR(EIO);
}
- if (item->ri_buf[1].i_len < sizeof(xfs_dqblk_t)) {
+ if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) {
cmn_err(CE_ALERT,
"XFS: dquot too small (%d) in %s.",
item->ri_buf[1].i_len, __func__);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 45b67d9c39c1..4637dce03fab 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1268,6 +1268,7 @@ extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
extern void drm_handle_vblank(struct drm_device *dev, int crtc);
extern int drm_vblank_get(struct drm_device *dev, int crtc);
extern void drm_vblank_put(struct drm_device *dev, int crtc);
+extern void drm_vblank_off(struct drm_device *dev, int crtc);
extern void drm_vblank_cleanup(struct drm_device *dev);
/* Modesetting support */
extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
index 853508499d20..3f6e545609be 100644
--- a/include/drm/drm_pciids.h
+++ b/include/drm/drm_pciids.h
@@ -552,6 +552,7 @@
{0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
{0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
{0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
+ {0x8086, 0x2e42, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
{0x8086, 0xa001, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
{0x8086, 0xa011, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
{0x8086, 0x35e8, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
index 2046b5b8af48..f1da7e4549a0 100644
--- a/include/linux/binfmts.h
+++ b/include/linux/binfmts.h
@@ -101,6 +101,7 @@ extern int prepare_binprm(struct linux_binprm *);
extern int __must_check remove_arg_zero(struct linux_binprm *);
extern int search_binary_handler(struct linux_binprm *,struct pt_regs *);
extern int flush_old_exec(struct linux_binprm * bprm);
+extern void setup_new_exec(struct linux_binprm * bprm);
extern int suid_dumpable;
#define SUID_DUMP_DISABLE 0 /* No setuid dumping */
diff --git a/include/linux/connector.h b/include/linux/connector.h
index b68d27850d51..ecb61c40b344 100644
--- a/include/linux/connector.h
+++ b/include/linux/connector.h
@@ -24,9 +24,6 @@
#include <linux/types.h>
-#define CN_IDX_CONNECTOR 0xffffffff
-#define CN_VAL_CONNECTOR 0xffffffff
-
/*
* Process Events connector unique ids -- used for message routing
*/
@@ -73,30 +70,6 @@ struct cn_msg {
__u8 data[0];
};
-/*
- * Notify structure - requests notification about
- * registering/unregistering idx/val in range [first, first+range].
- */
-struct cn_notify_req {
- __u32 first;
- __u32 range;
-};
-
-/*
- * Main notification control message
- * *_notify_num - number of appropriate cn_notify_req structures after
- * this struct.
- * group - notification receiver's idx.
- * len - total length of the attached data.
- */
-struct cn_ctl_msg {
- __u32 idx_notify_num;
- __u32 val_notify_num;
- __u32 group;
- __u32 len;
- __u8 data[0];
-};
-
#ifdef __KERNEL__
#include <asm/atomic.h>
@@ -132,11 +105,8 @@ struct cn_callback_id {
};
struct cn_callback_data {
- void (*destruct_data) (void *);
- void *ddata;
-
- void *callback_priv;
- void (*callback) (void *);
+ struct sk_buff *skb;
+ void (*callback) (struct cn_msg *, struct netlink_skb_parms *);
void *free;
};
@@ -152,11 +122,6 @@ struct cn_callback_entry {
u32 seq, group;
};
-struct cn_ctl_entry {
- struct list_head notify_entry;
- struct cn_ctl_msg *msg;
-};
-
struct cn_dev {
struct cb_id id;
@@ -167,11 +132,11 @@ struct cn_dev {
struct cn_queue_dev *cbdev;
};
-int cn_add_callback(struct cb_id *, char *, void (*callback) (void *));
+int cn_add_callback(struct cb_id *, char *, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
void cn_del_callback(struct cb_id *);
int cn_netlink_send(struct cn_msg *, u32, gfp_t);
-int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *));
+int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(struct cn_msg *, struct netlink_skb_parms *));
void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id);
int queue_cn_work(struct cn_callback_entry *cbq, struct work_struct *work);
diff --git a/include/linux/enclosure.h b/include/linux/enclosure.h
index 4332442b1b57..cceb406d194c 100644
--- a/include/linux/enclosure.h
+++ b/include/linux/enclosure.h
@@ -42,6 +42,8 @@ enum enclosure_status {
ENCLOSURE_STATUS_NOT_INSTALLED,
ENCLOSURE_STATUS_UNKNOWN,
ENCLOSURE_STATUS_UNAVAILABLE,
+ /* last element for counting purposes */
+ ENCLOSURE_STATUS_MAX
};
/* SFF-8485 activity light settings */
diff --git a/include/linux/fec.h b/include/linux/fec.h
index 39ba482298e1..5ebd1f4742de 100644
--- a/include/linux/fec.h
+++ b/include/linux/fec.h
@@ -13,13 +13,10 @@
#ifndef __LINUX_FEC_H__
#define __LINUX_FEC_H__
-#include <linux/etherdevice.h>
#include <linux/phy.h>
struct fec_platform_data {
phy_interface_t phy;
- unsigned int phy_mask;
- unsigned char mac[ETH_ALEN];
int (*init)(void);
int (*uninit)(void);
struct regulator *vddio_reg;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 73e9b643e455..e2eeaa5cfe94 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2296,6 +2296,7 @@ extern const struct inode_operations page_symlink_inode_operations;
extern int generic_readlink(struct dentry *, char __user *, int);
extern void generic_fillattr(struct inode *, struct kstat *);
extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
+void __inode_add_bytes(struct inode *inode, loff_t bytes);
void inode_add_bytes(struct inode *inode, loff_t bytes);
void inode_sub_bytes(struct inode *inode, loff_t bytes);
loff_t inode_get_bytes(struct inode *inode);
diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h
index 8ee3006f4678..e018b0d0dfc6 100644
--- a/include/linux/fsl_devices.h
+++ b/include/linux/fsl_devices.h
@@ -93,7 +93,6 @@ struct fsl_usb2_platform_data {
void (*platform_suspend)(struct fsl_usb2_platform_data *);
void (*platform_resume)(struct fsl_usb2_platform_data *);
void (*wake_up_enable)(struct fsl_usb2_platform_data *pdata, bool on);
- void (*phy_lowpower_suspend)(bool);
void (*platform_driver_vbus)(bool on); /* platform special function for vbus shutdown/open */
unsigned big_endian_mmio : 1;
unsigned big_endian_desc : 1;
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index dc3b1328aaeb..708085aeb692 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -241,7 +241,7 @@ extern void ftrace_enable_daemon(void);
# define ftrace_set_filter(buf, len, reset) do { } while (0)
# define ftrace_disable_daemon() do { } while (0)
# define ftrace_enable_daemon() do { } while (0)
-static inline void ftrace_release(void *start, unsigned long size) { }
+static inline void ftrace_release_mod(struct module *mod) {}
static inline int register_ftrace_command(struct ftrace_func_command *cmd)
{
return -EINVAL;
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
index 4759917adc71..5c66f2e64088 100644
--- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h
@@ -448,7 +448,7 @@ extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
{
- if (likely(!timer->start_site))
+ if (likely(!timer_stats_active))
return;
timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
timer->function, timer->start_comm, 0);
@@ -459,8 +459,6 @@ extern void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer,
static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
{
- if (likely(!timer_stats_active))
- return;
__timer_stats_hrtimer_set_start_info(timer, __builtin_return_address(0));
}
diff --git a/include/linux/ipu.h b/include/linux/ipu.h
index 54a889b57f73..424f0212c69e 100644
--- a/include/linux/ipu.h
+++ b/include/linux/ipu.h
@@ -956,8 +956,6 @@ int32_t ipu_init_sync_panel(int disp,
int32_t ipu_disp_set_window_pos(ipu_channel_t channel, int16_t x_pos,
int16_t y_pos);
-int32_t ipu_disp_get_window_pos(ipu_channel_t channel, int16_t *x_pos,
- int16_t *y_pos);
int32_t ipu_disp_set_global_alpha(ipu_channel_t channel, bool enable,
uint8_t alpha);
int32_t ipu_disp_set_color_key(ipu_channel_t channel, bool enable,
diff --git a/include/linux/isdn_ppp.h b/include/linux/isdn_ppp.h
index 4c218ee7587a..8687a7dc0632 100644
--- a/include/linux/isdn_ppp.h
+++ b/include/linux/isdn_ppp.h
@@ -157,7 +157,7 @@ typedef struct {
typedef struct {
int mp_mrru; /* unused */
- struct sk_buff_head frags; /* fragments sl list */
+ struct sk_buff * frags; /* fragments sl list -- use skb->next */
long frames; /* number of frames in the frame list */
unsigned int seq; /* last processed packet seq #: any packets
* with smaller seq # will be dropped
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index 3db5d8d37485..bd3dc67c589f 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -104,6 +104,11 @@ struct kvm_run {
__u64 cr8;
__u64 apic_base;
+#ifdef __KVM_S390
+ /* the processor status word for s390 */
+ __u64 psw_mask; /* psw upper half */
+ __u64 psw_addr; /* psw lower half */
+#endif
union {
/* KVM_EXIT_UNKNOWN */
struct {
@@ -155,8 +160,6 @@ struct kvm_run {
/* KVM_EXIT_S390_SIEIC */
struct {
__u8 icptcode;
- __u64 mask; /* psw upper half */
- __u64 addr; /* psw lower half */
__u16 ipa;
__u32 ipb;
} s390_sieic;
@@ -453,6 +456,7 @@ struct kvm_irq_routing {
};
#endif
+#define KVM_CAP_S390_PSW 42
/*
* ioctls for VM fds
diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h
index 3ddce03766ca..d73109243fda 100644
--- a/include/linux/kvm_para.h
+++ b/include/linux/kvm_para.h
@@ -13,6 +13,7 @@
#define KVM_ENOSYS 1000
#define KVM_EFAULT EFAULT
#define KVM_E2BIG E2BIG
+#define KVM_EPERM EPERM
#define KVM_HC_VAPIC_POLL_IRQ 1
#define KVM_HC_MMU_OP 2
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 291bc1c9d0ed..ef3603991d6f 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -25,6 +25,7 @@ extern unsigned long max_mapnr;
#endif
extern unsigned long num_physpages;
+extern unsigned long totalram_pages;
extern void * high_memory;
extern int page_cluster;
@@ -710,7 +711,6 @@ static inline int shmem_lock(struct file *file, int lock,
}
#endif
struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags);
-void shmem_set_file(struct vm_area_struct *vma, struct file *file);
int shmem_zero_setup(struct vm_area_struct *);
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
index 9167c389779e..9d6c28cee241 100644
--- a/include/linux/mmc/card.h
+++ b/include/linux/mmc/card.h
@@ -46,10 +46,6 @@ struct mmc_ext_csd {
unsigned int sectors;
unsigned int card_type;
#define MMC_DDR_MODE_MASK (0x3<<2)
- unsigned char boot_info;
- unsigned char boot_size_mult;
- unsigned char boot_config;
- unsigned char boot_bus_width;
};
struct sd_scr {
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
index 37a51b3122df..cf97645775a0 100644
--- a/include/linux/mmc/mmc.h
+++ b/include/linux/mmc/mmc.h
@@ -250,16 +250,12 @@ struct _mmc_csd {
* EXT_CSD fields
*/
-#define EXT_CSD_BOOT_BUS_WIDTH 177 /* R/W */
-#define EXT_CSD_BOOT_CONFIG 179 /* R/W */
#define EXT_CSD_BUS_WIDTH 183 /* R/W */
#define EXT_CSD_HS_TIMING 185 /* R/W */
#define EXT_CSD_CARD_TYPE 196 /* RO */
#define EXT_CSD_REV 192 /* RO */
#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
#define EXT_CSD_S_A_TIMEOUT 217
-#define EXT_CSD_BOOT_SIZE_MULT 226 /* RO, 1 bytes */
-#define EXT_CSD_BOOT_INFO 228 /* RO, 1 bytes */
/*
* EXT_CSD field definitions
@@ -279,29 +275,6 @@ struct _mmc_csd {
#define EXT_CSD_BUS_WIDTH_4_DDR 5 /* Card is in 4 bit ddr mode */
#define EXT_CSD_BUS_WIDTH_8_DDR 6 /* Card is in 8 bit ddr mode */
-#define EXT_CSD_BOOT_BUS_WIDTH_MASK (0x1F)
-#define EXT_CSD_BOOT_BUS_WIDTH_MODE_MASK (0x3 << 3)
-#define EXT_CSD_BOOT_BUS_WIDTH_MODE_SDR_NORMAL (0x0)
-#define EXT_CSD_BOOT_BUS_WIDTH_MODE_SDR_HIGH (0x1)
-#define EXT_CSD_BOOT_BUS_WIDTH_MODE_DDR (0x2)
-#define EXT_CSD_BOOT_BUS_WIDTH_RST_WIDTH (1 << 2)
-#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH_MASK (0x3)
-#define EXT_CSD_BOOT_BUS_WIDTH_1_SDR_4_DDR (0x0)
-#define EXT_CSD_BOOT_BUS_WIDTH_4_SDR_4_DDR (0x1)
-#define EXT_CSD_BOOT_BUS_WIDTH_8_SDR_8_DDR (0x2)
-
-#define EXT_CSD_BOOT_ACK_ENABLE (0x1 << 6)
-#define EXT_CSD_BOOT_PARTITION_ENABLE_MASK (0x7 << 3)
-#define EXT_CSD_BOOT_PARTITION_DISABLE (0x0)
-#define EXT_CSD_BOOT_PARTITION_PART1 (0x1 << 3)
-#define EXT_CSD_BOOT_PARTITION_PART2 (0x2 << 3)
-#define EXT_CSD_BOOT_PARTITION_USER (0x7 << 3)
-
-#define EXT_CSD_BOOT_PARTITION_ACCESS_MASK (0x7)
-#define EXT_CSD_BOOT_PARTITION_ACCESS_DISABLE (0x0)
-#define EXT_CSD_BOOT_PARTITION_ACCESS_PART1 (0x1)
-#define EXT_CSD_BOOT_PARTITION_ACCESS_PART2 (0x2)
-
/*
* MMC_SWITCH access modes
*/
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index 6547c3cdbc4c..82a9124f7d75 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -37,7 +37,6 @@ typedef int (*param_set_fn)(const char *val, struct kernel_param *kp);
typedef int (*param_get_fn)(char *buffer, struct kernel_param *kp);
/* Flag bits for kernel_param.flags */
-#define KPARAM_KMALLOCED 1
#define KPARAM_ISBOOL 2
struct kernel_param {
diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h
index 844d77ddfb34..ce38f1caa5e1 100644
--- a/include/linux/msdos_fs.h
+++ b/include/linux/msdos_fs.h
@@ -100,7 +100,6 @@ struct __fat_dirent {
/* <linux/videotext.h> has used 0x72 ('r') in collision, so skip a few */
#define FAT_IOCTL_GET_ATTRIBUTES _IOR('r', 0x10, __u32)
#define FAT_IOCTL_SET_ATTRIBUTES _IOW('r', 0x11, __u32)
-#define VFAT_IOCTL_GET_VOLUME_ID _IOR('r', 0x12, __u32)
struct fat_boot_sector {
__u8 ignored[3]; /* Boot strap short or near jump */
@@ -138,17 +137,6 @@ struct fat_boot_fsinfo {
__le32 reserved2[4];
};
-struct fat_boot_bsx {
- __u8 drive; /* drive number */
- __u8 reserved1;
- __u8 signature; /* extended boot signature */
- __u8 vol_id[4]; /* volume ID */
- __u8 vol_label[11]; /* volume label */
- __u8 type[8]; /* file system type */
-};
-#define FAT16_BSX_OFFSET 36 /* offset of fat_boot_bsx in FAT12 and FAT16 */
-#define FAT32_BSX_OFFSET 64 /* offset of fat_boot_bsx in FAT32 */
-
struct msdos_dir_entry {
__u8 name[MSDOS_NAME];/* name and extension */
__u8 attr; /* attribute bits */
diff --git a/include/linux/mxcfb.h b/include/linux/mxcfb.h
index 0f92ad04942c..27f786e5f018 100644
--- a/include/linux/mxcfb.h
+++ b/include/linux/mxcfb.h
@@ -78,8 +78,6 @@ struct mxcfb_rect {
#define TEMP_USE_AMBIENT 0x1000
-#define FB_POWERDOWN_DISABLE -1
-
struct mxcfb_alt_buffer_data {
__u32 phys_addr;
__u32 width; /* width of entire buffer */
@@ -120,7 +118,6 @@ struct mxcfb_waveform_modes {
#define MXCFB_SET_GAMMA _IOW('F', 0x28, struct mxcfb_gamma)
#define MXCFB_GET_FB_IPU_DI _IOR('F', 0x29, u_int32_t)
#define MXCFB_GET_DIFMT _IOR('F', 0x2A, u_int32_t)
-#define MXCFB_GET_FB_BLANK _IOR('F', 0x2B, u_int32_t)
/* IOCTLs for E-ink panel updates */
#define MXCFB_SET_WAVEFORM_MODES _IOW('F', 0x2B, struct mxcfb_waveform_modes)
@@ -128,8 +125,6 @@ struct mxcfb_waveform_modes {
#define MXCFB_SET_AUTO_UPDATE_MODE _IOW('F', 0x2D, __u32)
#define MXCFB_SEND_UPDATE _IOW('F', 0x2E, struct mxcfb_update_data)
#define MXCFB_WAIT_FOR_UPDATE_COMPLETE _IOW('F', 0x2F, __u32)
-#define MXCFB_SET_PWRDOWN_DELAY _IOW('F', 0x30, int32_t)
-#define MXCFB_GET_PWRDOWN_DELAY _IOR('F', 0x31, int32_t)
#ifdef __KERNEL__
@@ -145,6 +140,5 @@ enum {
int mxcfb_set_refresh_mode(struct fb_info *fbi, int mode,
struct mxcfb_rect *update_region);
-int mxc_elcdif_frame_addr_setup(dma_addr_t phys);
#endif /* __KERNEL__ */
#endif
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 73b46b6b904f..dc4cc294b256 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -479,6 +479,9 @@
#define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361
#define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL 0x252
+#define PCI_SUBVENDOR_ID_IBM 0x1014
+#define PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT 0x03d4
+
#define PCI_VENDOR_ID_UNISYS 0x1018
#define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C
@@ -877,6 +880,7 @@
#define PCI_DEVICE_ID_APPLE_SH_SUNGEM 0x0051
#define PCI_DEVICE_ID_APPLE_U3L_AGP 0x0058
#define PCI_DEVICE_ID_APPLE_U3H_AGP 0x0059
+#define PCI_DEVICE_ID_APPLE_U4_PCIE 0x005b
#define PCI_DEVICE_ID_APPLE_IPID2_AGP 0x0066
#define PCI_DEVICE_ID_APPLE_IPID2_ATA 0x0069
#define PCI_DEVICE_ID_APPLE_IPID2_FW 0x006a
diff --git a/include/linux/quota.h b/include/linux/quota.h
index 78c48895b12a..8fd8efcb6f2e 100644
--- a/include/linux/quota.h
+++ b/include/linux/quota.h
@@ -313,8 +313,9 @@ struct dquot_operations {
int (*claim_space) (struct inode *, qsize_t);
/* release rsved quota for delayed alloc */
void (*release_rsv) (struct inode *, qsize_t);
- /* get reserved quota for delayed alloc */
- qsize_t (*get_reserved_space) (struct inode *);
+ /* get reserved quota for delayed alloc, value returned is managed by
+ * quota code only */
+ qsize_t *(*get_reserved_space) (struct inode *);
};
/* Operations handling requests from userspace */
diff --git a/include/linux/regulator/max17135.h b/include/linux/regulator/max17135.h
index 348b82b62b9f..06eaf88d2536 100644
--- a/include/linux/regulator/max17135.h
+++ b/include/linux/regulator/max17135.h
@@ -50,8 +50,6 @@ struct max17135_platform_data {
int gpio_pmic_vcom_ctrl;
int gpio_pmic_wakeup;
int gpio_pmic_intr;
- int pass_num;
- int vcom_uV;
struct regulator_init_data *regulator_init;
};
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 5c6993ea13c5..1e174cacf3e5 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1296,7 +1296,7 @@ struct task_struct {
char comm[TASK_COMM_LEN]; /* executable name excluding path
- access with [gs]et_task_comm (which lock
it with task_lock())
- - initialized normally by flush_old_exec */
+ - initialized normally by setup_new_exec */
/* file system info */
int link_count, total_link_count;
#ifdef CONFIG_SYSVIPC
@@ -1665,9 +1665,6 @@ extern cputime_t task_utime(struct task_struct *p);
extern cputime_t task_stime(struct task_struct *p);
extern cputime_t task_gtime(struct task_struct *p);
-extern int task_free_register(struct notifier_block *n);
-extern int task_free_unregister(struct notifier_block *n);
-
/*
* Per process flags
*/
@@ -2002,11 +1999,18 @@ static inline int is_si_special(const struct siginfo *info)
return info <= SEND_SIG_FORCED;
}
-/* True if we are on the alternate signal stack. */
-
+/*
+ * True if we are on the alternate signal stack.
+ */
static inline int on_sig_stack(unsigned long sp)
{
- return (sp - current->sas_ss_sp < current->sas_ss_size);
+#ifdef CONFIG_STACK_GROWSUP
+ return sp >= current->sas_ss_sp &&
+ sp - current->sas_ss_sp < current->sas_ss_size;
+#else
+ return sp > current->sas_ss_sp &&
+ sp - current->sas_ss_sp <= current->sas_ss_size;
+#endif
}
static inline int sas_ss_flags(unsigned long sp)
@@ -2481,6 +2485,28 @@ static inline void mm_init_owner(struct mm_struct *mm, struct task_struct *p)
#define TASK_STATE_TO_CHAR_STR "RSDTtZX"
+static inline unsigned long task_rlimit(const struct task_struct *tsk,
+ unsigned int limit)
+{
+ return ACCESS_ONCE(tsk->signal->rlim[limit].rlim_cur);
+}
+
+static inline unsigned long task_rlimit_max(const struct task_struct *tsk,
+ unsigned int limit)
+{
+ return ACCESS_ONCE(tsk->signal->rlim[limit].rlim_max);
+}
+
+static inline unsigned long rlimit(unsigned int limit)
+{
+ return task_rlimit(current, limit);
+}
+
+static inline unsigned long rlimit_max(unsigned int limit)
+{
+ return task_rlimit_max(current, limit);
+}
+
#endif /* __KERNEL__ */
#endif
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index f2c69a2cca17..ff06fb2b159f 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1761,6 +1761,8 @@ extern int skb_copy_datagram_const_iovec(const struct sk_buff *from,
int to_offset,
int size);
extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
+extern void skb_free_datagram_locked(struct sock *sk,
+ struct sk_buff *skb);
extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
unsigned int flags);
extern __wsum skb_checksum(const struct sk_buff *skb, int offset,
diff --git a/include/linux/sockios.h b/include/linux/sockios.h
index f4fa1a164c74..241f179347d9 100644
--- a/include/linux/sockios.h
+++ b/include/linux/sockios.h
@@ -65,7 +65,6 @@
#define SIOCDIFADDR 0x8936 /* delete PA address */
#define SIOCSIFHWBROADCAST 0x8937 /* set hardware broadcast addr */
#define SIOCGIFCOUNT 0x8938 /* get number of devices */
-#define SIOCKILLADDR 0x8939 /* kill sockets with this local addr */
#define SIOCGIFBR 0x8940 /* Bridging support */
#define SIOCSIFBR 0x8941 /* Set bridging options */
diff --git a/include/linux/tty.h b/include/linux/tty.h
index e8c6c9136c97..b982a1771141 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -185,7 +185,12 @@ struct tty_port;
struct tty_port_operations {
/* Return 1 if the carrier is raised */
int (*carrier_raised)(struct tty_port *port);
+ /* Control the DTR line */
void (*dtr_rts)(struct tty_port *port, int raise);
+ /* Called when the last close completes or a hangup finishes
+ IFF the port was initialized. Do not use to free resources */
+ void (*shutdown)(struct tty_port *port);
+ void (*drop)(struct tty_port *port);
};
struct tty_port {
@@ -457,7 +462,8 @@ extern int tty_port_block_til_ready(struct tty_port *port,
extern int tty_port_close_start(struct tty_port *port,
struct tty_struct *tty, struct file *filp);
extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty);
-
+extern void tty_port_close(struct tty_port *port,
+ struct tty_struct *tty, struct file *filp);
extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc);
extern int tty_unregister_ldisc(int disc);
extern int tty_set_ldisc(struct tty_struct *tty, int ldisc);
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
index 8f33ae3e00f3..4f6bb3d2160e 100644
--- a/include/linux/usb/composite.h
+++ b/include/linux/usb/composite.h
@@ -100,7 +100,6 @@ struct usb_function {
struct usb_descriptor_header **hs_descriptors;
struct usb_configuration *config;
- int hidden;
/* REVISIT: bind() functions can be marked __init, which
* makes trouble for section mismatch analysis. See if
diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h
index 0ec50ba62139..20b12f3207ae 100644
--- a/include/linux/usb/serial.h
+++ b/include/linux/usb/serial.h
@@ -148,6 +148,7 @@ struct usb_serial {
struct usb_interface *interface;
unsigned char disconnected:1;
unsigned char suspending:1;
+ unsigned char attached:1;
unsigned char minor;
unsigned char num_ports;
unsigned char num_port_pointers;
@@ -261,6 +262,9 @@ struct usb_serial_driver {
be an attached tty at this point */
void (*dtr_rts)(struct usb_serial_port *port, int on);
int (*carrier_raised)(struct usb_serial_port *port);
+ /* Called by the usb serial hooks to allow the user to rework the
+ termios state */
+ void (*init_termios)(struct tty_struct *tty);
/* USB events */
void (*read_int_callback)(struct urb *urb);
void (*write_int_callback)(struct urb *urb);
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index 310e18a880ff..c42eeb32058a 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -86,6 +86,7 @@ struct driver_info {
#define FLAG_FRAMING_AX 0x0040 /* AX88772/178 packets */
#define FLAG_WLAN 0x0080 /* use "wlan%d" names */
+#define FLAG_SEND_ZLP 0x0200 /* hw requires ZLPs are sent */
/* init device ... can sleep, or cause probe() failure */
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h
index 3d15fb9bc116..a4b947e470a5 100644
--- a/include/linux/usb_usual.h
+++ b/include/linux/usb_usual.h
@@ -56,7 +56,9 @@
US_FLAG(SANE_SENSE, 0x00008000) \
/* Sane Sense (> 18 bytes) */ \
US_FLAG(CAPACITY_OK, 0x00010000) \
- /* READ CAPACITY response is correct */
+ /* READ CAPACITY response is correct */ \
+ US_FLAG(BAD_SENSE, 0x00020000) \
+ /* Bad Sense (never more than 18 bytes) */
#define US_FLAG(name, value) US_FL_##name = value ,
enum { US_DO_ALL_FLAGS };
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index 59cdece3a1a4..ed3aea1605e8 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -139,10 +139,8 @@ enum {
#define ESCO_2EV5 0x0100
#define ESCO_3EV5 0x0200
-#define SCO_ESCO_MASK (ESCO_HV1 | ESCO_HV2 | ESCO_HV3)
-#define EDR_ESCO_MASK (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5)
-#define ALL_ESCO_MASK (SCO_ESCO_MASK | ESCO_EV3 | ESCO_EV4 | ESCO_EV5 | \
- EDR_ESCO_MASK)
+#define SCO_ESCO_MASK (ESCO_HV1 | ESCO_HV2 | ESCO_HV3)
+#define EDR_ESCO_MASK (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5)
/* ACL flags */
#define ACL_CONT 0x01
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 2b8fc2c58b14..25b8a0345a6a 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -187,6 +187,7 @@ struct hci_conn {
struct work_struct work_del;
struct device dev;
+ atomic_t devref;
struct hci_dev *hdev;
void *l2cap_data;
@@ -325,15 +326,12 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
void hci_add_sco(struct hci_conn *conn, __u16 handle);
void hci_setup_sync(struct hci_conn *conn, __u16 handle);
-struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type,
- __u16 pkt_type, bdaddr_t *dst);
+struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
int hci_conn_del(struct hci_conn *conn);
void hci_conn_hash_flush(struct hci_dev *hdev);
void hci_conn_check_pending(struct hci_dev *hdev);
-struct hci_conn *hci_connect(struct hci_dev *hdev, int type,
- __u16 pkt_type, bdaddr_t *dst,
- __u8 sec_level, __u8 auth_type);
+struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 sec_level, __u8 auth_type);
int hci_conn_check_link_mode(struct hci_conn *conn);
int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type);
int hci_conn_change_link_key(struct hci_conn *conn);
@@ -342,6 +340,9 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
void hci_conn_enter_active_mode(struct hci_conn *conn);
void hci_conn_enter_sniff_mode(struct hci_conn *conn);
+void hci_conn_hold_device(struct hci_conn *conn);
+void hci_conn_put_device(struct hci_conn *conn);
+
static inline void hci_conn_hold(struct hci_conn *conn)
{
atomic_inc(&conn->refcnt);
diff --git a/include/net/bluetooth/sco.h b/include/net/bluetooth/sco.h
index 924338ac3223..e28a2a771471 100644
--- a/include/net/bluetooth/sco.h
+++ b/include/net/bluetooth/sco.h
@@ -37,7 +37,6 @@
struct sockaddr_sco {
sa_family_t sco_family;
bdaddr_t sco_bdaddr;
- __u16 sco_pkt_type;
};
/* SCO socket options */
@@ -73,8 +72,7 @@ struct sco_conn {
struct sco_pinfo {
struct bt_sock bt;
- __u16 pkt_type;
-
+ __u32 flags;
struct sco_conn *conn;
};
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index f27fd83d67d8..2c161892520a 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -354,8 +354,15 @@ static inline int ipv6_prefix_equal(const struct in6_addr *a1,
struct inet_frag_queue;
+enum ip6_defrag_users {
+ IP6_DEFRAG_LOCAL_DELIVER,
+ IP6_DEFRAG_CONNTRACK_IN,
+ IP6_DEFRAG_CONNTRACK_OUT,
+};
+
struct ip6_create_arg {
__be32 id;
+ u32 user;
struct in6_addr *src;
struct in6_addr *dst;
};
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index c06104476973..5edf79254065 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1244,6 +1244,12 @@ enum ieee80211_filter_flags {
*
* These flags are used with the ampdu_action() callback in
* &struct ieee80211_ops to indicate which action is needed.
+ *
+ * Note that drivers MUST be able to deal with a TX aggregation
+ * session being stopped even before they OK'ed starting it by
+ * calling ieee80211_start_tx_ba_cb(_irqsafe), because the peer
+ * might receive the addBA frame and send a delBA right away!
+ *
* @IEEE80211_AMPDU_RX_START: start Rx aggregation
* @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation
* @IEEE80211_AMPDU_TX_START: start Tx aggregation
diff --git a/include/net/netfilter/ipv6/nf_conntrack_ipv6.h b/include/net/netfilter/ipv6/nf_conntrack_ipv6.h
index abc55ad75c2b..1ee717eb5b09 100644
--- a/include/net/netfilter/ipv6/nf_conntrack_ipv6.h
+++ b/include/net/netfilter/ipv6/nf_conntrack_ipv6.h
@@ -9,7 +9,7 @@ extern struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6;
extern int nf_ct_frag6_init(void);
extern void nf_ct_frag6_cleanup(void);
-extern struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb);
+extern struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user);
extern void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb,
struct net_device *in,
struct net_device *out,
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h
index cbdd6284996d..5cf7270e3ffc 100644
--- a/include/net/netfilter/nf_conntrack.h
+++ b/include/net/netfilter/nf_conntrack.h
@@ -255,11 +255,9 @@ static inline bool nf_ct_kill(struct nf_conn *ct)
}
/* These are for NAT. Icky. */
-/* Update TCP window tracking data when NAT mangles the packet */
-extern void nf_conntrack_tcp_update(const struct sk_buff *skb,
- unsigned int dataoff,
- struct nf_conn *ct, int dir,
- s16 offset);
+extern s16 (*nf_ct_nat_offset)(const struct nf_conn *ct,
+ enum ip_conntrack_dir dir,
+ u32 seq);
/* Fake conntrack entry for untracked connections */
extern struct nf_conn nf_conntrack_untracked;
diff --git a/include/net/netfilter/nf_nat_helper.h b/include/net/netfilter/nf_nat_helper.h
index 237a961f40e1..4222220920a5 100644
--- a/include/net/netfilter/nf_nat_helper.h
+++ b/include/net/netfilter/nf_nat_helper.h
@@ -32,4 +32,8 @@ extern int (*nf_nat_seq_adjust_hook)(struct sk_buff *skb,
* to port ct->master->saved_proto. */
extern void nf_nat_follow_master(struct nf_conn *ct,
struct nf_conntrack_expect *this);
+
+extern s16 nf_nat_get_offset(const struct nf_conn *ct,
+ enum ip_conntrack_dir dir,
+ u32 seq);
#endif
diff --git a/include/net/tcp.h b/include/net/tcp.h
index eb2ed40659c6..88af84306471 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -1396,8 +1396,6 @@ extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head,
extern int tcp_gro_complete(struct sk_buff *skb);
extern int tcp4_gro_complete(struct sk_buff *skb);
-extern void tcp_v4_nuke_addr(__u32 saddr);
-
#ifdef CONFIG_PROC_FS
extern int tcp4_proc_init(void);
extern void tcp4_proc_exit(void);
diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h
index 9b4ac9385f5d..fbc0146a7cf0 100644
--- a/include/pcmcia/ss.h
+++ b/include/pcmcia/ss.h
@@ -262,6 +262,8 @@ struct pcmcia_socket {
struct device dev;
/* data internal to the socket driver */
void *driver_data;
+ /* status of the card during resume from a system sleep state */
+ int resume_status;
};
@@ -279,7 +281,9 @@ extern struct pccard_resource_ops pccard_iodyn_ops;
extern struct pccard_resource_ops pccard_nonstatic_ops;
/* socket drivers are expected to use these callbacks in their .drv struct */
-extern int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state);
+extern int pcmcia_socket_dev_suspend(struct device *dev);
+extern void pcmcia_socket_dev_early_resume(struct device *dev);
+extern void pcmcia_socket_dev_late_resume(struct device *dev);
extern int pcmcia_socket_dev_resume(struct device *dev);
/* socket drivers use this callback in their IRQ handler */
diff --git a/include/scsi/osd_protocol.h b/include/scsi/osd_protocol.h
index 2cc8e8b1cc19..685661283540 100644
--- a/include/scsi/osd_protocol.h
+++ b/include/scsi/osd_protocol.h
@@ -17,6 +17,7 @@
#define __OSD_PROTOCOL_H__
#include <linux/types.h>
+#include <linux/kernel.h>
#include <asm/unaligned.h>
#include <scsi/scsi.h>
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index b62a097b3ecb..6cc72e2fea88 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -677,6 +677,12 @@ struct Scsi_Host {
void *shost_data;
/*
+ * Points to the physical bus device we'd use to do DMA
+ * Needed just in case we have virtual hosts.
+ */
+ struct device *dma_dev;
+
+ /*
* We should ensure that this is aligned, both for better performance
* and also because some compilers (m68k) don't automatically force
* alignment to a long boundary.
@@ -720,7 +726,9 @@ extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *);
extern void scsi_flush_work(struct Scsi_Host *);
extern struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *, int);
-extern int __must_check scsi_add_host(struct Scsi_Host *, struct device *);
+extern int __must_check scsi_add_host_with_dma(struct Scsi_Host *,
+ struct device *,
+ struct device *);
extern void scsi_scan_host(struct Scsi_Host *);
extern void scsi_rescan_device(struct device *);
extern void scsi_remove_host(struct Scsi_Host *);
@@ -731,6 +739,12 @@ extern const char *scsi_host_state_name(enum scsi_host_state);
extern u64 scsi_calculate_bounce_limit(struct Scsi_Host *);
+static inline int __must_check scsi_add_host(struct Scsi_Host *host,
+ struct device *dev)
+{
+ return scsi_add_host_with_dma(host, dev, dev);
+}
+
static inline struct device *scsi_get_device(struct Scsi_Host *shost)
{
return shost->shost_gendev.parent;
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h
index 7d8b5bc74185..824979e60677 100644
--- a/include/trace/events/ext4.h
+++ b/include/trace/events/ext4.h
@@ -5,10 +5,12 @@
#define _TRACE_EXT4_H
#include <linux/writeback.h>
-#include "../../../fs/ext4/ext4.h"
-#include "../../../fs/ext4/mballoc.h"
#include <linux/tracepoint.h>
+struct ext4_allocation_context;
+struct ext4_allocation_request;
+struct ext4_prealloc_space;
+
TRACE_EVENT(ext4_free_inode,
TP_PROTO(struct inode *inode),
@@ -229,6 +231,7 @@ TRACE_EVENT(ext4_da_writepages,
__field( char, for_reclaim )
__field( char, for_writepages )
__field( char, range_cyclic )
+ __field( pgoff_t, writeback_index )
),
TP_fast_assign(
@@ -243,14 +246,51 @@ TRACE_EVENT(ext4_da_writepages,
__entry->for_reclaim = wbc->for_reclaim;
__entry->for_writepages = wbc->for_writepages;
__entry->range_cyclic = wbc->range_cyclic;
+ __entry->writeback_index = inode->i_mapping->writeback_index;
),
- TP_printk("dev %s ino %lu nr_t_write %ld pages_skipped %ld range_start %llu range_end %llu nonblocking %d for_kupdate %d for_reclaim %d for_writepages %d range_cyclic %d",
- jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->nr_to_write,
+ TP_printk("dev %s ino %lu nr_to_write %ld pages_skipped %ld range_start %llu range_end %llu nonblocking %d for_kupdate %d for_reclaim %d for_writepages %d range_cyclic %d writeback_index %lu",
+ jbd2_dev_to_name(__entry->dev),
+ (unsigned long) __entry->ino, __entry->nr_to_write,
__entry->pages_skipped, __entry->range_start,
__entry->range_end, __entry->nonblocking,
__entry->for_kupdate, __entry->for_reclaim,
- __entry->for_writepages, __entry->range_cyclic)
+ __entry->for_writepages, __entry->range_cyclic,
+ (unsigned long) __entry->writeback_index)
+);
+
+TRACE_EVENT(ext4_da_write_pages,
+ TP_PROTO(struct inode *inode, struct mpage_da_data *mpd),
+
+ TP_ARGS(inode, mpd),
+
+ TP_STRUCT__entry(
+ __field( dev_t, dev )
+ __field( ino_t, ino )
+ __field( __u64, b_blocknr )
+ __field( __u32, b_size )
+ __field( __u32, b_state )
+ __field( unsigned long, first_page )
+ __field( int, io_done )
+ __field( int, pages_written )
+ ),
+
+ TP_fast_assign(
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->ino = inode->i_ino;
+ __entry->b_blocknr = mpd->b_blocknr;
+ __entry->b_size = mpd->b_size;
+ __entry->b_state = mpd->b_state;
+ __entry->first_page = mpd->first_page;
+ __entry->io_done = mpd->io_done;
+ __entry->pages_written = mpd->pages_written;
+ ),
+
+ TP_printk("dev %s ino %lu b_blocknr %llu b_size %u b_state 0x%04x first_page %lu io_done %d pages_written %d",
+ jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino,
+ __entry->b_blocknr, __entry->b_size,
+ __entry->b_state, __entry->first_page,
+ __entry->io_done, __entry->pages_written)
);
TRACE_EVENT(ext4_da_writepages_result,
@@ -268,6 +308,7 @@ TRACE_EVENT(ext4_da_writepages_result,
__field( char, encountered_congestion )
__field( char, more_io )
__field( char, no_nrwrite_index_update )
+ __field( pgoff_t, writeback_index )
),
TP_fast_assign(
@@ -279,13 +320,16 @@ TRACE_EVENT(ext4_da_writepages_result,
__entry->encountered_congestion = wbc->encountered_congestion;
__entry->more_io = wbc->more_io;
__entry->no_nrwrite_index_update = wbc->no_nrwrite_index_update;
+ __entry->writeback_index = inode->i_mapping->writeback_index;
),
- TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld congestion %d more_io %d no_nrwrite_index_update %d",
- jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->ret,
+ TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld congestion %d more_io %d no_nrwrite_index_update %d writeback_index %lu",
+ jbd2_dev_to_name(__entry->dev),
+ (unsigned long) __entry->ino, __entry->ret,
__entry->pages_written, __entry->pages_skipped,
__entry->encountered_congestion, __entry->more_io,
- __entry->no_nrwrite_index_update)
+ __entry->no_nrwrite_index_update,
+ (unsigned long) __entry->writeback_index)
);
TRACE_EVENT(ext4_da_write_begin,
diff --git a/init/Kconfig b/init/Kconfig
index 419134cfc80d..3f7e60995c80 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -976,15 +976,6 @@ config EVENT_PROFILE
endmenu
-config ASHMEM
- bool "Enable the Anonymous Shared Memory Subsystem"
- default n
- depends on SHMEM || TINY_SHMEM
- help
- The ashmem subsystem is a new shared memory allocator, similar to
- POSIX SHM but with different behavior and sporting a simpler
- file-based API.
-
config VM_EVENT_COUNTERS
default y
bool "Enable VM event counters for /proc/vmstat" if EMBEDDED
diff --git a/init/main.c b/init/main.c
index 4c6c9dbf65bc..82e798f1a41f 100644
--- a/init/main.c
+++ b/init/main.c
@@ -250,7 +250,7 @@ early_param("loglevel", loglevel);
/*
* Unknown boot options get handed to init, unless they look like
- * failed parameters
+ * unused parameters (modprobe will find them in /proc/cmdline).
*/
static int __init unknown_bootoption(char *param, char *val)
{
@@ -271,14 +271,9 @@ static int __init unknown_bootoption(char *param, char *val)
if (obsolete_checksetup(param))
return 0;
- /*
- * Preemptive maintenance for "why didn't my misspelled command
- * line work?"
- */
- if (strchr(param, '.') && (!val || strchr(param, '.') < val)) {
- printk(KERN_ERR "Unknown boot option `%s': ignoring\n", param);
+ /* Unused module parameter. */
+ if (strchr(param, '.') && (!val || strchr(param, '.') < val))
return 0;
- }
if (panic_later)
return 0;
@@ -691,12 +686,12 @@ asmlinkage void __init start_kernel(void)
#endif
thread_info_cache_init();
cred_init();
- fork_init(num_physpages);
+ fork_init(totalram_pages);
proc_caches_init();
buffer_init();
key_init();
security_init();
- vfs_caches_init(num_physpages);
+ vfs_caches_init(totalram_pages);
radix_tree_init();
signals_init();
/* rootfs populating might need page-writeback */
diff --git a/ipc/msg.c b/ipc/msg.c
index 2ceab7f12fcb..779f7622ebcb 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -125,6 +125,7 @@ void msg_init_ns(struct ipc_namespace *ns)
void msg_exit_ns(struct ipc_namespace *ns)
{
free_ipcs(ns, &msg_ids(ns), freeque);
+ idr_destroy(&ns->ids[IPC_MSG_IDS].ipcs_idr);
}
#endif
diff --git a/ipc/sem.c b/ipc/sem.c
index 87c2b641fd7b..2f2a47959576 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -129,6 +129,7 @@ void sem_init_ns(struct ipc_namespace *ns)
void sem_exit_ns(struct ipc_namespace *ns)
{
free_ipcs(ns, &sem_ids(ns), freeary);
+ idr_destroy(&ns->ids[IPC_SEM_IDS].ipcs_idr);
}
#endif
diff --git a/ipc/shm.c b/ipc/shm.c
index 1bc4701ef4f0..9f779ab67726 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -101,6 +101,7 @@ static void do_shm_rmid(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
void shm_exit_ns(struct ipc_namespace *ns)
{
free_ipcs(ns, &shm_ids(ns), do_shm_rmid);
+ idr_destroy(&ns->ids[IPC_SHM_IDS].ipcs_idr);
}
#endif
@@ -410,7 +411,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
return error;
no_id:
- if (shp->mlock_user) /* shmflg & SHM_HUGETLB case */
+ if (is_file_hugepages(file) && shp->mlock_user)
user_shm_unlock(size, shp->mlock_user);
fput(file);
no_file:
diff --git a/kernel/acct.c b/kernel/acct.c
index 9f3391090b3e..a6605ca921b6 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -491,13 +491,17 @@ static void do_acct_process(struct bsd_acct_struct *acct,
u64 run_time;
struct timespec uptime;
struct tty_struct *tty;
+ const struct cred *orig_cred;
+
+ /* Perform file operations on behalf of whoever enabled accounting */
+ orig_cred = override_creds(file->f_cred);
/*
* First check to see if there is enough free_space to continue
* the process accounting system.
*/
if (!check_free_space(acct, file))
- return;
+ goto out;
/*
* Fill the accounting struct with the needed info as recorded
@@ -532,7 +536,8 @@ static void do_acct_process(struct bsd_acct_struct *acct,
do_div(elapsed, AHZ);
ac.ac_btime = get_seconds() - elapsed;
/* we really need to bite the bullet and change layout */
- current_uid_gid(&ac.ac_uid, &ac.ac_gid);
+ ac.ac_uid = orig_cred->uid;
+ ac.ac_gid = orig_cred->gid;
#if ACCT_VERSION==2
ac.ac_ahz = AHZ;
#endif
@@ -578,6 +583,8 @@ static void do_acct_process(struct bsd_acct_struct *acct,
sizeof(acct_t), &file->f_pos);
current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim;
set_fs(fs);
+out:
+ revert_creds(orig_cred);
}
/**
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c
index 2451dc6f3282..4b05bd9479db 100644
--- a/kernel/audit_tree.c
+++ b/kernel/audit_tree.c
@@ -277,7 +277,7 @@ static void untag_chunk(struct node *p)
owner->root = NULL;
}
- for (i = j = 0; i < size; i++, j++) {
+ for (i = j = 0; j <= size; i++, j++) {
struct audit_tree *s;
if (&chunk->owners[j] == p) {
list_del_init(&p->list);
@@ -290,7 +290,7 @@ static void untag_chunk(struct node *p)
if (!s) /* result of earlier fallback */
continue;
get_tree(s);
- list_replace_init(&chunk->owners[i].list, &new->owners[j].list);
+ list_replace_init(&chunk->owners[j].list, &new->owners[i].list);
}
list_replace_rcu(&chunk->hash, &new->hash);
@@ -373,15 +373,17 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
for (n = 0; n < old->count; n++) {
if (old->owners[n].owner == tree) {
spin_unlock(&hash_lock);
- put_inotify_watch(watch);
+ put_inotify_watch(&old->watch);
return 0;
}
}
spin_unlock(&hash_lock);
chunk = alloc_chunk(old->count + 1);
- if (!chunk)
+ if (!chunk) {
+ put_inotify_watch(&old->watch);
return -ENOMEM;
+ }
mutex_lock(&inode->inotify_mutex);
if (inotify_clone_watch(&old->watch, &chunk->watch) < 0) {
@@ -425,7 +427,8 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
spin_unlock(&hash_lock);
inotify_evict_watch(&old->watch);
mutex_unlock(&inode->inotify_mutex);
- put_inotify_watch(&old->watch);
+ put_inotify_watch(&old->watch); /* pair to inotify_find_watch */
+ put_inotify_watch(&old->watch); /* and kill it */
return 0;
}
diff --git a/kernel/exit.c b/kernel/exit.c
index 869dc221733e..b8606f0f22e4 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -987,8 +987,6 @@ NORET_TYPE void do_exit(long code)
tsk->mempolicy = NULL;
#endif
#ifdef CONFIG_FUTEX
- if (unlikely(!list_empty(&tsk->pi_state_list)))
- exit_pi_state_list(tsk);
if (unlikely(current->pi_state_cache))
kfree(current->pi_state_cache);
#endif
diff --git a/kernel/fork.c b/kernel/fork.c
index 4c21988d6195..4b36858c0f4a 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -136,9 +136,6 @@ struct kmem_cache *vm_area_cachep;
/* SLAB cache for mm_struct structures (tsk->mm) */
static struct kmem_cache *mm_cachep;
-/* Notifier list called when a task struct is freed */
-static ATOMIC_NOTIFIER_HEAD(task_free_notifier);
-
void free_task(struct task_struct *tsk)
{
prop_local_destroy_single(&tsk->dirties);
@@ -149,18 +146,6 @@ void free_task(struct task_struct *tsk)
}
EXPORT_SYMBOL(free_task);
-int task_free_register(struct notifier_block *n)
-{
- return atomic_notifier_chain_register(&task_free_notifier, n);
-}
-EXPORT_SYMBOL(task_free_register);
-
-int task_free_unregister(struct notifier_block *n)
-{
- return atomic_notifier_chain_unregister(&task_free_notifier, n);
-}
-EXPORT_SYMBOL(task_free_unregister);
-
void __put_task_struct(struct task_struct *tsk)
{
WARN_ON(!tsk->exit_state);
@@ -171,7 +156,6 @@ void __put_task_struct(struct task_struct *tsk)
put_cred(tsk->cred);
delayacct_tsk_free(tsk);
- atomic_notifier_call_chain(&task_free_notifier, 0, tsk);
if (!profile_handoff_task(tsk))
free_task(tsk);
}
@@ -560,12 +544,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
/* Get rid of any futexes when releasing the mm */
#ifdef CONFIG_FUTEX
- if (unlikely(tsk->robust_list))
+ if (unlikely(tsk->robust_list)) {
exit_robust_list(tsk);
+ tsk->robust_list = NULL;
+ }
#ifdef CONFIG_COMPAT
- if (unlikely(tsk->compat_robust_list))
+ if (unlikely(tsk->compat_robust_list)) {
compat_exit_robust_list(tsk);
+ tsk->compat_robust_list = NULL;
+ }
#endif
+ if (unlikely(!list_empty(&tsk->pi_state_list)))
+ exit_pi_state_list(tsk);
#endif
/* Get rid of any cached register state */
diff --git a/kernel/futex.c b/kernel/futex.c
index e18cfbdc7190..fdc88aa1c5f1 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -115,6 +115,9 @@ struct futex_q {
/* rt_waiter storage for requeue_pi: */
struct rt_mutex_waiter *rt_waiter;
+ /* The expected requeue pi target futex key: */
+ union futex_key *requeue_pi_key;
+
/* Bitset for the optional bitmasked wakeup */
u32 bitset;
};
@@ -147,7 +150,8 @@ static struct futex_hash_bucket *hash_futex(union futex_key *key)
*/
static inline int match_futex(union futex_key *key1, union futex_key *key2)
{
- return (key1->both.word == key2->both.word
+ return (key1 && key2
+ && key1->both.word == key2->both.word
&& key1->both.ptr == key2->both.ptr
&& key1->both.offset == key2->both.offset);
}
@@ -299,8 +303,14 @@ void put_futex_key(int fshared, union futex_key *key)
*/
static int fault_in_user_writeable(u32 __user *uaddr)
{
- int ret = get_user_pages(current, current->mm, (unsigned long)uaddr,
- 1, 1, 0, NULL, NULL);
+ struct mm_struct *mm = current->mm;
+ int ret;
+
+ down_read(&mm->mmap_sem);
+ ret = get_user_pages(current, mm, (unsigned long)uaddr,
+ 1, 1, 0, NULL, NULL);
+ up_read(&mm->mmap_sem);
+
return ret < 0 ? ret : 0;
}
@@ -521,8 +531,25 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb,
return -EINVAL;
WARN_ON(!atomic_read(&pi_state->refcount));
- WARN_ON(pid && pi_state->owner &&
- pi_state->owner->pid != pid);
+
+ /*
+ * When pi_state->owner is NULL then the owner died
+ * and another waiter is on the fly. pi_state->owner
+ * is fixed up by the task which acquires
+ * pi_state->rt_mutex.
+ *
+ * We do not check for pid == 0 which can happen when
+ * the owner died and robust_list_exit() cleared the
+ * TID.
+ */
+ if (pid && pi_state->owner) {
+ /*
+ * Bail out if user space manipulated the
+ * futex value.
+ */
+ if (pid != task_pid_vnr(pi_state->owner))
+ return -EINVAL;
+ }
atomic_inc(&pi_state->refcount);
*ps = pi_state;
@@ -749,6 +776,13 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this)
if (!pi_state)
return -EINVAL;
+ /*
+ * If current does not own the pi_state then the futex is
+ * inconsistent and user space fiddled with the futex value.
+ */
+ if (pi_state->owner != current)
+ return -EINVAL;
+
spin_lock(&pi_state->pi_mutex.wait_lock);
new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
@@ -912,8 +946,8 @@ retry:
hb1 = hash_futex(&key1);
hb2 = hash_futex(&key2);
- double_lock_hb(hb1, hb2);
retry_private:
+ double_lock_hb(hb1, hb2);
op_ret = futex_atomic_op_inuser(op, uaddr2);
if (unlikely(op_ret < 0)) {
@@ -1024,7 +1058,6 @@ static inline
void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key,
struct futex_hash_bucket *hb)
{
- drop_futex_key_refs(&q->key);
get_futex_key_refs(key);
q->key = *key;
@@ -1089,6 +1122,10 @@ static int futex_proxy_trylock_atomic(u32 __user *pifutex,
if (!top_waiter)
return 0;
+ /* Ensure we requeue to the expected futex. */
+ if (!match_futex(top_waiter->requeue_pi_key, key2))
+ return -EINVAL;
+
/*
* Try to take the lock for top_waiter. Set the FUTEX_WAITERS bit in
* the contended case or if set_waiters is 1. The pi_state is returned
@@ -1218,6 +1255,7 @@ retry_private:
*/
if (ret == 1) {
WARN_ON(pi_state);
+ drop_count++;
task_count++;
ret = get_futex_value_locked(&curval2, uaddr2);
if (!ret)
@@ -1276,6 +1314,12 @@ retry_private:
continue;
}
+ /* Ensure we requeue to the expected futex for requeue_pi. */
+ if (requeue_pi && !match_futex(this->requeue_pi_key, &key2)) {
+ ret = -EINVAL;
+ break;
+ }
+
/*
* Requeue nr_requeue waiters and possibly one more in the case
* of requeue_pi if we couldn't acquire the lock atomically.
@@ -1290,6 +1334,7 @@ retry_private:
if (ret == 1) {
/* We got the lock. */
requeue_pi_wake_futex(this, &key2, hb2);
+ drop_count++;
continue;
} else if (ret) {
/* -EDEADLK */
@@ -1625,17 +1670,8 @@ out:
static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q,
struct hrtimer_sleeper *timeout)
{
- queue_me(q, hb);
-
- /*
- * There might have been scheduling since the queue_me(), as we
- * cannot hold a spinlock across the get_user() in case it
- * faults, and we cannot just set TASK_INTERRUPTIBLE state when
- * queueing ourselves into the futex hash. This code thus has to
- * rely on the futex_wake() code removing us from hash when it
- * wakes us up.
- */
set_current_state(TASK_INTERRUPTIBLE);
+ queue_me(q, hb);
/* Arm the timer */
if (timeout) {
@@ -1645,8 +1681,8 @@ static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q,
}
/*
- * !plist_node_empty() is safe here without any lock.
- * q.lock_ptr != 0 is not safe, because of ordering against wakeup.
+ * If we have been removed from the hash list, then another task
+ * has tried to wake us, and we can skip the call to schedule().
*/
if (likely(!plist_node_empty(&q->list))) {
/*
@@ -1751,6 +1787,7 @@ static int futex_wait(u32 __user *uaddr, int fshared,
q.pi_state = NULL;
q.bitset = bitset;
q.rt_waiter = NULL;
+ q.requeue_pi_key = NULL;
if (abs_time) {
to = &timeout;
@@ -1762,6 +1799,7 @@ static int futex_wait(u32 __user *uaddr, int fshared,
current->timer_slack_ns);
}
+retry:
/* Prepare to wait on uaddr. */
ret = futex_wait_setup(uaddr, val, fshared, &q, &hb);
if (ret)
@@ -1779,9 +1817,14 @@ static int futex_wait(u32 __user *uaddr, int fshared,
goto out_put_key;
/*
- * We expect signal_pending(current), but another thread may
- * have handled it for us already.
+ * We expect signal_pending(current), but we might be the
+ * victim of a spurious wakeup as well.
*/
+ if (!signal_pending(current)) {
+ put_futex_key(fshared, &q.key);
+ goto retry;
+ }
+
ret = -ERESTARTSYS;
if (!abs_time)
goto out_put_key;
@@ -1858,6 +1901,7 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared,
q.pi_state = NULL;
q.rt_waiter = NULL;
+ q.requeue_pi_key = NULL;
retry:
q.key = FUTEX_KEY_INIT;
ret = get_futex_key(uaddr, fshared, &q.key, VERIFY_WRITE);
@@ -1930,7 +1974,7 @@ retry_private:
/* Unqueue and drop the lock */
unqueue_me_pi(&q);
- goto out;
+ goto out_put_key;
out_unlock_put_key:
queue_unlock(&q, hb);
@@ -2087,11 +2131,12 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb,
* Unqueue the futex_q and determine which it was.
*/
plist_del(&q->list, &q->list.plist);
- drop_futex_key_refs(&q->key);
+ /* Handle spurious wakeups gracefully */
+ ret = -EWOULDBLOCK;
if (timeout && !timeout->task)
ret = -ETIMEDOUT;
- else
+ else if (signal_pending(current))
ret = -ERESTARTNOINTR;
}
return ret;
@@ -2169,15 +2214,16 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, int fshared,
debug_rt_mutex_init_waiter(&rt_waiter);
rt_waiter.task = NULL;
- q.pi_state = NULL;
- q.bitset = bitset;
- q.rt_waiter = &rt_waiter;
-
key2 = FUTEX_KEY_INIT;
ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE);
if (unlikely(ret != 0))
goto out;
+ q.pi_state = NULL;
+ q.bitset = bitset;
+ q.rt_waiter = &rt_waiter;
+ q.requeue_pi_key = &key2;
+
/* Prepare to wait on uaddr. */
ret = futex_wait_setup(uaddr, val, fshared, &q, &hb);
if (ret)
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index e8108a1a0eaf..929ecec50913 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -369,6 +369,9 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
irqreturn_t ret, retval = IRQ_NONE;
unsigned int status = 0;
+ if (!(action->flags & IRQF_DISABLED))
+ local_irq_enable_in_hardirq();
+
do {
trace_irq_handler_entry(irq, action);
ret = action->handler(irq, action->dev_id);
diff --git a/kernel/module.c b/kernel/module.c
index 2d537186191f..cda4d7667d70 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1179,7 +1179,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect,
/* Count loaded sections and allocate structures */
for (i = 0; i < nsect; i++)
- if (sechdrs[i].sh_flags & SHF_ALLOC)
+ if (sechdrs[i].sh_flags & SHF_ALLOC
+ && sechdrs[i].sh_size)
nloaded++;
size[0] = ALIGN(sizeof(*sect_attrs)
+ nloaded * sizeof(sect_attrs->attrs[0]),
@@ -1199,6 +1200,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect,
for (i = 0; i < nsect; i++) {
if (! (sechdrs[i].sh_flags & SHF_ALLOC))
continue;
+ if (!sechdrs[i].sh_size)
+ continue;
sattr->address = sechdrs[i].sh_addr;
sattr->name = kstrdup(secstrings + sechdrs[i].sh_name,
GFP_KERNEL);
diff --git a/kernel/params.c b/kernel/params.c
index 7f6912ced2ba..f04a1e70c18b 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -217,15 +217,11 @@ int param_set_charp(const char *val, struct kernel_param *kp)
return -ENOSPC;
}
- if (kp->flags & KPARAM_KMALLOCED)
- kfree(*(char **)kp->arg);
-
/* This is a hack. We can't need to strdup in early boot, and we
* don't need to; this mangled commandline is preserved. */
if (slab_is_available()) {
- kp->flags |= KPARAM_KMALLOCED;
*(char **)kp->arg = kstrdup(val, GFP_KERNEL);
- if (!kp->arg)
+ if (!*(char **)kp->arg)
return -ENOMEM;
} else
*(const char **)kp->arg = val;
@@ -303,6 +299,7 @@ static int param_array(const char *name,
unsigned int min, unsigned int max,
void *elem, int elemsize,
int (*set)(const char *, struct kernel_param *kp),
+ u16 flags,
unsigned int *num)
{
int ret;
@@ -312,6 +309,7 @@ static int param_array(const char *name,
/* Get the name right for errors. */
kp.name = name;
kp.arg = elem;
+ kp.flags = flags;
/* No equals sign? */
if (!val) {
@@ -357,7 +355,8 @@ int param_array_set(const char *val, struct kernel_param *kp)
unsigned int temp_num;
return param_array(kp->name, val, 1, arr->max, arr->elem,
- arr->elemsize, arr->set, arr->num ?: &temp_num);
+ arr->elemsize, arr->set, kp->flags,
+ arr->num ?: &temp_num);
}
int param_array_get(char *buffer, struct kernel_param *kp)
@@ -604,11 +603,7 @@ void module_param_sysfs_remove(struct module *mod)
void destroy_params(const struct kernel_param *params, unsigned num)
{
- unsigned int i;
-
- for (i = 0; i < num; i++)
- if (params[i].flags & KPARAM_KMALLOCED)
- kfree(*(char **)params[i].arg);
+ /* FIXME: This should free kmalloced charp parameters. It doesn't. */
}
static void __init kernel_add_sysfs_param(const char *name,
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
index d7cbc579fc80..237fd07a369f 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -469,7 +469,8 @@ static void update_counter_times(struct perf_counter *counter)
struct perf_counter_context *ctx = counter->ctx;
u64 run_end;
- if (counter->state < PERF_COUNTER_STATE_INACTIVE)
+ if (counter->state < PERF_COUNTER_STATE_INACTIVE ||
+ counter->group_leader->state < PERF_COUNTER_STATE_INACTIVE)
return;
counter->total_time_enabled = ctx->time - counter->tstamp_enabled;
@@ -518,7 +519,7 @@ static void __perf_counter_disable(void *info)
*/
if (counter->state >= PERF_COUNTER_STATE_INACTIVE) {
update_context_time(ctx);
- update_counter_times(counter);
+ update_group_times(counter);
if (counter == counter->group_leader)
group_sched_out(counter, cpuctx, ctx);
else
@@ -573,7 +574,7 @@ static void perf_counter_disable(struct perf_counter *counter)
* in, so we can change the state safely.
*/
if (counter->state == PERF_COUNTER_STATE_INACTIVE) {
- update_counter_times(counter);
+ update_group_times(counter);
counter->state = PERF_COUNTER_STATE_OFF;
}
@@ -851,6 +852,27 @@ retry:
}
/*
+ * Put a counter into inactive state and update time fields.
+ * Enabling the leader of a group effectively enables all
+ * the group members that aren't explicitly disabled, so we
+ * have to update their ->tstamp_enabled also.
+ * Note: this works for group members as well as group leaders
+ * since the non-leader members' sibling_lists will be empty.
+ */
+static void __perf_counter_mark_enabled(struct perf_counter *counter,
+ struct perf_counter_context *ctx)
+{
+ struct perf_counter *sub;
+
+ counter->state = PERF_COUNTER_STATE_INACTIVE;
+ counter->tstamp_enabled = ctx->time - counter->total_time_enabled;
+ list_for_each_entry(sub, &counter->sibling_list, list_entry)
+ if (sub->state >= PERF_COUNTER_STATE_INACTIVE)
+ sub->tstamp_enabled =
+ ctx->time - sub->total_time_enabled;
+}
+
+/*
* Cross CPU call to enable a performance counter
*/
static void __perf_counter_enable(void *info)
@@ -877,8 +899,7 @@ static void __perf_counter_enable(void *info)
if (counter->state >= PERF_COUNTER_STATE_INACTIVE)
goto unlock;
- counter->state = PERF_COUNTER_STATE_INACTIVE;
- counter->tstamp_enabled = ctx->time - counter->total_time_enabled;
+ __perf_counter_mark_enabled(counter, ctx);
/*
* If the counter is in a group and isn't the group leader,
@@ -971,11 +992,9 @@ static void perf_counter_enable(struct perf_counter *counter)
* Since we have the lock this context can't be scheduled
* in, so we can change the state safely.
*/
- if (counter->state == PERF_COUNTER_STATE_OFF) {
- counter->state = PERF_COUNTER_STATE_INACTIVE;
- counter->tstamp_enabled =
- ctx->time - counter->total_time_enabled;
- }
+ if (counter->state == PERF_COUNTER_STATE_OFF)
+ __perf_counter_mark_enabled(counter, ctx);
+
out:
spin_unlock_irq(&ctx->lock);
}
@@ -1344,7 +1363,7 @@ static void perf_ctx_adjust_freq(struct perf_counter_context *ctx)
u64 interrupts, freq;
spin_lock(&ctx->lock);
- list_for_each_entry(counter, &ctx->counter_list, list_entry) {
+ list_for_each_entry_rcu(counter, &ctx->counter_list, event_entry) {
if (counter->state != PERF_COUNTER_STATE_ACTIVE)
continue;
@@ -1479,9 +1498,7 @@ static void perf_counter_enable_on_exec(struct task_struct *task)
counter->attr.enable_on_exec = 0;
if (counter->state >= PERF_COUNTER_STATE_INACTIVE)
continue;
- counter->state = PERF_COUNTER_STATE_INACTIVE;
- counter->tstamp_enabled =
- ctx->time - counter->total_time_enabled;
+ __perf_counter_mark_enabled(counter, ctx);
enabled = 1;
}
@@ -4126,8 +4143,8 @@ done:
static int perf_copy_attr(struct perf_counter_attr __user *uattr,
struct perf_counter_attr *attr)
{
- int ret;
u32 size;
+ int ret;
if (!access_ok(VERIFY_WRITE, uattr, PERF_ATTR_SIZE_VER0))
return -EFAULT;
@@ -4152,25 +4169,26 @@ static int perf_copy_attr(struct perf_counter_attr __user *uattr,
/*
* If we're handed a bigger struct than we know of,
- * ensure all the unknown bits are 0.
+ * ensure all the unknown bits are 0 - i.e. new
+ * user-space does not rely on any kernel feature
+ * extensions we dont know about yet.
*/
if (size > sizeof(*attr)) {
- unsigned long val;
- unsigned long __user *addr;
- unsigned long __user *end;
+ unsigned char __user *addr;
+ unsigned char __user *end;
+ unsigned char val;
- addr = PTR_ALIGN((void __user *)uattr + sizeof(*attr),
- sizeof(unsigned long));
- end = PTR_ALIGN((void __user *)uattr + size,
- sizeof(unsigned long));
+ addr = (void __user *)uattr + sizeof(*attr);
+ end = (void __user *)uattr + size;
- for (; addr < end; addr += sizeof(unsigned long)) {
+ for (; addr < end; addr++) {
ret = get_user(val, addr);
if (ret)
return ret;
if (val)
goto err_size;
}
+ size = sizeof(*attr);
}
ret = copy_from_user(attr, uattr, size);
diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
index d089d052c4a9..187d7a6d7761 100644
--- a/kernel/posix-timers.c
+++ b/kernel/posix-timers.c
@@ -524,14 +524,7 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock,
new_timer->it_id = (timer_t) new_timer_id;
new_timer->it_clock = which_clock;
new_timer->it_overrun = -1;
- error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer));
- if (error)
- goto out;
- /*
- * return the timer_id now. The next step is hard to
- * back out if there is an error.
- */
if (copy_to_user(created_timer_id,
&new_timer_id, sizeof (new_timer_id))) {
error = -EFAULT;
@@ -562,6 +555,10 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock,
new_timer->sigq->info.si_tid = new_timer->it_id;
new_timer->sigq->info.si_code = SI_TIMER;
+ error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer));
+ if (error)
+ goto out;
+
spin_lock_irq(&current->sighand->siglock);
new_timer->it_signal = current->signal;
list_add(&new_timer->list, &current->signal->posix_timers);
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index bd007aa74549..72067cbdb37f 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -119,73 +119,6 @@ config SUSPEND_FREEZER
config HIBERNATION_NVS
bool
-config HAS_WAKELOCK
- bool
-
-config HAS_EARLYSUSPEND
- bool
-
-config WAKELOCK
- bool "Wake lock"
- depends on PM && RTC_CLASS
- default n
- select HAS_WAKELOCK
- ---help---
- Enable wakelocks. When user space request a sleep state the
- sleep request will be delayed until no wake locks are held.
-
-config WAKELOCK_STAT
- bool "Wake lock stats"
- depends on WAKELOCK
- default y
- ---help---
- Report wake lock stats in /proc/wakelocks
-
-config USER_WAKELOCK
- bool "Userspace wake locks"
- depends on WAKELOCK
- default y
- ---help---
- User-space wake lock api. Write "lockname" or "lockname timeout"
- to /sys/power/wake_lock lock and if needed create a wake lock.
- Write "lockname" to /sys/power/wake_unlock to unlock a user wake
- lock.
-
-config EARLYSUSPEND
- bool "Early suspend"
- depends on WAKELOCK
- default y
- select HAS_EARLYSUSPEND
- ---help---
- Call early suspend handlers when the user requested sleep state
- changes.
-
-choice
- prompt "User-space screen access"
- default FB_EARLYSUSPEND if !FRAMEBUFFER_CONSOLE
- default CONSOLE_EARLYSUSPEND
- depends on HAS_EARLYSUSPEND
-
- config NO_USER_SPACE_SCREEN_ACCESS_CONTROL
- bool "None"
-
- config CONSOLE_EARLYSUSPEND
- bool "Console switch on early-suspend"
- depends on HAS_EARLYSUSPEND && VT
- ---help---
- Register early suspend handler to perform a console switch to
- when user-space should stop drawing to the screen and a switch
- back when it should resume.
-
- config FB_EARLYSUSPEND
- bool "Sysfs interface"
- depends on HAS_EARLYSUSPEND
- ---help---
- Register early suspend handler that notifies and waits for
- user-space through sysfs when user-space should stop drawing
- to the screen and notifies user-space when it should resume.
-endchoice
-
config HIBERNATION
bool "Hibernation (aka 'suspend to disk')"
depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE
diff --git a/kernel/power/Makefile b/kernel/power/Makefile
index 058ec85a98bd..c3b81c30e5d5 100644
--- a/kernel/power/Makefile
+++ b/kernel/power/Makefile
@@ -12,8 +12,3 @@ obj-$(CONFIG_HIBERNATION) += swsusp.o hibernate.o snapshot.o swap.o user.o
obj-$(CONFIG_HIBERNATION_NVS) += hibernate_nvs.o
obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o
-obj-$(CONFIG_WAKELOCK) += wakelock.o
-obj-$(CONFIG_USER_WAKELOCK) += userwakelock.o
-obj-$(CONFIG_EARLYSUSPEND) += earlysuspend.o
-obj-$(CONFIG_CONSOLE_EARLYSUSPEND) += consoleearlysuspend.o
-obj-$(CONFIG_FB_EARLYSUSPEND) += fbearlysuspend.o
diff --git a/kernel/power/main.c b/kernel/power/main.c
index ef94a083302f..f710e36930cc 100644
--- a/kernel/power/main.c
+++ b/kernel/power/main.c
@@ -146,11 +146,7 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t n)
{
#ifdef CONFIG_SUSPEND
-#ifdef CONFIG_EARLYSUSPEND
- suspend_state_t state = PM_SUSPEND_ON;
-#else
suspend_state_t state = PM_SUSPEND_STANDBY;
-#endif
const char * const *s;
#endif
char *p;
@@ -172,15 +168,8 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
break;
}
if (state < PM_SUSPEND_MAX && *s)
-#ifdef CONFIG_EARLYSUSPEND
- if (state == PM_SUSPEND_ON || valid_state(state)) {
- error = 0;
- request_suspend_state(state);
- }
-#else
error = enter_state(state);
#endif
-#endif
Exit:
return error ? error : n;
@@ -213,11 +202,6 @@ pm_trace_store(struct kobject *kobj, struct kobj_attribute *attr,
power_attr(pm_trace);
#endif /* CONFIG_PM_TRACE */
-#ifdef CONFIG_USER_WAKELOCK
-power_attr(wake_lock);
-power_attr(wake_unlock);
-#endif
-
static struct attribute * g[] = {
&state_attr.attr,
#ifdef CONFIG_PM_TRACE
@@ -226,10 +210,6 @@ static struct attribute * g[] = {
#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG)
&pm_test_attr.attr,
#endif
-#ifdef CONFIG_USER_WAKELOCK
- &wake_lock_attr.attr,
- &wake_unlock_attr.attr,
-#endif
NULL,
};
diff --git a/kernel/power/power.h b/kernel/power/power.h
index a665c1e4e597..26d5a26f82e3 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -236,27 +236,3 @@ static inline void suspend_thaw_processes(void)
{
}
#endif
-
-#ifdef CONFIG_WAKELOCK
-/* kernel/power/wakelock.c */
-extern struct workqueue_struct *suspend_work_queue;
-extern struct wake_lock main_wake_lock;
-extern suspend_state_t requested_suspend_state;
-#endif
-
-#ifdef CONFIG_USER_WAKELOCK
-ssize_t wake_lock_show(struct kobject *kobj, struct kobj_attribute *attr,
- char *buf);
-ssize_t wake_lock_store(struct kobject *kobj, struct kobj_attribute *attr,
- const char *buf, size_t n);
-ssize_t wake_unlock_show(struct kobject *kobj, struct kobj_attribute *attr,
- char *buf);
-ssize_t wake_unlock_store(struct kobject *kobj, struct kobj_attribute *attr,
- const char *buf, size_t n);
-#endif
-
-#ifdef CONFIG_EARLYSUSPEND
-/* kernel/power/earlysuspend.c */
-void request_suspend_state(suspend_state_t state);
-suspend_state_t get_suspend_state(void);
-#endif
diff --git a/kernel/power/process.c b/kernel/power/process.c
index d366c35f8ba0..da2072d73811 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -13,7 +13,6 @@
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/freezer.h>
-#include <linux/wakelock.h>
/*
* Timeout for stopping processes
@@ -37,7 +36,6 @@ static int try_to_freeze_tasks(bool sig_only)
struct timeval start, end;
u64 elapsed_csecs64;
unsigned int elapsed_csecs;
- unsigned int wakeup = 0;
do_gettimeofday(&start);
@@ -64,12 +62,6 @@ static int try_to_freeze_tasks(bool sig_only)
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
yield(); /* Yield is okay here */
-#ifdef CONFIG_WAKELOCK
- if (todo && has_wake_lock(WAKE_LOCK_SUSPEND)) {
- wakeup = 1;
- break;
- }
-#endif
if (time_after(jiffies, end_time))
break;
} while (todo);
@@ -85,18 +77,11 @@ static int try_to_freeze_tasks(bool sig_only)
* and caller must call thaw_processes() if something fails),
* but it cleans up leftover PF_FREEZE requests.
*/
- if(wakeup) {
- printk("\n");
- printk(KERN_ERR "Freezing of %s aborted\n",
- sig_only ? "user space " : "tasks ");
- }
- else {
- printk("\n");
- printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
- "(%d tasks refusing to freeze):\n",
- elapsed_csecs / 100, elapsed_csecs % 100, todo);
- show_state();
- }
+ printk("\n");
+ printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
+ "(%d tasks refusing to freeze):\n",
+ elapsed_csecs / 100, elapsed_csecs % 100, todo);
+ show_state();
read_lock(&tasklist_lock);
do_each_thread(g, p) {
task_lock(p);
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index cd515ba1c8ce..6f10dfc2d3e9 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -19,9 +19,6 @@
#include "power.h"
const char *const pm_states[PM_SUSPEND_MAX] = {
-#ifdef CONFIG_EARLYSUSPEND
- [PM_SUSPEND_ON] = "on",
-#endif
[PM_SUSPEND_STANDBY] = "standby",
[PM_SUSPEND_MEM] = "mem",
};
diff --git a/kernel/sched.c b/kernel/sched.c
index 1b59e265273b..81ede13d2238 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -7945,6 +7945,7 @@ static cpumask_var_t cpu_isolated_map;
/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
+ alloc_bootmem_cpumask_var(&cpu_isolated_map);
cpulist_parse(str, cpu_isolated_map);
return 1;
}
@@ -9383,13 +9384,15 @@ void __init sched_init(void)
current->sched_class = &fair_sched_class;
/* Allocate the nohz_cpu_mask if CONFIG_CPUMASK_OFFSTACK */
- alloc_cpumask_var(&nohz_cpu_mask, GFP_NOWAIT);
+ zalloc_cpumask_var(&nohz_cpu_mask, GFP_NOWAIT);
#ifdef CONFIG_SMP
#ifdef CONFIG_NO_HZ
- alloc_cpumask_var(&nohz.cpu_mask, GFP_NOWAIT);
+ zalloc_cpumask_var(&nohz.cpu_mask, GFP_NOWAIT);
alloc_cpumask_var(&nohz.ilb_grp_nohz_mask, GFP_NOWAIT);
#endif
- alloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT);
+ /* May be allocated at isolcpus cmdline parse time */
+ if (cpu_isolated_map == NULL)
+ zalloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT);
#endif /* SMP */
perf_counter_init();
diff --git a/kernel/signal.c b/kernel/signal.c
index 64c5deeaca5d..86464ce4ceba 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -939,7 +939,8 @@ static void print_fatal_signal(struct pt_regs *regs, int signr)
for (i = 0; i < 16; i++) {
unsigned char insn;
- __get_user(insn, (unsigned char *)(regs->ip + i));
+ if (get_user(insn, (unsigned char *)(regs->ip + i)))
+ break;
printk("%02x ", insn);
}
}
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
index 620b58abdc32..0d809ae02d60 100644
--- a/kernel/time/clockevents.c
+++ b/kernel/time/clockevents.c
@@ -20,6 +20,8 @@
#include <linux/sysdev.h>
#include <linux/tick.h>
+#include "tick-internal.h"
+
/* The registered clock event devices */
static LIST_HEAD(clockevent_devices);
static LIST_HEAD(clockevents_released);
@@ -237,8 +239,9 @@ void clockevents_exchange_device(struct clock_event_device *old,
*/
void clockevents_notify(unsigned long reason, void *arg)
{
- struct list_head *node, *tmp;
+ struct clock_event_device *dev, *tmp;
unsigned long flags;
+ int cpu;
spin_lock_irqsave(&clockevents_lock, flags);
clockevents_do_notify(reason, arg);
@@ -249,8 +252,20 @@ void clockevents_notify(unsigned long reason, void *arg)
* Unregister the clock event devices which were
* released from the users in the notify chain.
*/
- list_for_each_safe(node, tmp, &clockevents_released)
- list_del(node);
+ list_for_each_entry_safe(dev, tmp, &clockevents_released, list)
+ list_del(&dev->list);
+ /*
+ * Now check whether the CPU has left unused per cpu devices
+ */
+ cpu = *((int *)arg);
+ list_for_each_entry_safe(dev, tmp, &clockevent_devices, list) {
+ if (cpumask_test_cpu(cpu, dev->cpumask) &&
+ cpumask_weight(dev->cpumask) == 1 &&
+ !tick_is_broadcast_device(dev)) {
+ BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED);
+ list_del(&dev->list);
+ }
+ }
break;
default:
break;
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index e0f59a21c061..89aed5933ed4 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -231,6 +231,13 @@ void tick_nohz_stop_sched_tick(int inidle)
if (!inidle && !ts->inidle)
goto end;
+ /*
+ * Set ts->inidle unconditionally. Even if the system did not
+ * switch to NOHZ mode the cpu frequency governers rely on the
+ * update of the idle time accounting in tick_nohz_start_idle().
+ */
+ ts->inidle = 1;
+
now = tick_nohz_start_idle(ts);
/*
@@ -248,8 +255,6 @@ void tick_nohz_stop_sched_tick(int inidle)
if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
goto end;
- ts->inidle = 1;
-
if (need_resched())
goto end;
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 25edd5cc5935..52eb25189928 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1110,14 +1110,9 @@ static void ftrace_replace_code(int enable)
failed = __ftrace_replace_code(rec, enable);
if (failed) {
rec->flags |= FTRACE_FL_FAILED;
- if ((system_state == SYSTEM_BOOTING) ||
- !core_kernel_text(rec->ip)) {
- ftrace_free_rec(rec);
- } else {
- ftrace_bug(failed, rec->ip);
- /* Stop processing */
- return;
- }
+ ftrace_bug(failed, rec->ip);
+ /* Stop processing */
+ return;
}
} while_for_each_ftrace_rec();
}
@@ -2801,19 +2796,17 @@ static int ftrace_convert_nops(struct module *mod,
}
#ifdef CONFIG_MODULES
-void ftrace_release(void *start, void *end)
+void ftrace_release_mod(struct module *mod)
{
struct dyn_ftrace *rec;
struct ftrace_page *pg;
- unsigned long s = (unsigned long)start;
- unsigned long e = (unsigned long)end;
- if (ftrace_disabled || !start || start == end)
+ if (ftrace_disabled)
return;
mutex_lock(&ftrace_lock);
do_for_each_ftrace_rec(pg, rec) {
- if ((rec->ip >= s) && (rec->ip < e)) {
+ if (within_module_core(rec->ip, mod)) {
/*
* rec->ip is changed in ftrace_free_rec()
* It should not between s and e if record was freed.
@@ -2845,9 +2838,7 @@ static int ftrace_module_notify(struct notifier_block *self,
mod->num_ftrace_callsites);
break;
case MODULE_STATE_GOING:
- ftrace_release(mod->ftrace_callsites,
- mod->ftrace_callsites +
- mod->num_ftrace_callsites);
+ ftrace_release_mod(mod);
break;
}
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index f32dc9d1ea7b..a6b0d73a0d9d 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -844,8 +844,9 @@ static void postfix_clear(struct filter_parse_state *ps)
while (!list_empty(&ps->postfix)) {
elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
- kfree(elt->operand);
list_del(&elt->list);
+ kfree(elt->operand);
+ kfree(elt);
}
}
diff --git a/kernel/user.c b/kernel/user.c
index 2c000e7132ac..46d0165ca70c 100644
--- a/kernel/user.c
+++ b/kernel/user.c
@@ -330,9 +330,9 @@ done:
*/
static void free_user(struct user_struct *up, unsigned long flags)
{
- spin_unlock_irqrestore(&uidhash_lock, flags);
INIT_DELAYED_WORK(&up->work, cleanup_user_struct);
schedule_delayed_work(&up->work, msecs_to_jiffies(1000));
+ spin_unlock_irqrestore(&uidhash_lock, flags);
}
#else /* CONFIG_USER_SCHED && CONFIG_SYSFS */
diff --git a/mm/Makefile b/mm/Makefile
index f4e009cba6a5..5e0bd6426693 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -22,7 +22,6 @@ obj-$(CONFIG_HUGETLBFS) += hugetlb.o
obj-$(CONFIG_NUMA) += mempolicy.o
obj-$(CONFIG_SPARSEMEM) += sparse.o
obj-$(CONFIG_SPARSEMEM_VMEMMAP) += sparse-vmemmap.o
-obj-$(CONFIG_ASHMEM) += ashmem.o
obj-$(CONFIG_TMPFS_POSIX_ACL) += shmem_acl.o
obj-$(CONFIG_SLOB) += slob.o
obj-$(CONFIG_MMU_NOTIFIER) += mmu_notifier.o
diff --git a/mm/highmem.c b/mm/highmem.c
index 25878cc49daa..9c1e627f282e 100644
--- a/mm/highmem.c
+++ b/mm/highmem.c
@@ -426,16 +426,21 @@ void __init page_address_init(void)
void debug_kmap_atomic(enum km_type type)
{
- static unsigned warn_count = 10;
+ static int warn_count = 10;
- if (unlikely(warn_count == 0))
+ if (unlikely(warn_count < 0))
return;
if (unlikely(in_interrupt())) {
- if (in_irq()) {
+ if (in_nmi()) {
+ if (type != KM_NMI && type != KM_NMI_PTE) {
+ WARN_ON(1);
+ warn_count--;
+ }
+ } else if (in_irq()) {
if (type != KM_IRQ0 && type != KM_IRQ1 &&
type != KM_BIO_SRC_IRQ && type != KM_BIO_DST_IRQ &&
- type != KM_BOUNCE_READ) {
+ type != KM_BOUNCE_READ && type != KM_IRQ_PTE) {
WARN_ON(1);
warn_count--;
}
@@ -452,7 +457,9 @@ void debug_kmap_atomic(enum km_type type)
}
if (type == KM_IRQ0 || type == KM_IRQ1 || type == KM_BOUNCE_READ ||
- type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ) {
+ type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ ||
+ type == KM_IRQ_PTE || type == KM_NMI ||
+ type == KM_NMI_PTE ) {
if (!irqs_disabled()) {
WARN_ON(1);
warn_count--;
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index cafdcee154e8..cae03370a8ea 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1010,6 +1010,7 @@ int __weak alloc_bootmem_huge_page(struct hstate *h)
NODE_DATA(h->hugetlb_next_nid),
huge_page_size(h), huge_page_size(h), 0);
+ hstate_next_node(h);
if (addr) {
/*
* Use the beginning of the huge page to store the
@@ -1019,7 +1020,6 @@ int __weak alloc_bootmem_huge_page(struct hstate *h)
m = addr;
goto found;
}
- hstate_next_node(h);
nr_nodes--;
}
return 0;
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index fd4529d86de5..566925e7cdbd 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -496,7 +496,13 @@ int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem)
task_unlock(task);
if (!curr)
return 0;
- if (curr->use_hierarchy)
+ /*
+ * We should check use_hierarchy of "mem" not "curr". Because checking
+ * use_hierarchy of "curr" here make this function true if hierarchy is
+ * enabled in "curr" and "curr" is a child of "mem" in *cgroup*
+ * hierarchy(even if use_hierarchy is disabled in "mem").
+ */
+ if (mem->use_hierarchy)
ret = css_is_ancestor(&curr->css, &mem->css);
else
ret = (curr == mem);
diff --git a/mm/memory.c b/mm/memory.c
index aede2ce3aba4..753b2e6ffd28 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2638,7 +2638,8 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
goto oom_free_page;
entry = mk_pte(page, vma->vm_page_prot);
- entry = maybe_mkwrite(pte_mkdirty(entry), vma);
+ if (vma->vm_flags & VM_WRITE)
+ entry = pte_mkwrite(pte_mkdirty(entry));
page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
if (!pte_none(*page_table))
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 7dd9d9f80694..f29d8d70884d 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1024,7 +1024,7 @@ static long do_mbind(unsigned long start, unsigned long len,
err = migrate_prep();
if (err)
- return err;
+ goto mpol_out;
}
{
NODEMASK_SCRATCH(scratch);
@@ -1039,10 +1039,9 @@ static long do_mbind(unsigned long start, unsigned long len,
err = -ENOMEM;
NODEMASK_SCRATCH_FREE(scratch);
}
- if (err) {
- mpol_put(new);
- return err;
- }
+ if (err)
+ goto mpol_out;
+
vma = check_range(mm, start, end, nmask,
flags | MPOL_MF_INVERT, &pagelist);
@@ -1058,9 +1057,11 @@ static long do_mbind(unsigned long start, unsigned long len,
if (!err && nr_failed && (flags & MPOL_MF_STRICT))
err = -EIO;
- }
+ } else
+ putback_lru_pages(&pagelist);
up_write(&mm->mmap_sem);
+ mpol_out:
mpol_put(new);
return err;
}
@@ -2121,8 +2122,8 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
char *rest = nodelist;
while (isdigit(*rest))
rest++;
- if (!*rest)
- err = 0;
+ if (*rest)
+ goto out;
}
break;
case MPOL_INTERLEAVE:
@@ -2131,7 +2132,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
*/
if (!nodelist)
nodes = node_states[N_HIGH_MEMORY];
- err = 0;
break;
case MPOL_LOCAL:
/*
@@ -2141,11 +2141,19 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
goto out;
mode = MPOL_PREFERRED;
break;
-
- /*
- * case MPOL_BIND: mpol_new() enforces non-empty nodemask.
- * case MPOL_DEFAULT: mpol_new() enforces empty nodemask, ignores flags.
- */
+ case MPOL_DEFAULT:
+ /*
+ * Insist on a empty nodelist
+ */
+ if (!nodelist)
+ err = 0;
+ goto out;
+ case MPOL_BIND:
+ /*
+ * Insist on a nodelist
+ */
+ if (!nodelist)
+ goto out;
}
mode_flags = 0;
@@ -2159,13 +2167,14 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
else if (!strcmp(flags, "relative"))
mode_flags |= MPOL_F_RELATIVE_NODES;
else
- err = 1;
+ goto out;
}
new = mpol_new(mode, mode_flags, &nodes);
if (IS_ERR(new))
- err = 1;
- else {
+ goto out;
+
+ {
int ret;
NODEMASK_SCRATCH(scratch);
if (scratch) {
@@ -2176,13 +2185,15 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
ret = -ENOMEM;
NODEMASK_SCRATCH_FREE(scratch);
if (ret) {
- err = 1;
mpol_put(new);
- } else if (no_context) {
- /* save for contextualization */
- new->w.user_nodemask = nodes;
+ goto out;
}
}
+ err = 0;
+ if (no_context) {
+ /* save for contextualization */
+ new->w.user_nodemask = nodes;
+ }
out:
/* Restore string for error message */
diff --git a/mm/migrate.c b/mm/migrate.c
index 939888f9ddab..eebfb79d7748 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -597,7 +597,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private,
struct page *newpage = get_new_page(page, private, &result);
int rcu_locked = 0;
int charge = 0;
- struct mem_cgroup *mem;
+ struct mem_cgroup *mem = NULL;
if (!newpage)
return -ENOMEM;
@@ -937,6 +937,9 @@ static int do_pages_move(struct mm_struct *mm, struct task_struct *task,
goto out_pm;
err = -ENODEV;
+ if (node < 0 || node >= MAX_NUMNODES)
+ goto out_pm;
+
if (!node_state(node, N_HIGH_MEMORY))
goto out_pm;
diff --git a/mm/mincore.c b/mm/mincore.c
index 8cb508f84ea4..7a3436ef39eb 100644
--- a/mm/mincore.c
+++ b/mm/mincore.c
@@ -14,6 +14,7 @@
#include <linux/syscalls.h>
#include <linux/swap.h>
#include <linux/swapops.h>
+#include <linux/hugetlb.h>
#include <asm/uaccess.h>
#include <asm/pgtable.h>
@@ -72,6 +73,42 @@ static long do_mincore(unsigned long addr, unsigned char *vec, unsigned long pag
if (!vma || addr < vma->vm_start)
return -ENOMEM;
+#ifdef CONFIG_HUGETLB_PAGE
+ if (is_vm_hugetlb_page(vma)) {
+ struct hstate *h;
+ unsigned long nr_huge;
+ unsigned char present;
+
+ i = 0;
+ nr = min(pages, (vma->vm_end - addr) >> PAGE_SHIFT);
+ h = hstate_vma(vma);
+ nr_huge = ((addr + pages * PAGE_SIZE - 1) >> huge_page_shift(h))
+ - (addr >> huge_page_shift(h)) + 1;
+ nr_huge = min(nr_huge,
+ (vma->vm_end - addr) >> huge_page_shift(h));
+ while (1) {
+ /* hugepage always in RAM for now,
+ * but generally it needs to be check */
+ ptep = huge_pte_offset(current->mm,
+ addr & huge_page_mask(h));
+ present = !!(ptep &&
+ !huge_pte_none(huge_ptep_get(ptep)));
+ while (1) {
+ vec[i++] = present;
+ addr += PAGE_SIZE;
+ /* reach buffer limit */
+ if (i == nr)
+ return nr;
+ /* check hugepage border */
+ if (!((addr & ~huge_page_mask(h))
+ >> PAGE_SHIFT))
+ break;
+ }
+ }
+ return nr;
+ }
+#endif
+
/*
* Calculate how many pages there are left in the last level of the
* PTE array for our address.
diff --git a/mm/mlock.c b/mm/mlock.c
index 45eb650b9654..e13918d4fc4f 100644
--- a/mm/mlock.c
+++ b/mm/mlock.c
@@ -139,49 +139,36 @@ static void munlock_vma_page(struct page *page)
}
/**
- * __mlock_vma_pages_range() - mlock/munlock a range of pages in the vma.
+ * __mlock_vma_pages_range() - mlock a range of pages in the vma.
* @vma: target vma
* @start: start address
* @end: end address
- * @mlock: 0 indicate munlock, otherwise mlock.
*
- * If @mlock == 0, unlock an mlocked range;
- * else mlock the range of pages. This takes care of making the pages present ,
- * too.
+ * This takes care of making the pages present too.
*
* return 0 on success, negative error code on error.
*
* vma->vm_mm->mmap_sem must be held for at least read.
*/
static long __mlock_vma_pages_range(struct vm_area_struct *vma,
- unsigned long start, unsigned long end,
- int mlock)
+ unsigned long start, unsigned long end)
{
struct mm_struct *mm = vma->vm_mm;
unsigned long addr = start;
struct page *pages[16]; /* 16 gives a reasonable batch */
int nr_pages = (end - start) / PAGE_SIZE;
int ret = 0;
- int gup_flags = 0;
+ int gup_flags;
VM_BUG_ON(start & ~PAGE_MASK);
VM_BUG_ON(end & ~PAGE_MASK);
VM_BUG_ON(start < vma->vm_start);
VM_BUG_ON(end > vma->vm_end);
- VM_BUG_ON((!rwsem_is_locked(&mm->mmap_sem)) &&
- (atomic_read(&mm->mm_users) != 0));
-
- /*
- * mlock: don't page populate if vma has PROT_NONE permission.
- * munlock: always do munlock although the vma has PROT_NONE
- * permission, or SIGKILL is pending.
- */
- if (!mlock)
- gup_flags |= GUP_FLAGS_IGNORE_VMA_PERMISSIONS |
- GUP_FLAGS_IGNORE_SIGKILL;
+ VM_BUG_ON(!rwsem_is_locked(&mm->mmap_sem));
+ gup_flags = 0;
if (vma->vm_flags & VM_WRITE)
- gup_flags |= GUP_FLAGS_WRITE;
+ gup_flags = GUP_FLAGS_WRITE;
while (nr_pages > 0) {
int i;
@@ -201,19 +188,10 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma,
* This can happen for, e.g., VM_NONLINEAR regions before
* a page has been allocated and mapped at a given offset,
* or for addresses that map beyond end of a file.
- * We'll mlock the the pages if/when they get faulted in.
+ * We'll mlock the pages if/when they get faulted in.
*/
if (ret < 0)
break;
- if (ret == 0) {
- /*
- * We know the vma is there, so the only time
- * we cannot get a single page should be an
- * error (ret < 0) case.
- */
- WARN_ON(1);
- break;
- }
lru_add_drain(); /* push cached pages to LRU */
@@ -224,28 +202,22 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma,
/*
* Because we lock page here and migration is blocked
* by the elevated reference, we need only check for
- * page truncation (file-cache only).
+ * file-cache page truncation. This page->mapping
+ * check also neatly skips over the ZERO_PAGE(),
+ * though if that's common we'd prefer not to lock it.
*/
- if (page->mapping) {
- if (mlock)
- mlock_vma_page(page);
- else
- munlock_vma_page(page);
- }
+ if (page->mapping)
+ mlock_vma_page(page);
unlock_page(page);
- put_page(page); /* ref from get_user_pages() */
-
- /*
- * here we assume that get_user_pages() has given us
- * a list of virtually contiguous pages.
- */
- addr += PAGE_SIZE; /* for next get_user_pages() */
- nr_pages--;
+ put_page(page); /* ref from get_user_pages() */
}
+
+ addr += ret * PAGE_SIZE;
+ nr_pages -= ret;
ret = 0;
}
- return ret; /* count entire vma as locked_vm */
+ return ret; /* 0 or negative error code */
}
/*
@@ -289,7 +261,7 @@ long mlock_vma_pages_range(struct vm_area_struct *vma,
is_vm_hugetlb_page(vma) ||
vma == get_gate_vma(current))) {
- __mlock_vma_pages_range(vma, start, end, 1);
+ __mlock_vma_pages_range(vma, start, end);
/* Hide errors from mmap() and other callers */
return 0;
@@ -310,7 +282,6 @@ no_mlock:
return nr_pages; /* error or pages NOT mlocked */
}
-
/*
* munlock_vma_pages_range() - munlock all pages in the vma range.'
* @vma - vma containing range to be munlock()ed.
@@ -330,10 +301,24 @@ no_mlock:
* free them. This will result in freeing mlocked pages.
*/
void munlock_vma_pages_range(struct vm_area_struct *vma,
- unsigned long start, unsigned long end)
+ unsigned long start, unsigned long end)
{
+ unsigned long addr;
+
+ lru_add_drain();
vma->vm_flags &= ~VM_LOCKED;
- __mlock_vma_pages_range(vma, start, end, 0);
+
+ for (addr = start; addr < end; addr += PAGE_SIZE) {
+ struct page *page = follow_page(vma, addr, FOLL_GET);
+ if (page) {
+ lock_page(page);
+ if (page->mapping)
+ munlock_vma_page(page);
+ unlock_page(page);
+ put_page(page);
+ }
+ cond_resched();
+ }
}
/*
@@ -400,18 +385,14 @@ success:
* It's okay if try_to_unmap_one unmaps a page just after we
* set VM_LOCKED, __mlock_vma_pages_range will bring it back.
*/
- vma->vm_flags = newflags;
if (lock) {
- ret = __mlock_vma_pages_range(vma, start, end, 1);
-
- if (ret > 0) {
- mm->locked_vm -= ret;
- ret = 0;
- } else
- ret = __mlock_posix_error_return(ret); /* translate if needed */
+ vma->vm_flags = newflags;
+ ret = __mlock_vma_pages_range(vma, start, end);
+ if (ret < 0)
+ ret = __mlock_posix_error_return(ret);
} else {
- __mlock_vma_pages_range(vma, start, end, 0);
+ munlock_vma_pages_range(vma, start, end);
}
out:
diff --git a/mm/mmap.c b/mm/mmap.c
index 8101de490c73..cbb7cb308243 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -570,9 +570,9 @@ again: remove_next = 1 + (end > next->vm_end);
/*
* When changing only vma->vm_end, we don't really need
- * anon_vma lock: but is that case worth optimizing out?
+ * anon_vma lock.
*/
- if (vma->anon_vma)
+ if (vma->anon_vma && (insert || importer || start != vma->vm_start))
anon_vma = vma->anon_vma;
if (anon_vma) {
spin_lock(&anon_vma->lock);
diff --git a/mm/nommu.c b/mm/nommu.c
index 66e81e7e9fe9..10cdd4c61292 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -1056,7 +1056,7 @@ static int do_mmap_shared_file(struct vm_area_struct *vma)
ret = vma->vm_file->f_op->mmap(vma->vm_file, vma);
if (ret == 0) {
vma->vm_region->vm_top = vma->vm_region->vm_end;
- return ret;
+ return 0;
}
if (ret != -ENOSYS)
return ret;
@@ -1073,7 +1073,8 @@ static int do_mmap_shared_file(struct vm_area_struct *vma)
*/
static int do_mmap_private(struct vm_area_struct *vma,
struct vm_region *region,
- unsigned long len)
+ unsigned long len,
+ unsigned long capabilities)
{
struct page *pages;
unsigned long total, point, n, rlen;
@@ -1084,13 +1085,13 @@ static int do_mmap_private(struct vm_area_struct *vma,
* shared mappings on devices or memory
* - VM_MAYSHARE will be set if it may attempt to share
*/
- if (vma->vm_file) {
+ if (capabilities & BDI_CAP_MAP_DIRECT) {
ret = vma->vm_file->f_op->mmap(vma->vm_file, vma);
if (ret == 0) {
/* shouldn't return success if we're not sharing */
BUG_ON(!(vma->vm_flags & VM_MAYSHARE));
vma->vm_region->vm_top = vma->vm_region->vm_end;
- return ret;
+ return 0;
}
if (ret != -ENOSYS)
return ret;
@@ -1328,7 +1329,7 @@ unsigned long do_mmap_pgoff(struct file *file,
* - this is the hook for quasi-memory character devices to
* tell us the location of a shared mapping
*/
- if (file && file->f_op->get_unmapped_area) {
+ if (capabilities & BDI_CAP_MAP_DIRECT) {
addr = file->f_op->get_unmapped_area(file, addr, len,
pgoff, flags);
if (IS_ERR((void *) addr)) {
@@ -1352,15 +1353,17 @@ unsigned long do_mmap_pgoff(struct file *file,
}
vma->vm_region = region;
- add_nommu_region(region);
- /* set up the mapping */
+ /* set up the mapping
+ * - the region is filled in if BDI_CAP_MAP_DIRECT is still set
+ */
if (file && vma->vm_flags & VM_SHARED)
ret = do_mmap_shared_file(vma);
else
- ret = do_mmap_private(vma, region, len);
+ ret = do_mmap_private(vma, region, len, capabilities);
if (ret < 0)
- goto error_put_region;
+ goto error_just_free;
+ add_nommu_region(region);
/* okay... we have a mapping; now we have to register it */
result = vma->vm_start;
@@ -1378,25 +1381,14 @@ share:
kleave(" = %lx", result);
return result;
-error_put_region:
- __put_nommu_region(region);
- if (vma) {
- if (vma->vm_file) {
- fput(vma->vm_file);
- if (vma->vm_flags & VM_EXECUTABLE)
- removed_exe_file_vma(vma->vm_mm);
- }
- kmem_cache_free(vm_area_cachep, vma);
- }
- kleave(" = %d [pr]", ret);
- return ret;
-
error_just_free:
up_write(&nommu_region_sem);
error:
- fput(region->vm_file);
+ if (region->vm_file)
+ fput(region->vm_file);
kmem_cache_free(vm_region_jar, region);
- fput(vma->vm_file);
+ if (vma->vm_file)
+ fput(vma->vm_file);
if (vma->vm_flags & VM_EXECUTABLE)
removed_exe_file_vma(vma->vm_mm);
kmem_cache_free(vm_area_cachep, vma);
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index a7b2460e922b..ed452e9485d4 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -400,7 +400,7 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
cpuset_print_task_mems_allowed(current);
task_unlock(current);
dump_stack();
- mem_cgroup_print_oom_info(mem, current);
+ mem_cgroup_print_oom_info(mem, p);
show_mem();
if (sysctl_oom_dump_tasks)
dump_tasks(mem);
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index a0de15f46987..d04c8428c364 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1167,10 +1167,10 @@ again:
}
spin_lock_irqsave(&zone->lock, flags);
page = __rmqueue(zone, order, migratetype);
- __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order));
spin_unlock(&zone->lock);
if (!page)
goto failed;
+ __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order));
}
__count_zone_vm_events(PGALLOC, zone, 1 << order);
@@ -1715,7 +1715,7 @@ gfp_to_alloc_flags(gfp_t gfp_mask)
* See also cpuset_zone_allowed() comment in kernel/cpuset.c.
*/
alloc_flags &= ~ALLOC_CPUSET;
- } else if (unlikely(rt_task(p)))
+ } else if (unlikely(rt_task(p)) && !in_interrupt())
alloc_flags |= ALLOC_HARDER;
if (likely(!(gfp_mask & __GFP_NOMEMALLOC))) {
@@ -1763,6 +1763,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
if (NUMA_BUILD && (gfp_mask & GFP_THISNODE) == GFP_THISNODE)
goto nopage;
+restart:
wake_all_kswapd(order, zonelist, high_zoneidx);
/*
@@ -1772,7 +1773,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
*/
alloc_flags = gfp_to_alloc_flags(gfp_mask);
-restart:
/* This is the last chance, in general, before the goto nopage. */
page = get_page_from_freelist(gfp_mask, nodemask, order, zonelist,
high_zoneidx, alloc_flags & ~ALLOC_NO_WATERMARKS,
@@ -2783,7 +2783,8 @@ static void setup_zone_migrate_reserve(struct zone *zone)
{
unsigned long start_pfn, pfn, end_pfn;
struct page *page;
- unsigned long reserve, block_migratetype;
+ unsigned long block_migratetype;
+ int reserve;
/* Get the start pfn, end pfn and the number of blocks to reserve */
start_pfn = zone->zone_start_pfn;
@@ -2791,6 +2792,15 @@ static void setup_zone_migrate_reserve(struct zone *zone)
reserve = roundup(min_wmark_pages(zone), pageblock_nr_pages) >>
pageblock_order;
+ /*
+ * Reserve blocks are generally in place to help high-order atomic
+ * allocations that are short-lived. A min_free_kbytes value that
+ * would result in more than 2 reserve blocks for atomic allocations
+ * is assumed to be in place to help anti-fragmentation for the
+ * future allocation of hugepages at runtime.
+ */
+ reserve = min(2, reserve);
+
for (pfn = start_pfn; pfn < end_pfn; pfn += pageblock_nr_pages) {
if (!pfn_valid(pfn))
continue;
diff --git a/mm/pagewalk.c b/mm/pagewalk.c
index d5878bed7841..a286915e23ef 100644
--- a/mm/pagewalk.c
+++ b/mm/pagewalk.c
@@ -1,6 +1,7 @@
#include <linux/mm.h>
#include <linux/highmem.h>
#include <linux/sched.h>
+#include <linux/hugetlb.h>
static int walk_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
struct mm_walk *walk)
@@ -107,6 +108,7 @@ int walk_page_range(unsigned long addr, unsigned long end,
pgd_t *pgd;
unsigned long next;
int err = 0;
+ struct vm_area_struct *vma;
if (addr >= end)
return err;
@@ -117,11 +119,22 @@ int walk_page_range(unsigned long addr, unsigned long end,
pgd = pgd_offset(walk->mm, addr);
do {
next = pgd_addr_end(addr, end);
+
+ /* skip hugetlb vma to avoid hugepage PMD being cleared
+ * in pmd_none_or_clear_bad(). */
+ vma = find_vma(walk->mm, addr);
+ if (vma && is_vm_hugetlb_page(vma)) {
+ if (vma->vm_end < next)
+ next = vma->vm_end;
+ continue;
+ }
+
if (pgd_none_or_clear_bad(pgd)) {
if (walk->pte_hole)
err = walk->pte_hole(addr, next, walk);
if (err)
break;
+ pgd++;
continue;
}
if (walk->pgd_entry)
@@ -131,7 +144,8 @@ int walk_page_range(unsigned long addr, unsigned long end,
err = walk_pud_range(pgd, addr, next, walk);
if (err)
break;
- } while (pgd++, addr = next, addr != end);
+ pgd++;
+ } while (addr = next, addr != end);
return err;
}
diff --git a/mm/shmem.c b/mm/shmem.c
index fb7861108d31..d713239ce2ce 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2668,14 +2668,6 @@ put_memory:
}
EXPORT_SYMBOL_GPL(shmem_file_setup);
-void shmem_set_file(struct vm_area_struct *vma, struct file *file)
-{
- if (vma->vm_file)
- fput(vma->vm_file);
- vma->vm_file = file;
- vma->vm_ops = &shmem_vm_ops;
-}
-
/**
* shmem_zero_setup - setup a shared anonymous mapping
* @vma: the vma to be mmapped is prepared by do_mmap_pgoff
@@ -2688,8 +2680,11 @@ int shmem_zero_setup(struct vm_area_struct *vma)
file = shmem_file_setup("dev/zero", size, vma->vm_flags);
if (IS_ERR(file))
return PTR_ERR(file);
- shmem_set_file(vma, file);
+ if (vma->vm_file)
+ fput(vma->vm_file);
+ vma->vm_file = file;
+ vma->vm_ops = &shmem_vm_ops;
return 0;
}
diff --git a/mm/slab.c b/mm/slab.c
index 7b5d4deacfcd..7dfa481c96ba 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -1384,7 +1384,7 @@ void __init kmem_cache_init(void)
* Fragmentation resistance on low memory - only use bigger
* page orders on machines with more than 32MB of memory.
*/
- if (num_physpages > (32 << 20) >> PAGE_SHIFT)
+ if (totalram_pages > (32 << 20) >> PAGE_SHIFT)
slab_break_gfp_order = BREAK_GFP_ORDER_HI;
/* Bootstrap is tricky, because several objects are allocated
diff --git a/mm/swap.c b/mm/swap.c
index cb29ae5d33ab..9387f17f99c5 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -496,7 +496,7 @@ EXPORT_SYMBOL(pagevec_lookup_tag);
*/
void __init swap_setup(void)
{
- unsigned long megs = num_physpages >> (20 - PAGE_SHIFT);
+ unsigned long megs = totalram_pages >> (20 - PAGE_SHIFT);
#ifdef CONFIG_SWAP
bdi_init(swapper_space.backing_dev_info);
diff --git a/mm/swap_state.c b/mm/swap_state.c
index 42cd38eba79f..0313a135f2a1 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -66,10 +66,10 @@ void show_swap_cache_info(void)
}
/*
- * add_to_swap_cache resembles add_to_page_cache_locked on swapper_space,
+ * __add_to_swap_cache resembles add_to_page_cache_locked on swapper_space,
* but sets SwapCache flag and private instead of mapping and index.
*/
-int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
+static int __add_to_swap_cache(struct page *page, swp_entry_t entry)
{
int error;
@@ -77,28 +77,37 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
VM_BUG_ON(PageSwapCache(page));
VM_BUG_ON(!PageSwapBacked(page));
+ page_cache_get(page);
+ SetPageSwapCache(page);
+ set_page_private(page, entry.val);
+
+ spin_lock_irq(&swapper_space.tree_lock);
+ error = radix_tree_insert(&swapper_space.page_tree, entry.val, page);
+ if (likely(!error)) {
+ total_swapcache_pages++;
+ __inc_zone_page_state(page, NR_FILE_PAGES);
+ INC_CACHE_INFO(add_total);
+ }
+ spin_unlock_irq(&swapper_space.tree_lock);
+
+ if (unlikely(error)) {
+ set_page_private(page, 0UL);
+ ClearPageSwapCache(page);
+ page_cache_release(page);
+ }
+
+ return error;
+}
+
+
+int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
+{
+ int error;
+
error = radix_tree_preload(gfp_mask);
if (!error) {
- page_cache_get(page);
- SetPageSwapCache(page);
- set_page_private(page, entry.val);
-
- spin_lock_irq(&swapper_space.tree_lock);
- error = radix_tree_insert(&swapper_space.page_tree,
- entry.val, page);
- if (likely(!error)) {
- total_swapcache_pages++;
- __inc_zone_page_state(page, NR_FILE_PAGES);
- INC_CACHE_INFO(add_total);
- }
- spin_unlock_irq(&swapper_space.tree_lock);
+ error = __add_to_swap_cache(page, entry);
radix_tree_preload_end();
-
- if (unlikely(error)) {
- set_page_private(page, 0UL);
- ClearPageSwapCache(page);
- page_cache_release(page);
- }
}
return error;
}
@@ -289,13 +298,24 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
}
/*
+ * call radix_tree_preload() while we can wait.
+ */
+ err = radix_tree_preload(gfp_mask & GFP_KERNEL);
+ if (err)
+ break;
+
+ /*
* Swap entry may have been freed since our caller observed it.
*/
err = swapcache_prepare(entry);
- if (err == -EEXIST) /* seems racy */
+ if (err == -EEXIST) { /* seems racy */
+ radix_tree_preload_end();
continue;
- if (err) /* swp entry is obsolete ? */
+ }
+ if (err) { /* swp entry is obsolete ? */
+ radix_tree_preload_end();
break;
+ }
/*
* Associate the page with swap entry in the swap cache.
@@ -307,8 +327,9 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
*/
__set_page_locked(new_page);
SetPageSwapBacked(new_page);
- err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL);
+ err = __add_to_swap_cache(new_page, entry);
if (likely(!err)) {
+ radix_tree_preload_end();
/*
* Initiate read into locked page and return.
*/
@@ -316,6 +337,7 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
swap_readpage(new_page);
return new_page;
}
+ radix_tree_preload_end();
ClearPageSwapBacked(new_page);
__clear_page_locked(new_page);
swapcache_free(entry, NULL);
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 8ffdc0d23c53..b47ccd77f050 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -1149,8 +1149,7 @@ static int try_to_unuse(unsigned int type)
} else
retval = unuse_mm(mm, entry, page);
- if (set_start_mm &&
- swap_count(*swap_map) < swcount) {
+ if (set_start_mm && *swap_map < swcount) {
mmput(new_start_mm);
atomic_inc(&mm->mm_users);
new_start_mm = mm;
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index f8189a4b3e13..f603667f5d02 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -546,10 +546,8 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,
}
rcu_read_unlock();
- if (nr) {
- BUG_ON(nr > atomic_read(&vmap_lazy_nr));
+ if (nr)
atomic_sub(nr, &vmap_lazy_nr);
- }
if (nr || force_flush)
flush_tlb_kernel_range(*start, *end);
@@ -1368,7 +1366,7 @@ void *vmap(struct page **pages, unsigned int count,
might_sleep();
- if (count > num_physpages)
+ if (count > totalram_pages)
return NULL;
area = get_vm_area_caller((count << PAGE_SHIFT), flags,
@@ -1475,7 +1473,7 @@ static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot,
unsigned long real_size = size;
size = PAGE_ALIGN(size);
- if (!size || (size >> PAGE_SHIFT) > num_physpages)
+ if (!size || (size >> PAGE_SHIFT) > totalram_pages)
return NULL;
area = __get_vm_area_node(size, VM_ALLOC, VMALLOC_START, VMALLOC_END,
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 94e86dd6954c..95f35a7d1f05 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1298,7 +1298,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,
* IO, plus JVM can create lots of anon VM_EXEC pages,
* so we ignore them here.
*/
- if ((vm_flags & VM_EXEC) && !PageAnon(page)) {
+ if ((vm_flags & VM_EXEC) && page_is_file_cache(page)) {
list_add(&page->lru, &l_active);
continue;
}
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index fe649081fbdc..db09b9466354 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -287,8 +287,11 @@ out_uninit_applicant:
if (ngrp)
vlan_gvrp_uninit_applicant(real_dev);
out_free_group:
- if (ngrp)
- vlan_group_free(ngrp);
+ if (ngrp) {
+ hlist_del_rcu(&ngrp->hlist);
+ /* Free the group, after all cpu's are done. */
+ call_rcu(&ngrp->rcu, vlan_rcu_free);
+ }
return err;
}
diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c
index 89f99d3beb60..9d4adfd22757 100644
--- a/net/appletalk/aarp.c
+++ b/net/appletalk/aarp.c
@@ -599,7 +599,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
/* Non ELAP we cannot do. */
if (dev->type != ARPHRD_ETHER)
- return -1;
+ goto free_it;
skb->dev = dev;
skb->protocol = htons(ETH_P_ATALK);
@@ -634,7 +634,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
if (!a) {
/* Whoops slipped... good job it's an unreliable protocol 8) */
write_unlock_bh(&aarp_lock);
- return -1;
+ goto free_it;
}
/* Set up the queue */
@@ -663,15 +663,21 @@ out_unlock:
write_unlock_bh(&aarp_lock);
/* Tell the ddp layer we have taken over for this frame. */
- return 0;
+ goto sent;
sendit:
if (skb->sk)
skb->priority = skb->sk->sk_priority;
- dev_queue_xmit(skb);
+ if (dev_queue_xmit(skb))
+ goto drop;
sent:
- return 1;
+ return NET_XMIT_SUCCESS;
+free_it:
+ kfree_skb(skb);
+drop:
+ return NET_XMIT_DROP;
}
+EXPORT_SYMBOL(aarp_send_ddp);
/*
* An entry in the aarp unresolved queue has become resolved. Send
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
index 875eda5dbad7..0e165443ab0f 100644
--- a/net/appletalk/ddp.c
+++ b/net/appletalk/ddp.c
@@ -1270,8 +1270,10 @@ static int handle_ip_over_ddp(struct sk_buff *skb)
struct net_device_stats *stats;
/* This needs to be able to handle ipddp"N" devices */
- if (!dev)
- return -ENODEV;
+ if (!dev) {
+ kfree_skb(skb);
+ return NET_RX_DROP;
+ }
skb->protocol = htons(ETH_P_IP);
skb_pull(skb, 13);
@@ -1281,8 +1283,7 @@ static int handle_ip_over_ddp(struct sk_buff *skb)
stats = netdev_priv(dev);
stats->rx_packets++;
stats->rx_bytes += skb->len + 13;
- netif_rx(skb); /* Send the SKB up to a higher place. */
- return 0;
+ return netif_rx(skb); /* Send the SKB up to a higher place. */
}
#else
/* make it easy for gcc to optimize this test out, i.e. kill the code */
@@ -1290,9 +1291,8 @@ static int handle_ip_over_ddp(struct sk_buff *skb)
#define handle_ip_over_ddp(skb) 0
#endif
-static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
- struct ddpehdr *ddp, __u16 len_hops,
- int origlen)
+static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
+ struct ddpehdr *ddp, __u16 len_hops, int origlen)
{
struct atalk_route *rt;
struct atalk_addr ta;
@@ -1359,8 +1359,6 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
/* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */
struct sk_buff *nskb = skb_realloc_headroom(skb, 32);
kfree_skb(skb);
- if (!nskb)
- goto out;
skb = nskb;
} else
skb = skb_unshare(skb, GFP_ATOMIC);
@@ -1369,12 +1367,18 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
* If the buffer didn't vanish into the lack of space bitbucket we can
* send it.
*/
- if (skb && aarp_send_ddp(rt->dev, skb, &ta, NULL) == -1)
- goto free_it;
-out:
- return;
+ if (skb == NULL)
+ goto drop;
+
+ /*
+ * It is OK, NET_XMIT_SUCCESS == NET_RX_SUCCESS and
+ * NET_XMIT_DROP == NET_RX_DROP
+ */
+ return aarp_send_ddp(rt->dev, skb, &ta, NULL);
free_it:
kfree_skb(skb);
+drop:
+ return NET_RX_DROP;
}
/**
@@ -1404,7 +1408,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
/* Don't mangle buffer if shared */
if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
- goto out;
+ goto drop;
/* Size check and make sure header is contiguous */
if (!pskb_may_pull(skb, sizeof(*ddp)))
@@ -1448,8 +1452,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
/* Not ours, so we route the packet via the correct
* AppleTalk iface
*/
- atalk_route_packet(skb, dev, ddp, len_hops, origlen);
- goto out;
+ return atalk_route_packet(skb, dev, ddp, len_hops, origlen);
}
/* if IP over DDP is not selected this code will be optimized out */
@@ -1472,11 +1475,12 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
if (sock_queue_rcv_skb(sock, skb) < 0)
goto freeit;
-out:
- return 0;
+
+ return NET_RX_SUCCESS;
freeit:
kfree_skb(skb);
- goto out;
+drop:
+ return NET_RX_DROP;
}
/*
@@ -1652,10 +1656,10 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
if (skb2) {
loopback = 1;
SOCK_DEBUG(sk, "SK %p: send out(copy).\n", sk);
- if (aarp_send_ddp(dev, skb2,
- &usat->sat_addr, NULL) == -1)
- kfree_skb(skb2);
- /* else queued/sent above in the aarp queue */
+ /*
+ * If it fails it is queued/sent above in the aarp queue
+ */
+ aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL);
}
}
@@ -1685,9 +1689,10 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
usat = &gsat;
}
- if (aarp_send_ddp(dev, skb, &usat->sat_addr, NULL) == -1)
- kfree_skb(skb);
- /* else queued/sent above in the aarp queue */
+ /*
+ * If it fails it is queued/sent above in the aarp queue
+ */
+ aarp_send_ddp(dev, skb, &usat->sat_addr, NULL);
}
SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len);
@@ -1865,7 +1870,6 @@ static struct packet_type ppptalk_packet_type __read_mostly = {
static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B };
/* Export symbols for use by drivers when AppleTalk is a module */
-EXPORT_SYMBOL(aarp_send_ddp);
EXPORT_SYMBOL(atrtr_get_dev);
EXPORT_SYMBOL(atalk_find_dev_addr);
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
index da0f64f82b57..f8969febab72 100644
--- a/net/ax25/af_ax25.c
+++ b/net/ax25/af_ax25.c
@@ -538,7 +538,7 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
if (level != SOL_AX25)
return -ENOPROTOOPT;
- if (optlen < sizeof(int))
+ if (optlen < (int)sizeof(int))
return -EINVAL;
if (get_user(opt, (int __user *)optval))
@@ -893,7 +893,6 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
sock_init_data(NULL, sk);
- sk->sk_destruct = ax25_free_sock;
sk->sk_type = osk->sk_type;
sk->sk_priority = osk->sk_priority;
sk->sk_protocol = osk->sk_protocol;
@@ -931,6 +930,7 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
}
sk->sk_protinfo = ax25;
+ sk->sk_destruct = ax25_free_sock;
ax25->sk = sk;
return sk;
@@ -1781,8 +1781,8 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
ax25_info.n2count = ax25->n2count;
ax25_info.state = ax25->state;
- ax25_info.rcv_q = sk_wmem_alloc_get(sk);
- ax25_info.snd_q = sk_rmem_alloc_get(sk);
+ ax25_info.rcv_q = sk_rmem_alloc_get(sk);
+ ax25_info.snd_q = sk_wmem_alloc_get(sk);
ax25_info.vs = ax25->vs;
ax25_info.vr = ax25->vr;
ax25_info.va = ax25->va;
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 6b25e6eaed19..a9750984f772 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -196,8 +196,7 @@ static void hci_conn_idle(unsigned long arg)
hci_conn_enter_sniff_mode(conn);
}
-struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type,
- __u16 pkt_type, bdaddr_t *dst)
+struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
{
struct hci_conn *conn;
@@ -221,22 +220,14 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type,
conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK;
break;
case SCO_LINK:
- if (!pkt_type)
- pkt_type = SCO_ESCO_MASK;
+ if (lmp_esco_capable(hdev))
+ conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
+ (hdev->esco_type & EDR_ESCO_MASK);
+ else
+ conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
+ break;
case ESCO_LINK:
- if (!pkt_type)
- pkt_type = ALL_ESCO_MASK;
- if (lmp_esco_capable(hdev)) {
- /* HCI Setup Synchronous Connection Command uses
- reverse logic on the EDR_ESCO_MASK bits */
- conn->pkt_type = (pkt_type ^ EDR_ESCO_MASK) &
- hdev->esco_type;
- } else {
- /* Legacy HCI Add Sco Connection Command uses a
- shifted bitmask */
- conn->pkt_type = (pkt_type << 5) & hdev->pkt_type &
- SCO_PTYPE_MASK;
- }
+ conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK;
break;
}
@@ -255,6 +246,8 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type,
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
+ atomic_set(&conn->devref, 0);
+
hci_conn_init_sysfs(conn);
tasklet_enable(&hdev->tx_task);
@@ -297,7 +290,7 @@ int hci_conn_del(struct hci_conn *conn)
skb_queue_purge(&conn->data_q);
- hci_conn_del_sysfs(conn);
+ hci_conn_put_device(conn);
hci_dev_put(hdev);
@@ -346,9 +339,7 @@ EXPORT_SYMBOL(hci_get_route);
/* Create SCO or ACL connection.
* Device _must_ be locked */
-struct hci_conn *hci_connect(struct hci_dev *hdev, int type,
- __u16 pkt_type, bdaddr_t *dst,
- __u8 sec_level, __u8 auth_type)
+struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 sec_level, __u8 auth_type)
{
struct hci_conn *acl;
struct hci_conn *sco;
@@ -356,7 +347,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type,
BT_DBG("%s dst %s", hdev->name, batostr(dst));
if (!(acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst))) {
- if (!(acl = hci_conn_add(hdev, ACL_LINK, 0, dst)))
+ if (!(acl = hci_conn_add(hdev, ACL_LINK, dst)))
return NULL;
}
@@ -372,7 +363,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type,
return acl;
if (!(sco = hci_conn_hash_lookup_ba(hdev, type, dst))) {
- if (!(sco = hci_conn_add(hdev, type, pkt_type, dst))) {
+ if (!(sco = hci_conn_add(hdev, type, dst))) {
hci_conn_put(acl);
return NULL;
}
@@ -594,6 +585,19 @@ void hci_conn_check_pending(struct hci_dev *hdev)
hci_dev_unlock(hdev);
}
+void hci_conn_hold_device(struct hci_conn *conn)
+{
+ atomic_inc(&conn->devref);
+}
+EXPORT_SYMBOL(hci_conn_hold_device);
+
+void hci_conn_put_device(struct hci_conn *conn)
+{
+ if (atomic_dec_and_test(&conn->devref))
+ hci_conn_del_sysfs(conn);
+}
+EXPORT_SYMBOL(hci_conn_put_device);
+
int hci_get_conn_list(void __user *arg)
{
struct hci_conn_list_req req, *cl;
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 39f13cc05e5c..e99fe385fba2 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -579,7 +579,7 @@ static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
}
} else {
if (!conn) {
- conn = hci_conn_add(hdev, ACL_LINK, 0, &cp->bdaddr);
+ conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
if (conn) {
conn->out = 1;
conn->link_mode |= HCI_LM_MASTER;
@@ -887,6 +887,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
} else
conn->state = BT_CONNECTED;
+ hci_conn_hold_device(conn);
hci_conn_add_sysfs(conn);
if (test_bit(HCI_AUTH, &hdev->flags))
@@ -963,9 +964,7 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk
conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
if (!conn) {
- /* pkt_type not yet used for incoming connections */
- if (!(conn = hci_conn_add(hdev, ev->link_type, 0,
- &ev->bdaddr))) {
+ if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) {
BT_ERR("No memmory for new connection");
hci_dev_unlock(hdev);
return;
@@ -1695,6 +1694,7 @@ static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_bu
conn->handle = __le16_to_cpu(ev->handle);
conn->state = BT_CONNECTED;
+ hci_conn_hold_device(conn);
hci_conn_add_sysfs(conn);
break;
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
index b18676870d55..9f1e765cc558 100644
--- a/net/bluetooth/hidp/core.c
+++ b/net/bluetooth/hidp/core.c
@@ -40,6 +40,7 @@
#include <linux/input.h>
#include <linux/hid.h>
+#include <linux/hidraw.h>
#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
@@ -92,10 +93,14 @@ static void __hidp_link_session(struct hidp_session *session)
{
__module_get(THIS_MODULE);
list_add(&session->list, &hidp_session_list);
+
+ hci_conn_hold_device(session->conn);
}
static void __hidp_unlink_session(struct hidp_session *session)
{
+ hci_conn_put_device(session->conn);
+
list_del(&session->list);
module_put(THIS_MODULE);
}
@@ -573,7 +578,11 @@ static int hidp_session(void *arg)
if (session->hid) {
if (session->hid->claimed & HID_CLAIMED_INPUT)
hidinput_disconnect(session->hid);
+ if (session->hid->claimed & HID_CLAIMED_HIDRAW)
+ hidraw_disconnect(session->hid);
+
hid_destroy_device(session->hid);
+ session->hid = NULL;
}
/* Wakeup user-space polling for socket errors */
@@ -601,25 +610,27 @@ static struct device *hidp_get_device(struct hidp_session *session)
{
bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src;
bdaddr_t *dst = &bt_sk(session->ctrl_sock->sk)->dst;
+ struct device *device = NULL;
struct hci_dev *hdev;
- struct hci_conn *conn;
hdev = hci_get_route(dst, src);
if (!hdev)
return NULL;
- conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
+ session->conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
+ if (session->conn)
+ device = &session->conn->dev;
hci_dev_put(hdev);
- return conn ? &conn->dev : NULL;
+ return device;
}
static int hidp_setup_input(struct hidp_session *session,
struct hidp_connadd_req *req)
{
struct input_dev *input;
- int i;
+ int err, i;
input = input_allocate_device();
if (!input)
@@ -666,7 +677,13 @@ static int hidp_setup_input(struct hidp_session *session,
input->event = hidp_input_event;
- return input_register_device(input);
+ err = input_register_device(input);
+ if (err < 0) {
+ hci_conn_put_device(session->conn);
+ return err;
+ }
+
+ return 0;
}
static int hidp_open(struct hid_device *hid)
@@ -748,13 +765,11 @@ static int hidp_setup_hid(struct hidp_session *session,
{
struct hid_device *hid;
bdaddr_t src, dst;
- int ret;
+ int err;
hid = hid_allocate_device();
- if (IS_ERR(hid)) {
- ret = PTR_ERR(session->hid);
- goto err;
- }
+ if (IS_ERR(hid))
+ return PTR_ERR(session->hid);
session->hid = hid;
session->req = req;
@@ -776,16 +791,17 @@ static int hidp_setup_hid(struct hidp_session *session,
hid->dev.parent = hidp_get_device(session);
hid->ll_driver = &hidp_hid_driver;
- ret = hid_add_device(hid);
- if (ret)
- goto err_hid;
+ err = hid_add_device(hid);
+ if (err < 0)
+ goto failed;
return 0;
-err_hid:
+
+failed:
hid_destroy_device(hid);
session->hid = NULL;
-err:
- return ret;
+
+ return err;
}
int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock)
@@ -835,13 +851,13 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock,
if (req->rd_size > 0) {
err = hidp_setup_hid(session, req);
if (err && err != -ENODEV)
- goto err_skb;
+ goto purge;
}
if (!session->hid) {
err = hidp_setup_input(session, req);
if (err < 0)
- goto err_skb;
+ goto purge;
}
__hidp_link_session(session);
@@ -869,13 +885,20 @@ unlink:
__hidp_unlink_session(session);
- if (session->input)
+ if (session->input) {
input_unregister_device(session->input);
- if (session->hid)
+ session->input = NULL;
+ }
+
+ if (session->hid) {
hid_destroy_device(session->hid);
-err_skb:
+ session->hid = NULL;
+ }
+
+purge:
skb_queue_purge(&session->ctrl_transmit);
skb_queue_purge(&session->intr_transmit);
+
failed:
up_write(&hidp_session_sem);
diff --git a/net/bluetooth/hidp/hidp.h b/net/bluetooth/hidp/hidp.h
index e503c89057ad..faf3d74c3586 100644
--- a/net/bluetooth/hidp/hidp.h
+++ b/net/bluetooth/hidp/hidp.h
@@ -126,6 +126,8 @@ int hidp_get_conninfo(struct hidp_conninfo *ci);
struct hidp_session {
struct list_head list;
+ struct hci_conn *conn;
+
struct socket *ctrl_sock;
struct socket *intr_sock;
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
index d780295364da..bd0a4c1bced0 100644
--- a/net/bluetooth/l2cap.c
+++ b/net/bluetooth/l2cap.c
@@ -403,8 +403,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
struct sock *parent = bt_sk(sk)->parent;
rsp.result = cpu_to_le16(L2CAP_CR_PEND);
rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
- if (parent)
- parent->sk_data_ready(parent, 0);
+ parent->sk_data_ready(parent, 0);
} else {
sk->sk_state = BT_CONFIG;
@@ -897,7 +896,7 @@ static int l2cap_do_connect(struct sock *sk)
}
}
- hcon = hci_connect(hdev, ACL_LINK, 0, dst,
+ hcon = hci_connect(hdev, ACL_LINK, dst,
l2cap_pi(sk)->sec_level, auth_type);
if (!hcon)
goto done;
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
index 4e6e1c637de9..94b3388c188b 100644
--- a/net/bluetooth/rfcomm/core.c
+++ b/net/bluetooth/rfcomm/core.c
@@ -448,6 +448,7 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
break;
case BT_OPEN:
+ case BT_CONNECT2:
if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
set_bit(RFCOMM_AUTH_REJECT, &d->flags);
rfcomm_schedule(RFCOMM_SCHED_AUTH);
@@ -1193,6 +1194,8 @@ void rfcomm_dlc_accept(struct rfcomm_dlc *d)
rfcomm_send_ua(d->session, d->dlci);
+ rfcomm_dlc_clear_timer(d);
+
rfcomm_dlc_lock(d);
d->state = BT_CONNECTED;
d->state_change(d, 0);
@@ -1210,6 +1213,11 @@ static void rfcomm_check_accept(struct rfcomm_dlc *d)
if (d->defer_setup) {
set_bit(RFCOMM_DEFER_SETUP, &d->flags);
rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
+
+ rfcomm_dlc_lock(d);
+ d->state = BT_CONNECT2;
+ d->state_change(d, 0);
+ rfcomm_dlc_unlock(d);
} else
rfcomm_dlc_accept(d);
} else {
@@ -1751,6 +1759,11 @@ static inline void rfcomm_process_dlcs(struct rfcomm_session *s)
if (d->defer_setup) {
set_bit(RFCOMM_DEFER_SETUP, &d->flags);
rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
+
+ rfcomm_dlc_lock(d);
+ d->state = BT_CONNECT2;
+ d->state_change(d, 0);
+ rfcomm_dlc_unlock(d);
} else
rfcomm_dlc_accept(d);
}
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 98d9d07ddbff..51ae0c3e470a 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -176,7 +176,6 @@ static int sco_connect(struct sock *sk)
{
bdaddr_t *src = &bt_sk(sk)->src;
bdaddr_t *dst = &bt_sk(sk)->dst;
- __u16 pkt_type = sco_pi(sk)->pkt_type;
struct sco_conn *conn;
struct hci_conn *hcon;
struct hci_dev *hdev;
@@ -193,13 +192,10 @@ static int sco_connect(struct sock *sk)
if (lmp_esco_capable(hdev) && !disable_esco)
type = ESCO_LINK;
- else {
+ else
type = SCO_LINK;
- pkt_type &= SCO_ESCO_MASK;
- }
- hcon = hci_connect(hdev, type, pkt_type, dst,
- BT_SECURITY_LOW, HCI_AT_NO_BONDING);
+ hcon = hci_connect(hdev, type, dst, BT_SECURITY_LOW, HCI_AT_NO_BONDING);
if (!hcon)
goto done;
@@ -460,22 +456,18 @@ static int sco_sock_create(struct net *net, struct socket *sock, int protocol)
return 0;
}
-static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
+static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
{
- struct sockaddr_sco sa;
+ struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
struct sock *sk = sock->sk;
- bdaddr_t *src = &sa.sco_bdaddr;
- int len, err = 0;
+ bdaddr_t *src = &sa->sco_bdaddr;
+ int err = 0;
- BT_DBG("sk %p %s", sk, batostr(&sa.sco_bdaddr));
+ BT_DBG("sk %p %s", sk, batostr(&sa->sco_bdaddr));
if (!addr || addr->sa_family != AF_BLUETOOTH)
return -EINVAL;
- memset(&sa, 0, sizeof(sa));
- len = min_t(unsigned int, sizeof(sa), alen);
- memcpy(&sa, addr, len);
-
lock_sock(sk);
if (sk->sk_state != BT_OPEN) {
@@ -489,8 +481,7 @@ static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
err = -EADDRINUSE;
} else {
/* Save source address */
- bacpy(&bt_sk(sk)->src, &sa.sco_bdaddr);
- sco_pi(sk)->pkt_type = sa.sco_pkt_type;
+ bacpy(&bt_sk(sk)->src, &sa->sco_bdaddr);
sk->sk_state = BT_BOUND;
}
@@ -503,34 +494,26 @@ done:
static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
{
+ struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
struct sock *sk = sock->sk;
- struct sockaddr_sco sa;
- int len, err = 0;
+ int err = 0;
+
BT_DBG("sk %p", sk);
- if (!addr || addr->sa_family != AF_BLUETOOTH)
+ if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_sco))
return -EINVAL;
- memset(&sa, 0, sizeof(sa));
- len = min_t(unsigned int, sizeof(sa), alen);
- memcpy(&sa, addr, len);
-
- lock_sock(sk);
+ if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
+ return -EBADFD;
- if (sk->sk_type != SOCK_SEQPACKET) {
- err = -EINVAL;
- goto done;
- }
+ if (sk->sk_type != SOCK_SEQPACKET)
+ return -EINVAL;
- if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) {
- err = -EBADFD;
- goto done;
- }
+ lock_sock(sk);
/* Set destination address and psm */
- bacpy(&bt_sk(sk)->dst, &sa.sco_bdaddr);
- sco_pi(sk)->pkt_type = sa.sco_pkt_type;
+ bacpy(&bt_sk(sk)->dst, &sa->sco_bdaddr);
if ((err = sco_connect(sk)))
goto done;
@@ -636,7 +619,6 @@ static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len
bacpy(&sa->sco_bdaddr, &bt_sk(sk)->dst);
else
bacpy(&sa->sco_bdaddr, &bt_sk(sk)->src);
- sa->sco_pkt_type = sco_pi(sk)->pkt_type;
return 0;
}
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
index d22f611e4004..991fe40bb288 100644
--- a/net/bridge/br_netfilter.c
+++ b/net/bridge/br_netfilter.c
@@ -359,7 +359,7 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
},
.proto = 0,
};
- struct in_device *in_dev = in_dev_get(dev);
+ struct in_device *in_dev = __in_dev_get_rcu(dev);
/* If err equals -EHOSTUNREACH the error is due to a
* martian destination or due to the fact that
diff --git a/net/bridge/netfilter/ebt_ulog.c b/net/bridge/netfilter/ebt_ulog.c
index 133eeae45a4f..ce50688a6431 100644
--- a/net/bridge/netfilter/ebt_ulog.c
+++ b/net/bridge/netfilter/ebt_ulog.c
@@ -266,7 +266,7 @@ static bool ebt_ulog_tg_check(const struct xt_tgchk_param *par)
if (uloginfo->qthreshold > EBT_ULOG_MAX_QLEN)
uloginfo->qthreshold = EBT_ULOG_MAX_QLEN;
- return 0;
+ return true;
}
static struct xt_target ebt_ulog_tg_reg __read_mostly = {
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index 37928d5f2840..4877d57205de 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -1405,6 +1405,9 @@ static int do_ebt_set_ctl(struct sock *sk,
{
int ret;
+ if (!capable(CAP_NET_ADMIN))
+ return -EPERM;
+
switch(cmd) {
case EBT_SO_SET_ENTRIES:
ret = do_replace(sock_net(sk), user, len);
@@ -1424,6 +1427,9 @@ static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
struct ebt_replace tmp;
struct ebt_table *t;
+ if (!capable(CAP_NET_ADMIN))
+ return -EPERM;
+
if (copy_from_user(&tmp, user, sizeof(tmp)))
return -EFAULT;
diff --git a/net/can/af_can.c b/net/can/af_can.c
index e733725b11d4..264c96883db0 100644
--- a/net/can/af_can.c
+++ b/net/can/af_can.c
@@ -199,6 +199,8 @@ static int can_create(struct net *net, struct socket *sock, int protocol)
* @skb: pointer to socket buffer with CAN frame in data section
* @loop: loopback for listeners on local CAN sockets (recommended default!)
*
+ * Due to the loopback this routine must not be called from hardirq context.
+ *
* Return:
* 0 on success
* -ENETDOWN when the selected interface is down
@@ -278,7 +280,7 @@ int can_send(struct sk_buff *skb, int loop)
}
if (newskb)
- netif_rx(newskb);
+ netif_rx_ni(newskb);
/* update statistics */
can_stats.tx_frames++;
diff --git a/net/core/datagram.c b/net/core/datagram.c
index b0fe69211eef..caeb2852c3c8 100644
--- a/net/core/datagram.c
+++ b/net/core/datagram.c
@@ -223,6 +223,15 @@ void skb_free_datagram(struct sock *sk, struct sk_buff *skb)
consume_skb(skb);
sk_mem_reclaim_partial(sk);
}
+EXPORT_SYMBOL(skb_free_datagram);
+
+void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb)
+{
+ lock_sock(sk);
+ skb_free_datagram(sk, skb);
+ release_sock(sk);
+}
+EXPORT_SYMBOL(skb_free_datagram_locked);
/**
* skb_kill_datagram - Free a datagram skbuff forcibly
@@ -749,5 +758,4 @@ unsigned int datagram_poll(struct file *file, struct socket *sock,
EXPORT_SYMBOL(datagram_poll);
EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec);
EXPORT_SYMBOL(skb_copy_datagram_iovec);
-EXPORT_SYMBOL(skb_free_datagram);
EXPORT_SYMBOL(skb_recv_datagram);
diff --git a/net/core/dev.c b/net/core/dev.c
index ec28414f3564..908efef1a7eb 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -933,14 +933,15 @@ rollback:
ret = notifier_to_errno(ret);
if (ret) {
- if (err) {
- printk(KERN_ERR
- "%s: name change rollback failed: %d.\n",
- dev->name, ret);
- } else {
+ /* err >= 0 after dev_alloc_name() or stores the first errno */
+ if (err >= 0) {
err = ret;
memcpy(dev->name, oldname, IFNAMSIZ);
goto rollback;
+ } else {
+ printk(KERN_ERR
+ "%s: name change rollback failed: %d.\n",
+ dev->name, ret);
}
}
@@ -2248,6 +2249,9 @@ int netif_receive_skb(struct sk_buff *skb)
int ret = NET_RX_DROP;
__be16 type;
+ if (!skb->tstamp.tv64)
+ net_timestamp(skb);
+
if (skb->vlan_tci && vlan_hwaccel_do_receive(skb))
return NET_RX_SUCCESS;
@@ -2255,9 +2259,6 @@ int netif_receive_skb(struct sk_buff *skb)
if (netpoll_receive_skb(skb))
return NET_RX_DROP;
- if (!skb->tstamp.tv64)
- net_timestamp(skb);
-
if (!skb->iif)
skb->iif = skb->dev->ifindex;
@@ -4817,6 +4818,11 @@ int register_netdevice(struct net_device *dev)
rollback_registered(dev);
dev->reg_state = NETREG_UNREGISTERED;
}
+ /*
+ * Prevent userspace races by waiting until the network
+ * device is fully setup before sending notifications.
+ */
+ rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
out:
return ret;
@@ -5352,6 +5358,12 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
/* Notify protocols, that a new device appeared. */
call_netdevice_notifiers(NETDEV_REGISTER, dev);
+ /*
+ * Prevent userspace races by waiting until the network
+ * device is fully setup before sending notifications.
+ */
+ rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
+
synchronize_net();
err = 0;
out:
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index d78030f88bd0..93f18454ef1d 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1347,13 +1347,11 @@ static int rtnetlink_event(struct notifier_block *this, unsigned long event, voi
case NETDEV_UNREGISTER:
rtmsg_ifinfo(RTM_DELLINK, dev, ~0U);
break;
- case NETDEV_REGISTER:
- rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
- break;
case NETDEV_UP:
case NETDEV_DOWN:
rtmsg_ifinfo(RTM_NEWLINK, dev, IFF_UP|IFF_RUNNING);
break;
+ case NETDEV_REGISTER:
case NETDEV_CHANGE:
case NETDEV_GOING_DOWN:
break;
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 9e0597d189b0..79ae8954da3d 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -2704,7 +2704,8 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
NAPI_GRO_CB(skb)->free = 1;
goto done;
- }
+ } else if (skb_gro_len(p) != pinfo->gso_size)
+ return -E2BIG;
headroom = skb_headroom(p);
nskb = netdev_alloc_skb(p->dev, headroom + skb_gro_offset(p));
diff --git a/net/core/sock.c b/net/core/sock.c
index 76334228ed1c..a8c9b14f07ed 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1196,12 +1196,12 @@ EXPORT_SYMBOL_GPL(sk_setup_caps);
void __init sk_init(void)
{
- if (num_physpages <= 4096) {
+ if (totalram_pages <= 4096) {
sysctl_wmem_max = 32767;
sysctl_rmem_max = 32767;
sysctl_wmem_default = 32767;
sysctl_rmem_default = 32767;
- } else if (num_physpages >= 131072) {
+ } else if (totalram_pages >= 131072) {
sysctl_wmem_max = 131071;
sysctl_rmem_max = 131071;
}
@@ -1218,17 +1218,22 @@ void __init sk_init(void)
void sock_wfree(struct sk_buff *skb)
{
struct sock *sk = skb->sk;
- int res;
+ unsigned int len = skb->truesize;
- /* In case it might be waiting for more memory. */
- res = atomic_sub_return(skb->truesize, &sk->sk_wmem_alloc);
- if (!sock_flag(sk, SOCK_USE_WRITE_QUEUE))
+ if (!sock_flag(sk, SOCK_USE_WRITE_QUEUE)) {
+ /*
+ * Keep a reference on sk_wmem_alloc, this will be released
+ * after sk_write_space() call
+ */
+ atomic_sub(len - 1, &sk->sk_wmem_alloc);
sk->sk_write_space(sk);
+ len = 1;
+ }
/*
- * if sk_wmem_alloc reached 0, we are last user and should
- * free this sock, as sk_free() call could not do it.
+ * if sk_wmem_alloc reaches 0, we must finish what sk_free()
+ * could not do because of in-flight packets
*/
- if (res == 0)
+ if (atomic_sub_and_test(len, &sk->sk_wmem_alloc))
__sk_free(sk);
}
EXPORT_SYMBOL(sock_wfree);
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index 1bca9205104e..d9c44d82e86e 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -1049,10 +1049,10 @@ static int __init dccp_init(void)
*
* The methodology is similar to that of the buffer cache.
*/
- if (num_physpages >= (128 * 1024))
- goal = num_physpages >> (21 - PAGE_SHIFT);
+ if (totalram_pages >= (128 * 1024))
+ goal = totalram_pages >> (21 - PAGE_SHIFT);
else
- goal = num_physpages >> (23 - PAGE_SHIFT);
+ goal = totalram_pages >> (23 - PAGE_SHIFT);
if (thash_entries)
goal = (thash_entries *
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
index 1d6ca8a98dc6..44d0d3bd2914 100644
--- a/net/decnet/dn_route.c
+++ b/net/decnet/dn_route.c
@@ -1750,7 +1750,7 @@ void __init dn_route_init(void)
dn_route_timer.expires = jiffies + decnet_dst_gc_interval * HZ;
add_timer(&dn_route_timer);
- goal = num_physpages >> (26 - PAGE_SHIFT);
+ goal = totalram_pages >> (26 - PAGE_SHIFT);
for(order = 0; (1UL << order) < goal; order++)
/* NOTHING */;
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 3b478b320ad5..566ea6c4321d 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -257,7 +257,6 @@ static inline int inet_netns_ok(struct net *net, int protocol)
return ipprot->netns_ok;
}
-
/*
* Create an inet socket.
*/
@@ -826,7 +825,6 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
case SIOCSIFPFLAGS:
case SIOCGIFPFLAGS:
case SIOCSIFFLAGS:
- case SIOCKILLADDR:
err = devinet_ioctl(net, cmd, (void __user *)arg);
break;
default:
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 11b2ea9d2a56..3863c3a4223f 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -57,7 +57,6 @@
#include <net/arp.h>
#include <net/ip.h>
-#include <net/tcp.h>
#include <net/route.h>
#include <net/ip_fib.h>
#include <net/rtnetlink.h>
@@ -632,7 +631,6 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
case SIOCSIFBRDADDR: /* Set the broadcast address */
case SIOCSIFDSTADDR: /* Set the destination address */
case SIOCSIFNETMASK: /* Set the netmask for the interface */
- case SIOCKILLADDR: /* Nuke all sockets on this address */
ret = -EACCES;
if (!capable(CAP_NET_ADMIN))
goto out;
@@ -682,8 +680,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
}
ret = -EADDRNOTAVAIL;
- if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS
- && cmd != SIOCKILLADDR)
+ if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
goto done;
switch (cmd) {
@@ -807,10 +804,6 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
inet_insert_ifa(ifa);
}
break;
- case SIOCKILLADDR: /* Nuke all connections on this address */
- ret = 0;
- tcp_v4_nuke_addr(sin->sin_addr.s_addr);
- break;
}
done:
rtnl_unlock();
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
index 575f9bd51ccd..d3fe10be7219 100644
--- a/net/ipv4/ip_fragment.c
+++ b/net/ipv4/ip_fragment.c
@@ -563,7 +563,7 @@ out_oversize:
printk(KERN_INFO "Oversized IP packet from %pI4.\n",
&qp->saddr);
out_fail:
- IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_REASMFAILS);
+ IP_INC_STATS_BH(net, IPSTATS_MIB_REASMFAILS);
return err;
}
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 7ffcd96fe591..4d64a801bd3e 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -500,8 +500,8 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
if (skb->sk) {
frag->sk = skb->sk;
frag->destructor = sock_wfree;
- truesizes += frag->truesize;
}
+ truesizes += frag->truesize;
}
/* Everything is OK. Generate! */
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c
index 3229e0a81ba6..d396abf20b6f 100644
--- a/net/ipv4/netfilter/nf_nat_core.c
+++ b/net/ipv4/netfilter/nf_nat_core.c
@@ -212,7 +212,7 @@ find_best_ips_proto(struct nf_conntrack_tuple *tuple,
maxip = ntohl(range->max_ip);
j = jhash_2words((__force u32)tuple->src.u3.ip,
range->flags & IP_NAT_RANGE_PERSISTENT ?
- (__force u32)tuple->dst.u3.ip : 0, 0);
+ 0 : (__force u32)tuple->dst.u3.ip, 0);
j = ((u64)j * (maxip - minip + 1)) >> 32;
*var_ipp = htonl(minip + j);
}
@@ -750,6 +750,8 @@ static int __init nf_nat_init(void)
BUG_ON(nfnetlink_parse_nat_setup_hook != NULL);
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook,
nfnetlink_parse_nat_setup);
+ BUG_ON(nf_ct_nat_offset != NULL);
+ rcu_assign_pointer(nf_ct_nat_offset, nf_nat_get_offset);
return 0;
cleanup_extend:
@@ -764,6 +766,7 @@ static void __exit nf_nat_cleanup(void)
nf_ct_extend_unregister(&nat_extend);
rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL);
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL);
+ rcu_assign_pointer(nf_ct_nat_offset, NULL);
synchronize_net();
}
diff --git a/net/ipv4/netfilter/nf_nat_helper.c b/net/ipv4/netfilter/nf_nat_helper.c
index 09172a65d9b6..f9520fa3aba9 100644
--- a/net/ipv4/netfilter/nf_nat_helper.c
+++ b/net/ipv4/netfilter/nf_nat_helper.c
@@ -73,6 +73,28 @@ adjust_tcp_sequence(u32 seq,
DUMP_OFFSET(this_way);
}
+/* Get the offset value, for conntrack */
+s16 nf_nat_get_offset(const struct nf_conn *ct,
+ enum ip_conntrack_dir dir,
+ u32 seq)
+{
+ struct nf_conn_nat *nat = nfct_nat(ct);
+ struct nf_nat_seq *this_way;
+ s16 offset;
+
+ if (!nat)
+ return 0;
+
+ this_way = &nat->seq[dir];
+ spin_lock_bh(&nf_nat_seqofs_lock);
+ offset = after(seq, this_way->correction_pos)
+ ? this_way->offset_after : this_way->offset_before;
+ spin_unlock_bh(&nf_nat_seqofs_lock);
+
+ return offset;
+}
+EXPORT_SYMBOL_GPL(nf_nat_get_offset);
+
/* Frobs data inside this packet, which is linear. */
static void mangle_contents(struct sk_buff *skb,
unsigned int dataoff,
@@ -189,11 +211,6 @@ nf_nat_mangle_tcp_packet(struct sk_buff *skb,
adjust_tcp_sequence(ntohl(tcph->seq),
(int)rep_len - (int)match_len,
ct, ctinfo);
- /* Tell TCP window tracking about seq change */
- nf_conntrack_tcp_update(skb, ip_hdrlen(skb),
- ct, CTINFO2DIR(ctinfo),
- (int)rep_len - (int)match_len);
-
nf_conntrack_event_cache(IPCT_NATSEQADJ, ct);
}
return 1;
@@ -415,12 +432,7 @@ nf_nat_seq_adjust(struct sk_buff *skb,
tcph->seq = newseq;
tcph->ack_seq = newack;
- if (!nf_nat_sack_adjust(skb, tcph, ct, ctinfo))
- return 0;
-
- nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir, seqoff);
-
- return 1;
+ return nf_nat_sack_adjust(skb, tcph, ct, ctinfo);
}
/* Setup NAT on this expected conntrack so it follows master. */
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 278f46f5011b..62ccdf12f5f0 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -3412,7 +3412,7 @@ int __init ip_rt_init(void)
alloc_large_system_hash("IP route cache",
sizeof(struct rt_hash_bucket),
rhash_entries,
- (num_physpages >= 128 * 1024) ?
+ (totalram_pages >= 128 * 1024) ?
15 : 17,
0,
&rt_hash_log,
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 91145244ea63..33ed849d3715 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2862,7 +2862,7 @@ void __init tcp_init(void)
alloc_large_system_hash("TCP established",
sizeof(struct inet_ehash_bucket),
thash_entries,
- (num_physpages >= 128 * 1024) ?
+ (totalram_pages >= 128 * 1024) ?
13 : 15,
0,
&tcp_hashinfo.ehash_size,
@@ -2879,7 +2879,7 @@ void __init tcp_init(void)
alloc_large_system_hash("TCP bind",
sizeof(struct inet_bind_hashbucket),
tcp_hashinfo.ehash_size,
- (num_physpages >= 128 * 1024) ?
+ (totalram_pages >= 128 * 1024) ?
13 : 15,
0,
&tcp_hashinfo.bhash_size,
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 770fd759a6e9..6d88219c5e22 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1846,49 +1846,6 @@ void tcp_v4_destroy_sock(struct sock *sk)
EXPORT_SYMBOL(tcp_v4_destroy_sock);
-/*
- * tcp_v4_nuke_addr - destroy all sockets on the given local address
- */
-void tcp_v4_nuke_addr(__u32 saddr)
-{
- unsigned int bucket;
-
- for (bucket = 0; bucket < tcp_hashinfo.ehash_size; bucket++) {
- struct hlist_nulls_node *node;
- struct sock *sk;
- spinlock_t *lock = inet_ehash_lockp(&tcp_hashinfo, bucket);
-
-restart:
- spin_lock_bh(lock);
- sk_nulls_for_each(sk, node, &tcp_hashinfo.ehash[bucket].chain) {
- struct inet_sock *inet = inet_sk(sk);
-
- if (inet->rcv_saddr != saddr)
- continue;
- if (sysctl_ip_dynaddr && sk->sk_state == TCP_SYN_SENT)
- continue;
- if (sock_flag(sk, SOCK_DEAD))
- continue;
-
- sock_hold(sk);
- spin_unlock_bh(lock);
-
- local_bh_disable();
- bh_lock_sock(sk);
- sk->sk_err = ETIMEDOUT;
- sk->sk_error_report(sk);
-
- tcp_done(sk);
- bh_unlock_sock(sk);
- local_bh_enable();
- sock_put(sk);
-
- goto restart;
- }
- spin_unlock_bh(lock);
- }
-}
-
#ifdef CONFIG_PROC_FS
/* Proc filesystem TCP sock list dumping. */
@@ -2498,3 +2455,4 @@ EXPORT_SYMBOL(tcp_proc_register);
EXPORT_SYMBOL(tcp_proc_unregister);
#endif
EXPORT_SYMBOL(sysctl_tcp_low_latency);
+
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
index f8d67ccc64f3..96440e581c15 100644
--- a/net/ipv4/tcp_minisocks.c
+++ b/net/ipv4/tcp_minisocks.c
@@ -363,7 +363,7 @@ void tcp_twsk_destructor(struct sock *sk)
#ifdef CONFIG_TCP_MD5SIG
struct tcp_timewait_sock *twsk = tcp_twsk(sk);
if (twsk->tw_md5_keylen)
- tcp_put_md5sig_pool();
+ tcp_free_md5sig_pool();
#endif
}
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 80e3812837ad..00d1f6d82d26 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -831,6 +831,42 @@ out:
return ret;
}
+
+/**
+ * first_packet_length - return length of first packet in receive queue
+ * @sk: socket
+ *
+ * Drops all bad checksum frames, until a valid one is found.
+ * Returns the length of found skb, or 0 if none is found.
+ */
+static unsigned int first_packet_length(struct sock *sk)
+{
+ struct sk_buff_head list_kill, *rcvq = &sk->sk_receive_queue;
+ struct sk_buff *skb;
+ unsigned int res;
+
+ __skb_queue_head_init(&list_kill);
+
+ spin_lock_bh(&rcvq->lock);
+ while ((skb = skb_peek(rcvq)) != NULL &&
+ udp_lib_checksum_complete(skb)) {
+ UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS,
+ IS_UDPLITE(sk));
+ __skb_unlink(skb, rcvq);
+ __skb_queue_tail(&list_kill, skb);
+ }
+ res = skb ? skb->len : 0;
+ spin_unlock_bh(&rcvq->lock);
+
+ if (!skb_queue_empty(&list_kill)) {
+ lock_sock(sk);
+ __skb_queue_purge(&list_kill);
+ sk_mem_reclaim_partial(sk);
+ release_sock(sk);
+ }
+ return res;
+}
+
/*
* IOCTL requests applicable to the UDP protocol
*/
@@ -847,21 +883,16 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
case SIOCINQ:
{
- struct sk_buff *skb;
- unsigned long amount;
+ unsigned int amount = first_packet_length(sk);
- amount = 0;
- spin_lock_bh(&sk->sk_receive_queue.lock);
- skb = skb_peek(&sk->sk_receive_queue);
- if (skb != NULL) {
+ if (amount)
/*
* We will only return the amount
* of this packet since that is all
* that will be read.
*/
- amount = skb->len - sizeof(struct udphdr);
- }
- spin_unlock_bh(&sk->sk_receive_queue.lock);
+ amount -= sizeof(struct udphdr);
+
return put_user(amount, (int __user *)arg);
}
@@ -956,9 +987,7 @@ try_again:
err = ulen;
out_free:
- lock_sock(sk);
- skb_free_datagram(sk, skb);
- release_sock(sk);
+ skb_free_datagram_locked(sk, skb);
out:
return err;
@@ -1525,32 +1554,13 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait)
{
unsigned int mask = datagram_poll(file, sock, wait);
struct sock *sk = sock->sk;
- int is_lite = IS_UDPLITE(sk);
/* Check for false positives due to checksum errors */
- if ( (mask & POLLRDNORM) &&
- !(file->f_flags & O_NONBLOCK) &&
- !(sk->sk_shutdown & RCV_SHUTDOWN)){
- struct sk_buff_head *rcvq = &sk->sk_receive_queue;
- struct sk_buff *skb;
-
- spin_lock_bh(&rcvq->lock);
- while ((skb = skb_peek(rcvq)) != NULL &&
- udp_lib_checksum_complete(skb)) {
- UDP_INC_STATS_BH(sock_net(sk),
- UDP_MIB_INERRORS, is_lite);
- __skb_unlink(skb, rcvq);
- kfree_skb(skb);
- }
- spin_unlock_bh(&rcvq->lock);
-
- /* nothing to see, move along */
- if (skb == NULL)
- mask &= ~(POLLIN | POLLRDNORM);
- }
+ if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) &&
+ !(sk->sk_shutdown & RCV_SHUTDOWN) && !first_packet_length(sk))
+ mask &= ~(POLLIN | POLLRDNORM);
return mask;
-
}
struct proto udp_prot = {
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index 4aae658e5501..b15ba057ff35 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -559,6 +559,11 @@ static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb)
return skb_dst(skb) ? ip6_dst_idev(skb_dst(skb)) : __in6_dev_get(skb->dev);
}
+static inline struct net *ipv6_skb_net(struct sk_buff *skb)
+{
+ return skb_dst(skb) ? dev_net(skb_dst(skb)->dev) : dev_net(skb->dev);
+}
+
/* Router Alert as of RFC 2711 */
static int ipv6_hop_ra(struct sk_buff *skb, int optoff)
@@ -580,8 +585,8 @@ static int ipv6_hop_ra(struct sk_buff *skb, int optoff)
static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff)
{
const unsigned char *nh = skb_network_header(skb);
+ struct net *net = ipv6_skb_net(skb);
u32 pkt_len;
- struct net *net = dev_net(skb_dst(skb)->dev);
if (nh[optoff + 1] != 4 || (optoff & 3) != 2) {
LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n",
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
index 2a15c2d66c69..5cdf423d68bc 100644
--- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
+++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
@@ -183,6 +183,16 @@ out:
return nf_conntrack_confirm(skb);
}
+static enum ip6_defrag_users nf_ct6_defrag_user(unsigned int hooknum,
+ struct sk_buff *skb)
+{
+ if (hooknum == NF_INET_PRE_ROUTING)
+ return IP6_DEFRAG_CONNTRACK_IN;
+ else
+ return IP6_DEFRAG_CONNTRACK_OUT;
+
+}
+
static unsigned int ipv6_defrag(unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
@@ -195,8 +205,7 @@ static unsigned int ipv6_defrag(unsigned int hooknum,
if (skb->nfct)
return NF_ACCEPT;
- reasm = nf_ct_frag6_gather(skb);
-
+ reasm = nf_ct_frag6_gather(skb, nf_ct6_defrag_user(hooknum, skb));
/* queued */
if (reasm == NULL)
return NF_STOLEN;
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
index f3aba255ad9f..4b6a539cb87a 100644
--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
@@ -170,13 +170,14 @@ out:
/* Creation primitives. */
static __inline__ struct nf_ct_frag6_queue *
-fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst)
+fq_find(__be32 id, u32 user, struct in6_addr *src, struct in6_addr *dst)
{
struct inet_frag_queue *q;
struct ip6_create_arg arg;
unsigned int hash;
arg.id = id;
+ arg.user = user;
arg.src = src;
arg.dst = dst;
@@ -561,7 +562,7 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff)
return 0;
}
-struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb)
+struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user)
{
struct sk_buff *clone;
struct net_device *dev = skb->dev;
@@ -607,7 +608,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb)
if (atomic_read(&nf_init_frags.mem) > nf_init_frags.high_thresh)
nf_ct_frag6_evictor();
- fq = fq_find(fhdr->identification, &hdr->saddr, &hdr->daddr);
+ fq = fq_find(fhdr->identification, user, &hdr->saddr, &hdr->daddr);
if (fq == NULL) {
pr_debug("Can't find and can't create new queue\n");
goto ret_orig;
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
index 2642a41a8535..6a36f134d19b 100644
--- a/net/ipv6/reassembly.c
+++ b/net/ipv6/reassembly.c
@@ -72,6 +72,7 @@ struct frag_queue
struct inet_frag_queue q;
__be32 id; /* fragment id */
+ u32 user;
struct in6_addr saddr;
struct in6_addr daddr;
@@ -141,7 +142,7 @@ int ip6_frag_match(struct inet_frag_queue *q, void *a)
struct ip6_create_arg *arg = a;
fq = container_of(q, struct frag_queue, q);
- return (fq->id == arg->id &&
+ return (fq->id == arg->id && fq->user == arg->user &&
ipv6_addr_equal(&fq->saddr, arg->src) &&
ipv6_addr_equal(&fq->daddr, arg->dst));
}
@@ -163,6 +164,7 @@ void ip6_frag_init(struct inet_frag_queue *q, void *a)
struct ip6_create_arg *arg = a;
fq->id = arg->id;
+ fq->user = arg->user;
ipv6_addr_copy(&fq->saddr, arg->src);
ipv6_addr_copy(&fq->daddr, arg->dst);
}
@@ -244,6 +246,7 @@ fq_find(struct net *net, __be32 id, struct in6_addr *src, struct in6_addr *dst,
unsigned int hash;
arg.id = id;
+ arg.user = IP6_DEFRAG_LOCAL_DELIVER;
arg.src = src;
arg.dst = dst;
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index 98b7327d0949..2e41849ab1a1 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -313,7 +313,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t,
c = 0;
for (prl = t->prl; prl; prl = prl->next) {
- if (c > cmax)
+ if (c >= cmax)
break;
if (kprl.addr != htonl(INADDR_ANY) && prl->addr != kprl.addr)
continue;
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 33b59bd92c4d..333a6ec38bf3 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -288,9 +288,7 @@ try_again:
err = ulen;
out_free:
- lock_sock(sk);
- skb_free_datagram(sk, skb);
- release_sock(sk);
+ skb_free_datagram_locked(sk, skb);
out:
return err;
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
index bc064d7933ff..ce8e0e772bab 100644
--- a/net/mac80211/agg-rx.c
+++ b/net/mac80211/agg-rx.c
@@ -85,10 +85,6 @@ void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *r
struct ieee80211_local *local = sdata->local;
struct sta_info *sta;
- /* stop HW Rx aggregation. ampdu_action existence
- * already verified in session init so we add the BUG_ON */
- BUG_ON(!local->ops->ampdu_action);
-
rcu_read_lock();
sta = sta_info_get(local, ra);
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index a24e59816b93..b9005e1be8c3 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -123,13 +123,18 @@ void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u1
ieee80211_tx_skb(sdata, skb, 0);
}
-static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
- enum ieee80211_back_parties initiator)
+int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
+ enum ieee80211_back_parties initiator)
{
struct ieee80211_local *local = sta->local;
int ret;
u8 *state;
+#ifdef CONFIG_MAC80211_HT_DEBUG
+ printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n",
+ sta->sta.addr, tid);
+#endif /* CONFIG_MAC80211_HT_DEBUG */
+
state = &sta->ampdu_mlme.tid_state_tx[tid];
if (*state == HT_AGG_STATE_OPERATIONAL)
@@ -143,7 +148,6 @@ static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
/* HW shall not deny going back to legacy */
if (WARN_ON(ret)) {
- *state = HT_AGG_STATE_OPERATIONAL;
/*
* We may have pending packets get stuck in this case...
* Not bothering with a workaround for now.
@@ -526,11 +530,6 @@ int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
goto unlock;
}
-#ifdef CONFIG_MAC80211_HT_DEBUG
- printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n",
- sta->sta.addr, tid);
-#endif /* CONFIG_MAC80211_HT_DEBUG */
-
ret = ___ieee80211_stop_tx_ba_session(sta, tid, initiator);
unlock:
@@ -546,7 +545,7 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw,
struct sta_info *sta;
int ret = 0;
- if (WARN_ON(!local->ops->ampdu_action))
+ if (!local->ops->ampdu_action)
return -EINVAL;
if (tid >= STA_TID_NUM)
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 3f47276caeb8..88b06485a780 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -87,6 +87,9 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex,
if (!dev)
return -ENODEV;
+ if (netif_running(dev))
+ return -EBUSY;
+
if (!nl80211_type_check(type))
return -EINVAL;
@@ -96,9 +99,6 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex,
if (ret)
return ret;
- if (netif_running(sdata->dev))
- return -EBUSY;
-
if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
ieee80211_sdata_set_mesh_id(sdata,
params->mesh_id_len,
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c
index 0891bfb06996..a6b8eb418ef7 100644
--- a/net/mac80211/ht.c
+++ b/net/mac80211/ht.c
@@ -141,7 +141,6 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
struct sta_info *sta,
struct ieee80211_mgmt *mgmt, size_t len)
{
- struct ieee80211_local *local = sdata->local;
u16 tid, params;
u16 initiator;
@@ -161,10 +160,9 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
WLAN_BACK_INITIATOR, 0);
else { /* WLAN_BACK_RECIPIENT */
spin_lock_bh(&sta->lock);
- sta->ampdu_mlme.tid_state_tx[tid] =
- HT_AGG_STATE_OPERATIONAL;
+ if (sta->ampdu_mlme.tid_state_tx[tid] & HT_ADDBA_REQUESTED_MSK)
+ ___ieee80211_stop_tx_ba_session(sta, tid,
+ WLAN_BACK_RECIPIENT);
spin_unlock_bh(&sta->lock);
- ieee80211_stop_tx_ba_session(&local->hw, sta->sta.addr, tid,
- WLAN_BACK_RECIPIENT);
}
}
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 68eb5052179a..33a7e75e8380 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1057,6 +1057,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
enum ieee80211_back_parties initiator);
+int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
+ enum ieee80211_back_parties initiator);
/* Spectrum management */
void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata,
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 0936fc24942d..9e50fdbdacfc 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2155,11 +2155,17 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
skb = rx.skb;
- list_for_each_entry_rcu(sdata, &local->interfaces, list) {
+ if (rx.sdata && ieee80211_is_data(hdr->frame_control)) {
+ rx.flags |= IEEE80211_RX_RA_MATCH;
+ prepares = prepare_for_handlers(rx.sdata, &rx, hdr);
+ if (prepares)
+ prev = rx.sdata;
+ } else list_for_each_entry_rcu(sdata, &local->interfaces, list) {
if (!netif_running(sdata->dev))
continue;
- if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
+ if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
+ sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
continue;
rx.flags |= IEEE80211_RX_RA_MATCH;
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index a360bceeba59..5ccfd1074eaa 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -360,6 +360,7 @@ int sta_info_insert(struct sta_info *sta)
u.ap);
drv_sta_notify(local, &sdata->vif, STA_NOTIFY_ADD, &sta->sta);
+ sdata = sta->sdata;
}
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
@@ -494,6 +495,7 @@ static void __sta_info_unlink(struct sta_info **sta)
drv_sta_notify(local, &sdata->vif, STA_NOTIFY_REMOVE,
&(*sta)->sta);
+ sdata = (*sta)->sdata;
}
if (ieee80211_vif_is_mesh(&sdata->vif)) {
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 3a8922cd1038..e5d720e15137 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1478,7 +1478,7 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (sdata->vif.type != NL80211_IFTYPE_AP)
continue;
if (compare_ether_addr(sdata->dev->dev_addr,
- hdr->addr2)) {
+ hdr->addr2) == 0) {
dev_hold(sdata->dev);
dev_put(odev);
osdata = sdata;
@@ -1736,7 +1736,8 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb,
if (!is_multicast_ether_addr(hdr.addr1)) {
rcu_read_lock();
sta = sta_info_get(local, hdr.addr1);
- if (sta)
+ /* XXX: in the future, use sdata to look up the sta */
+ if (sta && sta->sdata == sdata)
sta_flags = get_sta_flags(sta);
rcu_read_unlock();
}
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 915e77769312..005016d18a52 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -537,7 +537,7 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,
if (elen > left)
break;
- if (calc_crc && id < 64 && (filter & BIT(id)))
+ if (calc_crc && id < 64 && (filter & (1ULL << id)))
crc = crc32_be(crc, pos - 2, elen + 2);
switch (id) {
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index 7c1333c67ff3..27a15f56cb69 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -2713,6 +2713,8 @@ static int ip_vs_genl_parse_service(struct ip_vs_service_user_kern *usvc,
if (!(nla_af && (nla_fwmark || (nla_port && nla_protocol && nla_addr))))
return -EINVAL;
+ memset(usvc, 0, sizeof(*usvc));
+
usvc->af = nla_get_u16(nla_af);
#ifdef CONFIG_IP_VS_IPV6
if (usvc->af != AF_INET && usvc->af != AF_INET6)
@@ -2900,6 +2902,8 @@ static int ip_vs_genl_parse_dest(struct ip_vs_dest_user_kern *udest,
if (!(nla_addr && nla_port))
return -EINVAL;
+ memset(udest, 0, sizeof(*udest));
+
nla_memcpy(&udest->addr, nla_addr, sizeof(udest->addr));
udest->port = nla_get_u16(nla_port);
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index b5869b9574b0..e7407e5bfacc 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -1089,14 +1089,14 @@ void nf_conntrack_flush_report(struct net *net, u32 pid, int report)
}
EXPORT_SYMBOL_GPL(nf_conntrack_flush_report);
-static void nf_ct_release_dying_list(void)
+static void nf_ct_release_dying_list(struct net *net)
{
struct nf_conntrack_tuple_hash *h;
struct nf_conn *ct;
struct hlist_nulls_node *n;
spin_lock_bh(&nf_conntrack_lock);
- hlist_nulls_for_each_entry(h, n, &init_net.ct.dying, hnnode) {
+ hlist_nulls_for_each_entry(h, n, &net->ct.dying, hnnode) {
ct = nf_ct_tuplehash_to_ctrack(h);
/* never fails to remove them, no listeners at this point */
nf_ct_kill(ct);
@@ -1115,7 +1115,7 @@ static void nf_conntrack_cleanup_net(struct net *net)
{
i_see_dead_people:
nf_ct_iterate_cleanup(net, kill_all, NULL);
- nf_ct_release_dying_list();
+ nf_ct_release_dying_list(net);
if (atomic_read(&net->ct.count) != 0) {
schedule();
goto i_see_dead_people;
@@ -1245,9 +1245,9 @@ static int nf_conntrack_init_init_net(void)
* machine has 512 buckets. >= 1GB machines have 16384 buckets. */
if (!nf_conntrack_htable_size) {
nf_conntrack_htable_size
- = (((num_physpages << PAGE_SHIFT) / 16384)
+ = (((totalram_pages << PAGE_SHIFT) / 16384)
/ sizeof(struct hlist_head));
- if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
+ if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
nf_conntrack_htable_size = 16384;
if (nf_conntrack_htable_size < 32)
nf_conntrack_htable_size = 32;
@@ -1350,6 +1350,11 @@ err_stat:
return ret;
}
+s16 (*nf_ct_nat_offset)(const struct nf_conn *ct,
+ enum ip_conntrack_dir dir,
+ u32 seq);
+EXPORT_SYMBOL_GPL(nf_ct_nat_offset);
+
int nf_conntrack_init(struct net *net)
{
int ret;
@@ -1367,6 +1372,9 @@ int nf_conntrack_init(struct net *net)
/* For use by REJECT target */
rcu_assign_pointer(ip_ct_attach, nf_conntrack_attach);
rcu_assign_pointer(nf_ct_destroy, destroy_conntrack);
+
+ /* Howto get NAT offsets */
+ rcu_assign_pointer(nf_ct_nat_offset, NULL);
}
return 0;
diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c
index 5509dd1f14cf..7dfd469c0cf8 100644
--- a/net/netfilter/nf_conntrack_ftp.c
+++ b/net/netfilter/nf_conntrack_ftp.c
@@ -323,24 +323,24 @@ static void update_nl_seq(struct nf_conn *ct, u32 nl_seq,
struct nf_ct_ftp_master *info, int dir,
struct sk_buff *skb)
{
- unsigned int i, oldest = NUM_SEQ_TO_REMEMBER;
+ unsigned int i, oldest;
/* Look for oldest: if we find exact match, we're done. */
for (i = 0; i < info->seq_aft_nl_num[dir]; i++) {
if (info->seq_aft_nl[dir][i] == nl_seq)
return;
-
- if (oldest == info->seq_aft_nl_num[dir] ||
- before(info->seq_aft_nl[dir][i],
- info->seq_aft_nl[dir][oldest]))
- oldest = i;
}
if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) {
info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq;
- } else if (oldest != NUM_SEQ_TO_REMEMBER &&
- after(nl_seq, info->seq_aft_nl[dir][oldest])) {
- info->seq_aft_nl[dir][oldest] = nl_seq;
+ } else {
+ if (before(info->seq_aft_nl[dir][0], info->seq_aft_nl[dir][1]))
+ oldest = 0;
+ else
+ oldest = 1;
+
+ if (after(nl_seq, info->seq_aft_nl[dir][oldest]))
+ info->seq_aft_nl[dir][oldest] = nl_seq;
}
}
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
index 97a82ba75376..ba2b76937283 100644
--- a/net/netfilter/nf_conntrack_proto_tcp.c
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
@@ -492,6 +492,21 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,
}
}
+#ifdef CONFIG_NF_NAT_NEEDED
+static inline s16 nat_offset(const struct nf_conn *ct,
+ enum ip_conntrack_dir dir,
+ u32 seq)
+{
+ typeof(nf_ct_nat_offset) get_offset = rcu_dereference(nf_ct_nat_offset);
+
+ return get_offset != NULL ? get_offset(ct, dir, seq) : 0;
+}
+#define NAT_OFFSET(pf, ct, dir, seq) \
+ (pf == NFPROTO_IPV4 ? nat_offset(ct, dir, seq) : 0)
+#else
+#define NAT_OFFSET(pf, ct, dir, seq) 0
+#endif
+
static bool tcp_in_window(const struct nf_conn *ct,
struct ip_ct_tcp *state,
enum ip_conntrack_dir dir,
@@ -506,6 +521,7 @@ static bool tcp_in_window(const struct nf_conn *ct,
struct ip_ct_tcp_state *receiver = &state->seen[!dir];
const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple;
__u32 seq, ack, sack, end, win, swin;
+ s16 receiver_offset;
bool res;
/*
@@ -519,11 +535,16 @@ static bool tcp_in_window(const struct nf_conn *ct,
if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM)
tcp_sack(skb, dataoff, tcph, &sack);
+ /* Take into account NAT sequence number mangling */
+ receiver_offset = NAT_OFFSET(pf, ct, !dir, ack - 1);
+ ack -= receiver_offset;
+ sack -= receiver_offset;
+
pr_debug("tcp_in_window: START\n");
pr_debug("tcp_in_window: ");
nf_ct_dump_tuple(tuple);
- pr_debug("seq=%u ack=%u sack=%u win=%u end=%u\n",
- seq, ack, sack, win, end);
+ pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n",
+ seq, ack, receiver_offset, sack, receiver_offset, win, end);
pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
sender->td_end, sender->td_maxend, sender->td_maxwin,
@@ -613,8 +634,8 @@ static bool tcp_in_window(const struct nf_conn *ct,
pr_debug("tcp_in_window: ");
nf_ct_dump_tuple(tuple);
- pr_debug("seq=%u ack=%u sack =%u win=%u end=%u\n",
- seq, ack, sack, win, end);
+ pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n",
+ seq, ack, receiver_offset, sack, receiver_offset, win, end);
pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
sender->td_end, sender->td_maxend, sender->td_maxwin,
@@ -700,7 +721,7 @@ static bool tcp_in_window(const struct nf_conn *ct,
before(seq, sender->td_maxend + 1) ?
after(end, sender->td_end - receiver->td_maxwin - 1) ?
before(sack, receiver->td_end + 1) ?
- after(ack, receiver->td_end - MAXACKWINDOW(sender)) ? "BUG"
+ after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1) ? "BUG"
: "ACK is under the lower bound (possible overly delayed ACK)"
: "ACK is over the upper bound (ACKed data not seen yet)"
: "SEQ is under the lower bound (already ACKed data retransmitted)"
@@ -715,39 +736,6 @@ static bool tcp_in_window(const struct nf_conn *ct,
return res;
}
-#ifdef CONFIG_NF_NAT_NEEDED
-/* Update sender->td_end after NAT successfully mangled the packet */
-/* Caller must linearize skb at tcp header. */
-void nf_conntrack_tcp_update(const struct sk_buff *skb,
- unsigned int dataoff,
- struct nf_conn *ct, int dir,
- s16 offset)
-{
- const struct tcphdr *tcph = (const void *)skb->data + dataoff;
- const struct ip_ct_tcp_state *sender = &ct->proto.tcp.seen[dir];
- const struct ip_ct_tcp_state *receiver = &ct->proto.tcp.seen[!dir];
- __u32 end;
-
- end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, dataoff, tcph);
-
- spin_lock_bh(&ct->lock);
- /*
- * We have to worry for the ack in the reply packet only...
- */
- if (ct->proto.tcp.seen[dir].td_end + offset == end)
- ct->proto.tcp.seen[dir].td_end = end;
- ct->proto.tcp.last_end = end;
- spin_unlock_bh(&ct->lock);
- pr_debug("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i "
- "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
- sender->td_end, sender->td_maxend, sender->td_maxwin,
- sender->td_scale,
- receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
- receiver->td_scale);
-}
-EXPORT_SYMBOL_GPL(nf_conntrack_tcp_update);
-#endif
-
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index 025d1a0af78b..0319516b7d39 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -617,7 +617,7 @@ struct xt_table_info *xt_alloc_table_info(unsigned int size)
int cpu;
/* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */
- if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > num_physpages)
+ if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
return NULL;
newinfo = kzalloc(XT_TABLE_INFO_SZ, GFP_KERNEL);
diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c
index 680980954395..38f03f75a636 100644
--- a/net/netfilter/xt_connlimit.c
+++ b/net/netfilter/xt_connlimit.c
@@ -103,7 +103,7 @@ static int count_them(struct xt_connlimit_data *data,
const struct nf_conntrack_tuple *tuple,
const union nf_inet_addr *addr,
const union nf_inet_addr *mask,
- const struct xt_match *match)
+ u_int8_t family)
{
const struct nf_conntrack_tuple_hash *found;
struct xt_connlimit_conn *conn;
@@ -113,8 +113,7 @@ static int count_them(struct xt_connlimit_data *data,
bool addit = true;
int matches = 0;
-
- if (match->family == NFPROTO_IPV6)
+ if (family == NFPROTO_IPV6)
hash = &data->iphash[connlimit_iphash6(addr, mask)];
else
hash = &data->iphash[connlimit_iphash(addr->ip & mask->ip)];
@@ -157,8 +156,7 @@ static int count_them(struct xt_connlimit_data *data,
continue;
}
- if (same_source_net(addr, mask, &conn->tuple.src.u3,
- match->family))
+ if (same_source_net(addr, mask, &conn->tuple.src.u3, family))
/* same source network -> be counted! */
++matches;
nf_ct_put(found_ct);
@@ -207,7 +205,7 @@ connlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par)
spin_lock_bh(&info->data->lock);
connections = count_them(info->data, tuple_ptr, &addr,
- &info->mask, par->match);
+ &info->mask, par->family);
spin_unlock_bh(&info->data->lock);
if (connections < 0) {
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c
index 219dcdbe388c..dd16e404424f 100644
--- a/net/netfilter/xt_hashlimit.c
+++ b/net/netfilter/xt_hashlimit.c
@@ -194,9 +194,9 @@ static int htable_create_v0(struct xt_hashlimit_info *minfo, u_int8_t family)
if (minfo->cfg.size)
size = minfo->cfg.size;
else {
- size = ((num_physpages << PAGE_SHIFT) / 16384) /
+ size = ((totalram_pages << PAGE_SHIFT) / 16384) /
sizeof(struct list_head);
- if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
+ if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
size = 8192;
if (size < 16)
size = 16;
@@ -266,9 +266,9 @@ static int htable_create(struct xt_hashlimit_mtinfo1 *minfo, u_int8_t family)
if (minfo->cfg.size) {
size = minfo->cfg.size;
} else {
- size = (num_physpages << PAGE_SHIFT) / 16384 /
+ size = (totalram_pages << PAGE_SHIFT) / 16384 /
sizeof(struct list_head);
- if (num_physpages > 1024 * 1024 * 1024 / PAGE_SIZE)
+ if (totalram_pages > 1024 * 1024 * 1024 / PAGE_SIZE)
size = 8192;
if (size < 16)
size = 16;
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 2936fa3b6dc8..8b9a87c87753 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -2026,10 +2026,10 @@ static int __init netlink_proto_init(void)
if (!nl_table)
goto panic;
- if (num_physpages >= (128 * 1024))
- limit = num_physpages >> (21 - PAGE_SHIFT);
+ if (totalram_pages >= (128 * 1024))
+ limit = totalram_pages >> (21 - PAGE_SHIFT);
else
- limit = num_physpages >> (23 - PAGE_SHIFT);
+ limit = totalram_pages >> (23 - PAGE_SHIFT);
order = get_bitmask_order(limit) - 1 + PAGE_SHIFT;
limit = (1UL << order) / sizeof(struct hlist_head);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index ebe5718baa31..f9f71770de5b 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1836,7 +1836,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
static int packet_getsockopt(struct socket *sock, int level, int optname,
char __user *optval, int __user *optlen)
{
- int len;
+ unsigned int len;
int val;
struct sock *sk = sock->sk;
struct packet_sock *po = pkt_sk(sk);
@@ -1849,7 +1849,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
if (get_user(len, optlen))
return -EFAULT;
- if (len < 0)
+ if ((int)len < 0)
return -EINVAL;
switch (optname) {
diff --git a/net/rfkill/core.c b/net/rfkill/core.c
index a88743bc0032..d2438f940a25 100644
--- a/net/rfkill/core.c
+++ b/net/rfkill/core.c
@@ -121,7 +121,6 @@ static struct {
static bool rfkill_epo_lock_active;
-static unsigned long rfkill_no;
#ifdef CONFIG_RFKILL_LEDS
static void rfkill_led_trigger_event(struct rfkill *rfkill)
@@ -694,7 +693,7 @@ static struct device_attribute rfkill_dev_attrs[] = {
__ATTR(type, S_IRUGO, rfkill_type_show, NULL),
__ATTR(index, S_IRUGO, rfkill_idx_show, NULL),
__ATTR(persistent, S_IRUGO, rfkill_persistent_show, NULL),
- __ATTR(state, S_IRUGO|S_IWUGO, rfkill_state_show, rfkill_state_store),
+ __ATTR(state, S_IRUGO|S_IWUSR, rfkill_state_show, rfkill_state_store),
__ATTR(claim, S_IRUGO|S_IWUSR, rfkill_claim_show, rfkill_claim_store),
__ATTR_NULL
};
@@ -881,6 +880,7 @@ static void rfkill_sync_work(struct work_struct *work)
int __must_check rfkill_register(struct rfkill *rfkill)
{
+ static unsigned long rfkill_no;
struct device *dev = &rfkill->dev;
int error;
@@ -960,8 +960,8 @@ void rfkill_unregister(struct rfkill *rfkill)
mutex_lock(&rfkill_global_mutex);
rfkill_send_events(rfkill, RFKILL_OP_DEL);
list_del_init(&rfkill->node);
- rfkill_no--;
mutex_unlock(&rfkill_global_mutex);
+
rfkill_led_trigger_unregister(rfkill);
}
EXPORT_SYMBOL(rfkill_unregister);
@@ -1180,6 +1180,7 @@ static long rfkill_fop_ioctl(struct file *file, unsigned int cmd,
#endif
static const struct file_operations rfkill_fops = {
+ .owner = THIS_MODULE,
.open = rfkill_fop_open,
.read = rfkill_fop_read,
.write = rfkill_fop_write,
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c
index 96c0ed115e2a..6b0359a500e6 100644
--- a/net/sched/act_pedit.c
+++ b/net/sched/act_pedit.c
@@ -34,7 +34,7 @@ static struct tcf_hashinfo pedit_hash_info = {
};
static const struct nla_policy pedit_policy[TCA_PEDIT_MAX + 1] = {
- [TCA_PEDIT_PARMS] = { .len = sizeof(struct tcf_pedit) },
+ [TCA_PEDIT_PARMS] = { .len = sizeof(struct tc_pedit) },
};
static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est,
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 09cdcdfe7e91..b83ac88a1448 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -348,7 +348,7 @@ static int tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp,
tcm = NLMSG_DATA(nlh);
tcm->tcm_family = AF_UNSPEC;
tcm->tcm__pad1 = 0;
- tcm->tcm__pad1 = 0;
+ tcm->tcm__pad2 = 0;
tcm->tcm_ifindex = qdisc_dev(tp->q)->ifindex;
tcm->tcm_parent = tp->classid;
tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol);
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
index a76da657244a..4905051ffd83 100644
--- a/net/sctp/protocol.c
+++ b/net/sctp/protocol.c
@@ -1186,10 +1186,10 @@ SCTP_STATIC __init int sctp_init(void)
/* Size and allocate the association hash table.
* The methodology is similar to that of the tcp hash tables.
*/
- if (num_physpages >= (128 * 1024))
- goal = num_physpages >> (22 - PAGE_SHIFT);
+ if (totalram_pages >= (128 * 1024))
+ goal = totalram_pages >> (22 - PAGE_SHIFT);
else
- goal = num_physpages >> (24 - PAGE_SHIFT);
+ goal = totalram_pages >> (24 - PAGE_SHIFT);
for (order = 0; (1UL << order) < goal; order++)
;
diff --git a/net/socket.c b/net/socket.c
index f3cfd48191af..6d4716559047 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -96,10 +96,6 @@
#include <net/sock.h>
#include <linux/netfilter.h>
-#ifdef CONFIG_UID_STAT
-#include <linux/uid_stat.h>
-#endif
-
static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
unsigned long nr_segs, loff_t pos);
@@ -574,12 +570,7 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock,
if (err)
return err;
- err = sock->ops->sendmsg(iocb, sock, msg, size);
-#ifdef CONFIG_UID_STAT
- if (err > 0)
- update_tcp_snd(current_uid(), err);
-#endif
- return err;
+ return sock->ops->sendmsg(iocb, sock, msg, size);
}
int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
@@ -693,12 +684,7 @@ static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock,
if (err)
return err;
- err = sock->ops->recvmsg(iocb, sock, msg, size, flags);
-#ifdef CONFIG_UID_STAT
- if (err > 0)
- update_tcp_rcv(current_uid(), err);
-#endif
- return err;
+ return sock->ops->recvmsg(iocb, sock, msg, size, flags);
}
int sock_recvmsg(struct socket *sock, struct msghdr *msg,
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
index 66d458fc6920..836c50e3beed 100644
--- a/net/sunrpc/auth_gss/auth_gss.c
+++ b/net/sunrpc/auth_gss/auth_gss.c
@@ -485,7 +485,7 @@ gss_refresh_upcall(struct rpc_task *task)
dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid,
cred->cr_uid);
gss_msg = gss_setup_upcall(task->tk_client, gss_auth, cred);
- if (IS_ERR(gss_msg) == -EAGAIN) {
+ if (PTR_ERR(gss_msg) == -EAGAIN) {
/* XXX: warning on the first, under the assumption we
* shouldn't normally hit this case on a refresh. */
warn_gssd();
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 23128ee191ae..39e37bca2576 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -110,7 +110,7 @@ static void svc_release_skb(struct svc_rqst *rqstp)
rqstp->rq_xprt_ctxt = NULL;
dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
- skb_free_datagram(svsk->sk_sk, skb);
+ skb_free_datagram_locked(svsk->sk_sk, skb);
}
}
@@ -537,7 +537,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
printk("rpcsvc: received unknown control message:"
"%d/%d\n",
cmh->cmsg_level, cmh->cmsg_type);
- skb_free_datagram(svsk->sk_sk, skb);
+ skb_free_datagram_locked(svsk->sk_sk, skb);
return 0;
}
svc_udp_get_dest_address(rqstp, cmh);
@@ -548,18 +548,18 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) {
local_bh_enable();
/* checksum error */
- skb_free_datagram(svsk->sk_sk, skb);
+ skb_free_datagram_locked(svsk->sk_sk, skb);
return 0;
}
local_bh_enable();
- skb_free_datagram(svsk->sk_sk, skb);
+ skb_free_datagram_locked(svsk->sk_sk, skb);
} else {
/* we can use it in-place */
rqstp->rq_arg.head[0].iov_base = skb->data +
sizeof(struct udphdr);
rqstp->rq_arg.head[0].iov_len = len;
if (skb_checksum_complete(skb)) {
- skb_free_datagram(svsk->sk_sk, skb);
+ skb_free_datagram_locked(svsk->sk_sk, skb);
return 0;
}
rqstp->rq_xprt_ctxt = skb;
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index fc3ebb906911..fc820cd75453 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -1074,6 +1074,8 @@ restart:
err = -ECONNREFUSED;
if (other->sk_state != TCP_LISTEN)
goto out_unlock;
+ if (other->sk_shutdown & RCV_SHUTDOWN)
+ goto out_unlock;
if (unix_recvq_full(other)) {
err = -EAGAIN;
@@ -1501,6 +1503,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
struct sk_buff *skb;
int sent = 0;
struct scm_cookie tmp_scm;
+ bool fds_sent = false;
if (NULL == siocb->scm)
siocb->scm = &tmp_scm;
@@ -1562,12 +1565,14 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
size = min_t(int, size, skb_tailroom(skb));
memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
- if (siocb->scm->fp) {
+ /* Only send the fds in the first buffer */
+ if (siocb->scm->fp && !fds_sent) {
err = unix_attach_fds(siocb->scm, skb);
if (err) {
kfree_skb(skb);
goto out_err;
}
+ fds_sent = true;
}
err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 7e595ce24eeb..46c101a5e44e 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -97,7 +97,7 @@ void cfg80211_bss_expire(struct cfg80211_registered_device *dev)
dev->bss_generation++;
}
-static u8 *find_ie(u8 num, u8 *ies, size_t len)
+static u8 *find_ie(u8 num, u8 *ies, int len)
{
while (len > 2 && ies[0] != num) {
len -= ies[1] + 2;
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index c29be8f90248..43300b337fda 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -105,12 +105,12 @@ as-instr = $(call try-run,\
# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
cc-option = $(call try-run,\
- $(CC) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2))
+ $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2))
# cc-option-yn
# Usage: flag := $(call cc-option-yn,-march=winchip-c6)
cc-option-yn = $(call try-run,\
- $(CC) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n)
+ $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n)
# cc-option-align
# Prefix align with either -falign or -malign
diff --git a/scripts/Makefile b/scripts/Makefile
index 9dd5b25a1d53..842dbc2d5aed 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -10,7 +10,6 @@
hostprogs-$(CONFIG_KALLSYMS) += kallsyms
hostprogs-$(CONFIG_LOGO) += pnmtologo
hostprogs-$(CONFIG_VT) += conmakehash
-hostprogs-$(CONFIG_PROM_CONSOLE) += conmakehash
hostprogs-$(CONFIG_IKCONFIG) += bin2c
always := $(hostprogs-y) $(hostprogs-m)
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 5c4b7a400c18..98112d04fcb8 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -269,7 +269,8 @@ targets += $(extra-y) $(MAKECMDGOALS) $(always)
# Linker scripts preprocessor (.lds.S -> .lds)
# ---------------------------------------------------------------------------
quiet_cmd_cpp_lds_S = LDS $@
- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ -o $@ $<
+ cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
+ -D__ASSEMBLY__ -o $@ $<
$(obj)/%.lds: $(src)/%.lds.S FORCE
$(call if_changed_dep,cpp_lds_S)
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
index 9d5bb40ed0c5..d5c232ff58c8 100644
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
@@ -586,7 +586,7 @@ static int prefix_underscores_count(const char *str)
{
const char *tail = str;
- while (*tail != '_')
+ while (*tail == '_')
tail++;
return tail - str;
diff --git a/security/integrity/ima/ima_iint.c b/security/integrity/ima/ima_iint.c
index b8dd693f8790..a4e2b1dac943 100644
--- a/security/integrity/ima/ima_iint.c
+++ b/security/integrity/ima/ima_iint.c
@@ -58,11 +58,11 @@ struct ima_iint_cache *ima_iint_insert(struct inode *inode)
if (!ima_initialized)
return iint;
- iint = kmem_cache_alloc(iint_cache, GFP_KERNEL);
+ iint = kmem_cache_alloc(iint_cache, GFP_NOFS);
if (!iint)
return iint;
- rc = radix_tree_preload(GFP_KERNEL);
+ rc = radix_tree_preload(GFP_NOFS);
if (rc < 0)
goto out;
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
index 7f09fb897d2b..667aecd0fe52 100644
--- a/security/keys/keyctl.c
+++ b/security/keys/keyctl.c
@@ -860,7 +860,7 @@ static long get_instantiation_keyring(key_serial_t ringid,
/* otherwise specify the destination keyring recorded in the
* authorisation key (any KEY_SPEC_*_KEYRING) */
if (ringid >= KEY_SPEC_REQUESTOR_KEYRING) {
- *_dest_keyring = rka->dest_keyring;
+ *_dest_keyring = key_get(rka->dest_keyring);
return 0;
}
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 8d8b69c5664e..43f26dd8ab64 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -2360,7 +2360,7 @@ static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
initrlim = init_task.signal->rlim + i;
rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
}
- update_rlimit_cpu(rlim->rlim_cur);
+ update_rlimit_cpu(current->signal->rlim[RLIMIT_CPU].rlim_cur);
}
}
diff --git a/sound/aoa/codecs/tas.c b/sound/aoa/codecs/tas.c
index f0ebc971c686..1dd66ddffcaf 100644
--- a/sound/aoa/codecs/tas.c
+++ b/sound/aoa/codecs/tas.c
@@ -897,6 +897,15 @@ static int tas_create(struct i2c_adapter *adapter,
client = i2c_new_device(adapter, &info);
if (!client)
return -ENODEV;
+ /*
+ * We know the driver is already loaded, so the device should be
+ * already bound. If not it means binding failed, and then there
+ * is no point in keeping the device instantiated.
+ */
+ if (!client->driver) {
+ i2c_unregister_device(client);
+ return -ENODEV;
+ }
/*
* Let i2c-core delete that device on driver removal.
diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c
index dc78272fc39f..dbb05b772558 100644
--- a/sound/arm/aaci.c
+++ b/sound/arm/aaci.c
@@ -504,6 +504,10 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream,
int err;
aaci_pcm_hw_free(substream);
+ if (aacirun->pcm_open) {
+ snd_ac97_pcm_close(aacirun->pcm);
+ aacirun->pcm_open = 0;
+ }
err = devdma_hw_alloc(NULL, substream,
params_buffer_bytes(params));
@@ -517,7 +521,7 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream,
else
err = snd_ac97_pcm_open(aacirun->pcm, params_rate(params),
params_channels(params),
- aacirun->pcm->r[1].slots);
+ aacirun->pcm->r[0].slots);
if (err)
goto out;
diff --git a/sound/arm/mxc-alsa-spdif.c b/sound/arm/mxc-alsa-spdif.c
index ae48051b49e8..93a34cd03e11 100644
--- a/sound/arm/mxc-alsa-spdif.c
+++ b/sound/arm/mxc-alsa-spdif.c
@@ -257,7 +257,6 @@ struct mxc_spdif_device {
* SPDIF module register base address
*/
unsigned long __iomem *reg_base;
- unsigned long reg_phys_base;
/*!
* spdif tx available or not
@@ -944,9 +943,8 @@ static void spdif_stop_tx(struct mxc_spdif_stream *s)
*/
static void spdif_start_tx(struct mxc_spdif_stream *s)
{
- struct snd_pcm_substream *substream = s->stream;
- struct snd_pcm_runtime *runtime = substream->runtime;
- struct mxc_spdif_device *chip = snd_pcm_substream_chip(substream);
+ struct snd_pcm_substream *substream;
+ struct snd_pcm_runtime *runtime;
unsigned int dma_size = 0;
unsigned int offset;
int ret = 0;
@@ -962,7 +960,7 @@ static void spdif_start_tx(struct mxc_spdif_stream *s)
(NULL, runtime->dma_area + offset, dma_size,
DMA_TO_DEVICE));
- dma_request.dst_addr = (dma_addr_t) (chip->reg_phys_base + 0x2c);
+ dma_request.dst_addr = (dma_addr_t) (SPDIF_BASE_ADDR + 0x2c);
dma_request.num_of_bytes = dma_size;
mxc_dma_config(s->dma_wchannel, &dma_request, 1,
@@ -1281,14 +1279,15 @@ static void spdif_stop_rx(struct mxc_spdif_stream *s)
*/
static void spdif_start_rx(struct mxc_spdif_stream *s)
{
- struct snd_pcm_substream *substream = s->stream;
- struct snd_pcm_runtime *runtime = substream->runtime;
- struct mxc_spdif_device *chip = snd_pcm_substream_chip(substream);
+ struct snd_pcm_substream *substream;
+ struct snd_pcm_runtime *runtime;
unsigned int dma_size = 0;
unsigned int offset;
int ret = 0;
mxc_dma_requestbuf_t dma_request;
+ substream = s->stream;
+ runtime = substream->runtime;
memset(&dma_request, 0, sizeof(mxc_dma_requestbuf_t));
if (s->active) {
@@ -1306,7 +1305,7 @@ static void spdif_start_rx(struct mxc_spdif_stream *s)
DMA_FROM_DEVICE));
dma_request.src_addr =
- (dma_addr_t) (chip->reg_phys_base + SPDIF_REG_SRL);
+ (dma_addr_t) (SPDIF_BASE_ADDR + SPDIF_REG_SRL);
dma_request.num_of_bytes = dma_size;
/* config and enable sdma for RX */
mxc_dma_config(s->dma_wchannel, &dma_request, 1,
@@ -2090,7 +2089,6 @@ static int mxc_alsa_spdif_probe(struct platform_device
chip = card->private_data;
chip->card = card;
card->dev = &pdev->dev;
- chip->reg_phys_base = res->start;
chip->reg_base = ioremap(res->start, res->end - res->start + 1);
spdif_base_addr = (unsigned long)chip->reg_base;
plat_data = (struct mxc_spdif_platform_data *)pdev->dev.platform_data;
diff --git a/sound/core/hrtimer.c b/sound/core/hrtimer.c
index 34c7d48f5061..7f4d744ae40a 100644
--- a/sound/core/hrtimer.c
+++ b/sound/core/hrtimer.c
@@ -37,14 +37,22 @@ static unsigned int resolution;
struct snd_hrtimer {
struct snd_timer *timer;
struct hrtimer hrt;
+ atomic_t running;
};
static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt)
{
struct snd_hrtimer *stime = container_of(hrt, struct snd_hrtimer, hrt);
struct snd_timer *t = stime->timer;
+
+ if (!atomic_read(&stime->running))
+ return HRTIMER_NORESTART;
+
hrtimer_forward_now(hrt, ns_to_ktime(t->sticks * resolution));
snd_timer_interrupt(stime->timer, t->sticks);
+
+ if (!atomic_read(&stime->running))
+ return HRTIMER_NORESTART;
return HRTIMER_RESTART;
}
@@ -58,6 +66,7 @@ static int snd_hrtimer_open(struct snd_timer *t)
hrtimer_init(&stime->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
stime->timer = t;
stime->hrt.function = snd_hrtimer_callback;
+ atomic_set(&stime->running, 0);
t->private_data = stime;
return 0;
}
@@ -78,16 +87,18 @@ static int snd_hrtimer_start(struct snd_timer *t)
{
struct snd_hrtimer *stime = t->private_data;
+ atomic_set(&stime->running, 0);
+ hrtimer_cancel(&stime->hrt);
hrtimer_start(&stime->hrt, ns_to_ktime(t->sticks * resolution),
HRTIMER_MODE_REL);
+ atomic_set(&stime->running, 1);
return 0;
}
static int snd_hrtimer_stop(struct snd_timer *t)
{
struct snd_hrtimer *stime = t->private_data;
-
- hrtimer_cancel(&stime->hrt);
+ atomic_set(&stime->running, 0);
return 0;
}
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c
index 473247c8e6d3..70d6f25ba526 100644
--- a/sound/core/rawmidi.c
+++ b/sound/core/rawmidi.c
@@ -248,7 +248,8 @@ static int assign_substream(struct snd_rawmidi *rmidi, int subdevice,
list_for_each_entry(substream, &s->substreams, list) {
if (substream->opened) {
if (stream == SNDRV_RAWMIDI_STREAM_INPUT ||
- !(mode & SNDRV_RAWMIDI_LFLG_APPEND))
+ !(mode & SNDRV_RAWMIDI_LFLG_APPEND) ||
+ !substream->append)
continue;
}
if (subdevice < 0 || subdevice == substream->number) {
@@ -266,17 +267,21 @@ static int open_substream(struct snd_rawmidi *rmidi,
{
int err;
- err = snd_rawmidi_runtime_create(substream);
- if (err < 0)
- return err;
- err = substream->ops->open(substream);
- if (err < 0)
- return err;
- substream->opened = 1;
- if (substream->use_count++ == 0)
- substream->active_sensing = 1;
- if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
- substream->append = 1;
+ if (substream->use_count == 0) {
+ err = snd_rawmidi_runtime_create(substream);
+ if (err < 0)
+ return err;
+ err = substream->ops->open(substream);
+ if (err < 0) {
+ snd_rawmidi_runtime_free(substream);
+ return err;
+ }
+ substream->opened = 1;
+ substream->active_sensing = 0;
+ if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
+ substream->append = 1;
+ }
+ substream->use_count++;
rmidi->streams[substream->stream].substream_opened++;
return 0;
}
@@ -297,27 +302,27 @@ static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode,
SNDRV_RAWMIDI_STREAM_INPUT,
mode, &sinput);
if (err < 0)
- goto __error;
+ return err;
}
if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) {
err = assign_substream(rmidi, subdevice,
SNDRV_RAWMIDI_STREAM_OUTPUT,
mode, &soutput);
if (err < 0)
- goto __error;
+ return err;
}
if (sinput) {
err = open_substream(rmidi, sinput, mode);
if (err < 0)
- goto __error;
+ return err;
}
if (soutput) {
err = open_substream(rmidi, soutput, mode);
if (err < 0) {
if (sinput)
close_substream(rmidi, sinput, 0);
- goto __error;
+ return err;
}
}
@@ -325,13 +330,6 @@ static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode,
rfile->input = sinput;
rfile->output = soutput;
return 0;
-
- __error:
- if (sinput && sinput->runtime)
- snd_rawmidi_runtime_free(sinput);
- if (soutput && soutput->runtime)
- snd_rawmidi_runtime_free(soutput);
- return err;
}
/* called from sound/core/seq/seq_midi.c */
diff --git a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c
index 4d26146a62cc..90356b880dbb 100644
--- a/sound/core/seq/seq_midi.c
+++ b/sound/core/seq/seq_midi.c
@@ -236,6 +236,7 @@ static int midisynth_use(void *private_data, struct snd_seq_port_subscribe *info
memset(&params, 0, sizeof(params));
params.avail_min = 1;
params.buffer_size = output_buffer_size;
+ params.no_active_sensing = 1;
if ((err = snd_rawmidi_output_params(msynth->output_rfile.output, &params)) < 0) {
snd_rawmidi_kernel_release(&msynth->output_rfile);
return err;
diff --git a/sound/mips/sgio2audio.c b/sound/mips/sgio2audio.c
index e497525bc11b..db7ff29ee9a1 100644
--- a/sound/mips/sgio2audio.c
+++ b/sound/mips/sgio2audio.c
@@ -609,7 +609,7 @@ static int snd_sgio2audio_pcm_hw_params(struct snd_pcm_substream *substream,
/* alloc virtual 'dma' area */
if (runtime->dma_area)
vfree(runtime->dma_area);
- runtime->dma_area = vmalloc(size);
+ runtime->dma_area = vmalloc_user(size);
if (runtime->dma_area == NULL)
return -ENOMEM;
runtime->dma_bytes = size;
diff --git a/sound/pci/cs46xx/cs46xx_lib.h b/sound/pci/cs46xx/cs46xx_lib.h
index 4eb55aa33612..b5189495d58a 100644
--- a/sound/pci/cs46xx/cs46xx_lib.h
+++ b/sound/pci/cs46xx/cs46xx_lib.h
@@ -35,7 +35,7 @@
#ifdef CONFIG_SND_CS46XX_NEW_DSP
-#define CS46XX_MIN_PERIOD_SIZE 1
+#define CS46XX_MIN_PERIOD_SIZE 64
#define CS46XX_MAX_PERIOD_SIZE 1024*1024
#else
#define CS46XX_MIN_PERIOD_SIZE 2048
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 175f07a381ba..7ea92f58ffd4 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1839,6 +1839,12 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
if (!bdl_pos_adj[chip->dev_index])
return 1; /* no delayed ack */
+ if (azx_dev->period_bytes == 0) {
+ printk(KERN_WARNING
+ "hda-intel: Divide by zero was avoided "
+ "in azx_dev->period_bytes.\n");
+ return 0;
+ }
if (pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
return 0; /* NG - it's below the period boundary */
return 1; /* OK, it's fine */
@@ -2392,6 +2398,11 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
}
}
+ /* disable 64bit DMA address for Teradici */
+ /* it does not work with device 6549:1200 subsys e4a2:040b */
+ if (chip->driver_type == AZX_DRIVER_TERA)
+ gcap &= ~ICH6_GCAP_64OK;
+
/* allow 64bit DMA address if supported by H/W */
if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 30eeb304351c..713bf692bc27 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -16876,6 +16876,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
ALC662_3ST_6ch_DIG),
+ SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB200", ALC663_ASUS_MODE4),
SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
ALC662_3ST_6ch_DIG),
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index 6990cfcb6a38..285b1e24e995 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -1817,6 +1817,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
"Dell Studio 17", STAC_DELL_M6_DMIC),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be,
"Dell Studio 1555", STAC_DELL_M6_DMIC),
+ SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd,
+ "Dell Studio 1557", STAC_DELL_M6_DMIC),
{} /* terminator */
};
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c
index cc84a831eb21..56d1bd8b6118 100644
--- a/sound/pci/ice1712/ice1724.c
+++ b/sound/pci/ice1712/ice1724.c
@@ -643,7 +643,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
(inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) {
/* running? we cannot change the rate now... */
spin_unlock_irqrestore(&ice->reg_lock, flags);
- return -EBUSY;
+ return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY;
}
if (!force && is_pro_rate_locked(ice)) {
spin_unlock_irqrestore(&ice->reg_lock, flags);
diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c
index a83d1968a845..32f98535c0b4 100644
--- a/sound/pci/mixart/mixart.c
+++ b/sound/pci/mixart/mixart.c
@@ -1161,13 +1161,15 @@ static long snd_mixart_BA0_read(struct snd_info_entry *entry, void *file_private
unsigned long count, unsigned long pos)
{
struct mixart_mgr *mgr = entry->private_data;
+ unsigned long maxsize;
- count = count & ~3; /* make sure the read size is a multiple of 4 bytes */
- if(count <= 0)
+ if (pos >= MIXART_BA0_SIZE)
return 0;
- if(pos + count > MIXART_BA0_SIZE)
- count = (long)(MIXART_BA0_SIZE - pos);
- if(copy_to_user_fromio(buf, MIXART_MEM( mgr, pos ), count))
+ maxsize = MIXART_BA0_SIZE - pos;
+ if (count > maxsize)
+ count = maxsize;
+ count = count & ~3; /* make sure the read size is a multiple of 4 bytes */
+ if (copy_to_user_fromio(buf, MIXART_MEM(mgr, pos), count))
return -EFAULT;
return count;
}
@@ -1180,13 +1182,15 @@ static long snd_mixart_BA1_read(struct snd_info_entry *entry, void *file_private
unsigned long count, unsigned long pos)
{
struct mixart_mgr *mgr = entry->private_data;
+ unsigned long maxsize;
- count = count & ~3; /* make sure the read size is a multiple of 4 bytes */
- if(count <= 0)
+ if (pos > MIXART_BA1_SIZE)
return 0;
- if(pos + count > MIXART_BA1_SIZE)
- count = (long)(MIXART_BA1_SIZE - pos);
- if(copy_to_user_fromio(buf, MIXART_REG( mgr, pos ), count))
+ maxsize = MIXART_BA1_SIZE - pos;
+ if (count > maxsize)
+ count = maxsize;
+ count = count & ~3; /* make sure the read size is a multiple of 4 bytes */
+ if (copy_to_user_fromio(buf, MIXART_REG(mgr, pos), count))
return -EFAULT;
return count;
}
diff --git a/sound/pci/oxygen/oxygen_io.c b/sound/pci/oxygen/oxygen_io.c
index c1eb923f2ac9..09b2b2a36df5 100644
--- a/sound/pci/oxygen/oxygen_io.c
+++ b/sound/pci/oxygen/oxygen_io.c
@@ -215,17 +215,8 @@ EXPORT_SYMBOL(oxygen_write_spi);
void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data)
{
- unsigned long timeout;
-
/* should not need more than about 300 us */
- timeout = jiffies + msecs_to_jiffies(1);
- do {
- if (!(oxygen_read16(chip, OXYGEN_2WIRE_BUS_STATUS)
- & OXYGEN_2WIRE_BUSY))
- break;
- udelay(1);
- cond_resched();
- } while (time_after_eq(timeout, jiffies));
+ msleep(1);
oxygen_write8(chip, OXYGEN_2WIRE_MAP, map);
oxygen_write8(chip, OXYGEN_2WIRE_DATA, data);
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c
index acfa4760da49..91683a349035 100644
--- a/sound/pci/via82xx.c
+++ b/sound/pci/via82xx.c
@@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct via82xx *chip = snd_kcontrol_chip(kcontrol);
- unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
+ unsigned int idx = kcontrol->id.subdevice;
ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0];
ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1];
@@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct via82xx *chip = snd_kcontrol_chip(kcontrol);
- unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
+ unsigned int idx = kcontrol->id.subdevice;
unsigned long port = chip->port + 0x10 * idx;
unsigned char val;
int i, change = 0;
@@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata =
};
static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = {
- .name = "VIA DXS Playback Volume",
- .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+ .device = 0,
+ /* .subdevice set later */
+ .name = "PCM Playback Volume",
.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
SNDRV_CTL_ELEM_ACCESS_TLV_READ),
- .count = 4,
.info = snd_via8233_dxs_volume_info,
.get = snd_via8233_dxs_volume_get,
.put = snd_via8233_dxs_volume_put,
@@ -1936,10 +1937,18 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip)
}
else /* Using DXS when PCM emulation is enabled is really weird */
{
- /* Standalone DXS controls */
- err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip));
- if (err < 0)
- return err;
+ for (i = 0; i < 4; ++i) {
+ struct snd_kcontrol *kctl;
+
+ kctl = snd_ctl_new1(
+ &snd_via8233_dxs_volume_control, chip);
+ if (!kctl)
+ return -ENOMEM;
+ kctl->id.subdevice = i;
+ err = snd_ctl_add(chip->card, kctl);
+ if (err < 0)
+ return err;
+ }
}
}
/* select spdif data slot 10/11 */
diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c b/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c
index d057e6489643..5cfa608823f7 100644
--- a/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c
+++ b/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c
@@ -51,7 +51,7 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s
return 0; /* already enough large */
vfree(runtime->dma_area);
}
- runtime->dma_area = vmalloc_32(size);
+ runtime->dma_area = vmalloc_32_user(size);
if (! runtime->dma_area)
return -ENOMEM;
runtime->dma_bytes = size;
diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c
index 835fa19ed461..bb6819aab133 100644
--- a/sound/ppc/keywest.c
+++ b/sound/ppc/keywest.c
@@ -59,6 +59,18 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter)
strlcpy(info.type, "keywest", I2C_NAME_SIZE);
info.addr = keywest_ctx->addr;
keywest_ctx->client = i2c_new_device(adapter, &info);
+ if (!keywest_ctx->client)
+ return -ENODEV;
+ /*
+ * We know the driver is already loaded, so the device should be
+ * already bound. If not it means binding failed, and then there
+ * is no point in keeping the device instantiated.
+ */
+ if (!keywest_ctx->client->driver) {
+ i2c_unregister_device(keywest_ctx->client);
+ keywest_ctx->client = NULL;
+ return -ENODEV;
+ }
/*
* Let i2c-core delete that device on driver removal.
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c
index 9bea4d8a523d..dbe96a8e1d3b 100644
--- a/sound/soc/codecs/sgtl5000.c
+++ b/sound/soc/codecs/sgtl5000.c
@@ -608,8 +608,6 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream,
fs = sgtl5000->lrclk;
/* SGTL5000 rev1 has a IC bug to prevent switching to MCLK from PLL. */
if (!sgtl5000->master) {
- sys_fs = sgtl5000->lrclk;
- clk_ctl = SGTL5000_RATE_MODE_DIV_1 << SGTL5000_RATE_MODE_SHIFT;
if (fs * 256 == sgtl5000->sysclk)
clk_ctl |= SGTL5000_MCLK_FREQ_256FS << \
SGTL5000_MCLK_FREQ_SHIFT;
diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c
index 0b8dcb5cd729..1365de0f7aec 100644
--- a/sound/soc/codecs/tlv320aic23.c
+++ b/sound/soc/codecs/tlv320aic23.c
@@ -625,11 +625,10 @@ static int tlv320aic23_resume(struct platform_device *pdev)
{
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
struct snd_soc_codec *codec = socdev->card->codec;
- int i;
u16 reg;
/* Sync reg_cache with the hardware */
- for (reg = 0; reg < ARRAY_SIZE(tlv320aic23_reg); i++) {
+ for (reg = 0; reg < TLV320AIC23_RESET; reg++) {
u16 val = tlv320aic23_read_reg_cache(codec, reg);
tlv320aic23_write(codec, reg, val);
}
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c
index 1fd4e88f50cf..e9123f54202d 100644
--- a/sound/soc/codecs/wm9712.c
+++ b/sound/soc/codecs/wm9712.c
@@ -464,7 +464,8 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
{
u16 *cache = codec->reg_cache;
- soc_ac97_ops.write(codec->ac97, reg, val);
+ if (reg < 0x7c)
+ soc_ac97_ops.write(codec->ac97, reg, val);
reg = reg >> 1;
if (reg < (ARRAY_SIZE(wm9712_reg)))
cache[reg] = val;
diff --git a/sound/soc/mxs/mxs-dai.c b/sound/soc/mxs/mxs-dai.c
index 9ca22ecdb4b0..a548b9948516 100644
--- a/sound/soc/mxs/mxs-dai.c
+++ b/sound/soc/mxs/mxs-dai.c
@@ -288,7 +288,6 @@ static int mxs_saif_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
default:
return -EINVAL;
}
- break;
default:
return -EINVAL;
}
diff --git a/sound/soc/mxs/mxs-pcm.c b/sound/soc/mxs/mxs-pcm.c
index dac91e3eb8fb..f3cdcdbd2861 100644
--- a/sound/soc/mxs/mxs-pcm.c
+++ b/sound/soc/mxs/mxs-pcm.c
@@ -378,7 +378,6 @@ static int mxs_pcm_close(struct snd_pcm_substream *substream)
free_irq(prtd->params->irq, substream);
mxs_dma_get_cooked(prtd->dma_ch, &list);
/* Free DMA channel*/
- mxs_dma_reset(prtd->dma_ch);
for (desc = 0; desc < desc_num; desc++)
mxs_dma_free_desc(prtd->dma_desc_array[desc]);
mxs_dma_release(prtd->dma_ch, mxs_pcm_dev);
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 21c69074aa17..4aba33fa6b70 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -774,9 +774,19 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
if (!w->power_check)
continue;
- power = w->power_check(w);
- if (power)
- sys_power = 1;
+ /* If we're suspending then pull down all the
+ * power. */
+ switch (event) {
+ case SND_SOC_DAPM_STREAM_SUSPEND:
+ power = 0;
+ break;
+
+ default:
+ power = w->power_check(w);
+ if (power)
+ sys_power = 1;
+ break;
+ }
if (w->power == power)
continue;
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index 44b9cdc8a83b..8da53c56c4d2 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -752,7 +752,7 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s
return 0; /* already large enough */
vfree(runtime->dma_area);
}
- runtime->dma_area = vmalloc(size);
+ runtime->dma_area = vmalloc_user(size);
if (!runtime->dma_area)
return -ENOMEM;
runtime->dma_bytes = size;
@@ -1934,7 +1934,7 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream, int direction)
struct snd_usb_stream *as = snd_pcm_substream_chip(substream);
struct snd_usb_substream *subs = &as->substream[direction];
- if (subs->interface >= 0) {
+ if (!as->chip->shutdown && subs->interface >= 0) {
usb_set_interface(subs->dev, subs->interface, 0);
subs->interface = -1;
}
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
index 8e7f78941ba6..e9a3a9dca15c 100644
--- a/sound/usb/usbaudio.h
+++ b/sound/usb/usbaudio.h
@@ -210,7 +210,7 @@ struct snd_usb_midi_endpoint_info {
/*
*/
-#define combine_word(s) ((*s) | ((unsigned int)(s)[1] << 8))
+#define combine_word(s) ((*(s)) | ((unsigned int)(s)[1] << 8))
#define combine_triple(s) (combine_word(s) | ((unsigned int)(s)[2] << 16))
#define combine_quad(s) (combine_triple(s) | ((unsigned int)(s)[3] << 24))
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 5e17de984dc8..5010952c1d81 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -1335,8 +1335,8 @@ static int __cmd_annotate(void)
exit(-1);
}
- if (!force && (stat.st_uid != geteuid())) {
- fprintf(stderr, "file: %s not owned by current user\n", input_name);
+ if (!force && stat.st_uid && (stat.st_uid != geteuid())) {
+ fprintf(stderr, "file: %s not owned by current user or root\n", input_name);
exit(-1);
}
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 8b2ec882e6e0..b8a75f63d535 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -1857,8 +1857,8 @@ static int __cmd_report(void)
exit(-1);
}
- if (!force && (stat.st_uid != geteuid())) {
- fprintf(stderr, "file: %s not owned by current user\n", input_name);
+ if (!force && stat.st_uid && (stat.st_uid != geteuid())) {
+ fprintf(stderr, "file: %s not owned by current user or root\n", input_name);
exit(-1);
}
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index b4b06c7903e1..e874ad447ff9 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -82,19 +82,32 @@ static u64 runtime_cycles[MAX_RUN];
static u64 event_res[MAX_RUN][MAX_COUNTERS][3];
static u64 event_scaled[MAX_RUN][MAX_COUNTERS];
-static u64 event_res_avg[MAX_COUNTERS][3];
-static u64 event_res_noise[MAX_COUNTERS][3];
+struct stats
+{
+ double sum;
+ double sum_sq;
+};
-static u64 event_scaled_avg[MAX_COUNTERS];
+static double avg_stats(struct stats *stats)
+{
+ return stats->sum / run_count;
+}
-static u64 runtime_nsecs_avg;
-static u64 runtime_nsecs_noise;
+/*
+ * stddev = sqrt(1/N (\Sum n_i^2) - avg(n)^2)
+ */
+static double stddev_stats(struct stats *stats)
+{
+ double avg = stats->sum / run_count;
-static u64 walltime_nsecs_avg;
-static u64 walltime_nsecs_noise;
+ return sqrt(stats->sum_sq/run_count - avg*avg);
+}
-static u64 runtime_cycles_avg;
-static u64 runtime_cycles_noise;
+struct stats event_res_stats[MAX_COUNTERS][3];
+struct stats event_scaled_stats[MAX_COUNTERS];
+struct stats runtime_nsecs_stats;
+struct stats walltime_nsecs_stats;
+struct stats runtime_cycles_stats;
#define MATCH_EVENT(t, c, counter) \
(attrs[counter].type == PERF_TYPE_##t && \
@@ -278,42 +291,37 @@ static int run_perf_stat(int argc __used, const char **argv)
return WEXITSTATUS(status);
}
-static void print_noise(u64 *count, u64 *noise)
+static void print_noise(double avg, double stddev)
{
if (run_count > 1)
- fprintf(stderr, " ( +- %7.3f%% )",
- (double)noise[0]/(count[0]+1)*100.0);
+ fprintf(stderr, " ( +- %7.3f%% )", 100*stddev / avg);
}
-static void nsec_printout(int counter, u64 *count, u64 *noise)
+static void nsec_printout(int counter, double avg, double stddev)
{
- double msecs = (double)count[0] / 1000000;
+ double msecs = avg / 1e6;
fprintf(stderr, " %14.6f %-24s", msecs, event_name(counter));
if (MATCH_EVENT(SOFTWARE, SW_TASK_CLOCK, counter)) {
- if (walltime_nsecs_avg)
- fprintf(stderr, " # %10.3f CPUs ",
- (double)count[0] / (double)walltime_nsecs_avg);
+ fprintf(stderr, " # %10.3f CPUs ",
+ avg / avg_stats(&walltime_nsecs_stats));
}
- print_noise(count, noise);
+ print_noise(avg, stddev);
}
-static void abs_printout(int counter, u64 *count, u64 *noise)
+static void abs_printout(int counter, double avg, double stddev)
{
- fprintf(stderr, " %14Ld %-24s", count[0], event_name(counter));
+ fprintf(stderr, " %14.0f %-24s", avg, event_name(counter));
- if (runtime_cycles_avg &&
- MATCH_EVENT(HARDWARE, HW_INSTRUCTIONS, counter)) {
+ if (MATCH_EVENT(HARDWARE, HW_INSTRUCTIONS, counter)) {
fprintf(stderr, " # %10.3f IPC ",
- (double)count[0] / (double)runtime_cycles_avg);
+ avg / avg_stats(&runtime_cycles_stats));
} else {
- if (runtime_nsecs_avg) {
- fprintf(stderr, " # %10.3f M/sec",
- (double)count[0]/runtime_nsecs_avg*1000.0);
- }
+ fprintf(stderr, " # %10.3f M/sec",
+ 1000.0 * avg / avg_stats(&runtime_nsecs_stats));
}
- print_noise(count, noise);
+ print_noise(avg, stddev);
}
/*
@@ -321,12 +329,12 @@ static void abs_printout(int counter, u64 *count, u64 *noise)
*/
static void print_counter(int counter)
{
- u64 *count, *noise;
+ double avg, stddev;
int scaled;
- count = event_res_avg[counter];
- noise = event_res_noise[counter];
- scaled = event_scaled_avg[counter];
+ avg = avg_stats(&event_res_stats[counter][0]);
+ stddev = stddev_stats(&event_res_stats[counter][0]);
+ scaled = avg_stats(&event_scaled_stats[counter]);
if (scaled == -1) {
fprintf(stderr, " %14s %-24s\n",
@@ -335,36 +343,34 @@ static void print_counter(int counter)
}
if (nsec_counter(counter))
- nsec_printout(counter, count, noise);
+ nsec_printout(counter, avg, stddev);
else
- abs_printout(counter, count, noise);
+ abs_printout(counter, avg, stddev);
+
+ if (scaled) {
+ double avg_enabled, avg_running;
+
+ avg_enabled = avg_stats(&event_res_stats[counter][1]);
+ avg_running = avg_stats(&event_res_stats[counter][2]);
- if (scaled)
fprintf(stderr, " (scaled from %.2f%%)",
- (double) count[2] / count[1] * 100);
+ 100 * avg_running / avg_enabled);
+ }
fprintf(stderr, "\n");
}
-/*
- * normalize_noise noise values down to stddev:
- */
-static void normalize_noise(u64 *val)
+static void update_stats(const char *name, int idx, struct stats *stats, u64 *val)
{
- double res;
+ double sq = *val;
- res = (double)*val / (run_count * sqrt((double)run_count));
-
- *val = (u64)res;
-}
-
-static void update_avg(const char *name, int idx, u64 *avg, u64 *val)
-{
- *avg += *val;
+ stats->sum += *val;
+ stats->sum_sq += sq * sq;
if (verbose > 1)
fprintf(stderr, "debug: %20s[%d]: %Ld\n", name, idx, *val);
}
+
/*
* Calculate the averages and noises:
*/
@@ -376,61 +382,22 @@ static void calc_avg(void)
fprintf(stderr, "\n");
for (i = 0; i < run_count; i++) {
- update_avg("runtime", 0, &runtime_nsecs_avg, runtime_nsecs + i);
- update_avg("walltime", 0, &walltime_nsecs_avg, walltime_nsecs + i);
- update_avg("runtime_cycles", 0, &runtime_cycles_avg, runtime_cycles + i);
+ update_stats("runtime", 0, &runtime_nsecs_stats, runtime_nsecs + i);
+ update_stats("walltime", 0, &walltime_nsecs_stats, walltime_nsecs + i);
+ update_stats("runtime_cycles", 0, &runtime_cycles_stats, runtime_cycles + i);
for (j = 0; j < nr_counters; j++) {
- update_avg("counter/0", j,
- event_res_avg[j]+0, event_res[i][j]+0);
- update_avg("counter/1", j,
- event_res_avg[j]+1, event_res[i][j]+1);
- update_avg("counter/2", j,
- event_res_avg[j]+2, event_res[i][j]+2);
+ update_stats("counter/0", j,
+ event_res_stats[j]+0, event_res[i][j]+0);
+ update_stats("counter/1", j,
+ event_res_stats[j]+1, event_res[i][j]+1);
+ update_stats("counter/2", j,
+ event_res_stats[j]+2, event_res[i][j]+2);
if (event_scaled[i][j] != (u64)-1)
- update_avg("scaled", j,
- event_scaled_avg + j, event_scaled[i]+j);
- else
- event_scaled_avg[j] = -1;
+ update_stats("scaled", j,
+ event_scaled_stats + j, event_scaled[i]+j);
}
}
- runtime_nsecs_avg /= run_count;
- walltime_nsecs_avg /= run_count;
- runtime_cycles_avg /= run_count;
-
- for (j = 0; j < nr_counters; j++) {
- event_res_avg[j][0] /= run_count;
- event_res_avg[j][1] /= run_count;
- event_res_avg[j][2] /= run_count;
- }
-
- for (i = 0; i < run_count; i++) {
- runtime_nsecs_noise +=
- abs((s64)(runtime_nsecs[i] - runtime_nsecs_avg));
- walltime_nsecs_noise +=
- abs((s64)(walltime_nsecs[i] - walltime_nsecs_avg));
- runtime_cycles_noise +=
- abs((s64)(runtime_cycles[i] - runtime_cycles_avg));
-
- for (j = 0; j < nr_counters; j++) {
- event_res_noise[j][0] +=
- abs((s64)(event_res[i][j][0] - event_res_avg[j][0]));
- event_res_noise[j][1] +=
- abs((s64)(event_res[i][j][1] - event_res_avg[j][1]));
- event_res_noise[j][2] +=
- abs((s64)(event_res[i][j][2] - event_res_avg[j][2]));
- }
- }
-
- normalize_noise(&runtime_nsecs_noise);
- normalize_noise(&walltime_nsecs_noise);
- normalize_noise(&runtime_cycles_noise);
-
- for (j = 0; j < nr_counters; j++) {
- normalize_noise(&event_res_noise[j][0]);
- normalize_noise(&event_res_noise[j][1]);
- normalize_noise(&event_res_noise[j][2]);
- }
}
static void print_stat(int argc, const char **argv)
@@ -457,10 +424,11 @@ static void print_stat(int argc, const char **argv)
fprintf(stderr, "\n");
fprintf(stderr, " %14.9f seconds time elapsed",
- (double)walltime_nsecs_avg/1e9);
+ avg_stats(&walltime_nsecs_stats)/1e9);
if (run_count > 1) {
fprintf(stderr, " ( +- %7.3f%% )",
- 100.0*(double)walltime_nsecs_noise/(double)walltime_nsecs_avg);
+ 100*stddev_stats(&walltime_nsecs_stats) /
+ avg_stats(&walltime_nsecs_stats));
}
fprintf(stderr, "\n\n");
}
diff --git a/tools/perf/util/module.c b/tools/perf/util/module.c
index ddabe925d65d..702083d342ff 100644
--- a/tools/perf/util/module.c
+++ b/tools/perf/util/module.c
@@ -422,7 +422,7 @@ static int mod_dso__load_module_paths(struct mod_dso *self)
len += strlen(uts.release);
len += strlen("/modules.dep");
- path = calloc(1, len);
+ path = calloc(1, len + 1);
if (path == NULL)
goto out_failure;
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
index 1150c6d5c7b8..5f3980525191 100644
--- a/virt/kvm/ioapic.c
+++ b/virt/kvm/ioapic.c
@@ -188,6 +188,8 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level)
if ((edge && old_irr != ioapic->irr) ||
(!edge && !entry.fields.remote_irr))
ret = ioapic_service(ioapic, irq);
+ else
+ ret = 0; /* report coalesced interrupt */
}
}
return ret;
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 2884baf1d5f9..198c750aa851 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2590,8 +2590,6 @@ int kvm_init(void *opaque, unsigned int vcpu_size,
int r;
int cpu;
- kvm_init_debug();
-
r = kvm_arch_init(opaque);
if (r)
goto out_fail;
@@ -2658,6 +2656,8 @@ int kvm_init(void *opaque, unsigned int vcpu_size,
kvm_preempt_ops.sched_in = kvm_sched_in;
kvm_preempt_ops.sched_out = kvm_sched_out;
+ kvm_init_debug();
+
return 0;
out_free:
@@ -2679,7 +2679,6 @@ out_free_0:
__free_page(bad_page);
out:
kvm_arch_exit();
- kvm_exit_debug();
out_fail:
return r;
}
@@ -2688,6 +2687,7 @@ EXPORT_SYMBOL_GPL(kvm_init);
void kvm_exit(void)
{
kvm_trace_cleanup();
+ kvm_exit_debug();
misc_deregister(&kvm_dev);
kmem_cache_destroy(kvm_vcpu_cache);
sysdev_unregister(&kvm_sysdev);
@@ -2697,7 +2697,6 @@ void kvm_exit(void)
on_each_cpu(hardware_disable, NULL, 1);
kvm_arch_hardware_unsetup();
kvm_arch_exit();
- kvm_exit_debug();
free_cpumask_var(cpus_hardware_enabled);
__free_page(bad_page);
}