summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorYves Fischer <yvesf-git@xapek.org>2011-10-13 20:33:30 +0200
committerYves Fischer <yvesf-git@xapek.org>2011-10-13 20:33:30 +0200
commit5d9d373a959271b498710817d08c2ea8e153aa6e (patch)
tree6867e887454a850b4e15616000ef342a1c661c7e /firmware
parent35a36b0a6c69ce136fd6ea2a203d34e48e1291e8 (diff)
downloadmini-octopus-5d9d373a959271b498710817d08c2ea8e153aa6e.tar.gz
mini-octopus-5d9d373a959271b498710817d08c2ea8e153aa6e.zip
correct firmware??
Diffstat (limited to 'firmware')
-rw-r--r--firmware/93c46.c18
-rw-r--r--firmware/93c46.h14
-rw-r--r--firmware/Makefile914
-rw-r--r--firmware/adc.c152
-rw-r--r--firmware/adc.h17
-rw-r--r--firmware/can.c756
-rw-r--r--firmware/can.h101
-rw-r--r--firmware/common.c16
-rw-r--r--firmware/common.h25
-rw-r--r--firmware/debug.c38
-rw-r--r--firmware/debug.h9
-rw-r--r--firmware/eeprom.c119
-rw-r--r--firmware/eeprom.h11
-rw-r--r--firmware/fifo.c20
-rw-r--r--firmware/i2c.c19
-rw-r--r--firmware/io.c402
-rw-r--r--firmware/io.h168
-rw-r--r--firmware/main.c344
-rw-r--r--firmware/main.hex2169
-rw-r--r--firmware/octopus_can_stable_1_1.hex1133
-rw-r--r--firmware/octopus_relais.hex959
-rw-r--r--firmware/octopus_stable_1_1.hex971
-rw-r--r--firmware/pin.c93
-rw-r--r--firmware/pin.h84
-rw-r--r--firmware/protocol.h17
-rw-r--r--firmware/pwm.c6
-rw-r--r--firmware/spi.c190
-rw-r--r--firmware/spi.h23
-rw-r--r--firmware/uart.c22
-rw-r--r--firmware/uart_fifo.c368
-rw-r--r--firmware/usbn2mc.c2
31 files changed, 2121 insertions, 7059 deletions
diff --git a/firmware/93c46.c b/firmware/93c46.c
index 9ec4e11..4af0f45 100644
--- a/firmware/93c46.c
+++ b/firmware/93c46.c
@@ -93,10 +93,10 @@ int flash_93c46_init(void)
//SETPIN(DIN0) = D4 = low
//SETPIN(DIN1) = D4 = low
- octopus.ports[16]=PIN_IN;
- octopus.ports[17]=PIN_OUT;
- octopus.ports[18]=PIN_OUT;
octopus.ports[19]=PIN_OUT;
+ octopus.ports[18]=PIN_OUT;
+ octopus.ports[17]=PIN_OUT;
+ octopus.ports[16]=PIN_IN;
return RSP_OK;
}
@@ -111,10 +111,9 @@ void flash_93c46_deinit_usb(void)
int flash_93c46_deinit(void)
{
- octopus.ports[16]=PIN_NONE;
- octopus.ports[17]=PIN_NONE;
- octopus.ports[18]=PIN_NONE;
- octopus.ports[19]=PIN_NONE;
+ octopus.ports[5]=PIN_OUT; // this is wrong!
+ octopus.ports[6]=PIN_OUT; // this is wrong!
+ octopus.ports[7]=PIN_OUT; // this is wrong!
return RSP_OK;
}
@@ -123,8 +122,7 @@ void flash_93c46_read_usb(unsigned char address, unsigned int length, char * buf
{
answer[0]=CMD_93C46_READ;
answer[1]=(unsigned char)flash_93c46_read(address,length,(char*)&answer[2]);
- answer[2+length] = 0;
- CommandAnswer(3+length);
+ CommandAnswer(length+2);
}
int flash_93c46_read(unsigned char address, unsigned int length, char * buf)
@@ -144,7 +142,7 @@ void flash_93c46_write_usb(unsigned char address, unsigned int length, char * bu
{
answer[0]=CMD_93C46_WRITE;
answer[1]=(unsigned char)flash_93c46_write(address,length, buf);
- answer[2]=0;
+ answer[2]=0x00;
CommandAnswer(3);
}
diff --git a/firmware/93c46.h b/firmware/93c46.h
index d919036..817eade 100644
--- a/firmware/93c46.h
+++ b/firmware/93c46.h
@@ -47,6 +47,10 @@
#define DO (B, 3)
+
+
+
+
#define DIN0 (B, 4)
#define DIN1 (B, 5)
@@ -96,4 +100,14 @@ void erase_write_disable(void);
uint8_t flash_93c46_read_word(uint8_t add);
uint8_t flash_93c46_write_word(uint8_t add,uint8_t wd);
+
+
+
+
+
+
+
+
+
+
#endif /* SPI_H */
diff --git a/firmware/Makefile b/firmware/Makefile
index c8ae6de..f3553b5 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -1,458 +1,458 @@
-# Hey Emacs, this is a -*- makefile -*-
-#
-# WinAVR makefile written by Eric B. Weddington, Jörg Wunsch, et al.
-# Released to the Public Domain
-# Please read the make user manual!
-#
-# Additional material for this makefile was submitted by:
-# Tim Henigan
-# Peter Fleury
-# Reiner Patommel
-# Sander Pool
-# Frederik Rouleau
-# Markus Pfaff
-#
-# On command line:
-#
-# make all = Make software.
-#
-# make clean = Clean out built project files.
-#
-# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
-#
-# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
-# 4.07 or greater).
-#
-# make program = Download the hex file to the device, using avrdude. Please
-# customize the avrdude settings below first!
-#
-# make filename.s = Just compile filename.c into the assembler code only
-#
-# To rebuild project do "make clean" then "make all".
-#
-
-# mth 2004/09
-# Differences from WinAVR 20040720 sample:
-# - DEPFLAGS according to Eric Weddingtion's fix (avrfreaks/gcc-forum)
-# - F_OSC Define in CFLAGS and AFLAGS
-
-
-# MCU name
-#MCU = atmega128
-MCU = at90can128
-
-# Main Oscillator Frequency
-# This is only used to define F_OSC in all assembler and c-sources.
+# Hey Emacs, this is a -*- makefile -*-
+#
+# WinAVR makefile written by Eric B. Weddington, Jörg Wunsch, et al.
+# Released to the Public Domain
+# Please read the make user manual!
+#
+# Additional material for this makefile was submitted by:
+# Tim Henigan
+# Peter Fleury
+# Reiner Patommel
+# Sander Pool
+# Frederik Rouleau
+# Markus Pfaff
+#
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
+#
+# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
+# 4.07 or greater).
+#
+# make program = Download the hex file to the device, using avrdude. Please
+# customize the avrdude settings below first!
+#
+# make filename.s = Just compile filename.c into the assembler code only
+#
+# To rebuild project do "make clean" then "make all".
+#
+
+# mth 2004/09
+# Differences from WinAVR 20040720 sample:
+# - DEPFLAGS according to Eric Weddingtion's fix (avrfreaks/gcc-forum)
+# - F_OSC Define in CFLAGS and AFLAGS
+
+
+# MCU name
+#MCU = atmega128
+MCU = at90can128
+
+# Main Oscillator Frequency
+# This is only used to define F_OSC in all assembler and c-sources.
F_OSC = 16000000
-
-# Output format. (can be srec, ihex, binary)
-FORMAT = ihex
-
-# Target file name (without extension).
-TARGET = main
-
-
-# List C source files here. (C dependencies are automatically generated.)
-#SRC = $(TARGET).c uart.c usbn2mc/main/usbn960x.c usbn2mc.c usbn2mc/main/usbnapi.c
-
-SRC = $(TARGET).c wait.c uart.c ../usbn2mc/main/usbn960x.c usbn2mc.c ../usbn2mc/main/usbnapi.c common.c fifo.c io.c adc.c i2c.c spi.c 93c46.c pwm.c debug.c can.c eeprom.c pin.c
-
-
-# List Assembler source files here.
-# Make them always end in a capital .S. Files ending in a lowercase .s
-# will not be considered source files but generated files (assembler
-# output from the compiler), and will be deleted upon "make clean"!
-# Even though the DOS/Win* filesystem matches both .s and .S the same,
-# it will preserve the spelling of the filenames, and gcc itself does
-# care about how the name is spelled on its command-line.
-ASRC =
-
-
-
-# Optimization level, can be [0, 1, 2, 3, s].
-# 0 = turn off optimization. s = optimize for size.
-# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
-OPT = s
-
-# Debugging format.
-# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
-# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
-DEBUG = stabs
-#DEBUG = dwarf-2
-
-# List any extra directories to look for include files here.
-# Each directory must be seperated by a space.
-EXTRAINCDIRS =
-
-
-# Compiler flag to set the C Standard level.
-# c89 - "ANSI" C
-# gnu89 - c89 plus GCC extensions
-# c99 - ISO C99 standard (not yet fully implemented)
-# gnu99 - c99 plus GCC extensions
-CSTANDARD = -std=gnu99
-
-# Place -D or -U options here
-CDEFS =
-
-# Place -I options here
-CINCS =
-
-
-# Compiler flags.
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns...: create assembler listing
-CFLAGS = -g$(DEBUG)
-CFLAGS += $(CDEFS) $(CINCS)
-CFLAGS += -O$(OPT)
-CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
-CFLAGS += -Wall -Wstrict-prototypes
-#CFLAGS += -Wall
-CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
-CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-CFLAGS += $(CSTANDARD)
-CFLAGS += -DF_OSC=$(F_OSC)
-
-
-
-# Assembler flags.
-# -Wa,...: tell GCC to pass this to the assembler.
-# -ahlms: create listing
-# -gstabs: have the assembler create line number information; note that
-# for use in COFF files, additional information about filenames
-# and function names needs to be present in the assembler source
-# files -- see avr-libc docs [FIXME: not yet described there]
-ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
-ASFLAGS += -DF_OSC=$(F_OSC)
-
-
-#Additional libraries.
-
-# Minimalistic printf version
-PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
-
-# Floating point printf version (requires MATH_LIB = -lm below)
-PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
-
-PRINTF_LIB =
-
-# Minimalistic scanf version
-SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
-
-# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
-SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
-
-SCANF_LIB =
-
-MATH_LIB = -lm
-
-# External memory options
-
-# 64 KB of external RAM, starting after internal RAM (ATmega128!),
-# used for variables (.data/.bss) and heap (malloc()).
-#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
-
-# 64 KB of external RAM, starting after internal RAM (ATmega128!),
-# only used for heap (malloc()).
-#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
-
-EXTMEMOPTS =
-
-# Linker flags.
-# -Wl,...: tell GCC to pass this to linker.
-# -Map: create map file
-# --cref: add cross reference to map file
-LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
-LDFLAGS += $(EXTMEMOPTS)
-LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
-
-
-
-
-# Programming support using avrdude. Settings and variables.
-
-# Programming hardware: alf avr910 avrisp bascom bsd
-# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
-#
-# Type: avrdude -c ?
-# to get a full listing.
-#
-AVRDUDE_PROGRAMMER = stk500
-
-# com1 = serial port. Use lpt1 to connect to parallel port.
-AVRDUDE_PORT = com1 # programmer connected to serial device
-
-AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
-#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
-
-
-# Uncomment the following if you want avrdude's erase cycle counter.
-# Note that this counter needs to be initialized first using -Yn,
-# see avrdude manual.
-#AVRDUDE_ERASE_COUNTER = -y
-
-# Uncomment the following if you do /not/ wish a verification to be
-# performed after programming the device.
-#AVRDUDE_NO_VERIFY = -V
-
-# Increase verbosity level. Please use this when submitting bug
-# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
-# to submit bug reports.
-#AVRDUDE_VERBOSE = -v -v
-
-AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
-AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
-AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
-AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
-
-
-
-# ---------------------------------------------------------------------------
-
-# Define directories, if needed.
-DIRAVR = c:/winavr
-DIRAVRBIN = $(DIRAVR)/bin
-DIRAVRUTILS = $(DIRAVR)/utils/bin
-DIRINC = .
-DIRLIB = $(DIRAVR)/avr/lib
-
-
-# Define programs and commands.
-SHELL = sh
-CC = avr-gcc
-OBJCOPY = avr-objcopy
-OBJDUMP = avr-objdump
-SIZE = avr-size
-NM = avr-nm
-AVRDUDE = avrdude
-REMOVE = rm -f
-COPY = cp
-
-
-
-
-# Define Messages
-# English
-MSG_ERRORS_NONE = Errors: none
-MSG_BEGIN = -------- begin --------
-MSG_END = -------- end --------
-MSG_SIZE_BEFORE = Size before:
-MSG_SIZE_AFTER = Size after:
-MSG_COFF = Converting to AVR COFF:
-MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
-MSG_FLASH = Creating load file for Flash:
-MSG_EEPROM = Creating load file for EEPROM:
-MSG_EXTENDED_LISTING = Creating Extended Listing:
-MSG_SYMBOL_TABLE = Creating Symbol Table:
-MSG_LINKING = Linking:
-MSG_COMPILING = Compiling:
-MSG_ASSEMBLING = Assembling:
-MSG_CLEANING = Cleaning project:
-
-
-
-
-# Define all object files.
-OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
-
-# Define all listing files.
-LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
-
-
-# Compiler flags to generate dependency files.
-### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d
-GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
-
-# Combine all necessary flags and optional flags.
-# Add target processor to flags.
-ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
-ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
-
-
-
-
-
-# Default target.
-all: begin gccversion sizebefore build sizeafter finished end
-
-build: elf hex eep lss sym
-
-elf: $(TARGET).elf
-hex: $(TARGET).hex
-eep: $(TARGET).eep
-lss: $(TARGET).lss
-sym: $(TARGET).sym
-
-
-
-# Eye candy.
-# AVR Studio 3.x does not check make's exit code but relies on
-# the following magic strings to be generated by the compile job.
-begin:
- @echo
- @echo $(MSG_BEGIN)
-
-finished:
- @echo $(MSG_ERRORS_NONE)
-
-end:
- @echo $(MSG_END)
- @echo
-
-
-# Display size of file.
-HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
-ELFSIZE = $(SIZE) -A $(TARGET).elf
-sizebefore:
- @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
-
-sizeafter:
- @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi
-
-
-
-# Display compiler version information.
-gccversion :
- @$(CC) --version
-
-
-
-# Program the device.
-program: $(TARGET).hex $(TARGET).eep
- $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
-
-
-
-
-# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
-COFFCONVERT=$(OBJCOPY) --debugging \
---change-section-address .data-0x800000 \
---change-section-address .bss-0x800000 \
---change-section-address .noinit-0x800000 \
---change-section-address .eeprom-0x810000
-
-
-coff: $(TARGET).elf
- @echo
- @echo $(MSG_COFF) $(TARGET).cof
- $(COFFCONVERT) -O coff-avr $< $(TARGET).cof
-
-
-extcoff: $(TARGET).elf
- @echo
- @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
- $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
-
-
-
-# Create final output files (.hex, .eep) from ELF output file.
-%.hex: %.elf
- @echo
- @echo $(MSG_FLASH) $@
- $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
-
-%.eep: %.elf
- @echo
- @echo $(MSG_EEPROM) $@
- -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
- --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
-
-# Create extended listing file from ELF output file.
-%.lss: %.elf
- @echo
- @echo $(MSG_EXTENDED_LISTING) $@
- $(OBJDUMP) -h -S $< > $@
-
-# Create a symbol table from ELF output file.
-%.sym: %.elf
- @echo
- @echo $(MSG_SYMBOL_TABLE) $@
- $(NM) -n $< > $@
-
-
-
-# Link: create ELF output file from object files.
-.SECONDARY : $(TARGET).elf
-.PRECIOUS : $(OBJ)
-%.elf: $(OBJ)
- @echo
- @echo $(MSG_LINKING) $@
- $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
-
-
-# Compile: create object files from C source files.
-%.o : %.c
- @echo
- @echo $(MSG_COMPILING) $<
- $(CC) -c $(ALL_CFLAGS) $< -o $@
-
-
-# Compile: create assembler files from C source files.
-%.s : %.c
- $(CC) -S $(ALL_CFLAGS) $< -o $@
-
-
-# Assemble: create object files from assembler source files.
-%.o : %.S
- @echo
- @echo $(MSG_ASSEMBLING) $<
- $(CC) -c $(ALL_ASFLAGS) $< -o $@
-
-
-
-# Target: clean project.
-clean: begin clean_list finished end
-
-clean_list :
- @echo
- @echo $(MSG_CLEANING)
- $(REMOVE) $(TARGET).hex
- $(REMOVE) $(TARGET).eep
- $(REMOVE) $(TARGET).obj
- $(REMOVE) $(TARGET).cof
- $(REMOVE) $(TARGET).elf
- $(REMOVE) $(TARGET).map
- $(REMOVE) $(TARGET).obj
- $(REMOVE) $(TARGET).a90
- $(REMOVE) $(TARGET).sym
- $(REMOVE) $(TARGET).lnk
- $(REMOVE) $(TARGET).lss
- $(REMOVE) $(OBJ)
- $(REMOVE) $(LST)
- $(REMOVE) $(SRC:.c=.s)
- $(REMOVE) $(SRC:.c=.d)
- $(REMOVE) .dep/*
-
-
-
-# Include the dependency files.
--include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
-
-
-# Listing of phony targets.
-.PHONY : all begin finish end sizebefore sizeafter gccversion \
-build elf hex eep lss sym coff extcoff \
-clean clean_list program
-
-download_old:
- avrdude -p m128 -c avrispv2 -P usb -U flash:w:main.hex
-
-download:
- avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex -B 1
-
-fuse_old:
- avrdude -p m128 -c avrispv2 -P usb -U lfuse:w:0xe0:m
- avrdude -p m128 -c avrispv2 -P usb -U efuse:w:0xff:m
- avrdude -p m128 -c avrispv2 -P usb -U hfuse:w:0xdd:m
-
-fuse:
- avrdude -p c128 -c avrispv2 -B 10 -P usb -U lfuse:w:0xe0:m
- avrdude -p c128 -c avrispv2 -B 10 -P usb -U efuse:w:0xff:m
- avrdude -p c128 -c avrispv2 -B 10 -P usb -U hfuse:w:0xdd:m
-
-usbprog:
- avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex
+
+# Output format. (can be srec, ihex, binary)
+FORMAT = ihex
+
+# Target file name (without extension).
+TARGET = main
+
+
+# List C source files here. (C dependencies are automatically generated.)
+#SRC = $(TARGET).c uart.c usbn2mc/main/usbn960x.c usbn2mc.c usbn2mc/main/usbnapi.c
+
+SRC = $(TARGET).c wait.c uart.c ../usbn2mc/main/usbn960x.c usbn2mc.c ../usbn2mc/main/usbnapi.c common.c fifo.c io.c adc.c i2c.c spi.c 93c46.c pwm.c debug.c
+
+
+# List Assembler source files here.
+# Make them always end in a capital .S. Files ending in a lowercase .s
+# will not be considered source files but generated files (assembler
+# output from the compiler), and will be deleted upon "make clean"!
+# Even though the DOS/Win* filesystem matches both .s and .S the same,
+# it will preserve the spelling of the filenames, and gcc itself does
+# care about how the name is spelled on its command-line.
+ASRC =
+
+
+
+# Optimization level, can be [0, 1, 2, 3, s].
+# 0 = turn off optimization. s = optimize for size.
+# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
+OPT = s
+
+# Debugging format.
+# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
+# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
+DEBUG = stabs
+#DEBUG = dwarf-2
+
+# List any extra directories to look for include files here.
+# Each directory must be seperated by a space.
+EXTRAINCDIRS =
+
+
+# Compiler flag to set the C Standard level.
+# c89 - "ANSI" C
+# gnu89 - c89 plus GCC extensions
+# c99 - ISO C99 standard (not yet fully implemented)
+# gnu99 - c99 plus GCC extensions
+CSTANDARD = -std=gnu99
+
+# Place -D or -U options here
+CDEFS =
+
+# Place -I options here
+CINCS =
+
+
+# Compiler flags.
+# -g*: generate debugging information
+# -O*: optimization level
+# -f...: tuning, see GCC manual and avr-libc documentation
+# -Wall...: warning level
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns...: create assembler listing
+CFLAGS = -g$(DEBUG)
+CFLAGS += $(CDEFS) $(CINCS)
+CFLAGS += -O$(OPT)
+CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
+CFLAGS += -Wall -Wstrict-prototypes
+#CFLAGS += -Wall
+CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
+CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+CFLAGS += $(CSTANDARD)
+CFLAGS += -DF_OSC=$(F_OSC)
+
+
+
+# Assembler flags.
+# -Wa,...: tell GCC to pass this to the assembler.
+# -ahlms: create listing
+# -gstabs: have the assembler create line number information; note that
+# for use in COFF files, additional information about filenames
+# and function names needs to be present in the assembler source
+# files -- see avr-libc docs [FIXME: not yet described there]
+ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
+ASFLAGS += -DF_OSC=$(F_OSC)
+
+
+#Additional libraries.
+
+# Minimalistic printf version
+PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
+
+# Floating point printf version (requires MATH_LIB = -lm below)
+PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
+
+PRINTF_LIB =
+
+# Minimalistic scanf version
+SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
+
+# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
+SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
+
+SCANF_LIB =
+
+MATH_LIB = -lm
+
+# External memory options
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# used for variables (.data/.bss) and heap (malloc()).
+#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# only used for heap (malloc()).
+#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
+
+EXTMEMOPTS =
+
+# Linker flags.
+# -Wl,...: tell GCC to pass this to linker.
+# -Map: create map file
+# --cref: add cross reference to map file
+LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
+LDFLAGS += $(EXTMEMOPTS)
+LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
+
+
+
+
+# Programming support using avrdude. Settings and variables.
+
+# Programming hardware: alf avr910 avrisp bascom bsd
+# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
+#
+# Type: avrdude -c ?
+# to get a full listing.
+#
+AVRDUDE_PROGRAMMER = stk500
+
+# com1 = serial port. Use lpt1 to connect to parallel port.
+AVRDUDE_PORT = com1 # programmer connected to serial device
+
+AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
+#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
+
+
+# Uncomment the following if you want avrdude's erase cycle counter.
+# Note that this counter needs to be initialized first using -Yn,
+# see avrdude manual.
+#AVRDUDE_ERASE_COUNTER = -y
+
+# Uncomment the following if you do /not/ wish a verification to be
+# performed after programming the device.
+#AVRDUDE_NO_VERIFY = -V
+
+# Increase verbosity level. Please use this when submitting bug
+# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
+# to submit bug reports.
+#AVRDUDE_VERBOSE = -v -v
+
+AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
+AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
+AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
+
+
+
+# ---------------------------------------------------------------------------
+
+# Define directories, if needed.
+DIRAVR = c:/winavr
+DIRAVRBIN = $(DIRAVR)/bin
+DIRAVRUTILS = $(DIRAVR)/utils/bin
+DIRINC = .
+DIRLIB = $(DIRAVR)/avr/lib
+
+
+# Define programs and commands.
+SHELL = sh
+CC = avr-gcc
+OBJCOPY = avr-objcopy
+OBJDUMP = avr-objdump
+SIZE = avr-size
+NM = avr-nm
+AVRDUDE = avrdude
+REMOVE = rm -f
+COPY = cp
+
+
+
+
+# Define Messages
+# English
+MSG_ERRORS_NONE = Errors: none
+MSG_BEGIN = -------- begin --------
+MSG_END = -------- end --------
+MSG_SIZE_BEFORE = Size before:
+MSG_SIZE_AFTER = Size after:
+MSG_COFF = Converting to AVR COFF:
+MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
+MSG_FLASH = Creating load file for Flash:
+MSG_EEPROM = Creating load file for EEPROM:
+MSG_EXTENDED_LISTING = Creating Extended Listing:
+MSG_SYMBOL_TABLE = Creating Symbol Table:
+MSG_LINKING = Linking:
+MSG_COMPILING = Compiling:
+MSG_ASSEMBLING = Assembling:
+MSG_CLEANING = Cleaning project:
+
+
+
+
+# Define all object files.
+OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
+
+# Define all listing files.
+LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
+
+
+# Compiler flags to generate dependency files.
+### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d
+GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
+
+# Combine all necessary flags and optional flags.
+# Add target processor to flags.
+ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
+ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
+
+
+
+
+
+# Default target.
+all: begin gccversion sizebefore build sizeafter finished end
+
+build: elf hex eep lss sym
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex
+eep: $(TARGET).eep
+lss: $(TARGET).lss
+sym: $(TARGET).sym
+
+
+
+# Eye candy.
+# AVR Studio 3.x does not check make's exit code but relies on
+# the following magic strings to be generated by the compile job.
+begin:
+ @echo
+ @echo $(MSG_BEGIN)
+
+finished:
+ @echo $(MSG_ERRORS_NONE)
+
+end:
+ @echo $(MSG_END)
+ @echo
+
+
+# Display size of file.
+HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
+ELFSIZE = $(SIZE) -A $(TARGET).elf
+sizebefore:
+ @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
+
+sizeafter:
+ @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi
+
+
+
+# Display compiler version information.
+gccversion :
+ @$(CC) --version
+
+
+
+# Program the device.
+program: $(TARGET).hex $(TARGET).eep
+ $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
+
+
+
+
+# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
+COFFCONVERT=$(OBJCOPY) --debugging \
+--change-section-address .data-0x800000 \
+--change-section-address .bss-0x800000 \
+--change-section-address .noinit-0x800000 \
+--change-section-address .eeprom-0x810000
+
+
+coff: $(TARGET).elf
+ @echo
+ @echo $(MSG_COFF) $(TARGET).cof
+ $(COFFCONVERT) -O coff-avr $< $(TARGET).cof
+
+
+extcoff: $(TARGET).elf
+ @echo
+ @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
+ $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
+
+
+
+# Create final output files (.hex, .eep) from ELF output file.
+%.hex: %.elf
+ @echo
+ @echo $(MSG_FLASH) $@
+ $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
+
+%.eep: %.elf
+ @echo
+ @echo $(MSG_EEPROM) $@
+ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
+ --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
+
+# Create extended listing file from ELF output file.
+%.lss: %.elf
+ @echo
+ @echo $(MSG_EXTENDED_LISTING) $@
+ $(OBJDUMP) -h -S $< > $@
+
+# Create a symbol table from ELF output file.
+%.sym: %.elf
+ @echo
+ @echo $(MSG_SYMBOL_TABLE) $@
+ $(NM) -n $< > $@
+
+
+
+# Link: create ELF output file from object files.
+.SECONDARY : $(TARGET).elf
+.PRECIOUS : $(OBJ)
+%.elf: $(OBJ)
+ @echo
+ @echo $(MSG_LINKING) $@
+ $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
+
+
+# Compile: create object files from C source files.
+%.o : %.c
+ @echo
+ @echo $(MSG_COMPILING) $<
+ $(CC) -c $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C source files.
+%.s : %.c
+ $(CC) -S $(ALL_CFLAGS) $< -o $@
+
+
+# Assemble: create object files from assembler source files.
+%.o : %.S
+ @echo
+ @echo $(MSG_ASSEMBLING) $<
+ $(CC) -c $(ALL_ASFLAGS) $< -o $@
+
+
+
+# Target: clean project.
+clean: begin clean_list finished end
+
+clean_list :
+ @echo
+ @echo $(MSG_CLEANING)
+ $(REMOVE) $(TARGET).hex
+ $(REMOVE) $(TARGET).eep
+ $(REMOVE) $(TARGET).obj
+ $(REMOVE) $(TARGET).cof
+ $(REMOVE) $(TARGET).elf
+ $(REMOVE) $(TARGET).map
+ $(REMOVE) $(TARGET).obj
+ $(REMOVE) $(TARGET).a90
+ $(REMOVE) $(TARGET).sym
+ $(REMOVE) $(TARGET).lnk
+ $(REMOVE) $(TARGET).lss
+ $(REMOVE) $(OBJ)
+ $(REMOVE) $(LST)
+ $(REMOVE) $(SRC:.c=.s)
+ $(REMOVE) $(SRC:.c=.d)
+ $(REMOVE) .dep/*
+
+
+
+# Include the dependency files.
+-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
+
+
+# Listing of phony targets.
+.PHONY : all begin finish end sizebefore sizeafter gccversion \
+build elf hex eep lss sym coff extcoff \
+clean clean_list program
+
+download:
+ avrdude -p m128 -c avrispv2 -P usb -U flash:w:main.hex
+
+download_can:
+ avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex
+
+fuse:
+ avrdude -p m128 -c avrispv2 -P usb -U lfuse:w:0xe0:m
+ avrdude -p m128 -c avrispv2 -P usb -U efuse:w:0xff:m
+ avrdude -p m128 -c avrispv2 -P usb -U hfuse:w:0xdd:m
+
+fuse_can:
+ avrdude -p c128 -c avrispv2 -B 10 -P usb -U lfuse:w:0xe0:m
+ avrdude -p c128 -c avrispv2 -B 10 -P usb -U efuse:w:0xff:m
+ avrdude -p c128 -c avrispv2 -B 10 -P usb -U hfuse:w:0xdd:m
+
+usbprog:
+ avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex
diff --git a/firmware/adc.c b/firmware/adc.c
index 915dbce..a9449b7 100644
--- a/firmware/adc.c
+++ b/firmware/adc.c
@@ -37,27 +37,19 @@
#include "protocol.h"
#include "adc.h"
-#include <stdio.h>
-#include "debug.h"
-
-
void adc_parser(char *buf)
{
- //debugf("adc parser CMD %02x\n",buf[0]);
switch(buf[0])
{
case CMD_ADC_INIT_PIN:
- adc_init_usb(buf[2]);
- break;
- case CMD_ADC_DEINIT_PIN:
- adc_deinit_usb(buf[2]);
- break;
+ adc_init_usb((int)buf[2]);
+ break;
case CMD_ADC_GET:
- adc_get_usb(buf[2]);
- break;
+ adc_get_usb((int)buf[2]);
+ break;
case CMD_ADC_REF:
- adc_ref_usb(buf[2]);
- break;
+ adc_ref_usb((int)buf[2]);
+ break;
default:
answer[0]=buf[0];
@@ -67,49 +59,42 @@ void adc_parser(char *buf)
}
}
-int adc_init(uint8_t pin)
+int adc_init(int pin)
{
- if (pin >= 10 && pin <= 17)
- {
- octopus.ports[pin] = PIN_AD;
- ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
- return RSP_OK;
- }
-
- return RSP_UNKOWN_PIN;
+ if (pin >= 33 && pin <= 40)
+ {
+ octopus.ports[pin] = PIN_AD;
+
+ switch(pin)
+ {
+ case 40: break;
+ case 39: break;
+ case 38: break;
+ case 37: break;
+ case 36: break;
+ case 35: break;
+ case 34: break;
+ case 33: break;
+ default:
+ return RSP_IMPOSSIBLE_PIN_CONFIG;
+ }
+ return RSP_OK;
+ }
+ return RSP_UNKOWN_PIN;
}
-void adc_init_usb(uint8_t pin)
+void adc_init_usb(int pin)
{
answer[0]=CMD_ADC_INIT_PIN;
- answer[1]=(unsigned char)adc_init(pin);
- answer[2]=0;
-
- CommandAnswer(3);
-}
-
-int adc_deinit(uint8_t pin)
-{
- if (octopus.ports[pin] == PIN_AD)
- {
- octopus.ports[pin] = PIN_NONE;
- return RSP_OK;
- }
-
- return RSP_UNKOWN_PIN;
-}
-
-void adc_deinit_usb(uint8_t pin)
-{
- answer[0]=CMD_ADC_DEINIT_PIN;
- answer[1]= (unsigned char)adc_deinit(pin);
+ answer[1]= (unsigned char)adc_init(pin);
answer[2]=0;
CommandAnswer(3);
}
-void adc_get_usb(uint8_t pin)
+void adc_get_usb(int pin)
{
+
uint16_t result;
//uint8_t result[2];
@@ -125,59 +110,64 @@ void adc_get_usb(uint8_t pin)
}
-int adc_get(uint8_t pin, uint16_t *value)
+int adc_get(int pin, uint16_t *value)
{
- *value = 0;
-
- if (octopus.ports[pin] == PIN_AD)
- {
- // 40 => 0
- // 39 => 1
- // 38 => 2
- // pin => 40-pin
- *value =_adc_read_channel(17 - pin);
- debugf("Wert %i\r\n",*value);
- return RSP_OK;
- }
- else
- return RSP_WRONG_PIN_CONFIG;
+ *value = 0;
+
+ if (octopus.ports[pin] == PIN_AD)
+ {
+ switch (pin)
+ {
+ case 40: *value =_adc_read_channel(0); break;
+ case 39: *value =_adc_read_channel(1); break;
+ case 38: *value =_adc_read_channel(2); break;
+ case 37: *value =_adc_read_channel(3); break;
+ case 36: *value =_adc_read_channel(4); break;
+ case 35: *value =_adc_read_channel(5); break;
+ case 34: *value =_adc_read_channel(6); break;
+ case 33: *value =_adc_read_channel(7); break;
+ default:
+ return RSP_IMPOSSIBLE_PIN_CONFIG;
+ }
+ return RSP_OK;
+ }
+ else
+ {
+ return RSP_WRONG_PIN_CONFIG;
+ }
}
-void adc_ref_usb(uint8_t ref)
+void adc_ref_usb(int ref)
{
answer[0]=CMD_ADC_REF;
answer[1]=adc_ref(ref);
- answer[2]=0;
- CommandAnswer(3);
+ CommandAnswer(2);
}
-int adc_ref(uint8_t ref)
+int adc_ref(int ref)
{
- ADMUX = 0x00;
-
- switch(ref)
- {
- case PARAM_ADC_AREF: break;
- case PARAM_ADC_AVCC: ADMUX |= (1<<REFS0); break;
- case PARAM_ADC_INTERNAL: ADMUX |= (1<<REFS1) | (1<<REFS0); break;
- default:
- return RSP_ERROR;
- }
-
- return RSP_OK;
+ ADMUX = 0x00;
+
+ switch(ref){
+ case PARAM_ADC_AREF: break;
+ case PARAM_ADC_AVCC: ADMUX |= (1<<REFS0); break;
+ case PARAM_ADC_INTERNAL: ADMUX |= (1<<REFS1) | (1<<REFS0); break;
+ default:
+ return RSP_ERROR;
+ }
+ return RSP_OK;
}
-uint16_t _adc_read_channel(uint8_t mux)
+uint16_t _adc_read_channel(int mux)
{
int i;
uint16_t result;
-
- //ADMUX |= mux; // Kanal waehlen
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren (1)
- ADMUX = (ADMUX & 0xF0) | mux; // select channel
+ //ADMUX |= (unsigned char)mux; // Kanal waehlen
+ ADMUX = (ADMUX & 0xF0) | (unsigned char) mux; // select channel
//ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
diff --git a/firmware/adc.h b/firmware/adc.h
index 1e85ff4..3aa0a6f 100644
--- a/firmware/adc.h
+++ b/firmware/adc.h
@@ -41,17 +41,16 @@
void adc_parser(char *buf);
-int adc_init(uint8_t pin);
-void adc_init_usb(uint8_t pin);
+int adc_init(int pin);
+void adc_init_usb(int pin);
-int adc_deinit(uint8_t pin);
-void adc_deinit_usb(uint8_t pin);
+void adc_ref_usb(int ref);
+int adc_ref(int ref);
-int adc_ref(uint8_t ref);
-void adc_ref_usb(uint8_t ref);
-int adc_get(uint8_t pin, uint16_t *value);
-void adc_get_usb(uint8_t pin);
-uint16_t _adc_read_channel(uint8_t mux);
+
+int adc_get(int pin, uint16_t *value);
+void adc_get_usb(int pin);
+uint16_t _adc_read_channel(int mux);
#endif /* ADC_H */
diff --git a/firmware/can.c b/firmware/can.c
deleted file mode 100644
index 95090bb..0000000
--- a/firmware/can.c
+++ /dev/null
@@ -1,756 +0,0 @@
-/*
- * Copyright (c) 2007 Marco Glietsch (http://www.mikrocontroller.net/topic/98697)
- * Original author: Marco Glietsch
- * Modified for octopus by Michael Hartmann <ich@speicherleck.de>
- * All rights reserved.
- *
- * Short descripton of file:
- *
- *
- * 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 the FH Augsburg 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.
- */
-
-#ifdef __AVR_AT90CAN128__
-
-#include "common.h"
-#include "protocol.h"
-#include "can.h"
-
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include <inttypes.h>
-#include <stdbool.h>
-
-struct {
- uint32_t id;
- int8_t data[8];
-} message;
-
-int8_t iemob[15] = {
- IEMOB0, IEMOB1, IEMOB2, IEMOB3, IEMOB4, IEMOB5, IEMOB6, IEMOB7,
- IEMOB8, IEMOB9, IEMOB10, IEMOB11, IEMOB12, IEMOB13, IEMOB14 };
-
-// extended id
-int8_t extended_id;
-
-void can_parser(uint8_t *buf)
-{
- switch(buf[0])
- {
- case CMD_CAN_INIT:
- can_init_usb((uint8_t)buf[2], (uint8_t)buf[3]);
- break;
- case CMD_CAN_DEINIT:
- can_deinit_usb();
- break;
- case CMD_CAN_ENABLE_MOB:
- asm("nop");
- uint32_t idm = 0;
- uint32_t id = 0;
-
- id = ((uint32_t)buf[4]) +
- ((uint32_t)buf[5] << 8) +
- ((uint32_t)buf[6] << 16) +
- ((uint32_t)buf[7] << 24);
-
- idm = ((uint32_t)buf[8]) +
- ((uint32_t)buf[9] << 8) +
- ((uint32_t)buf[10] << 16) +
- ((uint32_t)buf[11] << 24);
-
- // mob, mode, id, idm
- can_enable_mob_usb(buf[2], buf[3], id, idm);
- break;
- case CMD_CAN_DISABLE_MOB:
- can_disable_mob_usb((uint8_t)buf[2]);
- break;
- case CMD_CAN_SEND_DATA:
- can_send_data_usb(buf[2], buf[3], &buf[4]);
- break;
- case CMD_CAN_SEND_REMOTE:
- can_send_remote_usb(buf[2]);
- break;
- case CMD_CAN_RECEIVE_DATA:
- can_receive_data_usb(buf[2]);
- break;
- case CMD_CAN_SET_AUTOREPLY:
- can_set_autoreply_usb(buf[2], buf[3], &buf[4]);
- break;
- default:
- answer[0] = buf[0];
- answer[1] = RSP_UNKOWN_CMD;
- answer[2] = 0;
- CommandAnswer(3);
- }
-}
-
-void can_init_usb(uint8_t baudrate, uint8_t eid)
-{
- answer[0] = CMD_CAN_INIT;
- answer[1] = (uint8_t)can_init(baudrate, CAN_INTERRUPTS_RX, eid);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-// Message Objects zuruecksetzen, CAN-Controller aktivieren
-// Parameter:
-// uint8_t baud: 0,1,2...5 (fuer 100, 125, 200, 250, 500, 1000)
-// uint8_t intmode: Ereignis, bei dem ein Interrupt ausgelöst werden soll
-// - NONE - Deaktiviert
-// - TX - Daten gesendet
-// - RX - Daten empfangen
-// - TXRX - Daten gesendet und/oder empfangen
-int can_init(uint8_t baudrate, uint8_t intmode, uint8_t eid)
-{
- uint8_t i;
-
- octopus.ports[17] = PIN_CAN;
- octopus.ports[18] = PIN_CAN;
-
- extended_id = eid ? 1 : 0;
-
- message.id = 0;
- for(i = 0; i < 8; i++)
- message.data[i] = 0;
-
- // Status- und Steuerregister aller Message Objects initialisieren
- for(i = 0; i < NO_MOBS; i++)
- {
- can_get_mob(i);
- CANSTMOB = 0;
- CANCDMOB = 0;
- }
-
- // set baudrate
- if(can_set_baudrate(baudrate) == 0)
- return RSP_ERROR;
-
- if(can_set_interrupt(intmode) == 0)
- return RSP_ERROR;
-
- // CAN-Controller in Enabled Mode setzen
- setbit(CANGCON, ENASTB);
-
- // Warten bis der CAN-Controller das Enabled-Bit gesetzt hat und
- // einsatzbereit ist
- while (!getbit(CANGSTA, ENFG));
-
- return RSP_OK;
-}
-
-void can_deinit_usb(void)
-{
- answer[0] = CMD_CAN_DEINIT;
- answer[1] = (int8_t)can_deinit();
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-int can_deinit(void)
-{
- uint8_t i;
-
- octopus.ports[17] = PIN_NONE;
- octopus.ports[18] = PIN_NONE;
-
- for(i = 0; i < 15; i++)
- can_disable_mob(i);
-
- // CAN-Controller ausschalten
- clearbit(CANGCON, ENASTB);
-
- // warten bis wirklich ausgechaltet
- while (getbit(CANGSTA, ENFG));
-
- return RSP_OK;
-}
-
-void can_set_autoreply(uint8_t mob, uint8_t length, uint8_t *buf)
-{
- can_get_mob(mob);
- can_set_mode(CAN_MODE_AUTO_REPLY);
- can_set_data(length, buf);
-}
-
-void can_set_autoreply_usb(uint8_t mob, uint8_t length, uint8_t *buf)
-{
- can_set_autoreply(mob, length, buf);
-
- answer[0] = CMD_CAN_SET_AUTOREPLY;
- answer[1] = RSP_OK;
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-int can_set_baudrate(uint8_t baudrate)
-{
- // @16 MHz
- switch(baudrate)
- {
- case CAN_BAUDRATE_100K:
- CANBT1 = 0x12;
- CANBT2 = 0x0c;
- CANBT3 = 0x37;
- break;
-
- case CAN_BAUDRATE_125K:
- CANBT1 = 0x0e;
- CANBT2 = 0x0c;
- CANBT3 = 0x37;
- break;
-
- case CAN_BAUDRATE_200K:
- CANBT1 = 0x08;
- CANBT2 = 0x0c;
- CANBT3 = 0x37;
- break;
-
- case CAN_BAUDRATE_250K:
- CANBT1 = 0x06;
- CANBT2 = 0x0c;
- CANBT3 = 0x37;
- break;
-
- case CAN_BAUDRATE_500K:
- CANBT1 = 0x02;
- CANBT2 = 0x0c;
- CANBT3 = 0x37;
- break;
-
- case CAN_BAUDRATE_1000K:
- CANBT1 = 0x00;
- CANBT2 = 0x0c;
- CANBT3 = 0x37;
- break;
-
- default:
- return 0;
- }
-
- return 1;
-}
-
-void can_enable_mob_usb(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm)
-{
- answer[0] = CMD_CAN_ENABLE_MOB;
- answer[1] = (int8_t)can_enable_mob(mob, mode, id, idm);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-
-// Parameter:
-// uint8_t mob: Nummer des zu wählenden Objekts (0-14)
-//
-// uint8_t mode
-// - Betriebsart des Message Objekts:
-// - DISABLED Deaktiviert
-// - TRANSMIT_DATA Daten senden
-// - TRANSMIT_REMOTE Anfrage senden
-// - RECEIVE_DATA Empfangsmodus
-// - AUTO_REPLY automatischer Antwortmodus
-//
-// Funktion setzt die Betriebsart des vorher gewählten Objekts
-int can_enable_mob(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm)
-{
- // Objekt wählen
- can_get_mob(mob);
-
- // Interrupt für dieses Objekt aktivieren
- can_set_mob_interrupt(mob);
-
- // ID-Maske setzen
- can_set_id_mask(idm);
-
- // ID setzen
- can_set_id(id);
-
- // Betriebsmodus setzen
- if(can_set_mode(mode) == 0)
- return RSP_ERROR;
-
- return RSP_OK;
-}
-
-
-void can_send_data_usb(uint8_t mob, uint8_t length, uint8_t *data)
-{
- answer[0] = CMD_CAN_SEND_DATA;
- answer[1] = (int8_t)can_send_data(mob, length, data);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-int can_send_data(uint8_t mob, uint8_t length, uint8_t * data)
-{
- uint8_t mode;
-
- // Objekt wählen
- can_get_mob(mob);
-
- // Aktuelle Betriebsart sichern
- mode = can_get_mode();
-
- // Nutzdaten in Register schreiben
- can_set_data(length, data);
-
- // Datenübertragung starten
- can_set_mode(CAN_MODE_TRANSMIT_DATA);
-
- // Warten bis die Datenübertragung beendet ist (TXOK-Flag von CAN-Controller
- // gesetzt)
- while (!getbit(CANSTMOB, TXOK));
-
- // TXOK-Flag von Hand löschen
- clearbit(CANSTMOB, TXOK);
-
- // Alte Betriebsart wiederherstellen
- can_set_mode(mode);
-
- return RSP_OK;
-}
-
-
-// Parameter: uint8_t mode: Ereignis, bei dem Interrupt ausgelöst werden soll
-// - NONE - Deaktiviert
-// - TX - Daten gesendet
-// - RX - Daten empfangen
-// - TXRX - Daten gesendet und/oder empfangen
-int can_set_interrupt(uint8_t mode)
-{
- switch(mode)
- {
- case CAN_INTERRUPTS_NONE:
- clearbit(CANGIE, ENIT);
- clearbit(CANGIE, ENRX);
- clearbit(CANGIE, ENTX);
- break;
-
- case CAN_INTERRUPTS_TX:
- setbit(CANGIE, ENIT);
- clearbit(CANGIE, ENRX);
- setbit(CANGIE, ENTX);
- break;
-
- case CAN_INTERRUPTS_RX:
- setbit(CANGIE, ENIT);
- setbit(CANGIE, ENRX);
- clearbit(CANGIE, ENTX);
- break;
-
- case CAN_INTERRUPTS_TXRX:
- setbit(CANGIE, ENIT);
- setbit(CANGIE, ENRX);
- setbit(CANGIE, ENTX);
- break;
-
- default:
- return 0;
- }
-
- return 1;
-}
-
-
-// Funktion wählt CANPAGE des betreffenden Objekts aus und stellt Zugang zu
-// Registern des Objekts her
-void can_get_mob(uint8_t mob)
-{
- CANPAGE = (mob << 4);
-}
-
-
-// Parameter: uint32_t idm: ID-Maske in Dezimalschreibweise
-// Funktion setzt ID-Maske eines Objekts auf einen neuen Wert. In CANIDM4
-// bleiben dabei die Werte der unteren 3 Bit (RTRTAG, Reserved und IDEMSK)
-// erhalten.
-void can_set_id_mask(uint32_t idm)
-{
- //Standart identifier (11 bit)
- if(!extended_id)
- {
- CANIDM2 = (uint8_t)(idm << 5);
- CANIDM1 = (uint8_t)(idm >> 3);
- }
- //extended identifier
- else
- {
- idm <<= 3;
- idm |= 7;
-
- CANIDM4 = (int8_t) (idm);
- CANIDM3 = (int8_t) (idm>>8);
- CANIDM2 = (int8_t) (idm>>16);
- CANIDM1 = (int8_t) (idm>>24);
- }
-}
-
-// Funktion holt ID der empfangenen Nachricht
-uint32_t can_get_id(void)
-{
- uint32_t id = 0;
-
- //Standart identifier (11 bit)
- if(!extended_id)
- {
- id = (uint8_t) CANIDT2 >> 5;
- id |= (uint16_t) CANIDT1 << 3;
- }
- //extended identifier
- else
- {
- id |= ((uint32_t) CANIDT1 << 24);
- id |= ((uint32_t) CANIDT2 << 16);
- id |= ((uint32_t) CANIDT3 << 8);
- id |= (CANIDT4&0xF8);
- id >>= 3;
- }
-
- return id;
-}
-
-// Funktion setzt ID eines Objekts auf einen neuen Wert. In CANIDM4 bleiben
-// dabei die Werte der unteren 3 Bit (RTRTAG, RB1TAG und RB0TAG) erhalten.
-void can_set_id(uint32_t id)
-{
- //Standart identifier (11 bit)
- if(!extended_id)
- {
- CANIDT2 = (uint8_t)(id << 5);
- CANIDT1 = (uint8_t)(id >> 3);
- }
- //extended identifier
- else
- {
- id <<= 3;
- id &= 0xfffffff8;
- id |= (CANIDT4 & 0x07);
-
- CANIDT4 = (int8_t) (id);
- CANIDT3 = (int8_t) (id>>8);
- CANIDT2 = (int8_t) (id>>16);
- CANIDT1 = (int8_t) (id>>24);
- }
-}
-
-
-// Funktion setzt die Betriebsart des vorher gewählten Objekts.
-// Parameter: uint8_t mode:
-// - Betriebsart des Message Objekts:
-// - DISABLED - Deaktiviert
-// - TRANSMIT_DATA - Daten senden
-// - TRANSMIT_REMOTE - Anfrage senden
-// - RECEIVE_DATA - Empfangsmodus
-// - AUTO_REPLY - automatischer Antwortmodus
-int can_set_mode(uint8_t mode)
-{
- if(extended_id)
- setbit(CANCDMOB, IDE);
- else
- clearbit(CANCDMOB, IDE);
-
- switch(mode)
- {
- case CAN_MODE_DISABLED:
- clearbit(CANCDMOB, CONMOB0);
- clearbit(CANCDMOB, CONMOB1);
- clearbit(CANCDMOB, RPLV);
- clearbit(CANIDT4, RTRTAG);
- clearbit(CANIDM4, RTRMSK);
- break;
-
- case CAN_MODE_TRANSMIT_DATA:
- CANCDMOB &= ~(1 << CONMOB1 || 1 << CONMOB0 || 1 << RPLV);
- CANCDMOB |= (1 << CONMOB0 || 0 << CONMOB1);
- clearbit(CANIDT4, RTRTAG);
- break;
-
- case CAN_MODE_TRANSMIT_REMOTE:
- clearbit(CANCDMOB, CONMOB1);
- setbit(CANCDMOB, CONMOB0);
- clearbit(CANCDMOB, RPLV);
- setbit(CANIDT4, RTRTAG);
- break;
-
- case CAN_MODE_RECEIVE_DATA:
- clearbit(CANCDMOB, CONMOB0);
- setbit(CANCDMOB, CONMOB1);
- clearbit(CANCDMOB, RPLV);
- clearbit(CANIDT4, RTRTAG);
- break;
-
- case CAN_MODE_AUTO_REPLY:
- clearbit(CANCDMOB, CONMOB0);
- setbit(CANCDMOB, CONMOB1);
- setbit(CANCDMOB, RPLV);
- setbit(CANIDT4, RTRTAG);
- break;
-
- default:
- return 0;
- }
-
- return 1;
-}
-
-
-// Funktion holt die Betriebsart des vorher gewaehlten Objekts
-uint8_t can_get_mode(void)
-{
- uint8_t mode = 0;
-
- if(!getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0))
- {
- mode = CAN_MODE_DISABLED;
- }
- else if(!getbit(CANCDMOB, CONMOB1) && getbit(CANCDMOB, CONMOB0) &&
- !getbit(CANIDT4, RTRTAG))
- {
- mode = CAN_MODE_TRANSMIT_DATA;
- }
- else if(!getbit(CANCDMOB, CONMOB1) && getbit(CANCDMOB, CONMOB0) &&
- getbit(CANIDT4, RTRTAG))
- {
- mode = CAN_MODE_TRANSMIT_REMOTE;
- }
- else if(getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0) &&
- !getbit(CANIDT4, RTRTAG))
- {
- mode = CAN_MODE_RECEIVE_DATA;
- }
- else if(getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0) &&
- getbit(CANCDMOB,RPLV) && getbit(CANIDT4, RTRTAG))
- {
- mode = CAN_MODE_AUTO_REPLY;
- }
-
- return mode;
-}
-
-
-// Funktion schreibt in das Objekt die zu uebermittelnden Daten
-void can_set_data(uint8_t length, uint8_t * data)
-{
- uint8_t i;
- uint8_t cancdmob;
-
- if(length > 8)
- length = 8;
-
- // Anzahl der Datenbytes in der Nachricht
- // scheinbar darf man das CANCDMOB register nicht beliebig oft
- // schreiben/lesen, daher speichern wir den wert dazwischen, loeschen die
- // entsprechenden bits fuer die laenge und schreiben dann unsere laenge rein
- // wie dem auch sei: so funktionierts zumindest, also vorsicht beim aufraeumen ;-)
- cancdmob = CANCDMOB;
- clearbit(cancdmob, DLC0);
- clearbit(cancdmob, DLC1);
- clearbit(cancdmob, DLC2);
- clearbit(cancdmob, DLC3);
- CANCDMOB = (cancdmob | (length << DLC0));
- for(i = 0; i < length; i++)
- CANMSG = data[i];
-}
-
-void can_get_data(int8_t *msg)
-{
- uint8_t i;
-
- for(i = 0; i < 8; i++)
- msg[i] = CANMSG;
-}
-
-// Parameter: uint8_t mob: Nummer des Objekts (0-14)
-// Funktion setzt den Interrupt für das jeweilige Objekt
-void can_set_mob_interrupt(uint8_t mob)
-{
- // bugfix von C.H.
- // http://www.mikrocontroller.net/topic/98697#1232848
- if (mob < 8) { setbit(CANIE2, iemob[mob]); }
- else { setbit(CANIE1, iemob[mob]); }
-}
-
-// Parameter: uint8_t mob: Nummer des Objekts (0-14)
-// Funktion löscht den Interrupt für das jeweilige Objekt
-void can_clear_mob_interrupt(uint8_t mob)
-{
- clearbit(CANIE2, iemob[mob]);
-}
-
-// Rückgabe: uint8_t mob: Nummer des Objekts
-// Funktion ermittelt, welches Objekt Interrupt ausgeloest hat
-uint8_t can_get_mob_interrupt(void)
-{
- uint8_t mob;
- uint16_t maske;
- maske = CANSIT2 | (CANSIT1 << 8);
-
- // Wenn alle 32 Bit der Bitmaske 0 sind dann ist ein Fehler aufgetreten
- if(maske == 0)
- return NOMOB;
-
- // Die Bitmaske wird so lange nach rechts geschoben, bis Bit0 eine 1 hat.
- // Die Anzahl der Schiebeoperatoren gibt somit die Nummer des MOBs zurück
- for(mob=0; (maske & 0x01)==0; maske >>= 1, ++mob);
-
- // Kontrolle: Wenn mob größer als die Anzahl der verfügbaren
- // Message Objects ist das Ergebnis falsch
- if(mob > 14)
- return NOMOB;
-
- return mob;
-}
-
-void can_disable_mob_usb(uint8_t mob)
-{
- answer[0] = CMD_CAN_DISABLE_MOB;
- answer[1] = (int8_t)can_disable_mob(mob);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-// Funktion deaktiviert das gewählte Objekt
-int can_disable_mob(uint8_t mob)
-{
- // Objekt wählen
- can_get_mob(mob);
-
- // Interrupt für dieses Objekt aktivieren
- can_clear_mob_interrupt(mob);
-
- // Betriebsmodus setzen
- can_set_mode(CAN_MODE_DISABLED);
-
- return RSP_OK;
-}
-
-
-void can_send_remote_usb(uint8_t mob)
-{
- answer[0] = CMD_CAN_SEND_REMOTE;
- answer[1] = (int8_t)can_send_remote(mob);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-// Funktion sendet eine Anfrage (Remote Frame)
-int can_send_remote(uint8_t mob)
-{
- uint8_t mode;
-
- // Objekt wählen
- can_get_mob(mob);
-
- // Aktuelle Betriebsart sichern
- mode = can_get_mode();
-
- // Datenübertragung starten
- can_set_mode(CAN_MODE_TRANSMIT_REMOTE);
-
- // Warten bis die Datenübertragung beendet ist (TXOK-Flag von CAN-Controller
- // gesetzt)
- while (!getbit(CANSTMOB, TXOK));
-
- // TXOK-Flag von Hand löschen
- clearbit(CANSTMOB, TXOK);
-
- // Alte Betriebsart wiederherstellen
- can_set_mode(mode);
-
- return RSP_OK;
-}
-
-void can_receive_data_usb(int mob)
-{
- uint8_t i;
- answer[0] = CMD_CAN_RECEIVE_DATA;
- answer[1] = RSP_OK;
-
- // id
- answer[2] = (int8_t) (message.id);
- answer[3] = (int8_t) (message.id >> 8);
- answer[4] = (int8_t) (message.id >> 16);
- answer[5] = (int8_t) (message.id >> 24);
-
- message.id = 0;
- for(i = 0; i < 8; i++)
- {
- answer[6+i] = message.data[i];
- message.data[i] = 0;
- }
- answer[14] = 0;
-
- CommandAnswer(15);
-}
-
-// Interrupt fuer Empfang einer Nachricht
-SIGNAL(SIG_CAN_INTERRUPT1)
-{
- uint8_t save_canpage;
- uint8_t mob;
-
- // Aktuelle CANPAGE sichern
- save_canpage = CANPAGE;
-
- // Index des MOB ermitteln, der den Interrupt ausgelöst hat
- mob = can_get_mob_interrupt();
-
- // Falls es kein gültiges MOB war abbrechen
- if(mob == NOMOB)
- return;
-
- // Objekt das den Interrupt ausgelöst hat holen
- can_get_mob(mob);
-
- // Id der Nachricht holen
- message.id = can_get_id();
-
- // Daten des MOBs aus CANMSG auslesen
- can_get_data(message.data);
-
- // Id der Nachricht holen
- message.id = can_get_id();
-
- // RXOK-Flag löschen
- clearbit(CANSTMOB, RXOK);
-
- // MOB auf Empfang setzen
- can_set_mode(CAN_MODE_RECEIVE_DATA);
-
- // CANPAGE wiederherstellen
- CANPAGE = save_canpage;
-}
-
-#endif
diff --git a/firmware/can.h b/firmware/can.h
deleted file mode 100644
index 1bab0ba..0000000
--- a/firmware/can.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2007 Marco Glietsch (http://www.mikrocontroller.net/topic/98697)
- * Original author: Marco Glietsch
- * Modified for octopus by Michael Hartmann <ich@speicherleck.de>
- * All rights reserved.
- *
- * Short descripton of file:
- *
- *
- * 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 the FH Augsburg 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 CAN_H
-#define CAN_H
-
-#include <inttypes.h>
-
-#define setbit(ADR,BIT) (ADR |= (1<<BIT))
-#define clearbit(ADR,BIT) (ADR &=~(1<<BIT))
-#define getbit(ADR, BIT) (ADR & (1<<BIT))
-
-/* CAN Objekte */
-#define NO_MOBS 15 // Anzahl der Message Objects festlegen
-#define NOMOB 0xff // Definition für ungültigen Objektindex
-
-// baudrate
-enum { CAN_BAUDRATE_100K, CAN_BAUDRATE_125K, CAN_BAUDRATE_200K,
- CAN_BAUDRATE_250K, CAN_BAUDRATE_500K, CAN_BAUDRATE_1000K };
-
-// Betriebsmodi
-enum { CAN_MODE_DISABLED, CAN_MODE_TRANSMIT_DATA, CAN_MODE_TRANSMIT_REMOTE,
- CAN_MODE_RECEIVE_DATA, CAN_MODE_AUTO_REPLY };
-
-// Interrupt-Modi
-enum { CAN_INTERRUPTS_NONE, CAN_INTERRUPTS_TX, CAN_INTERRUPTS_RX,
- CAN_INTERRUPTS_TXRX };
-
-void can_parser(uint8_t *buf);
-
-int can_init(uint8_t baudrate, uint8_t intmode, uint8_t eid);
-void can_init_usb(uint8_t baudrate, uint8_t eid);
-
-int can_deinit(void);
-void can_deinit_usb(void);
-
-int can_enable_mob(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm);
-void can_enable_mob_usb(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm);
-
-int can_disable_mob(uint8_t mob);
-void can_disable_mob_usb(uint8_t mob);
-
-int can_send_data(uint8_t mob, uint8_t length, uint8_t * data);
-void can_send_data_usb(uint8_t mob, uint8_t length, uint8_t *data);
-
-int can_send_remote(uint8_t mob);
-void can_send_remote_usb(uint8_t mob);
-
-void can_receive_data_usb(int mob);
-
-void can_set_autoreply(uint8_t mob, uint8_t length, uint8_t *buf);
-void can_set_autoreply_usb(uint8_t mob, uint8_t length, uint8_t *buf);
-
-// sonsitge hilfsfunktionen
-int can_set_baudrate(uint8_t baudrate);
-int can_set_interrupt(uint8_t mode);
-void can_get_mob(uint8_t mob);
-uint32_t can_get_id(void);
-void can_set_id_mask(uint32_t idm);
-void can_set_id(uint32_t id);
-int can_set_mode(uint8_t mode);
-uint8_t can_get_mode(void);
-void can_set_data(uint8_t length, uint8_t * data);
-void can_get_data(int8_t *msg);
-void can_set_mob_interrupt(uint8_t object);
-void can_clear_mob_interrupt(uint8_t mob);
-uint8_t can_get_mob_interrupt(void);
-
-#endif /* CAN_H */
diff --git a/firmware/common.c b/firmware/common.c
index 69f3c94..9947c59 100644
--- a/firmware/common.c
+++ b/firmware/common.c
@@ -80,17 +80,11 @@ void common_parser(char *buf)
void common_init(void)
{
- uint8_t i;
+ int i;
for(i=1;i<=19;i++)
- {
- io_init(i);
- io_set_pin(i, 0);
- }
- for(i=24;i<=42;i++)
- {
- io_init(i);
- io_set_pin(i, 0);
- }
+ io_init(i);
+ for(i=26;i<=44;i++)
+ io_init(i);
}
@@ -106,7 +100,7 @@ void common_hwdesc(void)
answer[7] = 'p'; answer[8] = 'u';answer[9] = 's';answer[10] = '_';
#endif
answer[11] = '0'; answer[12] = '1';
- answer[13] = 0;
+ answer[13] = 0x00;
CommandAnswer(14);
}
diff --git a/firmware/common.h b/firmware/common.h
index 11716fb..3229718 100644
--- a/firmware/common.h
+++ b/firmware/common.h
@@ -31,46 +31,32 @@
* (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 COMMON_H
-#define COMMON_H
-
-#include <inttypes.h>
-#include <stdbool.h>
enum signals {PIN_NONE,PIN_IN,PIN_OUT,PIN_TRI,
PIN_AD,PIN_RX,PIN_TX,
PIN_SS,PIN_SCK,PIN_MISO,PIN_MOSI,
PIN_SCL,PIN_SDA,PIN_PWM,
- PIN_UART,PIN_CAN};
+ PIN_UART};
-#ifdef __AVR_AT90CAN128__
- #define OCTOPUS_CAN
-#endif
-//#define OCTOPUS_RELAIS
+#define OCTOPUS_CAN
-#define DEBUG 1
+//#define DEBUG
#define F_CPU 16000000UL
#define STATUS_LED_PIN PB7
#define STATUS_LED_PORT PORTB
/* red status led */
-#ifndef OCTOPUS_RELAIS
#define STATUS_LED_on (STATUS_LED_PORT |= (1 << STATUS_LED_PIN))
#define STATUS_LED_off (STATUS_LED_PORT &= ~(1 << STATUS_LED_PIN))
-#else
-#define STATUS_LED_on (1);
-#define STATUS_LED_off (1);
-#endif
volatile struct octopus_t
{
volatile unsigned char latency_timer;
- volatile unsigned char status_led;
- uint8_t ports[43];
+ int ports[45];
volatile char * msg[20];
volatile int datatogl;
volatile unsigned int long_rx_cmd;
@@ -85,7 +71,7 @@ volatile struct octopus_t
void CommandAnswer(unsigned int length);
-void CommandAnswerRest (void);
+void CommandAnswerRest(void);
void USBCommandRX(char *buf);
void USBMessageIn(char *buf);
@@ -105,4 +91,3 @@ void common_init(void);
void common_hwdesc(void);
-#endif //COMMON_H
diff --git a/firmware/debug.c b/firmware/debug.c
index 5e7a950..539a3e2 100644
--- a/firmware/debug.c
+++ b/firmware/debug.c
@@ -1,7 +1,4 @@
#include <inttypes.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
#include <avr/io.h>
#include "uart.h"
@@ -11,39 +8,21 @@
#define UART_PORT 0
-void debug_dummy(char *fmt, ...) {}
-
-void debug_init()
-{
-#ifdef DEBUG
-#warning Compiling with debug-support!
+void debug_init(void) {
uart_init(UART_PORT);
uart_baudrate(UART_PORT, 25, 0, 0, 0);
uart_stopbits(UART_PORT, 1);
uart_databits(UART_PORT, 8);
uart_parity(UART_PORT, 'N');
-
- static FILE mystdout = FDEV_SETUP_STREAM(debug_putchar, NULL,
- _FDEV_SETUP_WRITE);
- stdout = &mystdout;
-#endif
}
-int debug_putchar(char c, FILE *stream)
-{
-#ifdef DEBUG
- if (c == '\n')
- uart_putchar(UART_PORT, '\r');
- uart_putchar(UART_PORT, c);
-#endif
- return 1;
+void debug_deinit(void) {
+ uart_deinit(UART_PORT);
}
-void debug_deinit(void)
-{
-#ifdef DEBUG
- uart_deinit(UART_PORT);
-#endif
+void debug_write(char *buf) {
+ while(*buf)
+ uart_putchar(UART_PORT, *buf++);
}
unsigned char debug_AsciiToHex(unsigned char high, unsigned char low)
@@ -73,7 +52,6 @@ unsigned char debug_AsciiToHex(unsigned char high, unsigned char low)
void debug_SendHex(unsigned char hex)
{
-#ifdef DEBUG
unsigned char high,low;
// get highnibble
high = hex & 0xF0;
@@ -91,8 +69,4 @@ void debug_SendHex(unsigned char hex)
uart_putchar(UART_PORT, low+48);
else
uart_putchar(UART_PORT, low+87);
-
- //_debug_write("\r\n");
-#endif
}
-
diff --git a/firmware/debug.h b/firmware/debug.h
index 202ef22..8aa15d9 100644
--- a/firmware/debug.h
+++ b/firmware/debug.h
@@ -1,12 +1,5 @@
-#ifdef DEBUG
-#define debugf printf("%s,%d: ", __FILE__, __LINE__); printf
-#else
-#define debugf debug_dummy
-#endif
-
-void debug_dummy(char *fmt, ...);
void debug_init(void);
-int debug_putchar(char c, FILE *stream);
void debug_deinit(void);
+void debug_write(char *buf);
unsigned char debug_AsciiToHex(unsigned char high, unsigned char low);
void debug_SendHex(unsigned char hex);
diff --git a/firmware/eeprom.c b/firmware/eeprom.c
deleted file mode 100644
index 3f0c1a1..0000000
--- a/firmware/eeprom.c
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "common.h"
-#include "protocol.h"
-
-#include <inttypes.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <avr/eeprom.h>
-#include <stdio.h>
-
-#include "eeprom.h"
-#include "debug.h"
-
-#define EEPROM_READY() while(EECR & (1 << EEWE));
-
-void eeprom_parser(char *buf)
-{
- uint16_t addr;
- uint16_t length;
-
- addr = ((uint16_t)buf[2]) +
- ((uint16_t)buf[3] << 8);
-
- length = ((uint16_t)buf[4]) +
- ((uint16_t)buf[5] << 8);
-
- debugf("eeprom_parser: length: %u, addr: %u\n", length, addr);
-
- switch(buf[0])
- {
- case CMD_EEPROM_READ_BYTES:
- eeprom_read_bytes_usb(addr, length);
- break;
-
- case CMD_EEPROM_WRITE_BYTES:
- eeprom_write_bytes_usb(addr, &buf[6], length);
- break;
-
- default:
- answer[0] = buf[0];
- answer[1] = RSP_UNKOWN_CMD;
- answer[2] = 0;
- CommandAnswer(3);
- }
-}
-
-
-void eeprom_read_bytes_usb(uint16_t addr, uint16_t length)
-{
- answer[0] = CMD_EEPROM_READ_BYTES;
- answer[1] = eeprom_read_bytes(addr, (char *)&answer[2], length);
- answer[2+length] = 0;
-
- debugf("read: %s\n", &answer[2]);
-
- CommandAnswer(3+length);
-}
-
-uint8_t eeprom_read_bytes(uint16_t addr, char * buf, uint16_t length)
-{
- uint8_t i;
-
- if(addr > MAX_ADDR)
- return RSP_ERROR;
-
- // wait for eeprom
- EEPROM_READY();
-
- for(i = 0; i < length; i++)
- {
-
- buf[i] = eeprom_read_byte((uint8_t*) addr++);
- // set addr
- //EEAR = addr++;
-
- //EECR |= (1 << EERE);
-
- //buf[i] = EEDR;
- //debug_SendHex(buf[i]);
- }
-
- return RSP_OK;
-}
-
-void eeprom_write_bytes_usb(uint16_t addr, char * buf, uint16_t length)
-{
- answer[0] = CMD_EEPROM_WRITE_BYTES;
- answer[1] = eeprom_write_bytes(addr, buf, length);
- answer[2] = 0;
-
- debugf("written: %s\n", buf);
-
- CommandAnswer(3);
-}
-
-uint8_t eeprom_write_bytes(uint16_t addr, char * buf, uint16_t length)
-{
- uint8_t i;
-
- if(addr > MAX_ADDR)
- return RSP_ERROR;
-
- // wait for eeprom
- EEPROM_READY();
-
- for(i = 0; i < length; i++)
- {
- eeprom_write_byte ((uint8_t*) addr++, buf[i]);
-
- //EEAR = addr++;
- //EEDR = buf[i];
-
- //EECR |= (1 << EEMWE);
- //EECR |= (1 << EEWE);
- }
-
- eeprom_read_bytes(addr, buf, length);
-
- return RSP_OK;
-}
diff --git a/firmware/eeprom.h b/firmware/eeprom.h
deleted file mode 100644
index 2ac7d4a..0000000
--- a/firmware/eeprom.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <inttypes.h>
-#include <stdbool.h>
-
-#define MAX_ADDR 4095
-
-void eeprom_parser(char *buf);
-
-void eeprom_read_bytes_usb(uint16_t addr, uint16_t length);
-uint8_t eeprom_read_bytes(uint16_t addr, char * buf, uint16_t length);
-void eeprom_write_bytes_usb(uint16_t addr, char * buf, uint16_t length);
-uint8_t eeprom_write_bytes(uint16_t addr, char * buf, uint16_t length);
diff --git a/firmware/fifo.c b/firmware/fifo.c
index 17551d7..a1e0f87 100644
--- a/firmware/fifo.c
+++ b/firmware/fifo.c
@@ -2,26 +2,26 @@
void fifo_init (fifo_t *f, uint8_t *buffer, const uint8_t size)
{
- f->count = 0;
- f->pread = f->pwrite = buffer;
- f->read2end = f->write2end = f->size = size;
+ f->count = 0;
+ f->pread = f->pwrite = buffer;
+ f->read2end = f->write2end = f->size = size;
}
uint8_t fifo_put (fifo_t *f, const uint8_t data)
{
- return _inline_fifo_put (f, data);
+ return _inline_fifo_put (f, data);
}
uint8_t fifo_get_wait (fifo_t *f)
{
- while (!f->count);
-
- return _inline_fifo_get (f);
+ while (!f->count);
+
+ return _inline_fifo_get (f);
}
int fifo_get_nowait (fifo_t *f)
{
- if (!f->count) return -1;
-
- return (int) _inline_fifo_get (f);
+ if (!f->count) return -1;
+
+ return (int) _inline_fifo_get (f);
}
diff --git a/firmware/i2c.c b/firmware/i2c.c
index 4baa7bb..fca24ac 100644
--- a/firmware/i2c.c
+++ b/firmware/i2c.c
@@ -36,6 +36,7 @@
#include "common.h"
#include "protocol.h"
#include "i2c.h"
+#include "debug.h"
#define I2C_WAIT_FOR_COMPLETE() while (!(TWCR & (1<<TWINT)));
void i2c_parser(char *buf)
@@ -103,8 +104,8 @@ void i2c_deinit_usb(void)
int i2c_deinit(void)
{
TWCR &= ~(1<<TWEN); // deinit
- octopus.ports[12]=PIN_NONE;
- octopus.ports[13]=PIN_NONE;
+ octopus.ports[12]=PIN_NONE; // XXX correct?
+ octopus.ports[13]=PIN_NONE; // XXX correct?
return RSP_OK;
}
@@ -112,7 +113,7 @@ int i2c_deinit(void)
void i2c_set_bitrate_usb(char bitrate) {
answer[1] = (unsigned char)i2c_set_bitrate(bitrate);
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -129,7 +130,7 @@ int i2c_set_bitrate(char bitrate) {
void i2c_send_start_usb(void)
{
answer[1] = (unsigned char)i2c_send_start();
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -169,7 +170,7 @@ void i2c_send_usb(int length, char *data)
i2c_send(data, length);
answer[1] = RSP_OK;
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -192,12 +193,16 @@ void i2c_recv_usb(int address, int length)
answer[0]=CMD_I2C_RECV;
answer[1]=RSP_OK;
- for(i = 0; i < length; i++)
+ debug_init();
+ for(i = 0; i < length; i++) {
+ debug_write("recv\r\n\0");
answer[2+i] = i2c_recv_byte();
+ debug_write("recved\r\n\0");
+ }
answer[length+2] = 0;
- CommandAnswer(3+length);
+ CommandAnswer(length+2);
}
diff --git a/firmware/io.c b/firmware/io.c
index 4227ec9..280f892 100644
--- a/firmware/io.c
+++ b/firmware/io.c
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2007 Embedded Projects (http://www.embedded-projects.net)
- * Author: Benedikt Sauter <sauter@embedded-projects.net>
+ * Author: Benedikt Sauter <sauter@
* All rights reserved.
*
* Short descripton of file:
@@ -36,8 +36,6 @@
#include "common.h"
#include "protocol.h"
#include "io.h"
-#include "pin.h"
-
void io_parser(char *buf)
{
@@ -79,9 +77,6 @@ void io_parser(char *buf)
case CMD_IO_PIN_GET:
io_get_pin_usb((uint8_t)buf[2]);
break;
- case CMD_IO_SET_STATUS_LED:
- io_set_status_led_usb((uint8_t)buf[2]);
- break;
default:
answer[0] = buf[0];
answer[1] = RSP_UNKOWN_CMD;
@@ -92,7 +87,12 @@ void io_parser(char *buf)
uint8_t io_init(uint8_t pin)
{
- return io_set_pin_direction_out(pin);
+ if ((pin >= 1 && pin <= 19) || (pin >= 26 && pin <= 44))
+ {
+ io_set_pin_direction_out(pin);
+ return RSP_OK;
+ }
+ return RSP_UNKOWN_PIN;
}
void io_init_usb(uint8_t pin)
@@ -120,16 +120,16 @@ void io_init_port_usb(uint8_t port)
uint8_t io_set_port_direction_out(uint8_t port,uint8_t mask)
{
/* TODO
- switch (port)
- {
- case 1: DDRB = mask; break;
+ switch (port)
+ {
+ case 1: DDRB = mask; break;
case 2: DDRC = mask; break; // PC7 = /CS (output) - do we need to mask this ?
- case 3: DDRD = mask; break;
+ case 3: DDRD = mask; break;
case 4: DDRE = mask; break; // PE4 = INT4 (input) - do we need to mask this ?
- case 5: DDRF = mask; break;
- default: return RSP_UNKOWN_PIN;
+ case 5: DDRF = mask; break;
+ default: return RSP_UNKOWN_PIN;
}
- */
+ */
return RSP_OK;
}
@@ -160,7 +160,6 @@ void io_set_port_direction_in_usb(uint8_t port, uint8_t mask)
answer[2] = 0;
CommandAnswer(3);
}
-
void io_set_port_direction_tri_usb(uint8_t port, uint8_t mask)
{
answer[0] = CMD_IO_PORT_DIRECTION_TRI;
@@ -172,41 +171,131 @@ void io_set_port_direction_tri_usb(uint8_t port, uint8_t mask)
uint8_t io_set_pin_direction_out(uint8_t pin)
{
- pin_conf p;
-
- if(!pin_get_conf(pin, &p))
- return RSP_UNKOWN_PIN;
-
- octopus.ports[pin] = PIN_OUT;
- *(p.ox_ddr) |= (1 << p.ox_p);
-
- return RSP_OK;
+ if((pin >= 1 && pin <= 19) || (pin >=26 && pin <=44) )
+ {
+ octopus.ports[pin] = PIN_OUT;
+
+ switch(pin)
+ {
+ case 1: OX_DDR1 |=(1<<OX_P1); break;
+ case 2: OX_DDR2 |=(1<<OX_P2); break;
+ case 3: OX_DDR3 |=(1<<OX_P3); break;
+ case 4: OX_DDR4 |=(1<<OX_P4); break;
+ case 5: OX_DDR5 |=(1<<OX_P5); break;
+ case 6: OX_DDR6 |=(1<<OX_P6); break;
+ case 7: OX_DDR7 |=(1<<OX_P7); break;
+ case 8: OX_DDR8 |=(1<<OX_P8); break;
+ case 9: OX_DDR9 |=(1<<OX_P9); break;
+ case 10: OX_DDR10 |=(1<<OX_P10); break;
+ case 11: OX_DDR11 |=(1<<OX_P11); break;
+ case 12: OX_DDR12 |=(1<<OX_P12); break;
+ case 13: OX_DDR13 |=(1<<OX_P13); break;
+ case 14: OX_DDR14 |=(1<<OX_P14); break;
+ case 15: OX_DDR15 |=(1<<OX_P15); break;
+ case 16: OX_DDR16 |=(1<<OX_P16); break;
+ case 17: OX_DDR17 |=(1<<OX_P17); break;
+ case 18: OX_DDR18 |=(1<<OX_P18); break;
+ case 19: OX_DDR19 |=(1<<OX_P19); break;
+
+ case 26: OX_DDR26 |=(1<<OX_P26); break;
+ case 27: OX_DDR27 |=(1<<OX_P27); break;
+ case 28: OX_DDR28 |=(1<<OX_P28); break;
+ case 29: OX_DDR29 |=(1<<OX_P29); break;
+ case 30: OX_DDR30 |=(1<<OX_P30); break;
+ case 31: OX_DDR31 |=(1<<OX_P31); break;
+ case 32: OX_DDR32 |=(1<<OX_P32); break;
+ case 33: OX_DDR33 |=(1<<OX_P33); break;
+ case 34: OX_DDR34 |=(1<<OX_P34); break;
+ case 35: OX_DDR35 |=(1<<OX_P35); break;
+ case 36: OX_DDR36 |=(1<<OX_P36); break;
+ case 37: OX_DDR37 |=(1<<OX_P37); break;
+ case 38: OX_DDR38 |=(1<<OX_P38); break;
+ case 39: OX_DDR39 |=(1<<OX_P39); break;
+ case 40: OX_DDR40 |=(1<<OX_P40); break;
+ case 41: OX_DDR41 |=(1<<OX_P41); break;
+ case 42: OX_DDR42 |=(1<<OX_P42); break;
+ case 43: OX_DDR43 |=(1<<OX_P43); break;
+ case 44: OX_DDR44 |=(1<<OX_P44); break;
+ default:
+ return RSP_UNKOWN_PIN;
+ }
+ return RSP_OK;
+ }
+ else {
+ return RSP_UNKOWN_PIN;
+ }
}
-uint8_t io_set_pin_direction_in(uint8_t pin)
+uint8_t io_set_pin_direction_in(uint8_t pin)
{
- pin_conf p;
-
- if(!pin_get_conf(pin, &p))
- return RSP_UNKOWN_PIN;
-
- octopus.ports[pin] = PIN_IN;
- *(p.ox_ddr) &= ~(1 << p.ox_p);
-
- return RSP_OK;
+ if((pin >= 1 && pin <= 19) || (pin >=26 && pin <=44) )
+ {
+ octopus.ports[pin] = PIN_IN;
+ switch (pin)
+ {
+ case 1: OX_DDR1 &=~(1<<OX_P1); break;
+ case 2: OX_DDR2 &=~(1<<OX_P2); break;
+ case 3: OX_DDR3 &=~(1<<OX_P3); break;
+ case 4: OX_DDR4 &=~(1<<OX_P4); break;
+ case 5: OX_DDR5 &=~(1<<OX_P5); break;
+ case 6: OX_DDR6 &=~(1<<OX_P6); break;
+ case 7: OX_DDR7 &=~(1<<OX_P7); break;
+ case 8: OX_DDR8 &=~(1<<OX_P8); break;
+ case 9: OX_DDR9 &=~(1<<OX_P9); break;
+ case 10: OX_DDR10 &=~(1<<OX_P10); break;
+ case 11: OX_DDR11 &=~(1<<OX_P11); break;
+ case 12: OX_DDR12 &=~(1<<OX_P12); break;
+ case 13: OX_DDR13 &=~(1<<OX_P13); break;
+ case 14: OX_DDR14 &=~(1<<OX_P14); break;
+ case 15: OX_DDR15 &=~(1<<OX_P15); break;
+ case 16: OX_DDR16 &=~(1<<OX_P16); break;
+ case 17: OX_DDR17 &=~(1<<OX_P17); break;
+ case 18: OX_DDR18 &=~(1<<OX_P18); break;
+ case 19: OX_DDR19 &=~(1<<OX_P19); break;
+
+ case 26: OX_DDR26 &=~(1<<OX_P26); break;
+ case 27: OX_DDR27 &=~(1<<OX_P27); break;
+ case 28: OX_DDR28 &=~(1<<OX_P28); break;
+ case 29: OX_DDR29 &=~(1<<OX_P29); break;
+ case 30: OX_DDR30 &=~(1<<OX_P30); break;
+ case 31: OX_DDR31 &=~(1<<OX_P31); break;
+ case 32: OX_DDR32 &=~(1<<OX_P32); break;
+ case 33: OX_DDR33 &=~(1<<OX_P33); break;
+ case 34: OX_DDR34 &=~(1<<OX_P34); break;
+ case 35: OX_DDR35 &=~(1<<OX_P35); break;
+ case 36: OX_DDR36 &=~(1<<OX_P36); break;
+ case 37: OX_DDR37 &=~(1<<OX_P37); break;
+ case 38: OX_DDR38 &=~(1<<OX_P38); break;
+ case 39: OX_DDR39 &=~(1<<OX_P39); break;
+ case 40: OX_DDR40 &=~(1<<OX_P40); break;
+ case 41: OX_DDR41 &=~(1<<OX_P41); break;
+ case 42: OX_DDR42 &=~(1<<OX_P42); break;
+ case 43: OX_DDR43 &=~(1<<OX_P43); break;
+ case 44: OX_DDR44 &=~(1<<OX_P44); break;
+ default:
+ return RSP_UNKOWN_PIN;
+ }
+ return RSP_OK;
+ }
+ else
+ {
+ return RSP_UNKOWN_PIN;
+ }
}
-
-uint8_t io_set_pin_direction_tri(uint8_t pin)
+uint8_t io_set_pin_direction_tri(uint8_t pin)
{
- if(io_set_pin_direction_out(pin) == RSP_OK &&
- io_set_pin(pin,1) == RSP_OK)
+ if ((pin >= 1 && pin <= 19) || (pin >=26 && pin <=44) )
{
- octopus.ports[pin] = PIN_TRI;
- return RSP_OK;
- }
+ octopus.ports[pin] = PIN_TRI;
+ io_set_pin_direction_out(pin);
+ io_set_pin(pin,1);
+ return RSP_OK;
+ }
else
- return RSP_UNKOWN_PIN;
+ {
+ return RSP_UNKOWN_PIN;
+ }
}
@@ -235,58 +324,55 @@ void io_set_pin_direction_tri_usb(uint8_t pin)
}
-//XXX
+
uint8_t io_get_port (uint8_t port, uint8_t *pvalue)
{
- uint8_t value;
-
- *pvalue = 0;
- switch (port)
- {
- case 1: value = PINB; break;
- case 2: value = PINC; break; /* PC7 = /CS */
- case 3: value = PIND; break;
- case 4: value = PINE; break; /* PE4 = INTR */
- case 5: value = PINF; break;
- default: return RSP_UNKOWN_PORT;
- }
-
- *pvalue = value;
- return RSP_OK;
+ uint8_t value;
+
+ *pvalue = 0;
+ switch (port)
+ {
+ case 1: value = PINB; break;
+ case 2: value = PINC; break; /* PC7 = /CS */
+ case 3: value = PIND; break;
+ case 4: value = PINE; break; /* PE4 = INTR */
+ case 5: value = PINF; break;
+ default: return RSP_UNKOWN_PORT;
+ }
+ *pvalue = value;
+ return RSP_OK;
}
-void io_get_port_usb (uint8_t port)
-{
- uint8_t value;
+void io_get_port_usb (uint8_t port)
+{
+ uint8_t value;
- answer[0] = CMD_IO_PORT_GET;
- answer[1] = (unsigned char)io_get_port (port, &value);
- answer[2] = (unsigned char)value;
- answer[3] = 0;
- CommandAnswer(4);
+ answer[0] = CMD_IO_PORT_GET;
+ answer[1] = (unsigned char)io_get_port (port, &value);
+ answer[2] = (unsigned char)value;
+ CommandAnswer(3);
}
-// XXX
uint8_t io_set_port(uint8_t port, uint8_t value)
{
- switch (port)
- {
- case 1: PORTB = value; break;
- case 2: PORTC = value; break; // PC7 = /CS
- case 3: PORTD = value; break;
- case 4: PORTE = value; break; // PE4 = INTR
- case 5: PORTF = value; break;
- default: return RSP_UNKOWN_PIN;
- }
+ switch (port)
+ {
+ case 1: PORTB = value; break;
+ case 2: PORTC = value; break; // PC7 = /CS
+ case 3: PORTD = value; break;
+ case 4: PORTE = value; break; // PE4 = INTR
+ case 5: PORTF = value; break;
+ default: return RSP_UNKOWN_PIN;
+ }
return RSP_OK;
}
-void io_set_port_usb (uint8_t port, uint8_t value)
-{
- answer[0] = CMD_IO_PORT_SET;
- answer[1] = (unsigned char)io_set_port (port, value);
- answer[2] = 0;
- CommandAnswer(3);
+void io_set_port_usb (uint8_t port, uint8_t value)
+{
+ answer[0] = CMD_IO_PORT_SET;
+ answer[1] = (unsigned char)io_set_port (port, value);
+ answer[2] = 0;
+ CommandAnswer(3);
}
@@ -301,20 +387,59 @@ void io_set_pin_usb(uint8_t pin, uint8_t value)
uint8_t io_set_pin(uint8_t pin, uint8_t value)
{
- pin_conf p;
-
- if(!pin_get_conf(pin, &p))
- return RSP_UNKOWN_PIN;
-
- if(octopus.ports[pin] != PIN_OUT)
- return RSP_WRONG_PIN_CONFIG;
-
- if(value)
- *(p.ox_port) |= (1 << p.ox_p);
- else
- *(p.ox_port) &= ~(1 << p.ox_p);
-
- return RSP_OK;
+ if(octopus.ports[pin] == PIN_OUT)
+ {
+ switch(pin)
+ {
+ case 1: if(value) OX_PORT1 |=(1<<OX_P1); else OX_PORT1 &=~(1<<OX_P1); break;
+ case 2: if(value) OX_PORT2 |=(1<<OX_P2); else OX_PORT2 &=~(1<<OX_P2); break;
+ case 3: if(value) OX_PORT3 |=(1<<OX_P3); else OX_PORT3 &=~(1<<OX_P3); break;
+ case 4: if(value) OX_PORT4 |=(1<<OX_P4); else OX_PORT4 &=~(1<<OX_P4); break;
+ case 5: if(value) OX_PORT5 |=(1<<OX_P5); else OX_PORT5 &=~(1<<OX_P5); break;
+ case 6: if(value) OX_PORT6 |=(1<<OX_P6); else OX_PORT6 &=~(1<<OX_P6); break;
+ case 7: if(value) OX_PORT7 |=(1<<OX_P7); else OX_PORT7 &=~(1<<OX_P7); break;
+ case 8: if(value) OX_PORT8 |=(1<<OX_P8); else OX_PORT8 &=~(1<<OX_P8); break;
+ case 9: if(value) OX_PORT9 |=(1<<OX_P9); else OX_PORT9 &=~(1<<OX_P9); break;
+ case 10: if(value) OX_PORT10 |=(1<<OX_P10); else OX_PORT10 &=~(1<<OX_P10); break;
+ case 11: if(value) OX_PORT11 |=(1<<OX_P11); else OX_PORT11 &=~(1<<OX_P11); break;
+ case 12: if(value) OX_PORT12 |=(1<<OX_P12); else OX_PORT12 &=~(1<<OX_P12); break;
+ case 13: if(value) OX_PORT13 |=(1<<OX_P13); else OX_PORT13 &=~(1<<OX_P13); break;
+ case 14: if(value) OX_PORT14 |=(1<<OX_P14); else OX_PORT14 &=~(1<<OX_P14); break;
+ case 15: if(value) OX_PORT15 |=(1<<OX_P15); else OX_PORT15 &=~(1<<OX_P15); break;
+ case 16: if(value) OX_PORT16 |=(1<<OX_P16); else OX_PORT16 &=~(1<<OX_P16); break;
+ case 17: if(value) OX_PORT17 |=(1<<OX_P17); else OX_PORT17 &=~(1<<OX_P17); break;
+ case 18: if(value) OX_PORT18 |=(1<<OX_P18); else OX_PORT18 &=~(1<<OX_P18); break;
+ case 19: if(value) OX_PORT19 |=(1<<OX_P19); else OX_PORT19 &=~(1<<OX_P19); break;
+
+ case 26: if(value) OX_PORT26 |=(1<<OX_P26); else OX_PORT26 &=~(1<<OX_P26); break;
+ case 27: if(value) OX_PORT27 |=(1<<OX_P27); else OX_PORT27 &=~(1<<OX_P27); break;
+ case 28: if(value) OX_PORT28 |=(1<<OX_P28); else OX_PORT28 &=~(1<<OX_P28); break;
+ case 29: if(value) OX_PORT29 |=(1<<OX_P29); else OX_PORT29 &=~(1<<OX_P29); break;
+ case 30: if(value) OX_PORT30 |=(1<<OX_P30); else OX_PORT30 &=~(1<<OX_P30); break;
+ case 31: if(value) OX_PORT31 |=(1<<OX_P31); else OX_PORT31 &=~(1<<OX_P31); break;
+ case 32: if(value) OX_PORT32 |=(1<<OX_P32); else OX_PORT32 &=~(1<<OX_P32); break;
+ case 33: if(value) OX_PORT33 |=(1<<OX_P33); else OX_PORT33 &=~(1<<OX_P33); break;
+ case 34: if(value) OX_PORT34 |=(1<<OX_P34); else OX_PORT34 &=~(1<<OX_P34); break;
+ case 35: if(value) OX_PORT35 |=(1<<OX_P35); else OX_PORT35 &=~(1<<OX_P35); break;
+ case 36: if(value) OX_PORT36 |=(1<<OX_P36); else OX_PORT36 &=~(1<<OX_P36); break;
+ case 37: if(value) OX_PORT37 |=(1<<OX_P37); else OX_PORT37 &=~(1<<OX_P37); break;
+ case 38: if(value) OX_PORT38 |=(1<<OX_P38); else OX_PORT38 &=~(1<<OX_P38); break;
+ case 39: if(value) OX_PORT39 |=(1<<OX_P39); else OX_PORT39 &=~(1<<OX_P39); break;
+ case 40: if(value) OX_PORT40 |=(1<<OX_P40); else OX_PORT40 &=~(1<<OX_P40); break;
+ case 41: if(value) OX_PORT41 |=(1<<OX_P41); else OX_PORT41 &=~(1<<OX_P41); break;
+ case 42: if(value) OX_PORT42 |=(1<<OX_P42); else OX_PORT42 &=~(1<<OX_P42); break;
+ case 43: if(value) OX_PORT43 |=(1<<OX_P43); else OX_PORT43 &=~(1<<OX_P43); break;
+ case 44: if(value) OX_PORT44 |=(1<<OX_P44); else OX_PORT44 &=~(1<<OX_P44); break;
+ default:
+ return RSP_UNKOWN_PIN;
+ }
+
+ return RSP_OK;
+ }
+ else
+ {
+ return RSP_WRONG_PIN_CONFIG;
+ }
}
@@ -325,42 +450,63 @@ void io_get_pin_usb(uint8_t pin)
answer[0] = CMD_IO_PIN_GET;
answer[1] = (unsigned char)io_get_pin(pin,&value);
answer[2] = (unsigned char)value;
- answer[3] = 0;
- CommandAnswer(4);
+ CommandAnswer(3);
}
uint8_t io_get_pin(uint8_t pin, uint8_t *value)
{
- pin_conf p;
-
- if(!pin_get_conf(pin, &p))
- return RSP_UNKOWN_PIN;
-
- if(octopus.ports[pin] != PIN_IN)
- return RSP_WRONG_PIN_CONFIG;
-
- if(*(p.ox_pin) & (1 << p.ox_p))
- *value = 1;
- else
- *value = 0;
-
- return RSP_OK;
+ *value = 0;
+ if (octopus.ports[pin] == PIN_IN)
+ {
+ switch (pin)
+ {
+ case 1: if (OX_PIN1 & (1<<OX_P1)) *value=1; break;
+ case 2: if (OX_PIN2 & (1<<OX_P2)) *value=1; break;
+ case 3: if (OX_PIN3 & (1<<OX_P3)) *value=1; break;
+ case 4: if (OX_PIN4 & (1<<OX_P4)) *value=1; break;
+ case 5: if (OX_PIN5 & (1<<OX_P5)) *value=1; break;
+ case 6: if (OX_PIN6 & (1<<OX_P6)) *value=1; break;
+ case 7: if (OX_PIN7 & (1<<OX_P7)) *value=1; break;
+ case 8: if (OX_PIN8 & (1<<OX_P8)) *value=1; break;
+ case 9: if (OX_PIN9 & (1<<OX_P9)) *value=1; break;
+ case 10: if (OX_PIN10 & (1<<OX_P10)) *value=1; break;
+ case 11: if (OX_PIN11 & (1<<OX_P11)) *value=1; break;
+ case 12: if (OX_PIN12 & (1<<OX_P12)) *value=1; break;
+ case 13: if (OX_PIN13 & (1<<OX_P13)) *value=1; break;
+ case 14: if (OX_PIN14 & (1<<OX_P14)) *value=1; break;
+ case 15: if (OX_PIN15 & (1<<OX_P15)) *value=1; break;
+ case 16: if (OX_PIN16 & (1<<OX_P16)) *value=1; break;
+ case 17: if (OX_PIN17 & (1<<OX_P17)) *value=1; break;
+ case 18: if (OX_PIN18 & (1<<OX_P18)) *value=1; break;
+ case 19: if (OX_PIN19 & (1<<OX_P19)) *value=1; break;
+
+ case 26: if (OX_PIN26 & (1<<OX_P26)) *value=1; break;
+ case 27: if (OX_PIN27 & (1<<OX_P27)) *value=1; break;
+ case 28: if (OX_PIN28 & (1<<OX_P28)) *value=1; break;
+ case 29: if (OX_PIN29 & (1<<OX_P29)) *value=1; break;
+ case 30: if (OX_PIN30 & (1<<OX_P30)) *value=1; break;
+ case 31: if (OX_PIN31 & (1<<OX_P31)) *value=1; break;
+ case 32: if (OX_PIN32 & (1<<OX_P32)) *value=1; break;
+ case 33: if (OX_PIN33 & (1<<OX_P33)) *value=1; break;
+ case 34: if (OX_PIN34 & (1<<OX_P34)) *value=1; break;
+ case 35: if (OX_PIN35 & (1<<OX_P35)) *value=1; break;
+ case 36: if (OX_PIN36 & (1<<OX_P36)) *value=1; break;
+ case 37: if (OX_PIN37 & (1<<OX_P37)) *value=1; break;
+ case 38: if (OX_PIN38 & (1<<OX_P38)) *value=1; break;
+ case 39: if (OX_PIN39 & (1<<OX_P39)) *value=1; break;
+ case 40: if (OX_PIN40 & (1<<OX_P40)) *value=1; break;
+ case 41: if (OX_PIN41 & (1<<OX_P41)) *value=1; break;
+ case 42: if (OX_PIN42 & (1<<OX_P42)) *value=1; break;
+ case 43: if (OX_PIN43 & (1<<OX_P43)) *value=1; break;
+ case 44: if (OX_PIN44 & (1<<OX_P44)) *value=1; break;
+ default: return RSP_UNKOWN_PIN;
+ }
+ return RSP_OK;
+ }
+ else
+ {
+ return RSP_WRONG_PIN_CONFIG;
+ }
}
-void io_set_status_led(uint8_t on)
-{
- if(on)
- octopus.status_led = 1;
- else
- octopus.status_led = 0;
-}
-void io_set_status_led_usb(uint8_t on)
-{
- io_set_status_led(on);
-
- answer[0] = CMD_IO_PIN_GET;
- answer[1] = on;
- answer[2] = 0;
- CommandAnswer(3);
-}
diff --git a/firmware/io.h b/firmware/io.h
index 5cfb5f4..f86314f 100644
--- a/firmware/io.h
+++ b/firmware/io.h
@@ -38,9 +38,169 @@
#include <avr/io.h>
#include <avr/pgmspace.h>
-#ifdef __AVR_AT90CAN128__
- #define OCTOPUS_CAN
-#endif
+
+#define OX_PIN1 PINE
+#define OX_PIN2 PINE
+#define OX_PIN3 PINE
+#define OX_PIN4 PINB
+#define OX_PIN5 PINB
+#define OX_PIN6 PINB
+#define OX_PIN7 PINB
+#define OX_PIN8 PINB
+#define OX_PIN9 PINB
+#define OX_PIN10 PINB
+#define OX_PIN11 PINB
+#define OX_PIN12 PIND
+#define OX_PIN13 PIND
+#define OX_PIN14 PIND
+#define OX_PIN15 PIND
+#define OX_PIN16 PIND
+#define OX_PIN17 PIND
+#define OX_PIN18 PIND
+#define OX_PIN19 PIND
+
+#define OX_PIN26 PINC
+#define OX_PIN27 PINC
+#define OX_PIN28 PINC
+#define OX_PIN29 PINC
+#define OX_PIN30 PINC
+#define OX_PIN31 PINC
+#define OX_PIN32 PINC
+#define OX_PIN33 PINF
+#define OX_PIN34 PINF
+#define OX_PIN35 PINF
+#define OX_PIN36 PINF
+#define OX_PIN37 PINF
+#define OX_PIN38 PINF
+#define OX_PIN39 PINF
+#define OX_PIN40 PINF
+#define OX_PIN41 PINE
+#define OX_PIN42 PINE
+#define OX_PIN43 PINE
+#define OX_PIN44 PINE
+
+#define OX_PORT1 PORTE
+#define OX_PORT2 PORTE
+#define OX_PORT3 PORTE
+#define OX_PORT4 PORTB
+#define OX_PORT5 PORTB
+#define OX_PORT6 PORTB
+#define OX_PORT7 PORTB
+#define OX_PORT8 PORTB
+#define OX_PORT9 PORTB
+#define OX_PORT10 PORTB
+#define OX_PORT11 PORTB
+#define OX_PORT12 PORTD
+#define OX_PORT13 PORTD
+#define OX_PORT14 PORTD
+#define OX_PORT15 PORTD
+#define OX_PORT16 PORTD
+#define OX_PORT17 PORTD
+#define OX_PORT18 PORTD
+#define OX_PORT19 PORTD
+
+#define OX_PORT26 PORTC
+#define OX_PORT27 PORTC
+#define OX_PORT28 PORTC
+#define OX_PORT29 PORTC
+#define OX_PORT30 PORTC
+#define OX_PORT31 PORTC
+#define OX_PORT32 PORTC
+#define OX_PORT33 PORTF
+#define OX_PORT34 PORTF
+#define OX_PORT35 PORTF
+#define OX_PORT36 PORTF
+#define OX_PORT37 PORTF
+#define OX_PORT38 PORTF
+#define OX_PORT39 PORTF
+#define OX_PORT40 PORTF
+#define OX_PORT41 PORTE
+#define OX_PORT42 PORTE
+#define OX_PORT43 PORTE
+#define OX_PORT44 PORTE
+
+#define OX_DDR1 DDRE
+#define OX_DDR2 DDRE
+#define OX_DDR3 DDRE
+#define OX_DDR4 DDRB
+#define OX_DDR5 DDRB
+#define OX_DDR6 DDRB
+#define OX_DDR7 DDRB
+#define OX_DDR8 DDRB
+#define OX_DDR9 DDRB
+#define OX_DDR10 DDRB
+#define OX_DDR11 DDRB
+#define OX_DDR12 DDRD
+#define OX_DDR13 DDRD
+#define OX_DDR14 DDRD
+#define OX_DDR15 DDRD
+#define OX_DDR16 DDRD
+#define OX_DDR17 DDRD
+#define OX_DDR18 DDRD
+#define OX_DDR19 DDRD
+
+#define OX_DDR26 DDRC
+#define OX_DDR27 DDRC
+#define OX_DDR28 DDRC
+#define OX_DDR29 DDRC
+#define OX_DDR30 DDRC
+#define OX_DDR31 DDRC
+#define OX_DDR32 DDRC
+#define OX_DDR33 DDRF
+#define OX_DDR34 DDRF
+#define OX_DDR35 DDRF
+#define OX_DDR36 DDRF
+#define OX_DDR37 DDRF
+#define OX_DDR38 DDRF
+#define OX_DDR39 DDRF
+#define OX_DDR40 DDRF
+#define OX_DDR41 DDRE
+#define OX_DDR42 DDRE
+#define OX_DDR43 DDRE
+#define OX_DDR44 DDRE
+
+
+#define OX_P1 PE5
+#define OX_P2 PE6
+#define OX_P3 PE7
+#define OX_P4 PB0
+#define OX_P5 PB1
+#define OX_P6 PB2
+#define OX_P7 PB3
+#define OX_P8 PB4
+#define OX_P9 PB5
+#define OX_P10 PB6
+#define OX_P11 PB7
+#define OX_P12 PD0
+#define OX_P13 PD1
+#define OX_P14 PD2
+#define OX_P15 PD3
+#define OX_P16 PD4
+#define OX_P17 PD5
+#define OX_P18 PD6
+#define OX_P19 PD7
+
+#define OX_P26 PC0
+#define OX_P27 PC1
+#define OX_P28 PC2
+#define OX_P29 PC3
+#define OX_P30 PC4
+#define OX_P31 PC5
+#define OX_P32 PC6
+#define OX_P33 PF7
+#define OX_P34 PF6
+#define OX_P35 PF5
+#define OX_P36 PF4
+#define OX_P37 PF3
+#define OX_P38 PF2
+#define OX_P39 PF1
+#define OX_P40 PF0
+#define OX_P41 PE0
+#define OX_P42 PE1
+#define OX_P43 PE2
+#define OX_P44 PE3
+
+
void io_parser(char *buf);
@@ -80,8 +240,6 @@ void io_set_pin_usb(uint8_t pin, uint8_t value);
uint8_t io_get_pin(uint8_t pin, uint8_t *value);
void io_get_pin_usb(uint8_t pin);
-void io_set_status_led(uint8_t on);
-void io_set_status_led_usb(uint8_t on);
#define PORT(port,pin) (PORT##port)
#define DDR(port,pin) (DDR##port)
diff --git a/firmware/main.c b/firmware/main.c
index 6bd7c32..ef802a2 100644
--- a/firmware/main.c
+++ b/firmware/main.c
@@ -16,19 +16,19 @@
#include "protocol.h"
#include "wait.h"
-#include "93c46.h"
+#include "io.h"
#include "adc.h"
-#include "can.h"
-#include "eeprom.h"
#include "i2c.h"
-#include "io.h"
-#include "pwm.h"
#include "spi.h"
+#include "pwm.h"
#include "uart.h"
-#include <stdio.h>
+#include "93c46.h"
#include "debug.h"
+//#define DEBUG 1
+
+
SIGNAL (SIG_INTERRUPT4)
{
@@ -48,218 +48,185 @@ SIGNAL (SIG_OVERFLOW0)
}
-void USBCommandRX (char *buf)
+void
+USBCommandRX (char *buf)
{
int i;
- debugf("receiving command: %X (length: %u)\n", buf[1]);
+#ifdef DEBUG
+ debug_write("get \0");
+ debug_SendHex(buf[1]);
+ debug_write("\r\n");
+#endif
/* a paket can be max 255 bytes */
if (octopus.long_rx_cmd == 1)
- {
- debugf("get next\n");
-
- for (i = 0; i < 64; i++)
- request[octopus.long_rx_index + i] = buf[i];
+ {
+#ifdef DEBUG
+ debug_write("get next\r\n");
+#endif
+ for (i = 0; i < 64; i++)
+ request[octopus.long_rx_index + i] = buf[i];
- octopus.long_rx_index = octopus.long_rx_index + i;
+ octopus.long_rx_index = octopus.long_rx_index + i;
- if (octopus.long_rx_index >= octopus.long_rx_bytes)
- {
- octopus.long_rx_cmd = 0;
- USBMessageIn (request);
- }
- }
+ if (octopus.long_rx_index >= octopus.long_rx_bytes)
+ {
+ octopus.long_rx_cmd = 0;
+ USBMessageIn (request);
+ }
+ }
else
- {
- debugf("get and execute\n");
-
- octopus.long_rx_index = 0;
- for (i = 0; i < 64; i++)
- request[octopus.long_rx_index + i] = buf[i];
-
- octopus.long_rx_index = i;
-
- if ((unsigned int) buf[1] < 64)
- {
- octopus.long_rx_cmd = 0;
- USBMessageIn (request);
- }
- else
- {
- octopus.long_rx_cmd = 1;
- octopus.long_rx_bytes = (unsigned int) buf[1];
- }
- }
+ {
+#ifdef DEBUG
+ debug_write("get and execute\r\n\0");
+#endif
+ octopus.long_rx_index = 0;
+ for (i = 0; i < 64; i++)
+ request[octopus.long_rx_index + i] = buf[i];
+
+ octopus.long_rx_index = i;
+
+ if ((unsigned int) buf[1] < 64)
+ {
+ octopus.long_rx_cmd = 0;
+ USBMessageIn (request);
+ }
+ else
+ {
+ octopus.long_rx_cmd = 1;
+ octopus.long_rx_bytes = (unsigned int) buf[1];
+ }
+ }
}
/* is called when received data from pc */
-void USBMessageIn (char *buf)
+void
+USBMessageIn (char *buf)
{
octopus.long_index = 0;
octopus.long_running = 0;
- if(octopus.status_led)
- STATUS_LED_on;
-
+ STATUS_LED_on;
+#ifdef DEBUG
+ debug_write("parser\r\n\0");
+#endif
int check = ((int) buf[0] >> 4) & 0x0F;
- debugf("parser, check: %X, command: %X\n", check, buf[0]);
-
switch (check)
- {
- case 0:
- if (buf[0] == CMD_EXTERNAL_DEVICE)
- {
- switch (buf[2])
- {
- case CMD_EXTERNAL_93C46:
- flash_93c46_parser(buf);
- break;
- }
- }
- else
- common_parser(buf);
-
- break;
-
- case 1:
- debugf("calling io_parser\n");
- io_parser (buf);
- break;
- case 2:
- debugf("calling adc_parser\n");
- adc_parser (buf);
- break;
- case 3:
- debugf("calling i2c_parser\n");
- i2c_parser (buf);
- break;
- case 4:
- debugf("calling spi_parser\n");
- spi_parser (buf);
- break;
- case 5:
- debugf("calling pwm_parser\n");
- pwm_parser (buf);
- break;
- case 6:
- debugf("calling adc_parser\n");
- uart_parser (buf);
- break;
- case 7:
-#ifdef OCTOPUS_CAN
- debugf("calling can_parser\n");
- can_parser ((uint8_t *)buf);
-#else
- debugf("can't call can_parser - no CAN-support\n");
-#endif
- break;
- case 8:
- debugf("calling eeprom_parser\n");
- eeprom_parser(buf);
- break;
- default:
- debugf("unknown cmd\n");
- answer[0] = buf[0];
- answer[1] = RSP_UNKOWN_CMD;
- answer[2] = 0;
- CommandAnswer(3);
- }
-
- if(octopus.status_led)
- STATUS_LED_off;
-}
-
+ {
+ case 0:
+ if (buf[0] == CMD_EXTERNAL_DEVICE)
+ {
+ switch (buf[2])
+ {
+ case CMD_EXTERNAL_93C46:
+ flash_93c46_parser (buf);
+ break;
+ default:
+ ;
+ }
+ }
+ else
+ common_parser (buf);
+ break;
+ case 1:
+ io_parser (buf);
+ break;
+ case 2:
+ adc_parser (buf);
+ break;
+ case 3:
+ i2c_parser (buf);
+ break;
+ case 4:
+ spi_parser (buf);
+ break;
+ case 5:
+ pwm_parser (buf);
+ break;
+ case 6:
+ uart_parser (buf);
+ break;
+ default:
+ answer[0] = buf[0];
+ answer[1] = RSP_UNKOWN_CMD;
+ answer[2] = 0;
+ CommandAnswer (3);
+ }
-unsigned int strlen(volatile unsigned char *str)
-{
- unsigned int len = 0;
-
- while (*str++)
- len++;
-
- return len;
+ STATUS_LED_off;
}
-void CommandAnswer(unsigned int length)
+void
+CommandAnswer (unsigned int length)
{
int i;
- // if first packet of a long message
+ // if first packet of a lang message
if (length > 64 && octopus.long_running == 0)
- {
- debugf("first packet of a long message (length: %d)\n", length);
- octopus.long_index = 0;
- octopus.long_bytes = length;
- octopus.long_running = 1;
- length = 64;
- }
+ {
+ octopus.long_index = 0;
+ octopus.long_bytes = length;
+ octopus.long_running = 1;
+ length = 64;
+ }
USBNWrite (FIFOTXC1, FLUSH);
for (i = 0; i < length; i++)
- USBNWrite (TXD1, answer[octopus.long_index + i]);
+ USBNWrite (TXD1, answer[octopus.long_index + i]);
/* control togl bit */
if (octopus.datatogl == 1)
- {
- USBNWrite (FIFOTXC1, TX_LAST + TX_EN + TX_TOGL);
- octopus.datatogl = 0;
- }
+ {
+ USBNWrite (FIFOTXC1, TX_LAST + TX_EN + TX_TOGL);
+ octopus.datatogl = 0;
+ }
else
- {
- USBNWrite (FIFOTXC1, TX_LAST + TX_EN);
- octopus.datatogl = 1;
- }
+ {
+ USBNWrite (FIFOTXC1, TX_LAST + TX_EN);
+ octopus.datatogl = 1;
+ }
}
-void CommandAnswerRest (void)
+void
+CommandAnswerRest (void)
{
if (octopus.long_running == 1)
- {
- debugf("octopus long running message\n");
- if (octopus.long_index < octopus.long_bytes)
- {
- debugf("octopus.long_index < octopus.long_bytes\n");
- int diff = octopus.long_bytes - octopus.long_index;
- octopus.long_index = octopus.long_index + 64;
-
- if (diff > 64)
- {
- debugf("not last packet: diff > 64\n");
- CommandAnswer (64);
- }
- else
- {
- debugf("last packet\n");
- /* last packet */
- CommandAnswer (diff);
- octopus.long_running = 0;
- }
- }
- }
+ {
+ if (octopus.long_index < octopus.long_bytes)
+ {
+ int dif = octopus.long_bytes - octopus.long_index;
+ octopus.long_index = octopus.long_index + 64;
+
+ if (dif > 64)
+ CommandAnswer (64);
+
+ else
+ {
+ /* last packet */
+ CommandAnswer (dif);
+ octopus.long_running = 0;
+ }
+ }
+ }
}
-int main(void)
+int
+main (void)
{
- cli();
+ DDRB = 0xFF;
+ PORTB = 0xFF;
- USBNInitMC ();
- USBNStartClock();
-
- DDRB = 0xFF;
- PORTB = 0x00;
-
- /* use status led */
- octopus.status_led = 1;
int interf;
int conf;
+
STATUS_LED_off;
USBNInit ();
@@ -270,19 +237,17 @@ int main(void)
USBNDeviceBCDDevice (0x0001); // you can use it as version e.g. version 1.02
char lang[] = { 0x09, 0x04, 0x00 };
- _USBNAddStringDescriptor (lang); // language descriptor
+ _USBNAddStringDescriptor (lang); // language descriptor
/* Attention!!! Descriptors must be a factor of 8 (error in the stack) */
USBNDeviceManufacture ("EmbeddedProjects");
USBNDeviceProduct ("OctopusUSB Interface Converter and I/O Extension");
- //USBNDeviceProduct ("Octopus USB v3.3");
- USBNDeviceSerialNumber ("20090718");
+ USBNDeviceSerialNumber ("20081108");
conf = USBNAddConfiguration ();
- // we reserve 500mA, because users could drive LEDs and need more power
- USBNConfigurationPower (conf, 200);
+ USBNConfigurationPower (conf, 100);
interf = USBNAddInterface (conf, 0);
USBNAlternateSetting (conf, interf, 0);
@@ -290,32 +255,33 @@ int main(void)
/* communication */
USBNAddInEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &CommandAnswerRest);
USBNAddOutEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &USBCommandRX);
- //USBNAddOutEndpoint (conf, interf, 1, 0x02, BULK, 64, 0, NULL);
+
+ USBNInitMC ();
octopus.datatogl = 0;
octopus.long_rx_cmd = 0;
+ /* start usb chip */
+ USBNStart ();
+
/* UARTInit2(38400,8,'N',1); */
- debug_init();
+ #ifdef DEBUG
+ debug_init();
+ #endif
/* hello world led pattern */
- DDRC = 0x7F;
- PORTC = 0x2A;
+ DDRC = 0xFF;
+ PORTC = 0xAA;
delay_250ms ();
- PORTC = 0x55;
+ PORTC = 0xD5;
delay_250ms ();
- PORTC = 0x00;
-
- common_init();
+ PORTC = 0x80;
-
- /* init connection between avr and usbn9604 */
- USBNInitMC ();
- /* start usb chip */
- USBNStart ();
- sei();
+ // testpin
+ //PORTB = 0xFF;
+ //PORTB = 0x00;
while (1);
+
return 0;
}
-
diff --git a/firmware/main.hex b/firmware/main.hex
index d7795f1..3d38158 100644
--- a/firmware/main.hex
+++ b/firmware/main.hex
@@ -1,1327 +1,844 @@
-:100000000C9470000C948F000C948F000C948F0053
-:100010000C948F000C9463050C948F000C948F004B
-:100020000C948F000C948F000C948F000C948F0014
-:100030000C94DD190C948F000C948F000C948F009D
-:100040000C948F000C9438050C94431F0C948F0073
-:100050000C948F000C9491000C948F000C948F00E2
-:100060000C948F000C948F000C948F000C948F00D4
-:100070000C948F000C948F000C948F000C948F00C4
-:100080000C948F000C948F000C948F000C948F00B4
-:100090000C948F004C22572262226D2278228322F8
-:1000A0008E229922A422AF22BD22CB22D922E7227E
-:1000B000F222FD220B23162321232C233723422354
-:1000C0004D23582363236E23792384238F239A237C
-:1000D000A523B023BF23CA23D523E023EB23F92391
-:1000E00011241FBECFEFD0E1DEBFCDBF13E0A0E0F3
-:1000F000B1E0E8E6F0E500E00BBF02C007900D922A
-:10010000AE36B107D9F716E0AEE6B3E001C01D92F6
-:10011000A83BB107E1F70E94A9000C9432280C9487
-:1001200000001F920F920FB60F9211240F900FBE76
-:100130000F901F901895AC0120E030E002C02F5FB7
-:100140003F4FFA01E20FF31F80818823C1F7C901F5
-:1001500008956F927F928F929F92AF92BF92CF92AB
-:10016000DF92EF92FF920F93DF93CF9300D00F9225
-:10017000CDB7DEB7F8940E94B30A0E942B108FEF20
-:1001800084B915B881E0809378032F980E94240BDE
-:1001900081E897E10E946F0B85E69CE00E94740B5A
-:1001A00081E090E00E94790BDE011196E3EEF2E02F
-:1001B00083E001900D928150E1F7CE0101960E94FB
-:1001C000620F80E091E00E94001081E191E00E94C6
-:1001D000F80F82E491E00E94F00F0E94380F4C016A
-:1001E00068EC70E00E94870BC40160E070E00E9440
-:1001F000AE0E3C01C401B30140E050E00E94AD0BE3
-:10020000C401B30141E050E021E030E002E0A0E4AD
-:10021000EA2EF12CCC24DD24F6EBAF2EF1E0BF2E3C
-:100220000E94430EC401B30141E050E021E030E000
-:10023000E4E5AE2EE4E0BE2E0E947B0E1092CD03CC
-:100240001092CC031092CF031092CE030E94741B25
-:100250008FE787B98AE288B90E948B0585E588B95E
-:100260000E948B0518B80E94B1100E94B30A0E9428
-:1002700030107894FFCF0F931F93CF93DF938C01AF
-:1002800081349105F0F18091D8039091D903892BA5
-:10029000C1F500D000D000D0EDB7FEB731968BE4A9
-:1002A00091E0ADB7BEB712969C938E93119783E5FC
-:1002B00091E09383828381EC90E0958384830E9414
-:1002C0000D250F900F908AE591E0EDB7FEB7928370
-:1002D0008183148303830E940D251092D50310920D
-:1002E000D4031093D7030093D60381E090E090935A
-:1002F000D9038093D80300E410E00F900F900F9083
-:100300000F908BE268E00E94F50AC0E0D0E00DC0DB
-:10031000E091D403F091D503EC0FFD1FE25EFA4F9C
-:10032000608189E20E94F50A2196C017D10780F307
-:100330008091CC039091CD03019749F48BE267E063
-:100340000E94F50A1092CD031092CC030AC08BE2F2
-:1003500063E00E94F50A81E090E09093CD038093E2
-:10036000CC03DF91CF911F910F910895EF92FF92EF
-:100370000F931F93CF93DF938091D8039091D9036C
-:10038000019709F0B5C000D000D000D0EDB7FEB79E
-:1003900031960BE411E0ADB7BEB712961C930E93E5
-:1003A0001197B3E5EB2EB1E0FB2EF382E2828FEDE5
-:1003B00090E0958384830E940D258DB79EB70696A5
-:1003C0000FB6F8949EBF0FBE8DBF87E891E00E94E4
-:1003D00022252091D4033091D5038091D6039091AA
-:1003E000D7032817390708F083C000D000D000D009
-:1003F000EDB7FEB73196ADB7BEB712961C930E930C
-:100400001197F382E28282EE90E0958384830E94CA
-:100410000D258DB79EB706960FB6F8949EBF0FBEFA
-:100420008DBF84EA91E00E942225C091D603D0912D
-:10043000D7038091D4039091D503C81BD90B809129
-:10044000D4039091D503805C9F4F9093D503809304
-:10045000D403C134D1052CF100D000D000D0EDB7C9
-:10046000FEB73196ADB7BEB712961C930E93119797
-:10047000F382E28288EE90E0958384830E940D25CA
-:100480008DB79EB706960FB6F8949EBF0FBE8DBF70
-:100490008CEC91E00E94222580E490E00E943B01D8
-:1004A00027C000D000D000D0EDB7FEB73196ADB771
-:1004B000BEB712961C930E931197F382E2828DEED3
-:1004C00090E0958384830E940D258DB79EB7069694
-:1004D0000FB6F8949EBF0FBE8DBF87EE91E00E94CD
-:1004E0002225CE010E943B011092D9031092D8031D
-:1004F000DF91CF911F910F91FF90EF900895CF92D0
-:10050000DF92EF92FF921F93CF93DF93EC01109253
-:10051000D5031092D4031092D9031092D80380917E
-:10052000780381112F9A188112951F7000D000D086
-:1005300000D0EDB7FEB731969BE4E92E91E0F92E9D
-:10054000ADB7BEB71296FC92EE92119783E5C82E16
-:1005500081E0D82ED382C2828BE690E0958384839B
-:100560000E940D25EDB7FEB7319683EF91E0ADB750
-:10057000BEB712969C938E93119712831382888133
-:10058000848315820E940D258DB79EB706960FB6FF
-:10059000F8949EBF0FBE8DBF143009F495C015307E
-:1005A00058F4113029F11130A0F0123009F444C090
-:1005B000133009F03DC164C0163009F4CDC01630C7
-:1005C00008F4A6C0173009F4EBC0183009F030C1A8
-:1005D0000BC18881863041F48A81813009F058C18D
-:1005E000CE010E94AC1954C1CE010E94AA1050C184
-:1005F00000D000D000D0EDB7FEB73196ADB7BEB792
-:100600001296FC92EE921197D382C2828FE790E00D
-:10061000958384830E940D258DB79EB706960FB6ED
-:10062000F8949EBF0FBE8DBF83E192E00E94222509
-:10063000CE010E9455132CC100D000D000D0EDB7E0
-:10064000FEB73196ADB7BEB71296FC92EE921197F7
-:10065000D382C28283E890E0958384830E940D2533
-:100660008DB79EB706960FB6F8949EBF0FBE8DBF8E
-:1006700085E292E00E942225CE010E94F51408C175
-:1006800000D000D000D0EDB7FEB73196ADB7BEB701
-:100690001296FC92EE921197D382C28287E890E084
-:1006A000958384830E940D258DB79EB706960FB65D
-:1006B000F8949EBF0FBE8DBF88E392E00E94222572
-:1006C000CE010E942316E4C000D000D000D0EDB7C8
-:1006D000FEB73196ADB7BEB71296FC92EE92119767
-:1006E000D382C2828BE890E0958384830E940D259B
-:1006F0008DB79EB706960FB6F8949EBF0FBE8DBFFE
-:100700008BE492E00E942225CE010E94CE17C0C049
-:1007100000D000D000D0EDB7FEB73196ADB7BEB770
-:100720001296FC92EE921197D382C2828FE890E0EB
-:10073000958384830E940D258DB79EB706960FB6CC
-:10074000F8949EBF0FBE8DBF8EE592E00E942225D9
-:10075000CE010E94FF1A9CC000D000D000D0EDB79F
-:10076000FEB73196ADB7BEB71296FC92EE921197D6
-:10077000D382C28283E990E0958384830E940D2511
-:100780008DB79EB706960FB6F8949EBF0FBE8DBF6D
-:1007900085E292E00E942225CE010E94740778C073
-:1007A00000D000D000D0EDB7FEB73196ADB7BEB7E0
-:1007B0001296FC92EE921197D382C28288E990E061
-:1007C000958384830E940D258DB79EB706960FB63C
-:1007D000F8949EBF0FBE8DBF81E792E00E94222554
-:1007E000CE010E945C2054C000D000D000D0EDB7F4
-:1007F000FEB73196ADB7BEB71296FC92EE92119746
-:10080000D382C2828FE990E0958384830E940D2574
-:100810008DB79EB706960FB6F8949EBF0FBE8DBFDC
-:1008200084E892E00E942225CE010E94D02130C0AF
-:1008300000D000D000D0EDB7FEB731968BE491E048
-:10084000ADB7BEB712969C938E93119783E591E056
-:100850009383828383EA90E0958384830E940D25AD
-:100860008DB79EB706960FB6F8949EBF0FBE8DBF8C
-:100870008AE992E00E942225888180931E0583E008
-:1008800080931F051092200583E090E00E943B01B9
-:100890008091780381112F98DF91CF911F91FF9064
-:1008A000EF90DF90CF900895EF92FF920F931F93F8
-:1008B000CF93DF93EC0100D000D000D0EDB7FEB7AE
-:1008C00031960BE411E0ADB7BEB712961C930E93B0
-:1008D000119723E5E22E21E0F22EF382E28287E3F4
-:1008E00090E0958384830E940D250F900F90EDB7C3
-:1008F000FEB7319686EA92E0ADB7BEB712969C93EA
-:100900008E9311978981828313820E940D25809195
-:10091000CE039091CF030F900F900F900F900197FF
-:1009200009F04BC000D000D000D0EDB7FEB7319633
-:10093000ADB7BEB712961C930E931197F382E28265
-:100940008CE390E0958384830E940D258DB79EB73C
-:1009500006960FB6F8949EBF0FBE8DBF8AEC92E04C
-:100960000E94222520E030E0E091D003F091D103F5
-:10097000E20FF31FDE01A20FB31F8C91E252FC4F76
-:1009800080832F5F3F4F2034310571F78091D00372
-:100990009091D103805C9F4F9093D1038093D003BB
-:1009A0002091D0033091D1038091D2039091D30351
-:1009B0002817390708F455C03FC000D000D000D038
-:1009C000EDB7FEB73196ADB7BEB712961C930E9336
-:1009D0001197F382E2828BE490E0958384830E94F6
-:1009E0000D258DB79EB706960FB6F8949EBF0FBE25
-:1009F0008DBF83ED92E00E9422251092D1031092C8
-:100A0000D00320E030E0E091D003F091D103E20F79
-:100A1000F31FDE01A20FB31F8C91E252FC4F8083C3
-:100A20002F5F3F4F2034310571F73093D10320936E
-:100A3000D0038981803448F41092CF031092CE0302
-:100A40008EED93E00E947F020CC081E090E09093D5
-:100A5000CF038093CE03898190E09093D30380935A
-:100A6000D203DF91CF911F910F91FF90EF900895E6
-:100A70001F920F920FB60F920BB60F9211242F9365
-:100A80003F934F935F936F937F938F939F93AF9316
-:100A9000BF93EF93FF930E947C108091770386BDF4
-:100AA000FF91EF91BF91AF919F918F917F916F9146
-:100AB0005F914F913F912F910F900BBE0F900FBE02
-:100AC0000F901F9018951F920F920FB60F920BB6B2
-:100AD0000F9211242F933F934F935F936F937F93C4
-:100AE0008F939F93AF93BF93EF93FF930E94081050
-:100AF000FF91EF91BF91AF919F918F917F916F91F6
-:100B00005F914F913F912F910F900BBE0F900FBEB1
-:100B10000F901F90189520E040E45CE9CA0101970E
-:100B2000F1F72F5F2931D1F70895882321F0813023
-:100B300061F084E008958EE08093A2038093A30384
-:100B400088E18093C10081E008958EE0809387035F
-:100B50008093880388E18093C90081E00895882309
-:100B600021F0813081F084E008951092A203109268
-:100B7000A3031092C5001092C4001092C1001092FD
-:100B8000C20081E0089510928703109288031092AA
-:100B9000CD001092CC001092C9001092CA0081E0E2
-:100BA0000895882321F0813041F084E00895209356
-:100BB000C5006093C40081E008952093CD00609348
-:100BC000CC0081E00895623011F492E001C090E021
-:100BD000882321F0813061F084E008958091C20083
-:100BE000990F990F990F982B9093C20081E0089567
-:100BF0008091CA00990F990F990F982B9093CA0072
-:100C000081E00895663029F0673039F0653041F4AD
-:100C100002C020E006C020E001C021E090E002C058
-:100C200021E091E0882321F0813069F084E008958B
-:100C30008091C200220F220F990F922B982B909334
-:100C4000C20081E008958091CA00220F220F990FFF
-:100C5000922B982B9093CA0081E00895653419F087
-:100C60006F3419F405C021E001C020E090E002C01B
-:100C700021E091E0882321F0813079F084E008952B
-:100C80008091C2002295220F207E9295907F922B18
-:100C9000982B9093C20081E008958091CA0022951C
-:100CA000220F207E9295907F922B982B9093CA00D2
-:100CB00081E00895982FFA018230B8F084E0089519
-:100CC0002191992319F0913071F407C08091C000EF
-:100CD00085FFFCCF2093C60006C08091C80085FF29
-:100CE000FCCF2093CE00615070406115710541F733
-:100CF00081E00895882321F0813051F084E0089547
-:100D00008091C00085FFFCCF6093C60081E008950C
-:100D10008091C80085FFFCCF6093CE0081E00895EC
-:100D2000E82FDB01823010F084E008959A0116C0AC
-:100D3000EE2321F0E13049F084E00DC08091C00045
-:100D400087FFFCCF8091C60006C08091C80087FF56
-:100D5000FCCF8091CE008D932150304012161306A7
-:100D60003CF381E00895882321F0813049F084E04C
-:100D700008958091C00087FFFCCF8091C600089540
-:100D80008091C80087FFFCCF8091CE00089570E06D
-:100D90000E945A0680931F051092200583E090E080
-:100DA0000E943B0108950E94020680931F05109245
-:100DB000200583E090E00E943B0108950E94020616
-:100DC00080931F051092200583E090E00E943B0174
-:100DD00008950E94E30580931F051092200583E08B
-:100DE00090E00E943B0108950F930E94D1058093EB
-:100DF0001F051092200583E090E00E943B010F91B7
-:100E000008950E94AF0580931F051092200583E08E
-:100E100090E00E943B010895882321F0813059F031
-:100E200084E012C08EE08093A2038093A30388E144
-:100E30008093C10008C08EE080938703809388036D
-:100E400088E18093C90081E080931F0510922005FE
-:100E500083E090E00E943B010895CF92DF92EF92F1
-:100E6000FF920F931F93DF93CF93CDB7DEB78B0124
-:100E7000CDB6DEB62DB73EB7261B370B0FB6F894AE
-:100E80003EBF0FBE2DBFEDB6FEB60894E11CF11CAF
-:100E9000B701A8010E94900680931F0520E030E072
-:100EA0000AC0F701E20FF31F8081F901E05EFA4FFB
-:100EB00080832F5F3F4F201731079CF3F801E05EDE
-:100EC000FA4F1082C80103960E943B010FB6F894B6
-:100ED000DEBE0FBECDBECF91DF911F910F91FF906F
-:100EE000EF90DF90CF9008950F93FC018081809365
-:100EF0001E058081843611F1853648F48236B1F0C2
-:100F00008336E0F4803651F0813679F50BC08736B0
-:100F100031F18836E9F0853641F515C082810E94AD
-:100F20000C072CC082810E94010728C08281638146
-:100F30004481258106810E94F40620C0828163815C
-:100F40000E94E9061BC0828163810E94D30616C0FD
-:100F5000828163813496AF010E94C7060FC063810E
-:100F6000828170E00E942D0709C083E080931F05F5
-:100F70001092200583E090E00E943B010F910895BC
-:100F800087E28093860685E28093850690E29093BF
-:100F900087061092880628E030E030938A06209376
-:100FA000890683E28093920681E280939106909372
-:100FB0009306109294063093960620939506089512
-:100FC0000895089581E260919E060E94F50A0895B1
-:100FD0008BE268E00E94F50A88E261E10E94F50A6E
-:100FE0008FE268E00E94F50A8CE261E10E94F50A56
-:100FF0008FE261E00E94F50A83E265E00E94F50A53
-:1010000008950F931F938C0180E260E40E94F50A1B
-:10101000F8016281605884E00E94F50AF80182813B
-:1010200080939D061F910F9108950F931F93CF9367
-:10103000DF93EC0128853985121613060CF03FC0AA
-:101040008E819F81821793073CF583E268E00E94BE
-:10105000F50A00E010E012C0EA85FB85E20FF31FFD
-:1010600081E260810E94F50A8E819F8101969F83B3
-:101070008E830F5F1F4F0830110539F02E813F819D
-:1010800088859985281739073CF3288539858E810D
-:101090009F818217930724F087E261E00E94F50A9E
-:1010A0008B81813031F4898165E00E94F50A1B82D1
-:1010B00006C0898161E00E94F50A81E08B83DF919F
-:1010C000CF911F910F910895DF93CF9300D000D05F
-:1010D000CDB7DEB7FC0132812381109298061092C1
-:1010E000970681E080939406223031F12330B9F1E4
-:1010F000213009F05FC080917106809399061092AB
-:101100009A0681E796E090939C0680939B068681E1
-:101110009781089721F480E490E097838683868105
-:1011200097818034910509F045C088E090E0909364
-:101130009A06809399063EC08681978190939A067D
-:1011400080939906832F90E0880F991FE091830682
-:10115000F0918406E80FF91F8081918127C0332325
-:10116000B9F0832F90E0880F991FE091DC03F09194
-:10117000DD03E80FF91F0190F081E02DF0939C064C
-:10118000E0939B0680818093990610929A0612C084
-:1011900094E099832A8389E08B839C8384E090E0A8
-:1011A00090939A0680939906CE01019690939C069F
-:1011B00080939B0681E996E00E9415080F900F909E
-:1011C0000F900F90CF91DF910895CF93DF9382E23C
-:1011D0000E94C10AC82F85FF1AC083E268E00E94FE
-:1011E000F50AC6FF10C020919706309198068091AD
-:1011F000990690919A06281739072CF481E996E010
-:101200000E94150804C087E261E00E94F50ADF91A0
-:10121000CF9108950F931F9388E00E94C10A082F71
-:10122000182F86FF18C085E060E00E94F50A84E070
-:1012300060E80E94F50A80E260E00E94F50A83E21D
-:1012400068E00E94F50A87E261E00E94F50A85E005
-:1012500062E00E94F50A14FF04C089E060EC0E947D
-:10126000F50A07FF04C089E060ED0E94F50A1F91AE
-:101270000F9108958AE00E94C10A80FF03C00E9476
-:10128000E508089581FF0DC08AE20E94C10A80919D
-:101290005E06813061F4E0916106F0916206099585
-:1012A000089582E30E94C10A8AE30E94C10A089558
-:1012B0008EE00E94C10A0895EF92FF920F931F9350
-:1012C000DF93CF93CDB7DEB728970FB6F894DEBF84
-:1012D0000FBECDBF86E20E94C10A86FF7FC08E018D
-:1012E0000F5F1F4F49E0E42EF12CEC0EFD1E8091A4
-:1012F00085060E94C10AF80181938F01EE15FF0552
-:10130000B1F78E010F5F1F4F87E268E00E94F50A78
-:1013100083E268E00E94F50A80E20E94C10A682F19
-:101320006F7780E20E94F50A898190E08076907064
-:101330008032910509F440C080349105D1F1892BA8
-:10134000F1F5F80181818630D9F0873048F4813099
-:10135000F1F18130C8F0833079F1853081F521C019
-:10136000893019F18A3018F4883049F505C08A307F
-:1013700071F18B3021F520C081E260919E0625C07D
-:10138000C8010E94640823C083E268E00E94F50A55
-:1013900081E261E00E94F50A81E260E00E94F50AC4
-:1013A0000BC0C8010E94010812C0C8010E94E807D2
-:1013B0000EC0C8010E94B10A83E265E006C080E267
-:1013C0000E94C10A682F605880E20E94F50AF80165
-:1013D00080818823D1F483E265E015C020919906CD
-:1013E00030919A0680919506909196068217930700
-:1013F00064F410929A061092990683E268E00E94C3
-:10140000F50A87E261E00E94F50A28960FB6F89483
-:10141000DEBF0FBECDBFCF91DF911F910F91FF9027
-:10142000EF900895EF92FF920F931F93DF93CF9366
-:10143000CDB7DEB7C054D0400FB6F894DEBF0FBEB4
-:10144000CDBF8CE00E94C10A80FF03C00E945C09EE
-:101450007AC081FF29C08EE20E94C10A8DE20E94FB
-:10146000C10A89838E010F5F1F4F70E4E72EF12CB4
-:10147000EC0EFD1E0F5F1F4F0E94E40AF8018083EF
-:101480000E151F05B9F780916E03813039F4E09194
-:101490007103F0917203CE01019609958FE268E025
-:1014A0000E94F50A8FE22AC082FF2CC086E30E94C8
-:1014B000C10A85E30E94C10A89838E010F5F1F4F15
-:1014C00060E4E62EF12CEC0EFD1E0F5F1F4F0E9414
-:1014D000E40AF80180830E151F05B9F780916F03A8
-:1014E000813039F4E0917303F0917403CE010196D9
-:1014F000099587E368E00E94F50A87E361E00E94AE
-:10150000F50A21C083FF1FC08EE30E94C10A8E012D
-:101510000F5F1F4F51E4E52EF12CEC0EFD1E8DE305
-:101520000E94C10AF80181938F01EE15FF05B9F7FA
-:1015300080917003813039F4E0917103F09172036E
-:10154000CE0101960995C05CDF4F0FB6F894DEBF5F
-:101550000FBECDBFCF91DF911F910F91FF90EF9004
-:1015600008950895089581E080936A0080E18DBB1D
-:1015700083B3876083BB84B3836084BB3F9A479AFD
-:1015800008959FEF91B982B988B1805888B984B322
-:1015900095E0892784BB88B1805888B984B38927AE
-:1015A00084BB000011B888B1805888B984B322E0A8
-:1015B000822784BB0000000080B198B1905898B990
-:1015C00094B3922794BB089588B1805888B984B3A6
-:1015D00022E0822784BB0000000080B198B19058BF
-:1015E00098B994B3922794BB089582B98FEF81B9CB
-:1015F00088B1805888B984B395E0892784BB88B1C5
-:10160000805888B984B3892784BB62B988B180586F
-:1016100088B984B391E0892784BB88B1805888B9A0
-:1016200084B3892784BB089582B988B1805888B96A
-:1016300084B391E0892784BB88B1805888B984B38A
-:10164000892784BB0895089582E18093710681E023
-:101650008093720680E191E0909374068093730604
-:1016600010927506109276061092770688E08093A5
-:10167000780610927A061092790610927C061092E3
-:101680007B0610927E0610927D0610927F061092C5
-:101690008006109281061092820610926E031092BC
-:1016A0006F031092700310925E0610925F06109204
-:1016B000600610926806109267061092DB03109283
-:1016C000DA03089590937A068093790670937C06E6
-:1016D00060937B0650937E0640937D060895909319
-:1016E0007A0680937906089590937C0680937B0612
-:1016F000089590937E0680937D06089580937506E5
-:1017000008958093760608958093770608950F9341
-:101710001F93CF93DF938C01CB01C0916706D091CB
-:10172000680662E070E00E94D42710C09881298189
-:101730008A81823041F4E92FF22F858190E0801771
-:10174000910709F460870F80D885C02D209771F725
-:10175000DF91CF911F910F9108959C01E091670651
-:10176000F091680614C0A081B1818281843061F457
-:10177000848190E08217930739F4868190E0861780
-:10178000970711F413964C930780F085E02D30975E
-:1017900051F708950895BF92CF92DF92EF92FF9292
-:1017A0000F931F93CF93DF93EC01F62ED42EC22E0E
-:1017B000B02EE0916706F0916806309799F489E0C1
-:1017C00090E00E940B24FC019093680680936706CA
-:1017D000D183C083F38210861782D282C4820583AC
-:1017E000E6821AC0CF010780F085E02D3097D1F74F
-:1017F0008C0189E090E00E940B24FC01D80118962E
-:101800009C938E931797D183C083F382D282C48234
-:10181000B582E68210861782DF91CF911F910F91DA
-:10182000FF90EF90DF90CF90BF900895EF92FF92DE
-:101830001F93CF93DF937C01C091DA03D091DB0338
-:10184000209711F011E012C085E090E00E940B2477
-:10185000FC019093DB038093DA03F182E082128231
-:101860001482138210E012C01F5FEC018B819C81F7
-:101870000097D1F785E090E00E940B24FC019C8347
-:101880008B83F182E082128314821382812FDF9195
-:10189000CF911F91FF90EF900895EF92FF920F93D9
-:1018A0001F93CF93DF93E091DA03F091DB0380E0A5
-:1018B00090E00380F481E02D01963097D1F7880FF6
-:1018C000991F0E940B248093DC039093DD03C09149
-:1018D000DA03D091DB0301C0EC01E880F9808A8152
-:1018E00090E0880F991F0091DC031091DD03080F31
-:1018F000191FF701808190E00E940B24F80180837A
-:10190000918320E030E016C08A8190E0880F991F13
-:10191000E091DC03F091DD03E80FF91F0190F08105
-:10192000E02DE20FF31FD701A20FB31F8C9180832C
-:101930002F5F3F4FF701808190E02817390724F38C
-:101940008B819C81009741F6DF91CF911F910F9180
-:10195000FF90EF9008956F927F928F929F92AF9237
-:10196000BF92CF92DF92EF92FF920F931F93CF938C
-:10197000DF93E0916706F0916806CC24DD2409C06E
-:101980008281823019F40894C11CD11C0780F08533
-:10199000E02D3097A9F7C601880F991F0E940B24EC
-:1019A00080938306909384060894C108D108560159
-:1019B000AA0CBB1C0894C11CD11CC1E0D0E0882437
-:1019C00099244FC0E0916706F0916806A9E0EA2EDD
-:1019D000F12C16C0A081B181848190E08C179D0705
-:1019E00019F48381E80EF11C15968C9115978C17CC
-:1019F00021F48281823009F44D010780F085E02DC9
-:101A0000309741F700918306109184060A0D1B1D43
-:101A1000C7010E940B24D8018C9311969C9320E05F
-:101A200030E0E0918306F0918406EA0DFB1D019001
-:101A3000F081E02DE20FF31FD401A20FB31F8C91B0
-:101A400080832F5F3F4F2930310559F7E09183069E
-:101A5000F0918406EA0DFB1D0190F081E02DE282F9
-:101A60002196CC16DD060CF0ADCFE1E0EE2EF12C88
-:101A700079E0A72EB12C6624772488249924A5C068
-:101A8000A0916706B091680613C0ED91FC91119783
-:101A90008181823049F4858190E08E159F0521F483
-:101AA0008481682E772406C017960D90BC91A02DD6
-:101AB000109759F701E010E07DC040916706509102
-:101AC000680672C0DA01ED91FC9111978181843032
-:101AD00009F065C016968C91169790E080179107D3
-:101AE00009F05DC014968C9190E08E159F0509F069
-:101AF00056C0DF019501BF01675F7F4FE09183060C
-:101B0000F0918406E80DF91D0190F081E02DE20FBF
-:101B1000F31F8D9180832F5F3F4FA617B70771F793
-:101B2000E9E0F0E0AE0EBF1EA0916706B091680636
-:101B300034C012968C911297853059F514968C9179
-:101B4000149790E08E159F0521F515968C911597A9
-:101B500090E080179107E9F4CD91DC911197950100
-:101B6000BE01695F7F4FE0918306F0918406E80D26
-:101B7000F91D0190F081E02DE20FF31F8991808320
-:101B80002F5F3F4FC617D70771F787E090E0A80E89
-:101B9000B91E17960D90BC91A02D109751F6DA0141
-:101BA00017964D915C9118974115510509F08ACF10
-:101BB0000F5F1F4F601671060CF07FCF0894E11C79
-:101BC000F11CE2E0F0E08E0E9F1ECE14DF040CF05C
-:101BD00057CFDF91CF911F910F91FF90EF90DF9042
-:101BE000CF90BF90AF909F908F907F906F9008950F
-:101BF000AF92BF92CF92EF92FF920F931F93CF932A
-:101C0000DF93EC015B01122FE0916706F09168060B
-:101C100018C0A081B181848190E0C817D90771F400
-:101C2000868190E08A159B0549F48281843031F4E5
-:101C300014968C9114978F5F14968C930780F0857F
-:101C4000E02D309731F787E090E00E940B24FC01F3
-:101C500087E0808385E0818312830383F582E482B9
-:101C6000C682CF0167E045E02C2F0A2DEE240E94AA
-:101C7000CB0BDF91CF911F910F91FF90EF90CF9001
-:101C8000BF90AF900895AF92BF92CF92DF92EF9244
-:101C9000FF920F93FC01A114B10401F142305105F0
-:101CA00071F04330510599F041305105B9F481E0AC
-:101CB00080935E06B0926206A09261060FC081E03A
-:101CC00080935F06B0926406A092630607C081E02D
-:101CD00080936006B0926606A092650620583F4F3A
-:101CE000CF010E94F80D0F91FF90EF90DF90CF9001
-:101CF000BF90AF900895AF92BF92CF92DF92EF92D4
-:101D0000FF920F93FC014230510571F043305105B1
-:101D100099F041305105B9F481E080936E03B0929F
-:101D20007203A09271030FC081E080936F03B092A1
-:101D30007403A092730307C081E080937003B09294
-:101D40007603A0927503CF010E94F80D0F91FF90CA
-:101D5000EF90DF90CF90BF90AF900895EF920F93E8
-:101D6000CF93DF93082FE62EA0916706B091680607
-:101D7000C0E0D0E014C0ED91FC91119785818017EF
-:101D800051F412968C911297823029F484818F5FDE
-:101D90008483C82FD0E017960D90BC91A02D10978A
-:101DA00051F789E090E00E940B24FC0189E08083D8
-:101DB00084E08183E2821382148215821682178264
-:101DC0001086CF0169E044E0202F00E0EC2E0E9455
-:101DD000CB0BCE01DF91CF910F91EF900895DF9261
-:101DE000EF92FF920F931F93CF93DF93E82E162F5E
-:101DF000F42ED22EA0916706B0916806C0E0D0E024
-:101E000014C0ED91FC91119785818E1551F41296B5
-:101E10008C911297823029F484818F5F8483C82F3C
-:101E2000D0E017960D90BC91A02D109751F789E046
-:101E300090E00E940B24FC0189E0808384E0818390
-:101E4000128313821482F582D68207831086CF0113
-:101E500069E044E02E2D00E0EC2E0E94CB0BCE0179
-:101E6000DF91CF911F910F91FF90EF90DF90089538
-:101E7000EF920F931F93109182061F5F10938206BB
-:101E800089E090E00E940B24FC0189E0808389E0D6
-:101E900090E09383828382E081831482158316828B
-:101EA00080E887838AE18087CF0169E042E020E013
-:101EB00000E0EE240E94CB0B812F90E01F910F9148
-:101EC000EF9008950F931F93CF93DF938C01FC0144
-:101ED00001900020E9F7E81BF90BCF01880F991F4B
-:101EE0000E940B24EC01F80101900020E9F7E01BAF
-:101EF000F10BEE0FFF1FE88323E02983AC0120E004
-:101F000030E009C0F801E20FF31F8081FA018083FD
-:101F100011822F5F3F4FF80101900020E9F73197C0
-:101F2000E01BF10B4E5F5F4F2E173F0758F3CE01BA
-:101F30000E94160C90E0DF91CF911F910F910895B0
-:101F40000F931F93CF93DF938C01EB01CA010E9483
-:101F5000620F282FE0916706F091680614C0A081F7
-:101F6000B1818281843061F4848190E0801791078F
-:101F700039F4868190E08C179D0711F418962C9304
-:101F80000780F085E02D309751F7DF91CF911F91B9
-:101F90000F910895CF93DF93EC01CB010E94620F64
-:101FA000382FA0916706B091680615C09C911196D4
-:101FB0002C91119712968C911297823041F4E92F4F
-:101FC000F22F858190E08C179D0709F436831796D0
-:101FD0000D90BC91A02D109749F7DF91CF910895F6
-:101FE0000E94620F1816190614F480938106089552
-:101FF0000E94620F1816190614F480938006089543
-:102000000E94620F1816190614F480937F06089533
-:102010001F93CF93DF9386E00E94C10AC82F86FFEB
-:1020200002C00E94120AC2FF02C00E943A09C1FF08
-:1020300002C00E940A0987E00E94C10A182F87E0A7
-:1020400060E00E94F50A87E0612F0E94F50ADF91A7
-:10205000CF911F91089581E062E00E94F50A0895F2
-:102060000E94AB0C0E944D0C0E94C00780E061E012
-:102070000E94F50A80E00E94C10A80FDFBCF81E04A
-:1020800062E00E94F50A84E060E80E94F50A80E2BE
-:1020900060E40E94F50A83E268E00E94F50A87E2A4
-:1020A00069E00E94F50A8DE06FE00E94F50A8BE07E
-:1020B0006FE00E94F50A89E068ED0E94F50A8FE062
-:1020C00063E30E94F50A87E066ED0E94F50A85E069
-:1020D00062E00E94F50A80E06CEC0E94F50A089527
-:1020E0008EEC8093770381E080936E00809177037C
-:1020F00086BD83E084BD08950895089583E08093AC
-:102100001E0581E080931F058BE0809320052FE65C
-:102110002093210593E69093220584E7809323057D
-:10212000209324059093250581E6809326058EE66D
-:10213000809327058FE58093280580E38093290508
-:1021400081E380932A0510922B058EE090E00E9497
-:102150003B010895FC018081833011F40E947E10C0
-:1021600008951F9311E0812F0E944413812F60E096
-:102170000E9447121F5F1431B1F718E1812F0E94AE
-:102180004413812F60E00E9447121F5F1B32B1F79A
-:102190001F910895FC0110827583648373836283A9
-:1021A0004183478346830895FC019081818198177C
-:1021B00010F080E00895A481B5816D9387818150EE
-:1021C00019F48181A81BB1098783B583A4839FB7C4
-:1021D000F89480818F5F80839FBF81E00895FC0128
-:1021E00080818823E9F3A281B3812D91868181507A
-:1021F00019F48181A81BB109B383A28386839FB799
-:10220000F8948081815080839FBF822F0895FC01C4
-:102210008081882319F42FEF3FEF13C0A281B3818F
-:102220002D918681815019F48181A81BB109B38356
-:10223000A28386839FB7F8948081815080839FBF5B
-:1022400030E0C901089581E0089581E0089581E0BA
-:10225000089581E00895FB011082833089F0843075
-:1022600028F4813049F0823029F408C0843051F0DC
-:10227000853051F085E0089583B107C086B105C06F
-:1022800089B103C08CB101C08FB1808381E0089512
-:10229000833089F0843028F4813049F0823029F489
-:1022A00008C0843051F0853059F084E0089565B954
-:1022B00005C068B903C06BB901C06EB981E008956B
-:1022C00061BB81E00895882321F081E08093780349
-:1022D0000895109278030895982F882321F081E0C3
-:1022E0008093780302C0109278038BE180931E05DF
-:1022F00090931F051092200583E090E00E943B011F
-:10230000089598E190931E050E94481180931F053F
-:102310001092200583E090E00E943B010895982FE1
-:1023200089E180931E05933091F0943028F4913028
-:1023300051F0923029F409C0943059F0953059F099
-:1023400085E090E00AC093B107C096B105C099B18D
-:1023500003C09CB101C09FB181E080931F059093A1
-:1023600020051092210584E090E00E943B01089531
-:1023700084E180931E0581E080931F051092200563
-:1023800083E090E00E943B01089582E180931E0566
-:1023900081E080931F051092200583E090E00E9469
-:1023A0003B01089583E180931E0581E080931F0522
-:1023B0001092200583E090E00E943B01089580E1A7
-:1023C00080931E0581E080931F051092200583E015
-:1023D00090E00E943B010895EF92FF921F93DF93DC
-:1023E000CF93CDB7DEB727970FB6F894DEBF0FBEF9
-:1023F000CDBF182F7B01BE016F5F7F4F0E94392236
-:10240000882311F484E01BC0E12FF0E0E958FC4F71
-:102410003281313011F086E012C0EB81FC81808185
-:102420002F8190E002C0959587952A95E2F780FF6D
-:1024300003C0F701308302C0F701108281E02796C4
-:102440000FB6F894DEBF0FBECDBFCF91DF911F91C5
-:10245000FF90EF900895DF93CF930F92CDB7DEB743
-:102460009BE190931E05BE016F5F7F4F0E94EC11B0
-:1024700080931F058981809320051092210584E0B7
-:1024800090E00E943B010F90CF91DF9108950F9350
-:102490001F93DF93CF93CDB7DEB727970FB6F8948E
-:1024A000DEBF0FBECDBF182F062FBE016F5F7F4F5F
-:1024B0000E943922882311F484E025C0E12FF0E046
-:1024C000E958FC4F8281823011F086E01CC0E9811E
-:1024D000FA81002359F080819F8121E030E002C021
-:1024E000220F331F9A95E2F7822B0BC030812F8188
-:1024F00081E090E002C0880F991F2A95E2F780954D
-:102500008323808381E027960FB6F894DEBF0FBE49
-:10251000CDBFCF91DF911F910F9108959AE19093D4
-:102520001E050E94471280931F051092200583E02C
-:1025300090E00E943B0108951F93DF93CF93CDB7A6
-:10254000DEB727970FB6F894DEBF0FBECDBF182FAA
-:10255000BE016F5F7F4F0E943922882311F484E00F
-:1025600015C0E12FF0E0E958FC4F81E08283ED8156
-:10257000FE8130812F8181E090E002C0880F991F99
-:102580002A95E2F780958323808381E027960FB612
-:10259000F894DEBF0FBECDBFCF91DF911F9108959C
-:1025A00095E190931E050E949C1280931F05109246
-:1025B000200583E090E00E943B0108951F93DF9384
-:1025C000CF93CDB7DEB727970FB6F894DEBF0FBE17
-:1025D000CDBF182FBE016F5F7F4F0E943922882325
-:1025E00011F484E014C0E12FF0E0E958FC4F82E0E0
-:1025F0008283ED81FE8120813F8181E090E002C0F5
-:10260000880F991F3A95E2F7282B208381E02796BF
-:102610000FB6F894DEBF0FBECDBFCF91DF911F91F3
-:10262000089596E190931E050E94DE1280931F0587
-:102630001092200583E090E00E943B0108951F93D3
-:10264000182F0E94DE12813071F4812F61E00E9408
-:102650004712813041F4E12FF0E0E958FC4F83E06C
-:10266000828381E001C084E01F91089597E19093F7
-:102670001E050E941F1380931F051092200583E002
-:1026800090E00E943B0108950E94DE12089591E1BE
-:1026900090931E050E94DE1280931F051092200564
-:1026A00083E090E00E943B010895FC018081863127
-:1026B000E9F1873178F4823131F1833130F48031BE
-:1026C000D1F0813109F050C01AC0843131F1853127
-:1026D00048F51EC08931B9F18A3130F4873151F1A2
-:1026E000883109F041C02AC08B31B1F18B3178F1CA
-:1026F0008C31D1F535C082810E94DF11089582812D
-:102700000E9447130895828163810E94C511089534
-:10271000828163810E94D2110895828163810E9427
-:10272000B811089582810E94D012089582810E947A
-:102730001113089582810E94361308958281638166
-:102740000E948111089582810E948F1108958281D3
-:1027500063810E948E12089582810E942B12089537
-:1027600082810E946C11089580931E0583E08093FE
-:102770001F051092200583E090E00E943B01089520
-:10278000E82F8A50883018F024E030E00CC0F0E0E8
-:10279000E958FC4F84E0828380917C00806C8093B8
-:1027A0007C0021E030E0C9010895E82FF0E0E9580D
-:1027B000FC4F8281843019F024E030E003C01282A3
-:1027C00021E030E0C901089510927C00823039F098
-:1027D000833049F0813061F022E030E00BC080911D
-:1027E0007C00806403C080917C00806C80937C00BE
-:1027F00021E030E0C901089593E890937A00909128
-:102800007C00907F982B90937C0080917A0080646C
-:1028100080937A0080917A0086FDFCCF80917800C9
-:102820009091790040E050E020E030E080917A0023
-:10283000806480937A0080917A0086FDFCCF80913D
-:10284000780090917900280F391F4F5F5F4F443017
-:10285000510561F780917A008F7780937A003695E1
-:10286000279536952795C9010895982F83E280937F
-:102870001E0510927C00923039F0933049F091306F
-:1028800061F082E090E00BC080917C00806403C026
-:1028900080917C00806C80937C0081E090E080934C
-:1028A0001F051092200583E090E00E943B010895EF
-:1028B00091E290931E05E82FF0E0E958FC4F8281E9
-:1028C000843019F084E090E003C0128281E090E04F
-:1028D00080931F051092200583E090E00E943B0149
-:1028E0000895E82F80E280931E058E2F8A5088304D
-:1028F00018F084E090E00CC0F0E0E958FC4F84E070
-:10290000828380917C00806C80937C0081E090E0E9
-:1029100080931F051092200583E090E00E943B0108
-:102920000895CF93DF93982FEB0119821882E82F37
-:10293000F0E0E958FC4F8281843019F026E030E065
-:1029400032C081E1891B0E94FC139983888300D0E7
-:1029500000D000D0EDB7FEB7319686EE92E0ADB76D
-:10296000BEB712969C938E9311978EEE92E093834E
-:1029700082838BE890E0958384830E940D250F90DD
-:102980000F9084EF92E0EDB7FEB792838183888148
-:102990009981948383830E940D2521E030E00F907C
-:1029A0000F900F900F90C901DF91CF910895DF93A1
-:1029B000CF9300D0CDB7DEB792E290931E05BE0153
-:1029C0006F5F7F4F0E94911480931F0599818A81C8
-:1029D000809320059093210584E090E00E943B01C4
-:1029E0000F900F90CF91DF910895FC01808181328B
-:1029F00071F0823218F48032B1F405C0823259F09D
-:102A0000833289F40CC082810E94711408958281FE
-:102A10000E945814089582810E94D71408958281DB
-:102A20000E943514089580931E0583E080931F054E
-:102A30001092200583E090E00E943B010895ECEBAA
-:102A4000F0E08081846080838BE0809385038CE05C
-:102A50008093860381E090E00895ECEBF0E08081C4
-:102A60008B7F8083109285031092860381E090E033
-:102A700008958093B800E9EBF0E080818C7F80833B
-:102A80008081808381E090E008958091B900887F03
-:102A900008958091B90084EA8093BC008091BC00C5
-:102AA00087FFFCCF81E090E0089584E98093BC002B
-:102AB0008091BC0084FDFCCF81E090E00895AC01E2
-:102AC00020E030E094E80EC0FA01E20FF31F8081AD
-:102AD0008093BB009093BC008091BC0087FFFCCF2B
-:102AE0002F5F3F4F261737077CF3089584E88093C4
-:102AF000BC008091BC0087FFFCCF8091BB00089593
-:102B000085E380931E0581E080931F0520E030E07F
-:102B100094E80EC09093BC008091BC0087FFFCCF6E
-:102B20008091BB00F901E05EFA4F80832F5F3F4F39
-:102B3000261737077CF3FB01E05EFA4F1082CB01CA
-:102B400003960E943B010895AC0120E030E094E838
-:102B50000EC0FB01E20FF31F80818093BB009093B6
-:102B6000BC008091BC0087FFFCCF2F5F3F4F241734
-:102B700035077CF381E080931F051092200583E0E8
-:102B800090E00E943B01089584E98093BC0080910D
-:102B9000BC0084FDFCCF81E080931F0510922005CE
-:102BA00083E090E00E943B0108958091B90084EA9F
-:102BB0008093BC008091BC0087FFFCCF81E08093B4
-:102BC0001F051092200583E090E00E943B010895CC
-:102BD0008093B800E9EBF0E080818C7F8083808176
-:102BE000808381E080931F051092200583E090E0B0
-:102BF0000E943B010895ECEBF0E080818B7F8083A5
-:102C0000109285031092860381E080931F05109235
-:102C1000200583E090E00E943B010895ECEBF0E09A
-:102C20008081846080838BE0809385038CE0809337
-:102C3000860381E080931F051092200583E090E0D9
-:102C40000E943B010895FC01808180931E058081D4
-:102C50008433D1F0853338F4813379F0823381F0D5
-:102C6000803331F507C08633E9F08633A0F087332F
-:102C7000F9F41BC00E940E1608950E94FB150895DA
-:102C800082810E94E8150895828190E03396BF0109
-:102C90000E94A41508956381828190E070E00E94F3
-:102CA000801508950E94D51508950E94C4150895B1
-:102CB00083E080931F051092200583E090E00E943E
-:102CC0003B010895782F613041F0613040F062306F
-:102CD00041F0633009F059C007C060E006C060E011
-:102CE00001C061E050E002C061E051E04330B9F062
-:102CF000443028F4413059F0423078F40AC045306D
-:102D000099F0453070F0463009F03FC010C021E026
-:102D10000CC021E041E030E00DC021E009C020E01E
-:102D2000F9CF20E041E005C020E040E0F4CF20E012
-:102D300040E031E0239884B1866084B985B1817F19
-:102D400085B980E090E0772311F081E090E075E0B4
-:102D5000880F991F7A95E1F78065660F660F660FF9
-:102D6000682B550F550F562B542B220F252B2CBD9E
-:102D70003DBD88E080937E038AE080937F0389E0F5
-:102D80008093800321E030E002C022E030E0C901FE
-:102D900008951CBC1DBC10927E0310927F031092FC
-:102DA000800381E090E00895AC0120E008C0E60FC8
-:102DB000F71F80818EBD0DB407FEFDCF2F5FE22F80
-:102DC000F0E0E417F5079CF381E090E00895DC0162
-:102DD00020E030E040E050E014C01EBC08C083E0BA
-:102DE000493E580714F088E008954F5F5F4F0DB4D7
-:102DF00007FEF5CF8EB5FB01E20FF31F80832F5F37
-:102E00003F4F2A173B074CF381E00895CF93DF93A0
-:102E1000EC0120E030E0A0E0B0E018C0FE01E20FDD
-:102E2000F31F80818EBD08C0119683E0A93EB807CC
-:102E30001CF028E030E00FC00DB407FEF5CF8EB5D2
-:102E4000FB01E20FF31F80832F5F3F4F24173507ED
-:102E50002CF321E030E0C901DF91CF910895DC012E
-:102E600083E480931E0540E050E020E030E019C08C
-:102E7000FD01E20FF31F80818EBD09C04F5F5F4FE0
-:102E800083E0493E58071CF028E030E00FC00DB445
-:102E900007FEF4CF8EB5F901E25EFA4F82832F5F11
-:102EA0003F4F2617370724F321E030E020931F051A
-:102EB000FB01E05EFA4F1082CB0103960E943B01BA
-:102EC0000895BC0184E480931E0540E050E020E0BA
-:102ED00030E014C01EBC08C083E0493E580714F01F
-:102EE00088E010C04F5F5F4F0DB407FEF5CF8EB581
-:102EF000F901E25EFA4F82832F5F3F4F26173707B3
-:102F00004CF381E080931F05FB01E05EFA4F1082D5
-:102F1000CB0103960E943B01089593E490931E0514
-:102F2000282F30E090E008C0E60FF71F80818EBDAB
-:102F30000DB407FEFDCF9F5FE92FF0E0E217F30726
-:102F40009CF381E080931F051092200583E090E0C0
-:102F50000E943B01089581E480931E051CBC1DBCAA
-:102F600010927E0310927F031092800381E0809381
-:102F70001F051092200583E090E00E943B01089518
-:102F800090E490931E050E94621680931F05109294
-:102F9000200583E090E00E943B010895CF93DF93EA
-:102FA000EC0188818334A9F0843428F4803441F022
-:102FB000813401F50BC0843491F08534D9F413C009
-:102FC0008A816B814C810E94C0171FC00E94AB1781
-:102FD0001CC08A812396BE010E948D1716C08A816B
-:102FE00090E00E9461176A81CE01039670E00E9412
-:102FF0002F170BC080931E0583E080931F0510924E
-:10300000200583E090E00E943B01DF91CF9108957D
-:10301000209A219A229A2398249A259A2C982D98BE
-:1030200081E08093890382E080938A0380938B03FD
-:1030300080938C0381E090E00895109289031092B0
-:103040008A0310928B0310928C0381E090E0089524
-:10305000289829982A9880E29EE40197F1F7289A07
-:103060008AE0982F9A95F1F72A9A299A8A95F1F78A
-:103070000895282F299887FD02C02A9801C02A9A0E
-:103080008AE0982F9A95F1F7299A8A95F1F729986D
-:1030900026FF02C02A9A01C02A988AE0982F9A95A2
-:1030A000F1F7299A8A95F1F70895880F20E03AE020
-:1030B000299887FF02C02A9A01C02A98932F9A95CF
-:1030C000F1F7299A932F9A95F1F72F5F273011F096
-:1030D000880FEECF089520E03AE0299887FF02C0DC
-:1030E0002A9A01C02A98932F9A95F1F7299A932F3B
-:1030F0009A95F1F72F5F283011F0880FEECF0895E1
-:1031000029982A988AE0982F9A95F1F7299A982F6A
-:103110009A95F1F729982898982F9A95F1F7299A76
-:10312000982F9A95F1F729988A95F1F7289A80E0D7
-:103130000895299828982A982B9A08950E9428186B
-:1031400080E30E94391880E60E94551808950E9475
-:10315000281880E00E94391880E00E9455182998AC
-:1031600028982A982B9A08950F931F93182F062FAB
-:103170000E94281880E40E943918812F0E94551857
-:10318000802F0E946B1881E01F910F9108951F936B
-:10319000182F0E94281880EC0E943918812F0E9455
-:1031A00055180E9480181F91089529988AE08A95E1
-:1031B000F1F72A9820E080E04AE0880F299A942FBE
-:1031C0009A95F1F729981B998F5F3AE0942F9A9579
-:1031D000F1F72F5F283089F72898299A932F9A952D
-:1031E000F1F7289A2998932F9A95F1F708951F934C
-:1031F000182F0E94281880E80E943918812F0E94F9
-:1032000055180E94D5181F910895DF92EF92FF92F2
-:103210000F931F93CF93DF93D82E7B018A01C0E0D9
-:10322000D0E009C08D2D8C0F0E94F718F801EC0F2B
-:10323000FD1F80832196CE15DF05A0F381E090E08D
-:10324000DF91CF911F910F91FF90EF90DF90089544
-:103250000F931F93182F062F0E949E18812F602F07
-:103260000E94B41881E01F910F910895DF92EF92B0
-:10327000FF920F931F93CF93DF93D82E7B018A0188
-:10328000C0E0D0E009C0F801EC0FFD1F8D2D8C0FC0
-:1032900060810E9428192196CE15DF05A0F381E0F8
-:1032A00090E0DF91CF911F910F91FF90EF90DF9011
-:1032B000089594E090931E050E94361980931F058F
-:1032C0001092200583E090E00E943B010895EF9268
-:1032D000FF920F931F938B019EE1E92E95E0F92E4B
-:1032E00093E090931E05A7014E5F5F4F0E94051962
-:1032F00080931F050E5F1F4FE00EF11EF701108235
-:10330000C80101960E943B011F910F91FF90EF9021
-:10331000089582E080931E051092890310928A031B
-:1033200010928B0310928C0381E080931F05109202
-:10333000200583E090E00E943B01089581E08093A6
-:103340001E050E94081880931F051092200583E037
-:1033500090E00E943B010895FC018381823069F076
-:10336000833018F48130E1F405C0833049F08430B3
-:10337000B9F40EC00E949E1908950E9489190895FB
-:103380006581848170E03696AF010E9467190895C7
-:103390006581848170E03696AF010E9459190895C5
-:1033A000808180931E0583E080931F051092200585
-:1033B00083E090E00E943B0108951F920F920FB6A8
-:1033C0000F9211240F900FBE0F901F9018959C0123
-:1033D0000897029718F024E030E025C0F901E95879
-:1033E000FC4F8DE0828328303105A1F02930310572
-:1033F00019F027E030E017C0259A81E090E0909323
-:1034000089008093880081E88093800089E0809320
-:10341000810007C0249A81E08093B30089E68093FD
-:10342000B00021E030E0C90108959C01FC01E95899
-:10343000FC4F82818D3019F026E030E054C02830F6
-:10344000310531F12930310519F027E030E04BC06A
-:1034500063307105A9F0643071053CF46130710589
-:1034600059F062307105E9F509C06430710551F019
-:1034700065307105B1F508C081E007C082E005C084
-:1034800083E003C084E001C085E08093810029C00F
-:1034900064307105E9F06530710554F462307105EE
-:1034A00099F06330710594F461307105D1F40AC06C
-:1034B0006630710589F06630710564F0673071051A
-:1034C00081F40CC089E60BC08AE609C08BE607C010
-:1034D0008CE605C08DE603C08EE601C08FE68093C2
-:1034E000B00021E030E0C90108959C01FC01E958D9
-:1034F000FC4F82818D3019F026E030E012C0283078
-:10350000310559F02930310519F027E030E009C0C4
-:10351000709389006093880002C06093B30021E03B
-:1035200030E0C90108959C0183E580931E05F901EF
-:10353000E958FC4F82818D3019F086E090E012C08E
-:103540002830310559F02930310519F087E090E035
-:1035500009C0709389006093880002C06093B30033
-:1035600081E090E080931F051092200583E090E0B9
-:103570000E943B01089522E520931E050E94151A22
-:1035800080931F051092200583E090E00E943B018C
-:10359000089520E520931E050E94E71980931F05DA
-:1035A0001092200583E090E00E943B010895FC0109
-:1035B000E958FC4F12828830910531F0893091052D
-:1035C00031F026E030E00BC01092B00004C0109241
-:1035D0008100109280000E94DE1221E030E0C901DB
-:1035E000089521E520931E050E94D71A80931F0598
-:1035F0001092200583E090E00E943B010895FC01B9
-:103600008081813579F0823518F48035F1F405C078
-:10361000823569F08335C9F411C0828190E00E943F
-:10362000C91A0895828190E00E94F11A0895638179
-:10363000828190E070E00E94BB1A089563818281CC
-:1036400090E070E00E94931A089580931E0583E035
-:1036500080931F051092200583E090E00E943B01BB
-:103660000895DF93CF93CDB7DEB7CF91DF91089563
-:103670008A3310F4805301C087556A3310F46053C5
-:1036800001C067556F708295807F862B08951F93C8
-:10369000682F62956F70182F1F706A3010F4605D8C
-:1036A00001C0695A80E00E947A061A3010F4105D59
-:1036B00001C0195A80E0612F0E947A061F91089577
-:1036C0001F93182F8A3021F480E06DE00E947A0663
-:1036D00080E0612F0E947A0681E090E01F910895BA
-:1036E00080E00E94AF0508950F9380E00E94950549
-:1036F00080E069E140E020E000E00E94D10580E048
-:1037000061E00E94E30580E068E00E94020680E03C
-:103710006EE40E942E068EEF92E09093B5068093A1
-:10372000B4060F9108958230A1F0833028F48823E5
-:1037300061F0813039F40BC0843079F0843058F076
-:10374000853079F020E030E016C082E107C08EE0DD
-:1037500005C088E003C086E001C082E08093E200FB
-:1037600002C01092E2008CE08093E30087E3809334
-:10377000E40021E030E0C9010895813091F081300A
-:1037800038F08230B9F0833019F120E030E031C0F8
-:103790008091DB008F778093DB008091DB008F7D51
-:1037A00011C08091DB0080688093DB008091DB009A
-:1037B0008F7D16C08091DB0080688093DB00809154
-:1037C000DB0080628093DB008091DB008F7E0DC088
-:1037D0008091DB0080688093DB008091DB00806259
-:1037E0008093DB008091DB0080618093DB0021E02F
-:1037F00030E0C90108951F93282F162F8FE0809382
-:103800008A0380938B031092AD06442319F081E064
-:103810008093AD061092A1061092A2061092A30604
-:103820001092A406E5EAF6E0119286E0ED3AF80778
-:10383000D9F790E0892F8295807F8093ED001092D8
-:10384000EE001092EF009F5F9F30A1F7822F0E9441
-:10385000931B892B89F0812F0E94BD1B892B61F05E
-:103860008091D80082608093D8008091D90082FF37
-:10387000FCCF21E030E002C022E030E0C9011F911E
-:1038800008958295807F8093ED0008959B01AC019F
-:103890008091AD06882381F4822F8295880F807EE7
-:1038A0008093F60063E056954795379527956A957E
-:1038B000D1F72093F7000895DA01C90153E0880F8A
-:1038C000991FAA1FBB1F5A95D1F787608093F400F8
-:1038D000292F3A2F4B2F55272093F5009D01442780
-:1038E00055272093F6008B2F9927AA27BB27809373
-:1038F000F7000895EF92FF920F931F938091AD060A
-:103900008823C1F42091F20022952695277030E09B
-:1039100040E050E08091F30090E003E0880F991FB1
-:103920000A95E1F77C0100E010E0E22AF32A042B7B
-:10393000152B33C02091F3008091F200E090F1004C
-:103940006091F00090E0A0E0B0E0DC0199278827CA
-:1039500030E040E050E0522F442733272227822BCB
-:10396000932BA42BB52BFF2400E010E0102F0F2D7C
-:10397000FE2CEE248E299F29A02BB12BE62EFF24AE
-:1039800000E010E0E82AF92A0A2B1B2B73E01695B9
-:103990000795F794E7947A95D1F7B701C8011F917D
-:1039A0000F91FF90EF9008959B01AC018091AD06BF
-:1039B000882371F4822F8295880F807E8093F20095
-:1039C000E3E05695479537952795EA95D1F725C0B9
-:1039D00073E0220F331F441F551F7A95D1F7809152
-:1039E000F00090E0A0E0B0E087709070A070B07040
-:1039F000282B392B4A2B5B2B2093F000BB27A52FBC
-:103A0000942F832F8093F100CA01AA27BB278093AC
-:103A1000F200252F3327442755272093F3000895DC
-:103A2000982F8091AD06882321F08091EF0080616E
-:103A300003C08091EF008F7E8093EF00923091F170
-:103A4000933028F4992359F0913031F422C0933007
-:103A5000B9F1943009F447C020E030E05AC08091B9
-:103A6000EF008F7B8093EF008091EF008F77809342
-:103A7000EF008091EF008F7D8093EF008091F00048
-:103A80008B7F8093F0008091F4008B7F8093F40013
-:103A90003EC08091EF008E7F8093EF008091EF0019
-:103AA00081601BC08091EF008F778093EF00809141
-:103AB000EF0080648093EF008091EF008F7D20C045
-:103AC0008091EF008F7B8093EF008091EF00806802
-:103AD0008093EF008091EF008F7D8093EF008091C5
-:103AE000F0008B7F12C08091EF008F7B8093EF00FE
-:103AF0008091EF0080688093EF008091EF008062FA
-:103B00008093EF008091F00084608093F00021E0CA
-:103B100030E0C9010895FF920F931F93162F042FD1
-:103B2000F52E8295807F8093ED0084E00E94101D29
-:103B3000193008F018E08091EF00807F812B80938E
-:103B4000EF00202F3F2DC901FC0190E004C08191BE
-:103B50008093FA009F5F9117D0F31F910F91FF9010
-:103B600008959F92AF92BF92CF92DF92EF92FF9211
-:103B70000F931F93962E59016A01982F9295907F6B
-:103B80009093ED00E82FF0E0883080F42091DE0083
-:103B9000E45FFC4F81E090E0008002C0880F991F35
-:103BA0000A94E2F7282B2093DE000FC02091DF005B
-:103BB000E45FFC4F81E090E0008002C0880F991F15
-:103BC0000A94E2F7282B2093DF00C801B7010E9476
-:103BD000461CC601B5010E94D41C892D0E94101DEF
-:103BE000892B19F021E030E002C022E030E0C90169
-:103BF0001F910F91FF90EF90DF90CF90BF90AF900B
-:103C00009F9008958091EF0087FD04C08091EF00A0
-:103C100086FF3CC08091EF0087FD0AC08091EF00D5
-:103C200086FF06C08091F00082FD02C081E0089509
-:103C30008091EF0087FD0AC08091EF0086FF06C0EB
-:103C40008091F00082FF02C082E008958091EF0031
-:103C500087FF0AC08091EF0086FD06C08091F000CA
-:103C600082FD02C083E008958091EF0087FF0EC0BF
-:103C70008091EF0086FD0AC08091EF0085FF06C0AD
-:103C80008091F00082FF02C084E0089580E00895F2
-:103C9000EF92FF920F931F93162F042FF52E82950C
-:103CA000807F8093ED000E94021EE82E193008F0FC
-:103CB00018E08091EF00807F812B8093EF00202F10
-:103CC0003F2DC901FC0190E004C081918093FA006E
-:103CD0009F5F9117D0F381E00E94101D8091EE004C
-:103CE00086FFFCCF8091EE008F7B8093EE008E2DBF
-:103CF0000E94101D81E090E01F910F91FF90EF90C6
-:103D00000895482F893008F048E08091EF00807FC7
-:103D1000842B8093EF00FB0190E004C0819180939D
-:103D2000FA009F5F9417D0F30895AC0120E030E0D3
-:103D30008091FA00FA01E20FF31F80832F5F3F4F5B
-:103D400028303105A9F70895E82FF0E0883080F495
-:103D50002091DE00E45FFC4F81E090E0008002C033
-:103D6000880F991F0A94E2F7282B2093DE0008950C
-:103D70002091DF00E45FFC4F81E090E0008002C012
-:103D8000880F991F0A94E2F7282B2093DF000895EB
-:103D9000AEEDB0E02C91ECE0F3E0E80FF11D81E036
-:103DA00090E0008002C0880F991F0A94E2F7809586
-:103DB00082238C9308953091E0002091E100922FAE
-:103DC00080E0232F30E0282B392B2115310521F4F9
-:103DD00007C0369527958F5F20FFFBCF8F3008F007
-:103DE0008FEF0895982F9295907F9093ED00AEED10
-:103DF000B0E02C91ECE0F3E0E80FF11D81E090E001
-:103E0000008002C0880F991F0A94E2F780958223F0
-:103E10008C9380E00E94101D81E090E008951F9334
-:103E200010928A0310928B0310E0812F0E94F21EE1
-:103E30001F5F1F30D1F78091D8008D7F8093D8000D
-:103E40008091D90082FDFCCF81E090E01F91089520
-:103E50001F938295807F8093ED000E94021E182F91
-:103E600082E00E94101D8091EE0086FFFCCF8091C1
-:103E7000EE008F7B8093EE00812F0E94101D81E069
-:103E800090E01F9108951F920F920FB60F920BB6FC
-:103E90000F9211241F932F933F934F935F936F9330
-:103EA0007F938F939F93AF93BF93EF93FF93109163
-:103EB000ED003091E0002091E100922F80E0232F6F
-:103EC00030E0282B392B21153105A9F103C0369597
-:103ED00027958F5F20FFFBCF8F3068F58F3F59F11B
-:103EE0008295807F8093ED000E947A1C6093A106EA
-:103EF0007093A2068093A3069093A406E5EAF6E0E9
-:103F00008091FA00819386E0ED3AF807C9F70E94A4
-:103F10007A1C6093A1067093A2068093A3069093E7
-:103F2000A4068091EE008F7D8093EE0083E00E94D6
-:103F3000101D1093ED00FF91EF91BF91AF919F91F4
-:103F40008F917F916F915F914F913F912F911F9131
-:103F50000F900BBE0F900FBE0F901F90189586E725
-:103F600080931E0581E080931F058091A1069091AA
-:103F7000A206A091A306B091A40680932005292F44
-:103F80003A2F4B2F5527209321059D014427552774
-:103F9000209322058B2F9927AA27BB2780932305DF
-:103FA0001092A1061092A2061092A3061092A406E7
-:103FB000A5EAB6E026E030E08C91F901E25EFA4F26
-:103FC00080831D922F5F3F4F86E0AD3AB807A1F77F
-:103FD00010922C058FE090E00E943B01089595E738
-:103FE00090931E050E94281F80931F0510922005A4
-:103FF00083E090E00E943B01089594E790931E05B2
-:104000000E94F21E80931F051092200583E090E02D
-:104010000E943B01089592E790931E050E94481E5E
-:1040200080931F051092200583E090E00E943B01E1
-:104030000895EF92FF920F931F9393E790931E05BD
-:104040000E94B11D80931F051092200583E090E02F
-:104050000E943B011F910F91FF90EF9008950E94E5
-:104060008B1D87E780931E0581E080931F051092CA
-:10407000200583E090E00E943B01089581E7809352
-:104080001E050E940F1F80931F051092200583E0DC
-:1040900090E00E943B010895462F90E790931E0503
-:1040A00062E00E94FB1B80931F051092200583E0B5
-:1040B00090E00E943B010895EF92FF920F931F93AF
-:1040C000FC018081833701F1843748F48137C9F0DE
-:1040D000823708F06BC0803709F07FC00DC085378C
-:1040E00009F46BC0853708F45DC0863709F469C0F0
-:1040F000873709F072C06AC0828163810E944C20B8
-:1041000077C00E943E2074C00000258130E040E06E
-:1041100050E0542F432F322F2227868190E0A0E0D9
-:10412000B0E0DC0199278827280F391F4A1F5B1F41
-:104130008481280F311D411D511D878190E0A0E031
-:10414000B0E0B82FAA2799278827280F391F4A1FC0
-:104150005B1FE184FF2400E010E0102F0F2DFE2CE8
-:10416000EE24828590E0A0E0B0E0DC01992788276A
-:10417000E80EF91E0A1F1B1F8085E80EF11C011DA9
-:10418000111D838590E0A0E0B0E0B82FAA27992701
-:104190008827E80EF91E0A1F1B1F828163810E9477
-:1041A000192026C082810E94FD1F22C08281638166
-:1041B0003496AF010E940B201BC082810E94EF1F2A
-:1041C00017C0828190E00E94AF1F12C0828163817C
-:1041D0003496AF010E942F200BC080931E0583E010
-:1041E00080931F051092200583E090E00E943B0120
-:1041F0001F910F91FF90EF900895DC0180E1A030B6
-:10420000B80710F082E00895F999FECF9D010BC028
-:10421000F999FECF32BD21BDF89A80B5E60FF71FA0
-:1042200080832F5F3F4F822F8A1BE82FF0E0E41737
-:10423000F50770F381E00895DC0180E1A030B80754
-:1042400010F082E00895F999FECF9D0110C0E60FAD
-:10425000F71FE081F999FECFC901019632BD21BD5A
-:10426000E0BD0FB6F894FA9AF99A0FBE9C01822F1E
-:104270008A1BE82FF0E0E417F50748F3C9010E9414
-:10428000FD2081E008950F931F938B0121E8209377
-:104290001E050E941C2180931F051092200500D04E
-:1042A00000D000D0EDB7FEB731968BE193E0ADB70B
-:1042B000BEB712969C938E93119783E293E09383FB
-:1042C00082838AE590E0958384830E940D250F9078
-:1042D0000F908CE293E0EDB7FEB792838183148355
-:1042E00003830E940D250F900F900F900F9083E095
-:1042F00090E00E943B011F910F910895CF92DF92B1
-:10430000EF92FF920F931F937B010EE115E020E8DF
-:1043100020931E0522E0C22ED12CC00ED11EB60164
-:10432000A7010E94FD2080931F0582E090E0E80E27
-:10433000F91E0E0D1F1DD8011C9200D000D000D018
-:10434000EDB7FEB731968BE193E0ADB7BEB71296ED
-:104350009C938E93119783E293E09383828385E30A
-:1043600090E0958384830E940D250F900F9089E340
-:1043700093E0EDB7FEB792838183D482C3820E941B
-:104380000D250F900F900F900F90C70101960E947E
-:104390003B011F910F91FF90EF90DF90CF90089518
-:1043A000EF92FF920F931F93CF93DF93EC019B81CA
-:1043B00080E02A817C01E20EF11C9D8180E02C814D
-:1043C0008C01020F111D00D000D000D0EDB7FEB758
-:1043D00031968BE193E0ADB7BEB712969C938E9366
-:1043E000119783E293E0938382838AE190E095833F
-:1043F00084830E940D25EDB7FEB7319683E493E0E8
-:10440000ADB7BEB712969C938E9311971383028318
-:10441000F582E4820E940D2588812DB73EB72A5F80
-:104420003F4F0FB6F8943EBF0FBE2DBF803819F036
-:10443000813869F405C0C701B8010E947E2112C00D
-:104440002696C701BE01A8010E9443210BC080939C
-:104450001E0583E080931F051092200583E090E005
-:104460000E943B01DF91CF911F910F91FF90EF9040
-:104470000895CF93DF93EB0190E003978632910587
-:1044800048F4865B9F4FFC01EE0FFF1F0590F491EF
-:10449000E02D099480E0BCC188E290E09983888394
-:1044A00086E290E09B838A8387E290E0B0C088E256
-:1044B00090E09983888386E290E09B838A8387E2F9
-:1044C00090E058C188E290E09983888386E290E08A
-:1044D0009B838A8387E290E076C088E290E09983AC
-:1044E000888386E290E09B838A8387E290E05DC0C8
-:1044F00088E290E09983888386E290E09B838A83B8
-:1045000087E290E044C088E290E09983888386E265
-:1045100090E09B838A8387E290E02BC088E290E062
-:104520009983888386E290E09B838A8387E290E088
-:104530005CC181E390E0998388838FE290E09B8364
-:104540008A8380E390E05FC181E390E09983888370
-:104550008FE290E09B838A8380E390E046C181E311
-:1045600090E0998388838FE290E09B838A8380E345
-:1045700090E09D838C8385E049C181E390E099833D
-:1045800088838FE290E09B838A8380E390E09D8321
-:104590008C8384E03BC181E390E0998388838FE240
-:1045A00090E09B838A8380E390E09D838C8383E00B
-:1045B0002DC181E390E0998388838FE290E09B8313
-:1045C0008A8380E390E09D838C8382E01FC181E336
-:1045D00090E0998388838FE290E09B838A8380E3D5
-:1045E00090E0C8C081E390E0998388838FE290E0F7
-:1045F0009B838A8380E390E00AC08EE290E09983F7
-:1046000088838CE290E09B838A838DE290E09D8397
-:104610008C831E82FCC08EE290E0998388838CE2BA
-:1046200090E09B838A838DE290E0A4C08EE290E0CC
-:10463000998388838CE290E09B838A838DE290E06B
-:10464000C2CF8EE290E0998388838CE290E09B83D6
-:104650008A838DE290E0A9CF8EE290E099838883EF
-:104660008CE290E09B838A838DE290E082CF8EE2A1
-:1046700090E0998388838CE290E09B838A838DE22B
-:1046800090E0B3C08EE290E0998388838CE290E062
-:104690009B838A838DE290E0B6C085E290E09983A7
-:1046A000888383E290E09B838A8384E290E0AFCFAB
-:1046B00085E290E09983888383E290E09B838A83FC
-:1046C00084E290E057C085E290E09983888383E29A
-:1046D00090E09B838A8384E290E075CF85E290E04E
-:1046E0009983888383E290E09B838A8384E290E0CD
-:1046F0005CCF85E290E09983888383E290E09B839E
-:104700008A8384E290E043CF85E290E099838883B6
-:1047100083E290E09B838A8384E290E02ACF85E263
-:1047200090E09983888383E290E09B838A8384E28C
-:1047300090E05BC085E290E09983888383E290E01B
-:104740009B838A8384E290E05EC08BE290E0998351
-:10475000888389E290E09B838A838AE290E057CF46
-:104760008BE290E09983888389E290E09B838A833F
-:104770008AE290E09D838C8381E08E8349C08BE246
-:1047800090E09983888389E290E09B838A838AE220
-:1047900090E019CF8BE290E09983888389E290E0E2
-:1047A0009B838A838AE290E000CF8BE290E099833A
-:1047B000888389E290E09B838A838AE290E0E7CE57
-:1047C0008BE290E09983888389E290E09B838A83DF
-:1047D0008AE290E0CECE8BE290E09983888389E2F2
-:1047E00090E09B838A838AE290E09D838C8386E0BD
-:1047F0000DC08BE290E09983888389E290E09B83EF
-:104800008A838AE290E09D838C8387E08E8381E0B7
-:10481000DF91CF910895CF93DF93BC018230910552
-:1048200010F462E070E0A091B006B091B106ED0125
-:10483000E0E0F0E040E050E021C0888199818617F7
-:10484000970769F48A819B81309719F0938382835B
-:1048500004C09093B1068093B006FE0134C068177F
-:10486000790738F44115510519F08417950708F4B4
-:10487000AC01FE018A819B819C01E9012097E9F648
-:1048800041155105A9F1CA01861B970B049708F43D
-:10489000BA01E0E0F0E02AC08D919C911197841755
-:1048A0009507F9F46417750781F412968D919C9120
-:1048B0001397309719F09383828304C09093B106C5
-:1048C0008093B006FD0132964CC0CA01861B970B3F
-:1048D000FD01E80FF91F6193719302978D939C93EB
-:1048E00040C0FD01828193819C01D9011097A1F6FE
-:1048F0008091AE069091AF06892B41F480916A03B6
-:1049000090916B039093AF068093AE0640916C0339
-:1049100050916D034115510541F44DB75EB780913B
-:10492000680390916903481B590B2091AE063091A2
-:10493000AF06CA01821B930B8617970780F0AB0165
-:104940004E5F5F4F8417950750F0420F531F5093EF
-:10495000AF064093AE06F9016193719302C0E0E0A7
-:10496000F0E0CF01DF91CF910895CF93DF930097CF
-:1049700009F450C0EC0122971B821A82A091B00664
-:10498000B091B106109709F140E050E0AC17BD07B7
-:1049900008F1BB83AA83FE0121913191E20FF31F3D
-:1049A000AE17BF0779F48D919C911197280F391F8D
-:1049B0002E5F3F4F3983288312968D919C911397D8
-:1049C0009B838A834115510571F4D093B106C0933E
-:1049D000B00620C012968D919C911397AD0100975F
-:1049E00011F0DC01D3CFFA01D383C283219131913D
-:1049F000E20FF31FCE17DF0769F488819981280F32
-:104A0000391F2E5F3F4FFA01318320838A819B81BA
-:104A100093838283DF91CF910895A0E0B0E0E3E13A
-:104A2000F5E20C940B28FE0135966191719180910D
-:104A3000B4069091B506AF010E9457252096E2E09A
-:104A40000C9427280F931F93CF93DF938C01E09151
-:104A5000B406F091B506838181FF21C0C0E0D0E0AB
-:104A60000DC0E091B406F091B50620853185BF01F7
-:104A7000F9010995892B11F0CFEFDFEFF801819152
-:104A80008F01882371F7E091B406F091B506208577
-:104A900031858AE0BF01F9010995892B11F0CFEF2B
-:104AA000DFEFCE01DF91CF911F910F910895ABE021
-:104AB000B0E0EDE5F5E20C94FB273C012B015A0137
-:104AC000FC0117821682838181FD03C06FEF7FEFA7
-:104AD000C6C19AE0892E1E010894211C311CF301E5
-:104AE0002381F20123FD859123FF81912F018823EA
-:104AF00009F4B2C1853239F423FD859123FF8191F8
-:104B00002F01853229F490E0B3010E944A27E7CFB4
-:104B1000982FFF24EE249924FFE1FF15D0F09B325B
-:104B200069F09C3228F4903259F0933291F40EC01F
-:104B30009D3249F0903369F441E024C052E0F52AF7
-:104B400084E0F82A28C098E0F92A25C0E0E1FE2A8E
-:104B500022C0F7FC29C0892F80538A3070F4F6FEFA
-:104B600005C0989C902C1124980E15C0E89CE02C50
-:104B70001124E80EF0E2FF2A0EC09E3229F4F6FC62
-:104B80006BC140E4F42A07C09C3619F450E8F52ABA
-:104B900002C0983649F4F20123FD959123FF9191CB
-:104BA0002F01992309F0B8CF892F8554833018F04D
-:104BB0008052833038F444E050E0A40EB51E5FE329
-:104BC00059830FC0933631F0933779F0933509F05C
-:104BD00056C020C0F5018081898342E050E0A40ED8
-:104BE000B51E610101E010E012C0F501C080D18066
-:104BF000F6FC03C06FEF7FEF02C0692D70E042E06A
-:104C000050E0A40EB51EC6010E943F278C015FE74D
-:104C1000F52214C0F501C080D180F6FC03C06FEF0F
-:104C20007FEF02C0692D70E042E050E0A40EB51E97
-:104C3000C6010E9434278C0150E8F52AF3FE07C014
-:104C40001AC080E290E0B3010E944A27EA948E2DB8
-:104C500090E008171907A8F30EC0F601F7FC85913C
-:104C6000F7FE81916F0190E0B3010E944A27E110A5
-:104C7000EA94015010400115110579F7EAC0943605
-:104C800011F0993669F5F7FE08C0F50120813181F0
-:104C90004281538184E090E00AC0F50180819181D6
-:104CA0009C01442737FD4095542F82E090E0A80EE8
-:104CB000B91E9FE6F92257FF09C0509540953095DF
-:104CC00021953F4F4F4F5F4FE0E8FE2ACA01B901DF
-:104CD000A1012AE030E00E947627D82ED21840C0E9
-:104CE000953729F41F2D1F7E2AE030E01DC01F2DAF
-:104CF000197F9F3661F0903720F4983509F0ACC0E9
-:104D00000FC0903739F0983709F0A6C004C028E0EA
-:104D100030E00AC0106114FD146020E130E004C0EE
-:104D200014FD166020E132E017FF08C0F501608134
-:104D300071818281938144E050E008C0F501808157
-:104D40009181BC0180E090E042E050E0A40EB51EED
-:104D5000A1010E947627D82ED2188FE7F82EF122D3
-:104D6000F6FE0BC05EEFF522D91438F4F4FE07C04E
-:104D7000F2FC05C08FEEF82202C01D2D01C0192DD6
-:104D8000F4FE0DC0FE01ED0DF11D8081803319F49C
-:104D900099EEF92208C01F5FF2FE05C003C08F2DF7
-:104DA000867809F01F5F0F2DF3FC14C0F0FE0FC0D2
-:104DB0001E1510F09D2C0BC09D2C9E0C911A1E2DC3
-:104DC00006C080E290E0B3010E944A271F5F1E15D3
-:104DD000C0F304C01E1510F4E11A01C0EE2404FF54
-:104DE0000FC080E390E0B3010E944A2702FF1DC07C
-:104DF00001FD03C088E790E00EC088E590E00BC09D
-:104E0000802F867891F001FF02C08BE201C080E222
-:104E1000F7FC8DE290E0B3010E944A2706C080E3D0
-:104E200090E0B3010E944A279A94D914C0F3DA940F
-:104E3000F101ED0DF11D808190E0B3010E944A2740
-:104E4000DD20A9F706C080E290E0B3010E944A2766
-:104E5000EA94EE20C1F743CEF30166817781CB015E
-:104E60002B96E2E10C941728FC01059061507040EC
-:104E70000110D8F7809590958E0F9F1F0895FC0123
-:104E80006150704001900110D8F7809590958E0F79
-:104E90009F1F08950F931F93CF93DF938C01EB0116
-:104EA0008B8181FF1BC082FF0DC02E813F818C81D1
-:104EB0009D812817390764F4E881F9810193F9830A
-:104EC000E88306C0E885F985802F0995892B31F4A0
-:104ED0008E819F8101969F838E8302C00FEF1FEF0B
-:104EE000C801DF91CF911F910F910895FA01AA2770
-:104EF000283051F1203181F1E8946F936E7F6E5F1D
-:104F00007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0CA
-:104F1000670F781F891F9A1FA11D680F791F8A1FAD
-:104F2000911DA11D6A0F711D811D911DA11D20D014
-:104F300009F468943F912AE0269F11243019305DCE
-:104F40003193DEF6CF010895462F4770405D4193BF
-:104F5000B3E00FD0C9F7F6CF462F4F70405D4A330C
-:104F600018F0495D31FD4052419302D0A9F7EACFD4
-:104F7000B4E0A6959795879577956795BA95C9F703
-:104F800000976105710508959B01AC010A2E0694F6
-:104F90005795479537952795BA95C9F7620F731FAF
-:104FA000841F951FA01D089597FB092E07260AD080
-:104FB00077FD04D00CD006D000201AF470956195CE
-:104FC0007F4F0895F6F7909581959F4F0895AA1BFE
-:104FD000BB1B51E107C0AA1FBB1FA617B70710F0E4
-:104FE000A61BB70B881F991F5A95A9F78095909516
-:104FF000BC01CD0108952F923F924F925F926F9224
-:105000007F928F929F92AF92BF92CF92DF92EF9258
-:10501000FF920F931F93CF93DF93CDB7DEB7CA1BD9
-:10502000DB0B0FB6F894DEBF0FBECDBF09942A8804
-:10503000398848885F846E847D848C849B84AA84AC
-:10504000B984C884DF80EE80FD800C811B81AA8139
-:10505000B981CE0FD11D0FB6F894DEBF0FBECDBF04
-:08506000ED010895F894FFCF63
-:10506800456D62656464656450726F6A65637473E4
-:10507800004F63746F70757355534220496E7465A1
-:10508800726661636520436F6E766572746572201F
-:10509800616E6420492F4F20457874656E73696F7F
-:1050A8006E0032303039303731380025732C2564A2
-:1050B8003A20006D61696E2E630066697273742010
-:1050C8007061636B6574206F662061206C6F6E671A
-:1050D800206D65737361676520286C656E677468F9
-:1050E8003A202564290A006F63746F707573206C09
-:1050F8006F6E672072756E6E696E67206D6573736B
-:10510800616765006F63746F7075732E6C6F6E677F
-:105118005F696E646578203C206F63746F70757387
-:105128002E6C6F6E675F6279746573006E6F7420A2
-:105138006C617374207061636B65743A206469668E
-:1051480066203E203634006C617374207061636B96
-:105158006574007061727365722C20636865636B97
-:105168003A2025582C20636F6D6D616E643A2025B6
-:10517800580A0063616C6C696E6720696F5F7061C3
-:10518800727365720063616C6C696E672061646339
-:105198005F7061727365720063616C6C696E672021
-:1051A8006932635F7061727365720063616C6C6908
-:1051B8006E67207370695F706172736572006361F6
-:1051C8006C6C696E672070776D5F70617273657261
-:1051D8000063616C6C696E672063616E5F706172F9
-:1051E8007365720063616C6C696E672065657072C7
-:1051F8006F6D5F70617273657200756E6B6E6F773D
-:105208006E20636D6400726563656976696E6720F8
-:10521800636F6D6D616E643A20255820286C656E49
-:105228006774683A202575290A00676574206E65D9
-:1052380078740067657420616E64206578656375AD
-:1052480074650009040025732C25643A2000616404
-:10525800632E6300576572742025690D0A000000EB
-:10526800000200000000601B0000000000010203B3
-:10527800040506070001020304050625732C2564AE
-:105288003A2000656570726F6D2E630077726974DD
-:1052980074656E3A2025730A00726561643A2025A8
-:1052A800730A00656570726F6D5F70617273657205
-:1052B8003A206C656E6774683A2025752C20616405
-:0E52C80064723A2025750A002000B806000026
+:100000000C94FA000C9417010C9417010C9417012E
+:100010000C9417010C9408030C9417010C9417010D
+:100020000C9417010C9417010C9417010C941701F0
+:100030000C9475170C9417010C9417010C9417016C
+:100040000C9417010C94E1020C9417010C94170105
+:100050000C9417010C9419010C9417010C941701BE
+:100060000C9417010C9417010C9417010C941701B0
+:100070000C9417010C9417010C9417010C941701A0
+:100080000C9417010C9417010C9417010C94170190
+:100090000C941701AA0DAC0DAE0DB00DB20DB40D40
+:1000A000B60DB80DBA0DBC0DBE0DC00DC20DC40D00
+:1000B000C60DC80DCA0DCC0DCE0DFC0DFC0DFC0DF2
+:1000C000FC0DFC0DFC0DD00DD20DD40DD60DD80DB0
+:1000D000DA0DDC0DDE0DE00DE20DE40DE60DE80DB0
+:1000E000EA0DEC0DEE0DF00DF20DF60D490E4B0E76
+:1000F0004D0E4F0E510E530E550E570E590E5B0EF0
+:100100005D0E5F0E610E630E650E670E690E6B0E5F
+:100110006D0E9B0E9B0E9B0E9B0E9B0E9B0E6F0EF1
+:10012000710E730E750E770E790E7B0E7D0E7F0E9F
+:10013000810E830E850E870E890E8B0E8D0E8F0E0F
+:10014000910E950E090F0F0F150F1B0F210F270F83
+:100150002D0F330F390F3F0F450F4B0F510F570F17
+:100160005D0F630F690F6F0F750F060F060F060FF8
+:10017000060F060F060F7B0F810F870F8D0F930F52
+:10018000990F9F0FA50FAB0FB10FB70FBD0FC30F87
+:10019000C90FCF0FD50FDB0FE10FE70F37103A1064
+:1001A0003D1040104310461049104C104F10521093
+:1001B000551058105B105E106110641067106A10C3
+:1001C0006D1034103410341034103410341070109A
+:1001D0007310761079107C107F10821085108810B3
+:1001E0008B108E109110941097109A109D10A010E3
+:1001F000A310A61011241FBECFEFD0E1DEBFCDBFEC
+:1002000011E0A0E0B1E0E2E4F4E300E00BBF02C0E3
+:1002100007900D92A435B107D9F714E0A4E5B1E039
+:1002200001C01D92A93BB107E1F70C9423010C9486
+:1002300000001F920F920FB60F9211240F900FBE65
+:100240000F901F901895CCEFD0E1DEBFCDBF8FEFA0
+:1002500084B985B92F980E94650781E897E10E94CB
+:10026000B00785E69CE00E94B50781E090E00E941F
+:10027000BA07DE011196EBE4F1E083E001900D9204
+:100280008150E1F7CE0101960E94AF0B80E091E032
+:100290000E944B0C81E191E00E94430C82E491E0CA
+:1002A0000E943B0C0E94850B4C0164E670E00E94AA
+:1002B000C80760E070E0C4010E94F10A3C0140E020
+:1002C00050E0BC01C4010E94E90720EFA22E21E00A
+:1002D000B22ECC24DD2490E4E92EF12C02E021E0C2
+:1002E00030E041E050E0B301C4010E94860A87E794
+:1002F000A82E82E0B82E21E030E041E050E0B301CA
+:10030000C4010E94BE0A0E940A071092E1011092E5
+:10031000E0011092E3011092E2010E94790C8FEF4C
+:1003200087B98AEA88B90E942C0385ED88B90E94B2
+:100330002C0380E888B9FFCF0F931F93CF93DF93EF
+:10034000EC0181349105B0F08091EC019091ED01C8
+:10035000892B81F41092E9011092E801D093EB010E
+:10036000C093EA0181E090E09093ED018093EC016D
+:10037000C0E4D0E068E08BE20E94500700E010E0AB
+:100380000EC0E091E801F091E901E00FF11FEE5C91
+:10039000FC4F608189E20E9450070F5F1F4F0C17CE
+:1003A0001D0779F78091E0019091E101019749F4EF
+:1003B00067E08BE20E9450071092E1011092E00189
+:1003C0000AC063E08BE20E94500781E090E09093C6
+:1003D000E1018093E001DF91CF911F910F9108958A
+:1003E0008091EC019091ED01019771F52091E80168
+:1003F0003091E9018091EA019091EB0128173907CA
+:1004000018F52091EA013091EB018091E80190917B
+:10041000E901281B390B8091E8019091E901805C8A
+:100420009F4F9093E9018093E801213431052CF02E
+:1004300080E490E00E949C010895C9010E949C0103
+:100440001092ED011092EC010895FC011092E90167
+:100450001092E8011092ED011092EC0100002F9A29
+:100460002081822F82958F7099278230910511F11A
+:10047000833091052CF4009761F0019759F516C06F
+:1004800084309105F9F084309105C4F0059711F599
+:100490001DC0263039F48281813039F5CF010E94A8
+:1004A000421723C0CF010E94F30C1FC0CF010E944E
+:1004B00084111BC0CF010E94E71217C0CF010E9418
+:1004C0002A1413C0CF010E945C150FC0CF010E94F7
+:1004D00092180BC02093320383E080933303109271
+:1004E000340383E090E00E949C012F980895CF93FD
+:1004F000DF93EC018091E2019091E301019751F5C6
+:1005000020E030E0E091E401F091E501E20FF31F1B
+:10051000DE01A20FB31F8C91EE50FE4F80832F5F40
+:100520003F4F2034310571F78091E4019091E5014E
+:10053000805C9F4F9093E5018093E4012091E4015A
+:100540003091E5018091E6019091E7012817390784
+:10055000A8F11FC01092E5011092E40120E030E004
+:10056000E091E401F091E501E20FF31FDE01A20F3B
+:10057000B31F8C91EE50FE4F80832F5F3F4F20348E
+:10058000310571F73093E5012093E401A981A0348E
+:1005900048F41092E3011092E20182EF91E00E9490
+:1005A00025020CC081E090E09093E3018093E2018A
+:1005B0008A2F99279093E7018093E601DF91CF91ED
+:1005C00008951F920F920FB60F9211242F933F930D
+:1005D0004F935F936F937F938F939F93AF93BF934B
+:1005E000EF93FF930E94C50C80915D0186BDFF9142
+:1005F000EF91BF91AF919F918F917F916F915F919B
+:100600004F913F912F910F900FBE0F901F90189513
+:100610001F920F920FB60F9211242F933F934F9377
+:100620005F936F937F938F939F93AF93BF93EF935A
+:10063000FF930E94530CFF91EF91BF91AF919F9157
+:100640008F917F916F915F914F913F912F910F907B
+:100650000FBE0F901F90189520E080E49CE9019751
+:10066000F1F72F5F2931C9F70895FF920F931F9378
+:10067000162F042FF22E9C01442737FD4095542F4E
+:1006800060E472E48FE090E00E94D0192150304085
+:10069000163061F0173019F0153019F404C0E1E09C
+:1006A00003C0E1E004C0E0E070E002C0E0E071E01F
+:1006B000053439F00F3419F451E041E004C050E042
+:1006C00001C051E040E082E0F81611F462E001C0A0
+:1006D00060E0832F992787FD9A958093C50020932A
+:1006E000C40088E18093C100770FEE0FEE0FE72B77
+:1006F0005295550F507E5E2B4295407F452B660FDD
+:10070000660F660F642B6093C2001F910F91FF90DC
+:1007100008951092C50089E18093C40088E1809318
+:10072000C10086E08093C20008950895982F8091BB
+:10073000C00085FFFCCF9093C60008958091C00053
+:1007400087FFFCCF8091C600992708958A3310F463
+:10075000805301C087556A3310F4605301C0675558
+:100760006F708295807F682B862F99270895FC01F2
+:1007700007C08091C00085FFFCCF31969093C600E2
+:1007800090819923B1F70895982F92959F70282F03
+:100790002F709A3030F48091C00085FFFCCF905DBF
+:1007A00005C08091C00085FFFCCF995A9093C60088
+:1007B0002A3030F48091C00085FFFCCF205D05C059
+:1007C0008091C00085FFFCCF295A2093C600089570
+:1007D00087E280939A0485E28093990490E2909353
+:1007E0009B0410929C0428E030E030939E042093F8
+:1007F0009D0483E28093A60481E28093A5049093F4
+:10080000A7041092A8043093AA042093A904089581
+:1008100008956091B20481E20E945007089568E053
+:100820008BE20E94500761E188E20E94500768E075
+:100830008FE20E94500761E18CE20E94500761E064
+:100840008FE20E9450071092E1011092E00165E0F2
+:1008500083E20E94500708950F931F938C0160E478
+:1008600080E20E945007F8016281605884E00E9493
+:100870005007F80182818093B1041F910F91089570
+:100880000F931F93CF93DF93EC01288539851216C0
+:100890001306DCF58E819F81821793071CF568E0B3
+:1008A00083E20E94500700E010E00FC08A859B851C
+:1008B000E80FF91F608181E20E9450078E819F81BD
+:1008C00001969F838E830F5F1F4FEE81FF81888586
+:1008D0009985083011051CF4E817F9073CF3E8176F
+:1008E000F90724F061E087E20E9450078B81813094
+:1008F00031F465E089810E9450071B8206C061E0E7
+:1009000089810E94500781E08B83DF91CF911F91F5
+:100910000F910895CF93DF93CDB7DEB724970FB62D
+:10092000F894DEBF0FBECDBFDC01FC012281338114
+:100930001092AC041092AB0481E08093A804832F42
+:1009400099278230D9F0833069F1813009F057C09E
+:100950008091850499279093AE048093AD0485E837
+:1009600094E09093B0048093AF04868197818034A3
+:10097000910509F044C088E090E029C0FD0186811E
+:1009800097819093AE048093AD04E22FFF27EE0F82
+:10099000FF1F8091970490919804E80FF91F8081C0
+:1009A000918129C02223C1F0E22FFF27EE0FFF1F04
+:1009B0008091F0019091F101E80FF91F0190F08111
+:1009C000E02DF093B004E093AF04808199279093D9
+:1009D000AE048093AD0413C094E0998383E08A83CE
+:1009E00089E08B839C8384E090E09093AE048093B5
+:1009F000AD04CE0101969093B0048093AF0485EAD4
+:100A000094E00E94400424960FB6F894DEBF0FBE17
+:100A1000CDBFDF91CF910895CF93DF9382E20E9403
+:100A20002B07C82FDD27C5FF1AC068E083E20E94AC
+:100A30005007C6FF10C02091AB043091AC048091E8
+:100A4000AD049091AE04281739072CF485EA94E0A0
+:100A50000E94400404C061E087E20E945007DF91D9
+:100A6000CF9108951F93CF93DF9388E00E942B07C7
+:100A7000182FC82FDD27C6FF18C060E085E00E9450
+:100A8000500760E884E00E94500760E080E20E9426
+:100A9000500768E083E20E94500761E087E20E940D
+:100AA000500762E085E00E945007C4FF04C060EC7C
+:100AB00089E00E94500717FF04C060ED89E00E94A2
+:100AC0005007DF91CF911F9108958AE00E942B0774
+:100AD000992780FF03C00E940C05089581FF0DC077
+:100AE0008AE20E942B0780917204813061F4E091C8
+:100AF0007504F09176040995089582E30E942B070E
+:100B00008AE30E942B0708958EE00E942B0768E07D
+:100B10008FE20E94500761E08FE20E94500720910F
+:100B2000AD043091AE048091A9049091AA0482177B
+:100B300093075CF468E083E20E94500761E087E27B
+:100B40000E94500781E08093A8040895AF92BF925D
+:100B5000CF92DF92EF92FF920F931F93CF93DF9389
+:100B6000CDB7DEB728970FB6F894DEBF0FBECDBF66
+:100B700086E20E942B0786FF7EC08E010F5F1F4F0B
+:100B8000580169E0C62ED12CCC0EDD1E809199044F
+:100B90000E942B07F80181938F017501EC15FD056B
+:100BA000A9F768E087E20E94500768E083E20E94AC
+:100BB000500780E20E942B078F77682F80E20E9407
+:100BC000500789819927807690708032910509F4C9
+:100BD00040C080349105D1F1892BF1F5F501818177
+:100BE0008630D9F0873048F48130F1F18130C8F097
+:100BF0008330D1F1853081F521C0893019F18A30F7
+:100C000018F4883049F505C08A3071F18B3021F530
+:100C100020C0C5010E94090427C0C5010E948A04A2
+:100C200023C068E083E20E94500761E081E20E94F5
+:100C3000500760E081E20E9450070BC0C5010E948E
+:100C40002C0412C0C5010E940F040EC0C5010E94F1
+:100C5000080765E083E206C080E20E942B07805807
+:100C6000682F80E20E945007F70180818823D1F429
+:100C700065E083E215C02091AD043091AE0480910F
+:100C8000A9049091AA048217930764F41092AE0409
+:100C90001092AD0468E083E20E94500761E087E2B1
+:100CA0000E94500728960FB6F894DEBF0FBECDBF46
+:100CB000DF91CF911F910F91FF90EF90DF90CF9038
+:100CC000BF90AF900895CF92DF92EF92FF920F9373
+:100CD0001F93CF93DF93CDB7DEB7C054D0400FB68C
+:100CE000F894DEBF0FBECDBF8CE00E942B07992782
+:100CF00080FF03C00E94A6057BC081FF2AC08EE250
+:100D00000E942B078DE20E942B0789838E010F5FC3
+:100D10001F4F6801FFE3EF2EF12CE00EF11E0F5F75
+:100D20001F4F0E941907F80180830E151F05B9F7A0
+:100D300080915401813031F4E0915701F0915801D4
+:100D4000C601099568E08FE20E94500761E08FE2DA
+:100D50002BC082FF2CC086E30E942B0785E30E94F4
+:100D60002B0789838E010F5F1F4F6801EFE3EE2E83
+:100D7000F12CE00EF11E0F5F1F4F0E941907F801C2
+:100D800080830E151F05B9F780915501813031F42C
+:100D9000E0915901F0915A01C601099568E087E395
+:100DA0000E94500761E087E30E94500721C083FF43
+:100DB0001FC08EE30E942B078E010F5F1F4F68013B
+:100DC00071E4E72EF12CEC0EFD1E8DE30E942B0743
+:100DD000F80181938F01EE15FF05B9F78091560157
+:100DE000813031F4E0915701F0915801C601099525
+:100DF000C05CDF4F0FB6F894DEBF0FBECDBFDF91F2
+:100E0000CF911F910F91FF90EF90DF90CF900895B9
+:100E10000895089581E080936A0080E18DBB83B3DB
+:100E2000876083BB84B3836084BB3F9A479A78947E
+:100E3000089588B1805888B984B322E0822784BBA2
+:100E40000000000080B198B1905898B994B39227EF
+:100E500094BB992708959FEF91B982B988B18058C2
+:100E600088B984B395E0892784BB88B1805888B954
+:100E700084B3892784BB000011B80E941907992701
+:100E8000089582B988B1805888B984B391E08927E0
+:100E900084BB88B1805888B984B3892784BB0895FE
+:100EA00082B98FEF81B988B1805888B984B395E051
+:100EB000892784BB88B1805888B984B3892784BBCB
+:100EC000862F0E9441070895089582E1809385044A
+:100ED00081E08093860480E191E090938804809380
+:100EE00087041092890410928A0410928B0488E07F
+:100EF00080938C0410928E0410928D0410929004B2
+:100F000010928F0410929204109291041092930404
+:100F10001092940410929504109296041092540129
+:100F2000109255011092560110927204109273049F
+:100F30001092740410927C0410927B041092EF01C2
+:100F40001092EE01089590938E0480938D04709317
+:100F5000900460938F0450939204409391040895F9
+:100F600090938E0480938D040895909390048093C1
+:100F70008F04089590939204809391040895809330
+:100F80008904089580938A04089580938B040895BA
+:100F9000CF93DF939C01CB01E0917B04F0917C0423
+:100FA00062E070E00E94BD190FC0A081B181828112
+:100FB000823039F4ED018D8199278217930709F466
+:100FC00068870780F085E02D309779F7DF91CF9122
+:100FD0000895CF93DF939C01E0917B04F0917C0412
+:100FE00014C0A081B1818281843061F48481992709
+:100FF0008217930739F4868199278617970711F48A
+:10100000ED014B830780F085E02D309751F7DF919C
+:10101000CF910895BF92CF92DF92EF92FF920F93FC
+:101020001F93CF93DF936C01162FF42EB22EC09135
+:101030007B04D0917C042097A1F489E090E00E9489
+:10104000C418FC0190937C0480937B04D182C082FD
+:10105000138310861782F282B4820583E68215C05C
+:10106000EC018F8198850097D9F789E090E00E9484
+:10107000C418FC0198878F83D182C0821383F282C7
+:10108000B4820583E68210861782DF91CF911F918B
+:101090000F91FF90EF90DF90CF90BF900895EF9267
+:1010A000FF921F93CF93DF937C01C091EE01D0910B
+:1010B000EF01209711F011E012C085E090E00E944E
+:1010C000C418FC019093EF018093EE01F182E0825D
+:1010D00012821482138210E012C01F5FEC018B8118
+:1010E0009C810097D1F785E090E00E94C418FC0134
+:1010F0009C838B83F182E082128314821382812F7E
+:101100009927DF91CF911F91FF90EF900895EF9273
+:10111000FF920F931F93CF93DF93E091EE01F09135
+:10112000EF0180E090E00380F481E02D019630979C
+:10113000D1F7880F991F0E94C4189093F1018093F2
+:10114000F0010091EE011091EF01E801E880F980D3
+:101150008A81C82FDD27CC0FDD1F8091F00190918F
+:10116000F101C80FD91FF701808199270E94C41887
+:101170009983888320E030E017C0E801EA81FF27E7
+:10118000EE0FFF1F8091F0019091F101E80FF91F20
+:101190000190F081E02DE20FF31FD701A20FB31FE2
+:1011A0008C9180832F5F3F4FF7018081992728170B
+:1011B00039071CF3E8018B819C81009711F08C01A9
+:1011C000C4CFDF91CF911F910F91FF90EF900895C1
+:1011D0004F925F926F927F928F929F92AF92BF9247
+:1011E000CF92DF92EF92FF920F931F93CF93DF93F3
+:1011F000E0917B04F0917C046624772409C082810D
+:10120000823019F40894611C711C0780F085E02D70
+:101210003097A9F74301880C991CC4010E94C41897
+:101220009093980480939704E1E0EE2EF12CAA2489
+:10123000BB2455C0E0917B04F0917C0479E0C72E7B
+:10124000D12C15C0A081B181848199278E159F056D
+:1012500019F48381C80ED11CED018D818E1521F406
+:101260008281823009F45D010780F085E02D30979E
+:1012700049F7009197041091980402501040080D0E
+:10128000191DC6010E94C418F8019183808320E0D3
+:1012900030E0E0919704F0919804E80DF91D329741
+:1012A0000190F081E02DE20FF31FD501A20FB31FD3
+:1012B0008C9180832F5F3F4F2930310551F7E091AA
+:1012C0009704F0919804E80DF91D32970190F08190
+:1012D000E02D8C2D875F82830894E11CF11C6E1435
+:1012E0007F040CF0A7CF61E0C62ED12C59E0A52ECB
+:1012F000B12C4424552442E0842E912CA1C0A0910D
+:101300007B04B0917C0412C0ED91FC911197818116
+:10131000823049F4858199278C159D0521F48481BB
+:10132000482E552405C0ED01AF81B885109761F7AF
+:1013300031E0E32EF12C79C060917B0470917C0444
+:101340006DC0FB01C081D1818981843009F063C007
+:10135000868199278E159F0509F05DC084819927A4
+:101360008C159D0509F057C0950140E050E0E091D3
+:101370009704F0919804E80DF91D32970190F081DF
+:10138000E02DE20FF31FDE01A40FB51F8C918083C7
+:101390002F5F3F4F4F5F5F4F4930510541F789E065
+:1013A00090E0A80EB91EC0917B04D0917C0431C09E
+:1013B0008A81853059F58C8199278C159D0531F5E9
+:1013C0008D8199278E159F0509F508811981950151
+:1013D00040E050E0E0919704F0919804E80DF91D89
+:1013E00032970190F081E02DE20FF31FD801A40F96
+:1013F000B51F8C9180832F5F3F4F4F5F5F4F47300A
+:10140000510541F7E7E0F0E0AE0EBF1E0F80D88532
+:10141000C02D209769F6EB016F8178856115710504
+:1014200009F08FCF0894E11CF11C4E145F040CF0FE
+:1014300083CF0894C11CD11CE2E0F0E08E0E9F1E09
+:101440006C147D040CF05BCFDF91CF911F910F9155
+:10145000FF90EF90DF90CF90BF90AF909F908F90D4
+:101460007F906F905F904F9008956F927F928F92D0
+:101470009F92AF92BF92CF92DF92EF92FF920F9323
+:10148000CF93DF935C013B014901E0917B04F09134
+:101490007C0416C0A081B18184819927A816B90661
+:1014A00061F4868199278615970539F48281843005
+:1014B00021F4ED018C818F5F8C830780F085E02D16
+:1014C000309741F787E090E00E94C418FC0187E064
+:1014D000808385E0818382820383F582E482C682F1
+:1014E000EE24062D2A2D45E067E0CF010E940A0870
+:1014F000DF91CF910F91FF90EF90DF90CF90BF9051
+:10150000AF909F908F907F906F900895AF92BF9211
+:10151000CF92DF92EF92FF920F93FC01A114B104DE
+:1015200001F14230510571F04330510599F04130DD
+:101530005105B9F481E080937204B0927604A092D0
+:1015400075040FC081E080937304B0927804A09278
+:10155000770407C081E080937404B0927A04A0926B
+:10156000790420583F4FCF010E94350A0F91FF9018
+:10157000EF90DF90CF90BF90AF900895AF92BF9261
+:10158000CF92DF92EF92FF920F93FC014230510510
+:1015900071F04330510599F041305105B9F481E0C3
+:1015A00080935401B0925801A09257010FC081E07E
+:1015B00080935501B0925A01A092590107C081E071
+:1015C00080935601B0925C01A0925B01CF010E9412
+:1015D000350A0F91FF90EF90DF90CF90BF90AF90C2
+:1015E0000895CF92DF92EF920F931F93CF93DF93E3
+:1015F0006C018B01A0917B04B0917C04C0E0D0E031
+:1016000014C02D913C911197F90185818C1551F4ED
+:10161000FD018281823031F4F90184818F5F8483FE
+:10162000C82FDD27FD01A781B085109751F789E00C
+:1016300090E00E94C418FC0189E0808384E08183EB
+:101640000283138214821582168217821086EC2E72
+:1016500000E02C2D44E069E0CF010E940A08CE0191
+:10166000DF91CF911F910F91EF90DF90CF90089570
+:10167000BF92CF92DF92EF92FF920F931F93CF937F
+:10168000DF936C017B01142FB22EA0917B04B091EB
+:101690007C04C0E0D0E014C02D913C911197F90179
+:1016A00085818C1551F4FD018281823031F4F9017C
+:1016B00084818F5F8483C82FDD27FD01A781B085DA
+:1016C000109751F789E090E00E94C418FC0189E06E
+:1016D000808384E08183E282138214821583B68240
+:1016E00007831086EC2E00E02C2D44E069E0CF014A
+:1016F0000E940A08CE01DF91CF911F910F91FF90B8
+:10170000EF90DF90CF90BF900895EF920F931F93CB
+:10171000109196041F5F1093960489E090E00E9458
+:10172000C418FC0189E0808389E090E09383828380
+:1017300082E0818314821583168280EA87838AE19E
+:101740008087EE2400E020E042E069E0CF010E94C3
+:101750000A08812F99271F910F91EF900895CF9339
+:10176000DF93EC01FC0101900020E9F7E81BF90B85
+:10177000CF01880F991F0E94C4189C01FE0101909F
+:101780000020E9F7EC1BFD0BEE0FFF1FDC01EC93D3
+:1017900083E0F901818340E050E009C0FE01E40FDD
+:1017A000F51F80818C93FD0111824F5F5F4F129670
+:1017B000FE0101900020E9F73197EC1BFD0B4E175D
+:1017C0005F0760F3C9010E944F089927DF91CF910D
+:1017D0000895EF92FF920F931F93CF93DF938C01A5
+:1017E0007B01CA010E94AF0B9C01E0917B04F09148
+:1017F0007C0414C0A081B1818281843061F4848131
+:1018000099278017910739F4868199278E159F05AE
+:1018100011F4ED0128870780F085E02D309751F70E
+:10182000DF91CF911F910F91FF90EF9008950F934B
+:101830001F93CF93DF938C01CB010E94AF0B9C01D0
+:10184000E0917B04F0917C040FC0A081B181828182
+:10185000823039F4ED018D8199278017910709F4C1
+:101860002E830780F085E02D309779F7DF91CF91B7
+:101870001F910F9108950E94AF0B1816190614F4CA
+:101880008093950408950E94AF0B1816190614F45E
+:101890008093940408950E94AF0B1816190614F44F
+:1018A0008093930408951F9386E00E942B07992745
+:1018B00086FF03C00E9463060EC082FF03C00E9421
+:1018C000650509C081FF03C00E94320504C084FF82
+:1018D00002C00E94840587E00E942B07182F60E059
+:1018E00087E00E945007612F87E00E9450071F91F8
+:1018F00008950E94E8080E9487080E94E80361E0BA
+:1019000080E00E94500780E00E942B0780FDFBCF03
+:1019100062E081E00E94500760E884E00E94500786
+:1019200060E480E20E94500768E083E20E94500772
+:1019300069E087E20E9450076FE08DE00E94500747
+:101940006FE08BE00E94500768ED89E00E9450072D
+:1019500063E38FE00E94500766ED87E00E94500726
+:1019600062E085E00E9450076CEC80E00E94500726
+:1019700008958EEC80935D0181E080936E008091EC
+:101980005D0186BD83E084BD08950895089583E0D8
+:101990008093320381E0809333038BE080933403A0
+:1019A0002FE62093350393E69093360384E78093E4
+:1019B0003703209338039093390381E680933A03E9
+:1019C0008EE680933B038FE580933C0380E3809316
+:1019D0003D0381E380933E0310923F038EE090E04D
+:1019E0000E949C010895FC018081833011F40E94C3
+:1019F000C70C0895CF93DF93C1E0D0E08C2F0E94F5
+:101A00000B0E2196C431D105C9F7CAE1D0E08C2F65
+:101A10000E940B0E2196CD32D105C9F7DF91CF91EF
+:101A20000895CF93DF93DC01EC01EA81FB812191E2
+:101A30008E81815019F48981E81BF109ED01FB8346
+:101A4000EA838E839FB7F8948C9181508C939FBFCB
+:101A5000822F9927DF91CF910895FC011082758321
+:101A60006483738362834183478346830895CF935E
+:101A7000DF93DC019C91ED018981981718F080E0DB
+:101A800090E016C0ED01EC81FD8161938F81815062
+:101A900019F48981E81BF109ED018F83FD83EC8343
+:101AA0009FB7F8948C918F5F8C939FBF81E090E0FB
+:101AB000DF91CF910895FC0180818823E9F3CF0164
+:101AC0000E94110D99270895FC018081882319F443
+:101AD0008FEF9FEF0895CF010E94110D9927089570
+:101AE00081E090E0089581E090E0089581E090E049
+:101AF000089581E090E00895CF93DF93CDB7DEB7EE
+:101B000022970FB6F894DEBF0FBECDBF282F8150AD
+:101B1000833120F08951833108F06EC0E22FFF2716
+:101B2000EE0FFF1FE35AFE4F82E090E09283818325
+:101B3000822F9927AA27BB27FC013197EC32F105A8
+:101B400008F05AC0E65BFF4FEE0FFF1F0590F491BF
+:101B5000E02D09946D9A47C06E9A49C06F9A43C0B0
+:101B6000209A45C0219A3FC0229A41C0239A3BC087
+:101B7000249A3DC0259A37C0269A39C0279A33C087
+:101B8000509A35C0519A2FC0529A31C0539A2BC0E7
+:101B9000549A2DC0559A27C0569A29C0579A23C0E7
+:101BA000389A25C0399A1FC03A9A21C03B9A1BC067
+:101BB0003C9A1DC03D9A17C03E9A19C0879A13C01F
+:101BC000869A15C0859A0FC0849A11C0839A0BC05B
+:101BD000829A0DC0819A07C0809A09C0689A03C092
+:101BE000699A05C06A9A81E090E008C06B9AE1E0CA
+:101BF000F0E0FA83E98304C084E090E09A8389836B
+:101C000089819A8122960FB6F894DEBF0FBECDBFB0
+:101C1000DF91CF910895982F8150833130F0895111
+:101C2000833118F084E090E00895892F0E947C0DA4
+:101C300081E090E00895CF93DF93CDB7DEB7229790
+:101C40000FB6F894DEBF0FBECDBF282F8150833171
+:101C500020F08951833108F06EC0E22FFF27EE0F8C
+:101C6000FF1FE35AFE4F81E090E092838183822F31
+:101C70009927AA27BB27FC013197EC32F10508F020
+:101C80005AC0EA58FF4FEE0FFF1F0590F491E02D68
+:101C900009946D9847C06E9849C06F9843C02098CA
+:101CA00045C021983FC0229841C023983BC024984A
+:101CB0003DC0259837C0269839C0279833C0509822
+:101CC00035C051982FC0529831C053982BC05498AA
+:101CD0002DC0559827C0569829C0579823C03898CA
+:101CE00025C039981FC03A9821C03B981BC03C982A
+:101CF0001DC03D9817C03E9819C0879813C086989C
+:101D000015C085980FC0849811C083980BC0829825
+:101D10000DC0819807C0809809C0689803C0699871
+:101D200005C06A9881E090E008C06B98E1E0F0E0BF
+:101D3000FA83E98304C084E090E09A8389838981EF
+:101D40009A8122960FB6F894DEBF0FBECDBFDF9109
+:101D5000CF910895FB011082833091F0843028F4F4
+:101D6000813051F0823029F409C0843059F0853037
+:101D700059F085E090E0089583B107C086B105C0B1
+:101D800089B103C08CB101C08FB1808381E090E044
+:101D90000895833091F0843028F4813051F08230FE
+:101DA00029F409C0843059F0853069F084E090E06E
+:101DB000089565B905C068B903C06BB901C06EB9B3
+:101DC00081E090E0089561BB81E090E00895282FC4
+:101DD000E82FFF27EE0FFF1FE35AFE4F818192810C
+:101DE000029719F086E090E00895822F9927AA279C
+:101DF000BB27FC013197EC32F10540F4EE55FF4F63
+:101E0000EE0FFF1F0590F491E02D099484E090E01F
+:101E10000895662311F0759ADDC07598DBC06623BE
+:101E200011F0769AD7C07698D5C0662311F0779ACC
+:101E3000D1C07798CFC0662311F0289ACBC02898DC
+:101E4000C9C0662311F0299AC5C02998C3C066236A
+:101E500011F02A9ABFC02A98BDC0662311F02B9AB0
+:101E6000B9C02B98B7C0662311F02C9AB3C02C9838
+:101E7000B1C0662311F02D9AADC02D98ABC066237A
+:101E800011F02E9AA7C02E98A5C0662311F02F9AA4
+:101E9000A1C02F989FC0662311F0589A9BC05898F4
+:101EA00099C0662311F0599A95C0599893C066233A
+:101EB00011F05A9A8FC05A988DC0662311F05B9A20
+:101EC00089C05B9887C0662311F05C9A83C05C98D8
+:101ED00081C0662311F05D9A7DC05D987BC066234A
+:101EE00011F05E9A77C05E9875C0662311F05F9A14
+:101EF00071C05F986FC0662311F0409A6BC0409824
+:101F000069C0662311F0419A65C0419863C0662399
+:101F100011F0429A5FC042985DC0662311F0439A67
+:101F200059C0439857C0662311F0449A53C044984F
+:101F300051C0662311F0459A4DC045984BC06623A9
+:101F400011F0469A47C0469845C0662311F08F9A13
+:101F500041C08F983FC0662311F08E9A3BC08E9887
+:101F600039C0662311F08D9A35C08D9833C0662331
+:101F700011F08C9A2FC08C982DC0662311F08B9A8B
+:101F800029C08B9827C0662311F08A9A23C08A98AB
+:101F900021C0662311F0899A1DC089981BC0662351
+:101FA00011F0889A17C0889815C0662311F0709AAE
+:101FB00011C070980FC0662311F0719A0BC0719810
+:101FC00009C0662311F0729A05C0729803C0662397
+:101FD00021F0739A81E090E00895739881E090E099
+:101FE00008951F93182F8150833130F08951833128
+:101FF00018F084E090E013C0E12FFF27EE0FFF1FE1
+:10200000E35AFE4F83E090E092838183812F0E9408
+:102010007C0D61E0812F0E94E70E81E090E01F912E
+:102020000895CF93DF93282FEB011882E82FFF2725
+:10203000EE0FFF1FE35AFE4F81819281019719F045
+:1020400086E090E089C0822F9927AA27BB27FC0150
+:102050003197EC32F10540F4E253FF4FEE0FFF1FD2
+:102060000590F491E02D099484E090E075C0659BA3
+:1020700071C06EC0669B6EC06BC0679B6BC068C052
+:10208000189B68C065C0199B65C062C01A9B62C07E
+:102090005FC01B9B5FC05CC01C9B5CC059C01D9B8C
+:1020A00059C056C01E9B56C053C01F9B53C050C042
+:1020B000489B50C04DC0499B4DC04AC04A9B4AC036
+:1020C00047C04B9B47C044C04C9B44C041C04D9B44
+:1020D00041C03EC04E9B3EC03BC04F9B3BC038C042
+:1020E000309B38C035C0319B35C032C0329B32C0C6
+:1020F0002FC0339B2FC02CC0349B2CC029C0359BD4
+:1021000029C026C0369B26C023C07F9B23C020C089
+:102110007E9B20C01DC07D9B1DC01AC07C9B1AC029
+:1021200017C07B9B17C014C07A9B14C011C0799B49
+:1021300011C00EC0789B0EC00BC0609B0BC008C0C6
+:10214000619B08C005C0629B05C002C0639B02C0C2
+:1021500081E0888381E090E0DF91CF910895CF9373
+:10216000DF93CDB7DEB721970FB6F894DEBF0FBE71
+:10217000CDBF9BE190933203BE016F5F7F4F0E9402
+:1021800011108093330389818093340383E090E0BE
+:102190000E949C0121960FB6F894DEBF0FBECDBF02
+:1021A000DF91CF9108959AE1909332030E94E70E58
+:1021B000809333031092340383E090E00E949C01EB
+:1021C000089598E1909332030E94C90E80933303DF
+:1021D0001092340383E090E00E949C010895982FB0
+:1021E00089E180933203933099F0943028F4913050
+:1021F00059F0923029F40AC0943061F0953061F0C2
+:1022000085E090E020E00BC023B107C026B105C0F7
+:1022100029B103C02CB101C02FB181E090E08093BF
+:1022200033032093340383E090E00E949C010895DF
+:1022300097E1909332030E94F10F80933303109241
+:10224000340383E090E00E949C01089595E190930F
+:1022500032030E941B0E809333031092340383E0F9
+:1022600090E00E949C01089596E1909332030E94B1
+:102270007C0D809333031092340383E090E00E943E
+:102280009C01089584E18093320381E080933303BD
+:102290001092340383E090E00E949C01089582E153
+:1022A0008093320381E0809333031092340383E000
+:1022B00090E00E949C01089583E18093320381E0C5
+:1022C000809333031092340383E090E00E949C01DA
+:1022D000089580E18093320381E08093330310926C
+:1022E000340383E090E00E949C01089591E1909373
+:1022F00032030E940B0E809333031092340383E069
+:1023000090E00E949C010895FC0180818531C9F113
+:10231000863180F4823131F1833130F48031D1F073
+:10232000813109F04CC01AC0833109F1843109F0C0
+:1023300046C022C0883189F1893128F4863129F1DB
+:102340008731E9F526C08A3189F18A3158F18B311C
+:10235000B1F531C082810E946911089582810E9485
+:1023600076110895638182810E944F1108956381DF
+:1023700082810E945C110895638182810E944211D2
+:10238000089582810E942611089582810E9434114D
+:10239000089582810E9418110895638182810E94AC
+:1023A000E110089582810E94EF1008956381828177
+:1023B0000E94D310089582810E94AF1008958093E7
+:1023C000320383E0809333031092340383E090E080
+:1023D0000E949C010895FC018197089718F084E001
+:1023E00090E00895EE0FFF1FE35AFE4F84E090E067
+:1023F0009283818381E090E0089510927C00823086
+:10240000910541F08330910569F0019741F082E038
+:1024100090E0089580917C00806480937C0081E04E
+:1024200090E0089580917C00806C80937C0081E036
+:1024300090E0089593E890937A0090917C00907FCB
+:10244000982B90937C0080917A00806480937A002E
+:1024500080917A0086FDFCCF809178009091790080
+:1024600020E030E040E050E080917A00806480938A
+:102470007A0080917A0086FDFCCF8091780090915F
+:102480007900480F591F2F5F3F4F2430310561F706
+:1024900080917A008F7780937A00CA01969587950C
+:1024A000969587950895CF93DF939C01EB01198250
+:1024B0001882FC01EE0FFF1FE35AFE4F81819281CB
+:1024C000049719F086E090E03CC02432310541F1D8
+:1024D0002532310554F42232310541F123323105E0
+:1024E00014F52132310569F424C02632310591F00A
+:1024F0002632310594F02732310549F02832310572
+:1025000019F087E090E01DC080E090E014C081E009
+:1025100090E011C082E090E00EC083E090E00BC03C
+:1025200084E090E008C085E090E005C086E090E09F
+:1025300002C087E090E00E941A129983888381E0AC
+:1025400090E0DF91CF91089522E2209332030E9420
+:10255000FD118093330382E090E00E949C01089576
+:10256000CF93DF93CDB7DEB722970FB6F894DEBFD7
+:102570000FBECDBF21E220933203BE016F5F7F4FBC
+:102580000E9453128093330329813A81832F992724
+:10259000809334032093350384E090E00E949C01F3
+:1025A00022960FB6F894DEBF0FBECDBFDF91CF915C
+:1025B000089520E2209332030E94EB1180933303AD
+:1025C0001092340383E090E00E949C010895FC0186
+:1025D0008081813249F0823261F0803279F48281E7
+:1025E00099270E94D9120895828199270E94B012DA
+:1025F0000895828199270E94A4120895809332033E
+:1026000083E0809333031092340383E090E00E94D0
+:102610009C0108958091B9009927887F9070089552
+:102620008091BC0087FFFCCF0895ECEBF0E0808147
+:10263000846080838BE090E09093770180937601B3
+:102640008CE090E0909379018093780181E090E0B4
+:102650000895ECEBF0E080818B7F808382E090E056
+:10266000909377018093760190937901809378011C
+:1026700081E090E008958130910511F48CE00BC069
+:102680008230910511F488E106C0039719F082E0C9
+:1026900090E0089588E48093B8008091B9008C7F21
+:1026A0008093B9008091B9008093B90081E090E0F7
+:1026B00008958091B90084EA8093BC008091BC00A9
+:1026C00087FFFCCF81E090E0089584E98093BC000F
+:1026D00081E090E008958093BB0084E88093BC0083
+:1026E0008091BC0087FFFCCF80E090E0089584E8F3
+:1026F0008093BC008091BC0087FFFCCF8091BB0021
+:102700009927089585E38093320381E08093330312
+:102710008093340384E88093BC008091BC0087FFE1
+:10272000FCCF8091BB008093350385E090E00E9450
+:102730009C01089540E050E00FC0F901E40FF51F3F
+:1027400080818093BB0084E88093BC008091BC00B2
+:1027500087FFFCCF4F5F5F4F4617570774F384E343
+:102760008093320381E0809333031092340383E03B
+:1027700090E00E949C01089587E38093320384E9EE
+:102780008093BC0081E0809333031092340383E094
+:1027900090E00E949C01089586E38093320380912B
+:1027A000B90084EA8093BC008091BC0087FFFCCF15
+:1027B00081E0809333031092340383E090E00E9421
+:1027C0009C01089522E3209332030E943B138093DF
+:1027D00033031092340383E090E00E949C0108953B
+:1027E00081E380933203ECEBF0E080818B7F808388
+:1027F00082E090E090937701809376019093790145
+:102800008093780181E0809333031092340383E056
+:1028100090E00E949C01089580E380933203ECEBEA
+:10282000F0E08081846080838BE090E0909377017A
+:10283000809376018CE090E0909379018093780109
+:1028400081E0809333031092340383E090E00E9490
+:102850009C010895FC0180818433D9F0853338F4DC
+:10286000813379F0823381F0803389F507C0863374
+:1028700041F18633D8F0873351F526C00E940C14FD
+:1028800008950E94F0130895828199270E94E2130F
+:102890000895428155276181772764507040838174
+:1028A00034969F0199270E949A13089542815527D3
+:1028B0006181772764507040838199270E94821339
+:1028C00008950E94CC1308950E94BC13089580932C
+:1028D000320383E0809333031092340383E090E06B
+:1028E0000E949C01089585B1817F85B9239886E077
+:1028F00084B91CBC1DBC83E58CBD88E090E090933E
+:102900006901809368018AE090E090936B01809365
+:102910006A0189E090E090936D0180936C0181E001
+:1029200090E008951CBC1DBC82E090E0909369018A
+:102930008093680190936B0180936A0190936D017D
+:1029400080936C0181E090E00895089581E090E02B
+:102950000895AC0120E030E00AC0FA01E20FF31F55
+:1029600080818EBD0DB407FEFDCF2F5F3F4F261730
+:1029700037079CF381E090E00895DC0120E030E02F
+:1029800040E050E015C01EBC09C04F5F5F4F83E0C0
+:10299000493E58071CF088E090E008950DB407FE0A
+:1029A000F4CFFD01E20FF31F8EB580832F5F3F4F01
+:1029B0002617370744F381E090E00895CF93DF9323
+:1029C000EC0120E030E0A0E0B0E018C0FE01E20F32
+:1029D000F31F80818EBD08C0119683E0A93EB80721
+:1029E0001CF088E090E00FC00DB407FEF5CFFB01AE
+:1029F000E20FF31F8EB580832F5F3F4F24173507FB
+:102A00002CF381E090E0DF91CF9108950F931F9315
+:102A10008B0123E420933203AB0164E373E00E9453
+:102A2000DE148093330310923403C80102960E948F
+:102A30009C011F910F9108950F931F938C0184E4C3
+:102A400080933203B80184E393E00E94BD14809325
+:102A5000330310923403C80102960E949C011F9117
+:102A60000F91089523E4209332030E94A9148093C8
+:102A700033031092340383E090E00E949C01089598
+:102A800081E4809332030E94921480933303109266
+:102A9000340383E090E00E949C01089580E48093D9
+:102AA00032030E947314809333031092350383E042
+:102AB00090E00E949C010895CF93DF93EC01888100
+:102AC0008334A1F0843438F4813469F0823458F5C9
+:102AD0008034F1F405C0843481F08534C9F411C028
+:102AE0000E944E1520C00E9440151DC069817727A5
+:102AF000CE0102960E94321516C0898199270E9444
+:102B00001C1569817727CE0102960E9406150BC01D
+:102B10008093320383E0809333031092340383E085
+:102B200090E00E949C01DF91CF910895209A219A14
+:102B3000229A2398249A259A2C982D9882E090E046
+:102B40009093850180938401909383018093820107
+:102B5000909381018093800181E090E090937F01C8
+:102B600080937E01089582E090E0909369018093C4
+:102B7000680190936B0180936A0190936D0180933B
+:102B80006C0181E090E00895289829982A9880E2C5
+:102B90009EE40197F1F7289A8AE0982F9A95F1F729
+:102BA0002A9A299A8A95F1F70895282F299887FD5E
+:102BB00002C02A9801C02A9A8AE0982F9A95F1F7C4
+:102BC000299A8A95F1F7299826FF02C02A9A01C00E
+:102BD0002A988AE0982F9A95F1F7299A8A95F1F721
+:102BE0000895282F220F30E0299827FF02C02A9A43
+:102BF00001C02A988AE0982F9A95F1F7299A8A9528
+:102C0000F1F73F5F373011F0220FEECF0895282FF4
+:102C100030E0299827FF02C02A9A01C02A988AE04A
+:102C2000982F9A95F1F7299A8A95F1F73F5F3830F6
+:102C300011F0220FEECF089529982A988AE0982F54
+:102C40009A95F1F7299A982F9A95F1F7299828984B
+:102C5000982F9A95F1F7299A982F9A95F1F7299834
+:102C60008A95F1F7289A80E090E0089529982898AD
+:102C70002A982B9A08950E94C41580E30E94D515C6
+:102C800080E60E94F11508950E94C41580E00E941C
+:102C9000D51580E00E94F1150E94361608950F9315
+:102CA0001F93182F062F0E94C41580E40E94D5158B
+:102CB000812F0E94F115802F0E94071681E090E07D
+:102CC0001F910F9108951F93182F0E94C41580EC37
+:102CD0000E94D515812F0E94F1150E941C1699277C
+:102CE0001F91089529988AE08A95F1F72A9830E093
+:102CF00090E0990F299A2AE0822F8A95F1F7299876
+:102D00001B999F5F822F8A95F1F73F5F383089F7D3
+:102D10002898299A822F8A95F1F7289A29982A9536
+:102D2000F1F7892F992708951F93182F0E94C41532
+:102D300080E80E94D515812F0E94F1150E9472161D
+:102D400099271F910895DF92EF92FF920F931F939F
+:102D5000CF93DF93D82E7B018A01C0E0D0E009C079
+:102D60008D2D8C0F0E949416F801EC0FFD1F8083AF
+:102D70002196CE15DF05A1F781E090E0DF91CF919C
+:102D80001F910F91FF90EF90DF9008950F931F9385
+:102D9000082F162F0E943B16612F802F0E944F167E
+:102DA00081E090E01F910F910895DF92EF92FF92E2
+:102DB0000F931F93CF93DF93D82E7B018A01C0E03E
+:102DC000D0E009C0F801EC0FFD1F60818D2D8C0F44
+:102DD0000E94C6162196CE15DF05A1F781E090E08E
+:102DE000DF91CF911F910F91FF90EF90DF900895A9
+:102DF00094E0909332030E94D5168093330310928F
+:102E0000340383E090E00E949C0108950F931F9388
+:102E10008B0193E09093320344E353E00E94A316A6
+:102E200080933303C80102960E949C011F910F9169
+:102E3000089582E08093320382E090E090936901EC
+:102E40008093680190936B0180936A0190936D0168
+:102E500080936C0181E0809333031092340383E00C
+:102E600090E00E949C01089581E0809332030E94CB
+:102E70009615809333031092340383E090E00E9410
+:102E80009C010895FC018381823069F0833018F43D
+:102E90008130F1F405C0833049F08430C9F40FC0AB
+:102EA0000E94341708950E9419170895AF014A5FD0
+:102EB0005F4F6581772784810E9406170895AF01CF
+:102EC0004A5F5F4F6581772784810E94F8160895D5
+:102ED00080818093320383E0809333031092340324
+:102EE00083E090E00E949C0108951F920F920FB61C
+:102EF0000F9211240F900FBE0F901F9018959C01F8
+:102F00000897029718F084E090E00895F901EE0F19
+:102F1000FF1FE35AFE4F8DE090E0928381832830BB
+:102F20003105B1F02930310519F087E090E00895BE
+:102F3000259A81E090E0909389008093880081E851
+:102F40008093800089E08093810081E090E0089583
+:102F5000249A81E08093B30089E68093B00081E0F9
+:102F600090E008959C01FC01EE0FFF1FE35AFE4F15
+:102F7000818192810D9719F086E090E008952830C4
+:102F8000310539F12930310519F087E090E00895D5
+:102F900063307105B1F06430710544F4613071053E
+:102FA00061F06230710509F040C009C064307105FC
+:102FB00051F065307105C9F508C081E007C082E0B5
+:102FC00005C083E003C084E001C085E080938100F8
+:102FD00029C064307105E9F06530710554F4623040
+:102FE000710599F06330710594F461307105E9F46D
+:102FF0000AC06630710589F06630710564F067308B
+:10300000710599F40CC089E60BC08AE609C08BE60D
+:1030100007C08CE605C08DE603C08EE601C08FE6D2
+:103020008093B00081E090E0089581E090E0089501
+:103030009C01FC01EE0FFF1FE35AFE4F818192813C
+:103040000D9719F086E090E008952830310569F079
+:103050002930310519F087E090E0089570938900D8
+:103060006093880081E090E008956093B30081E070
+:1030700090E0089523E5209332030E94181880936E
+:1030800033031092340383E090E00E949C01089582
+:1030900022E5209332030E94B217809333031092EB
+:1030A000340383E090E00E949C01089520E5209382
+:1030B00032030E947F17809333031092340383E01E
+:1030C00090E00E949C0108959C01FC01EE0FFF1FFF
+:1030D000E35AFE4F82E090E09283818328303105ED
+:1030E00031F02930310531F086E090E008951092FA
+:1030F000B00004C01092810010928000822F0E94C4
+:103100007C0D81E090E0089521E5209332030E9438
+:103110006418809333031092340383E090E00E949C
+:103120009C010895FC018081813579F0823518F485
+:103130008035F1F405C0823569F08335C9F411C0DA
+:10314000828199270E9456180895828199270E94AA
+:103150008418089563817727828199270E944818EF
+:10316000089563817727828199270E943A180895EC
+:103170008093320383E0809333031092340383E01F
+:1031800090E00E949C010895CF93DF93AC010297D9
+:1031900010F442E050E0A091B704B091B804FD01F2
+:1031A000C0E0D0E020E030E020C080819181841731
+:1031B000950769F482819381209719F09B838A8314
+:1031C00004C09093B8048093B704CF0132C048176D
+:1031D000590738F42115310519F08217930708F4BF
+:1031E0009C01EF010280F381E02D3097F1F621156B
+:1031F000310589F1C901841B950B049708F4A901D5
+:10320000E0E0F0E026C08D919C9111978217930722
+:10321000E9F44817590779F4ED018A819B813097C9
+:1032200019F09383828304C09093B8048093B70409
+:10323000CD01029649C0841B950BFD01E80FF91FD3
+:103240004193519302978D939C933AC0FD01A281C3
+:10325000B3811097C1F68091B5049091B604892B83
+:1032600041F480915001909151019093B604809364
+:10327000B50420915201309153012115310541F4DB
+:103280002DB73EB780914E0190914F01281B390B0D
+:10329000E091B504F091B6042E1B3F0B24173507BF
+:1032A00088F0CA0102962817390760F0CF01840F11
+:1032B000951F02969093B6048093B5044193519361
+:1032C000CF0102C080E090E0DF91CF910895CF93CD
+:1032D000DF93009709F44EC0EC0122971B821A82FB
+:1032E000A091B704B091B804109711F140E050E0FC
+:1032F00001C0DC01AC17BD0700F1BB83AA83FE014E
+:1033000021913191E20FF31FEA17FB0771F42E5F51
+:103310003F4F8D919C911197820F931F99838883C2
+:10332000FD01828193819B838A834115510559F464
+:10333000D093B804C093B7041DC0FD01828193816E
+:10334000AD010097B1F6FA01D383C2832191319187
+:10335000E20FF31FEC17FD0769F42E5F3F4F8881E2
+:103360009981820F931FFA01918380838A819B81C7
+:1033700093838283DF91CF91089597FB092E0726CF
+:103380000AD077FD04D027D006D000201AF470951B
+:1033900061957F4F0895F6F7909581959F4F089519
+:1033A00097FB092E05260ED057FD04D028D00AD051
+:1033B000001C38F450954095309521953F4F4F4F64
+:1033C0005F4F0895F6F790958095709561957F4FC2
+:1033D0008F4F9F4F0895AA1BBB1B51E107C0AA1F27
+:1033E000BB1FA617B70710F0A61BB70B881F991FA6
+:1033F0005A95A9F780959095BC01CD010895A1E259
+:103400001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F5E
+:10341000FF1FA217B307E407F50720F0A21BB30BA9
+:10342000E40BF50B661F771F881F991F1A9469F725
+:1034300060957095809590959B01AC01BD01CF0181
+:023440000895ED
+:10344200456D62656464656450726F6A6563747326
+:10345200004F63746F70757355534220496E7465E3
+:10346200726661636520436F6E7665727465722061
+:10347200616E6420492F4F20457874656E73696FC1
+:103482006E0032303038313130380009040020000B
+:04349200B904000079
:00000001FF
diff --git a/firmware/octopus_can_stable_1_1.hex b/firmware/octopus_can_stable_1_1.hex
deleted file mode 100644
index cf06536..0000000
--- a/firmware/octopus_can_stable_1_1.hex
+++ /dev/null
@@ -1,1133 +0,0 @@
-:100000000C94FA000C9419010C9419010C94190128
-:100010000C9419010C94EB030C9419010C94190124
-:100020000C9419010C9419010C9419010C941901E8
-:100030000C94BF190C9419010C9419010C9419011A
-:100040000C9419010C94C4030C94E61F0C94190130
-:100050000C9419010C941B010C9419010C941901B6
-:100060000C9419010C9419010C9419010C941901A8
-:100070000C9419010C9419010C9419010C94190198
-:100080000C9419010C9419010C9419010C94190188
-:100090000C941901061008100A100C100E10101004
-:1000A00012101410161018101A101C101E10201008
-:1000B00022102410261028102A1054105410541006
-:1000C0005410541054102C102E10301032103410C4
-:1000D0003A103810361038103A103C103E104010CC
-:1000E00042104410461048104A104E109D109F10A8
-:1000F000A110A310A510A710A910AB10AD10AF1040
-:10010000B110B310B510B710B910BB10BD10BF10AF
-:10011000C110EB10EB10EB10EB10EB10EB10C31059
-:10012000C510C710C910CB10D110CF10CD10CF10F3
-:10013000D110D310D510D710D910DB10DD10DF107F
-:10014000E110E51056115C11621168116E11741105
-:100150007A11801186118C11921198119E11A4119F
-:10016000AA11B011B611BC11C21153115311531180
-:10017000531153115311C811CE11D411DA11E011DA
-:10018000F211EC11E611EC11F211F811FE1104124A
-:1001900010120A120A12101216121C12651268129C
-:1001A0006B126E127112741277127A127D12801213
-:1001B0008312861289128C128F1292129512981243
-:1001C0009B126212621262126212621262129E121A
-:1001D000A112A412A712AA12B312B012AD12B01239
-:1001E000B312B612B912BC12C212BF12BF12C2129F
-:1001F000C512C81211241FBECFEFD0E1DEBFCDBFA4
-:1002000013E0A0E0B1E0E8E7F4E400E00BBF02C0D7
-:1002100007900D92A633B107D9F716E0A6E3B3E035
-:1002200001C01D92A937B107E1F70E9430010C947B
-:100230003B220C9400001F920F920FB60F921124D4
-:100240000F900FBE0F901F901895FC0120E030E03A
-:1002500002C02F5F3F4F81918823D9F7C9010895CC
-:10026000CCEFD0E1DEBFCDBFF8940E9464090E94BC
-:10027000D20E8FEF84B985B92F980E94BE0981E80C
-:1002800097E10E94090A85E69CE00E940E0A81E03F
-:1002900090E00E94130ADE011196E2EEF2E083E0A4
-:1002A00001900D928150E1F7CE0101960E94080E57
-:1002B00080E091E00E94A40E81E191E00E949C0EFA
-:1002C00082E491E00E94940E0E94DE0D4C0164E6EF
-:1002D00070E00E94210A60E070E0C4010E944A0DB3
-:1002E0003C0140E050E0BC01C4010E94420A22E10E
-:1002F000A22E22E0B22ECC24DD2490E4E92EF12CB3
-:1003000002E021E030E041E050E0B301C4010E948E
-:10031000DF0C84E3A82E83E0B82E21E030E041E03A
-:1003200050E0B301C4010E94170D10929403109283
-:10033000930310929603109295030E94041B8FE77B
-:1003400087B98AE288B90E940F0485E588B90E94BE
-:100350000F0418B80E94580F0E9464090E94D70E1B
-:100360007894FFCF0F931F93CF93DF93EC018134E9
-:10037000910510F180919F039091A003892BE1F4E6
-:10038000DF93CF938BE491E09F938F930E94FD1AAC
-:1003900010929C0310929B03D0939E03C0939D03E5
-:1003A00081E090E09093A00380939F03C0E4D0E0AD
-:1003B0000F900F900F900F9068E08BE20E94A909B8
-:1003C00000E010E00EC0E0919B03F0919C03E00F71
-:1003D000F11FEB51FB4F608189E20E94A9090F5F79
-:1003E0001F4F0C171D0779F7809193039091940389
-:1003F000019749F467E08BE20E94A90910929403E7
-:10040000109293030AC063E08BE20E94A90981E085
-:1004100090E09093940380939303DF91CF911F9189
-:100420000F910895CF93DF9380919F039091A00344
-:10043000019709F04CC088E791E09F938F930E9449
-:10044000FD1A20919B0330919C0380919D03909114
-:100450009E030F900F9028173907C8F586E991E0A1
-:100460009F938F930E94FD1AC0919D03D0919E038C
-:1004700080919B0390919C03C81BD90B80919B0397
-:1004800090919C03805C9F4F90939C0380939B036F
-:100490000F900F90C134D1055CF08FEB91E09F93EA
-:1004A0008F930E94FD1A80E490E00E94B2010DC07B
-:1004B0008BED91E09F938F930E94FD1ACE010E94D5
-:1004C000B2011092A00310929F030F900F90DF9142
-:1004D000CF9108950F931F93CF93DF938C011092C8
-:1004E0009C0310929B031092A00310929F032F9ADB
-:1004F000FC018081282F22952F70C22FDD2799279C
-:100500009F938F93DF93CF9388EE91E09F938F9388
-:100510000E94FD1A8DB79EB706960FB6F8949EBF3F
-:100520000FBE8DBFC430D10509F451C0C530D1050F
-:1005300084F4C130D10569F1C230D1051CF4CD2B52
-:10054000C1F077C0C230D10571F1239709F071C0B5
-:1005500034C0C630D10509F44EC0C630D1050CF404
-:1005600040C0C730D10509F450C0289709F061C0D8
-:1005700056C0F8018081863041F48281813009F0D3
-:100580006DC0C8010E948C1969C0C8010E94510F3A
-:1005900065C088E092E09F938F930E94FD1AC80186
-:1005A0000E94AA1359C08BE192E09F938F930E94FF
-:1005B000FD1AC8010E940C154FC08FE292E09F9374
-:1005C0008F930E94FD1AC8010E942C1645C083E437
-:1005D00092E09F938F930E94FD1AC8010E94AA1770
-:1005E0003BC087E592E09F938F930E94FD1AC8015C
-:1005F0000E94CB1A31C08BE192E09F938F930E94AF
-:10060000FD1AC8010E94F60527C08BE692E09F9371
-:100610008F930E94FD1AC8010E94431F1DC08FE7DF
-:1006200092E09F938F930E94FD1AC8010E94CA20F6
-:1006300013C086E992E09F938F930E94FD1AF80100
-:1006400080818093E50483E08093E6041092E704C0
-:1006500083E090E00E94B2010F900F902F98DF91FD
-:10066000CF911F910F9108950F931F93CF93DF9315
-:10067000EC018C010F5F1F4F898199279F938F9306
-:1006800083EA92E09F938F930E94FD1A80919503D5
-:10069000909196030F900F900F900F90019791F506
-:1006A00087EC92E09F938F930E94FD1A20E030E048
-:1006B0000F900F90E0919703F0919803E20FF31FD2
-:1006C000DE01A20FB31F8C91EB55FC4F80832F5F8F
-:1006D0003F4F2034310571F7809197039091980333
-:1006E000805C9F4F9093980380939703209197038A
-:1006F000309198038091990390919A0328173907B4
-:10070000F0F128C081ED92E09F938F930E94FD1A33
-:10071000109298031092970320E030E00F900F9012
-:10072000E0919703F0919803E20FF31FDE01A20F0F
-:10073000B31F8C91EB55FC4F80832F5F3F4F2034CC
-:10074000310571F73093980320939703F8012081C6
-:10075000203448F4109296031092950385EA93E0B2
-:100760000E946A020CC081E090E09093960380930F
-:100770009503822F992790939A0380939903DF9191
-:10078000CF911F910F9108951F920F920FB60F9264
-:1007900011242F933F934F935F936F937F938F9386
-:1007A0009F93AF93BF93EF93FF930E94230F80918A
-:1007B0003F0386BDFF91EF91BF91AF919F918F91C4
-:1007C0007F916F915F914F913F912F910F900FBE4D
-:1007D0000F901F9018951F920F920FB60F92112431
-:1007E0002F933F934F935F936F937F938F939F9339
-:1007F000AF93BF93EF93FF930E94AC0EFF91EF91E5
-:10080000BF91AF919F918F917F916F915F914F9128
-:100810003F912F910F900FBE0F901F90189520E0E1
-:1008200080E49CE90197F1F72F5F2931C9F708951A
-:10083000882329F0813071F084E090E008958EE003
-:100840008093690380936A0388E18093C10081E00B
-:1008500090E008958EE080934E0380934F0388E1EB
-:100860008093C90081E090E00895882329F08130C9
-:1008700091F084E090E008951092690310926A0369
-:100880001092C5001092C4001092C1001092C200D4
-:1008900081E090E0089510924E0310924F03109261
-:1008A000CD001092CC001092C9001092CA0081E0D5
-:1008B00090E008950F93882329F0813041F084E07F
-:1008C00090E00BC02093C5006093C40004C0209347
-:1008D000CD006093CC0081E090E00F9108956230EC
-:1008E00011F492E001C090E0882329F0813071F08A
-:1008F00084E090E008958091C200990F990F990FBC
-:10090000982B9093C20081E090E008958091CA00F6
-:10091000990F990F990F982B9093CA0081E090E05E
-:100920000895663061F0673019F0653019F404C03D
-:1009300021E003C021E004C020E090E002C020E0FC
-:1009400091E0882329F0813079F084E090E00895E7
-:100950008091C200220F220F990F922B982B909317
-:10096000C20081E090E008958091CA00220F220F1A
-:10097000990F922B982B9093CA0081E090E00895F4
-:10098000653439F06F3419F421E091E004C020E0BF
-:1009900001C021E090E0882329F0813089F084E0D3
-:1009A00090E008958091C2002295220F207E9295BA
-:1009B000907F922B982B9093C20081E090E0089555
-:1009C0008091CA002295220F207E9295907F922BD3
-:1009D000982B9093CA0081E090E00895882329F035
-:1009E000813061F084E090E008958091C00085FF3F
-:1009F000FCCF6093C60081E090E008958091C8002C
-:100A000085FFFCCF6093CE0081E090E00895FF92D7
-:100A10000F931F93CF93DF93F82EEB018A0181E0B0
-:100A20008F1548F484E090E00DC0F80161918F01CA
-:100A30008F2D0E94EE042197FFEFCF3FDF07A9F72C
-:100A400081E090E0DF91CF911F910F91FF90089589
-:100A5000882329F0813051F084E090E0089580915E
-:100A6000C00087FFFCCF8091C60006C08091C800FF
-:100A700087FFFCCF8091CE0099270895FF920F93B6
-:100A80001F93CF93DF93F82E8B0181E08F1518F41D
-:100A900084E090E00EC0EA0107C08F2D0E94280577
-:100AA000F80181938F0121971C161D06B4F381E094
-:100AB00090E0DF91CF911F910F91FF9008957727DC
-:100AC0000E9407058093E6041092E70483E090E01B
-:100AD0000E94B20108950E9491048093E60410924E
-:100AE000E70483E090E00E94B20108950E9491041F
-:100AF0008093E6041092E70483E090E00E94B20144
-:100B000008950E946F048093E6041092E70483E046
-:100B100090E00E94B20108950F930E945A048093BE
-:100B2000E6041092E70483E090E00E94B2010F9186
-:100B300008950E9435048093E6041092E70483E050
-:100B400090E00E94B20108950E9418048093E60488
-:100B50001092E70483E090E00E94B2010895CF92E2
-:100B6000DF92EF92FF920F931F93CF93DF93CDB756
-:100B7000DEB78B01CDB6DEB62DB73EB7261B370BE1
-:100B80000FB6F8943EBF0FBE2DBFEDB6FEB608946B
-:100B9000E11CF11CAB01B7010E943E058093E60405
-:100BA00020E030E00AC0F701E20FF31F8081F90175
-:100BB000E951FB4F80832F5F3F4F201731079CF394
-:100BC000F801E951FB4F1082C80103960E94B2015F
-:100BD0000FB6F894DEBE0FBECDBEDF91CF911F9150
-:100BE0000F91FF90EF90DF90CF9008950F93FC014D
-:100BF00080818093E504843611F1853648F482368D
-:100C0000B1F08336E0F4803651F0813681F50BC0C7
-:100C1000873639F18836E9F0853649F515C0828185
-:100C20000E94A4052DC082810E94990529C00681D9
-:100C300025814481638182810E948C0521C063816A
-:100C400082810E9481051CC0638182810E946B05A4
-:100C500017C0AF014C5F5F4F638182810E945F05C7
-:100C60000FC06381772782810E94AF0509C083E0AE
-:100C70008093E6041092E70483E090E00E94B201C2
-:100C80000F91089587E280934D0685E280934C068C
-:100C900090E290934E0610924F0628E030E0309399
-:100CA00051062093500683E28093590681E2809397
-:100CB000580690935A0610925B0630935D06209377
-:100CC0005C06089508956091650681E20E94A90975
-:100CD000089568E08BE20E94A90961E188E20E9420
-:100CE000A90968E08FE20E94A90961E18CE20E94F3
-:100CF000A90961E08FE20E94A90910929403109261
-:100D0000930365E083E20E94A90908950F931F935E
-:100D10008C0160E480E20E94A909F80162816058B8
-:100D200084E00E94A909F8018281809364061F91E2
-:100D30000F9108950F931F93CF93DF93EC012885B4
-:100D4000398512161306DCF58E819F818217930771
-:100D50001CF568E083E20E94A90900E010E00FC0E2
-:100D60008A859B85E80FF91F608181E20E94A909AD
-:100D70008E819F8101969F838E830F5F1F4FEE812F
-:100D8000FF8188859985083011051CF4E817F9075B
-:100D90003CF3E817F90724F061E087E20E94A90913
-:100DA0008B81813031F465E089810E94A9091B8221
-:100DB00006C061E089810E94A90981E08B83DF91EF
-:100DC000CF911F910F910895CF93DF93CDB7DEB7E9
-:100DD00024970FB6F894DEBF0FBECDBFDC01FC0137
-:100DE0002281338110925F0610925E0681E080932B
-:100DF0005B06832F99278230D9F0833069F18130E7
-:100E000009F057C080913806992790936106809326
-:100E1000600688E396E0909363068093620686817D
-:100E200097818034910509F044C088E090E029C0A2
-:100E3000FD01868197819093610680936006E22F81
-:100E4000FF27EE0FFF1F80914A0690914B06E80F97
-:100E5000F91F8081918129C02223C1F0E22FFF2751
-:100E6000EE0FFF1F8091A3039091A403E80FF91FD9
-:100E70000190F081E02DF0936306E093620680819B
-:100E80009927909361068093600613C094E099833C
-:100E900083E08A8389E08B839C8384E090E0909355
-:100EA000610680936006CE0101969093630680935D
-:100EB000620688E596E00E949A0624960FB6F8949A
-:100EC000DEBF0FBECDBFDF91CF910895CF93DF93EB
-:100ED00082E20E948409C82FDD27C5FF1AC068E09E
-:100EE00083E20E94A909C6FF10C020915E063091DE
-:100EF0005F068091600690916106281739072CF4EF
-:100F000088E596E00E949A0604C061E087E20E94AC
-:100F1000A909DF91CF9108951F93CF93DF9388E0C4
-:100F20000E948409182FC82FDD27C6FF18C060E073
-:100F300085E00E94A90960E884E00E94A90960E0B8
-:100F400080E20E94A90968E083E20E94A90961E0A9
-:100F500087E20E94A90962E085E00E94A909C4FF16
-:100F600004C060EC89E00E94A90917FF04C060ED8D
-:100F700089E00E94A909DF91CF911F9108958AE02D
-:100F80000E948409992780FF03C00E946607089584
-:100F900081FF0DC08AE20E9484098091250681307C
-:100FA00061F4E0912806F09129060995089582E3FD
-:100FB0000E9484098AE30E94840908958EE00E94B9
-:100FC000840968E08FE20E94A90961E08FE20E9433
-:100FD000A909209160063091610680915C0690918C
-:100FE0005D06821793075CF468E083E20E94A9091A
-:100FF00061E087E20E94A90981E080935B06089581
-:10100000AF92BF92CF92DF92EF92FF920F931F9316
-:10101000CF93DF93CDB7DEB728970FB6F894DEBF36
-:101020000FBECDBF86E20E94840986FF7EC08E017E
-:101030000F5F1F4F580169E0C62ED12CCC0EDD1E6C
-:1010400080914C060E948409F80181938F017501FB
-:10105000EC15FD05A9F768E087E20E94A90968E0A0
-:1010600083E20E94A90980E20E9484098F77682F99
-:1010700080E20E94A9098981992780769070803248
-:10108000910509F440C080349105D1F1892BF1F527
-:10109000F50181818630D9F0873048F48130F1F153
-:1010A0008130C8F08330D1F1853081F521C089309D
-:1010B00019F18A3018F4883049F505C08A3071F189
-:1010C0008B3021F520C0C5010E94630627C0C501F1
-:1010D0000E94E40623C068E083E20E94A90961E05F
-:1010E00081E20E94A90960E081E20E94A9090BC087
-:1010F000C5010E94860612C0C5010E9469060EC085
-:10110000C5010E94620965E083E206C080E20E9498
-:1011100084098058682F80E20E94A909F701808124
-:101120008823D1F465E083E215C0209160063091F8
-:10113000610680915C0690915D068217930764F4C6
-:10114000109261061092600668E083E20E94A9098D
-:1011500061E087E20E94A90928960FB6F894DEBFE5
-:101160000FBECDBFDF91CF911F910F91FF90EF90F8
-:10117000DF90CF90BF90AF900895CF92DF92EF9223
-:10118000FF920F931F93CF93DF93CDB7DEB7C05479
-:10119000D0400FB6F894DEBF0FBECDBF8CE00E94EA
-:1011A0008409992780FF03C00E9400087BC081FF4B
-:1011B0002AC08EE20E9484098DE20E9484098983FC
-:1011C0008E010F5F1F4F6801FFE3EF2EF12CE00E41
-:1011D000F11E0F5F1F4F0E947209F80180830E15E8
-:1011E0001F05B9F780913603813031F4E09139035E
-:1011F000F0913A03C601099568E08FE20E94A909BF
-:1012000061E08FE22BC082FF2CC086E30E9484093C
-:1012100085E30E94840989838E010F5F1F4F680157
-:10122000EFE3EE2EF12CE00EF11E0F5F1F4F0E9438
-:101230007209F80180830E151F05B9F780913703F5
-:10124000813031F4E0913B03F0913C03C6010995F4
-:1012500068E087E30E94A90961E087E30E94A90989
-:1012600021C083FF1FC08EE30E9484098E010F5F9F
-:101270001F4F680171E4E72EF12CEC0EFD1E8DE38B
-:101280000E948409F80181938F01EE15FF05B9F7DB
-:1012900080913803813031F4E0913903F0913A03C1
-:1012A000C6010995C05CDF4F0FB6F894DEBF0FBED4
-:1012B000CDBFDF91CF911F910F91FF90EF90DF9005
-:1012C000CF9008950895089581E080936A0080E1A9
-:1012D0008DBB83B3876083BB84B3836084BB3F9A39
-:1012E000479A089588B1805888B984B322E082274C
-:1012F00084BB0000000080B198B1905898B994B3B5
-:10130000922794BB992708959FEF91B982B988B12C
-:10131000805888B984B395E0892784BB88B1805808
-:1013200088B984B3892784BB000011B80E94720970
-:101330009927089582B988B1805888B984B391E01B
-:10134000892784BB88B1805888B984B3892784BB36
-:10135000089582B98FEF81B988B1805888B984B374
-:1013600095E0892784BB88B1805888B984B38927E0
-:1013700084BB862F0E949A090895089582E1809384
-:10138000380681E08093390680E191E090933B0636
-:1013900080933A0610923C0610923D0610923E064B
-:1013A00088E080933F06109241061092400610920A
-:1013B000430610924206109245061092440610927F
-:1013C000460610924706109248061092490610925F
-:1013D00036031092370310923803109225061092AC
-:1013E00026061092270610922F0610922E061092B3
-:1013F000A2031092A10308959093410680934006A2
-:10140000709343066093420650934506409344060A
-:101410000895909341068093400608959093430663
-:10142000809342060895909345068093440608955C
-:1014300080933C06089580933D06089580933E0670
-:101440000895CF93DF939C01CB01E0912E06F0919C
-:101450002F0662E070E00E9414220FC0A081B181CB
-:101460008281823039F4ED018D81992782179307AB
-:1014700009F468870780F085E02D309779F7DF91D0
-:10148000CF910895CF93DF939C01E0912E06F091C8
-:101490002F0614C0A081B1818281843061F48481DF
-:1014A00099278217930739F486819927861797071A
-:1014B00011F4ED014B830780F085E02D309751F753
-:1014C000DF91CF910895BF92CF92DF92EF92FF927A
-:1014D0000F931F93CF93DF936C01162FF42EB22E30
-:1014E000C0912E06D0912F062097A1F489E090E0BC
-:1014F0000E941621FC0190932F0680932E06D18224
-:10150000C082138310861782F282B4820583E6823A
-:1015100015C0EC018F8198850097D9F789E090E09C
-:101520000E941621FC0198878F83D182C082138389
-:10153000F282B4820583E68210861782DF91CF9112
-:101540001F910F91FF90EF90DF90CF90BF90089583
-:10155000EF92FF921F93CF93DF937C01C091A10381
-:10156000D091A203209711F011E012C085E090E025
-:101570000E941621FC019093A2038093A103F182A3
-:10158000E08212821482138210E012C01F5FEC010D
-:101590008B819C810097D1F785E090E00E94162115
-:1015A000FC019C838B83F182E0821283148213827C
-:1015B000812F9927DF91CF911F91FF90EF90089590
-:1015C000EF92FF920F931F93CF93DF93E091A103CC
-:1015D000F091A20380E090E00380F481E02D019679
-:1015E0003097D1F7880F991F0E9416219093A4037A
-:1015F0008093A3030091A1031091A203E801E88066
-:10160000F9808A81C82FDD27CC0FDD1F8091A303CD
-:101610009091A403C80FD91FF701808199270E94D8
-:1016200016219983888320E030E017C0E801EA8121
-:10163000FF27EE0FFF1F8091A3039091A403E80FF3
-:10164000F91F0190F081E02DE20FF31FD701A20FE7
-:10165000B31F8C9180832F5F3F4FF70180819927C3
-:10166000281739071CF3E8018B819C81009711F042
-:101670008C01C4CFDF91CF911F910F91FF90EF901C
-:1016800008954F925F926F927F928F929F92AF9246
-:10169000BF92CF92DF92EF92FF920F931F93CF935F
-:1016A000DF93E0912E06F0912F066624772409C07F
-:1016B0008281823019F40894611C711C0780F085C6
-:1016C000E02D3097A9F74301880C991CC4010E94B2
-:1016D000162190934B0680934A06E1E0EE2EF12C02
-:1016E000AA24BB2455C0E0912E06F0912F0679E084
-:1016F000C72ED12C15C0A081B181848199278E1568
-:101700009F0519F48381C80ED11CED018D818E15C2
-:1017100021F48281823009F45D010780F085E02D9B
-:10172000309749F700914A0610914B06025010403D
-:10173000080D191DC6010E941621F80191838083AE
-:1017400020E030E0E0914A06F0914B06E80DF91DEB
-:1017500032970190F081E02DE20FF31FD501A20F27
-:10176000B31F8C9180832F5F3F4F2930310551F794
-:10177000E0914A06F0914B06E80DF91D3297019071
-:10178000F081E02D8C2D875F82830894E11CF11C91
-:101790006E147F040CF0A7CF61E0C62ED12C59E067
-:1017A000A52EB12C4424552442E0842E912CA1C0B6
-:1017B000A0912E06B0912F0612C0ED91FC911197C9
-:1017C0008181823049F4858199278C159D0521F40A
-:1017D0008481482E552405C0ED01AF81B88510974E
-:1017E00061F731E0E32EF12C79C060912E06709103
-:1017F0002F066DC0FB01C081D1818981843009F041
-:1018000063C0868199278E159F0509F05DC084818C
-:1018100099278C159D0509F057C0950140E050E0CF
-:10182000E0914A06F0914B06E80DF91D32970190C0
-:10183000F081E02DE20FF31FDE01A40FB51F8C91A4
-:1018400080832F5F3F4F4F5F5F4F4930510541F716
-:1018500089E090E0A80EB91EC0912E06D0912F0607
-:1018600031C08A81853059F58C8199278C159D0569
-:1018700031F58D8199278E159F0509F5088119810C
-:10188000950140E050E0E0914A06F0914B06E80DEA
-:10189000F91D32970190F081E02DE20FF31FD8017E
-:1018A000A40FB51F8C9180832F5F3F4F4F5F5F4F19
-:1018B0004730510541F7E7E0F0E0AE0EBF1E0F8064
-:1018C000D885C02D209769F6EB016F817885611569
-:1018D000710509F08FCF0894E11CF11C4E145F04D0
-:1018E0000CF083CF0894C11CD11CE2E0F0E08E0E16
-:1018F0009F1E6C147D040CF05BCFDF91CF911F9184
-:101900000F91FF90EF90DF90CF90BF90AF909F909E
-:101910008F907F906F905F904F9008956F927F921D
-:101920008F929F92AF92BF92CF92DF92EF92FF92EF
-:101930000F93CF93DF935C013B014901E0912E06A9
-:10194000F0912F0616C0A081B18184819927A81635
-:10195000B90661F4868199278615970539F4828145
-:10196000843021F4ED018C818F5F8C830780F085BA
-:10197000E02D309741F787E090E00E941621FC01AE
-:1019800087E0808385E0818382820383F582E4821D
-:10199000C682EE24062D2A2D45E067E0CF010E9485
-:1019A000630ADF91CF910F91FF90EF90DF90CF907E
-:1019B000BF90AF909F908F907F906F900895AF925F
-:1019C000BF92CF92DF92EF92FF920F93FC01A1148E
-:1019D000B10401F14230510571F04330510599F0E5
-:1019E00041305105B9F481E080932506B092290673
-:1019F000A09228060FC081E080932606B0922B06A5
-:101A0000A0922A0607C081E080932706B0922D0697
-:101A1000A0922C0620583F4FCF010E948E0C0F91B0
-:101A2000FF90EF90DF90CF90BF90AF900895AF926E
-:101A3000BF92CF92DF92EF92FF920F93FC01423060
-:101A4000510571F04330510599F041305105B9F419
-:101A500081E080933603B0923A03A09239030FC01D
-:101A600081E080933703B0923C03A0923B0307C010
-:101A700081E080933803B0923E03A0923D03CF01F2
-:101A80000E948E0C0F91FF90EF90DF90CF90BF904F
-:101A9000AF900895CF92DF92EF920F931F93CF9361
-:101AA000DF936C018B01A0912E06B0912F06C0E050
-:101AB000D0E014C02D913C911197F90185818C15CE
-:101AC00051F4FD018281823031F4F90184818F5F0C
-:101AD0008483C82FDD27FD01A781B085109751F7BA
-:101AE00089E090E00E941621FC0189E0808384E077
-:101AF00081830283138214821582168217821086D4
-:101B0000EC2E00E02C2D44E069E0CF010E94630A36
-:101B1000CE01DF91CF911F910F91EF90DF90CF9089
-:101B20000895BF92CF92DF92EF92FF920F931F938F
-:101B3000CF93DF936C017B01142FB22EA0912E0660
-:101B4000B0912F06C0E0D0E014C02D913C911197C8
-:101B5000F90185818C1551F4FD018281823031F4C7
-:101B6000F90184818F5F8483C82FDD27FD01A78160
-:101B7000B085109751F789E090E00E941621FC0192
-:101B800089E0808384E08183E2821382148215835A
-:101B9000B68207831086EC2E00E02C2D44E069E02D
-:101BA000CF010E94630ACE01DF91CF911F910F9167
-:101BB000FF90EF90DF90CF90BF900895EF920F933A
-:101BC0001F93109149061F5F1093490689E090E02A
-:101BD0000E941621FC0189E0808389E090E09383D4
-:101BE000828382E0818314821583168280EA878350
-:101BF0008AE18087EE2400E020E042E069E0CF0146
-:101C00000E94630A812F99271F910F91EF900895E9
-:101C1000CF93DF93EC01FC0101900020E9F7E81B72
-:101C2000F90BCF01880F991F0E9416219C01FE011C
-:101C300001900020E9F7EC1BFD0BEE0FFF1FDC010C
-:101C4000EC9383E0F901818340E050E009C0FE019C
-:101C5000E40FF51F80818C93FD0111824F5F5F4F70
-:101C60001296FE0101900020E9F73197EC1BFD0B65
-:101C70004E175F0760F3C9010E94A80A9927DF91F8
-:101C8000CF910895EF92FF920F931F93CF93DF931D
-:101C90008C017B01CA010E94080E9C01E0912E0676
-:101CA000F0912F0614C0A081B1818281843061F44B
-:101CB000848199278017910739F4868199278E1599
-:101CC0009F0511F4ED0128870780F085E02D3097FE
-:101CD00051F7DF91CF911F910F91FF90EF900895F1
-:101CE0000F931F93CF93DF938C01CB010E94080EBB
-:101CF0009C01E0912E06F0912F060FC0A081B181CA
-:101D00008281823039F4ED018D8199278017910706
-:101D100009F42E830780F085E02D309779F7DF9165
-:101D2000CF911F910F9108950E94080E1816190661
-:101D300014F48093480608950E94080E1816190698
-:101D400014F48093470608950E94080E1816190689
-:101D500014F48093460608951F9386E00E94840938
-:101D6000992786FF03C00E94BD080EC082FF03C0F2
-:101D70000E94BF0709C081FF03C00E948C0704C0F6
-:101D800084FF02C00E94DE0787E00E948409182FAA
-:101D900060E087E00E94A909612F87E00E94A909FD
-:101DA0001F91089562E081E00E94A90908950E94B0
-:101DB000410B0E94E00A0E94420661E080E00E941E
-:101DC000A90980E00E94840980FDFBCF62E081E0E8
-:101DD0000E94A90960E884E00E94A90960E480E209
-:101DE0000E94A90968E083E20E94A90969E087E2EC
-:101DF0000E94A9096FE08DE00E94A9096FE08BE0C5
-:101E00000E94A90968ED89E00E94A90963E38FE0B7
-:101E10000E94A90966ED87E00E94A90962E085E0B9
-:101E20000E94A9096CEC80E00E94A90908958EEC3B
-:101E300080933F0381E080936E0080913F0386BDD5
-:101E400083E084BD08950895089583E08093E504B8
-:101E500081E08093E6048BE08093E7042FE62093F3
-:101E6000E80493E69093E90484E78093EA042093DE
-:101E7000EB049093EC0481E68093ED048EE680936E
-:101E8000EE048FE58093EF0480E38093F00481E318
-:101E90008093F1041092F2048EE090E00E94B2016F
-:101EA0000895FC018081833011F40E94250F08956C
-:101EB0001F9311E0812F0E94631060E0812F0E9428
-:101EC00037111F5F1431B1F718E1812F0E946310A1
-:101ED00060E0812F0E9437111F5F1B32B1F71F9105
-:101EE0000895CF93DF93DC01EC01EA81FB8121911E
-:101EF0008E81815019F48981E81BF109ED01FB8382
-:101F0000EA838E839FB7F8948C9181508C939FBF06
-:101F1000822F9927DF91CF910895FC01108275835C
-:101F20006483738362834183478346830895CF9399
-:101F3000DF93DC019C91ED018981981718F080E016
-:101F400090E016C0ED01EC81FD8161938F8181509D
-:101F500019F48981E81BF109ED018F83FD83EC837E
-:101F60009FB7F8948C918F5F8C939FBF81E090E036
-:101F7000DF91CF910895FC0180818823E9F3CF019F
-:101F80000E94710F99270895FC018081882319F41C
-:101F90008FEF9FEF0895CF010E94710F9927089549
-:101FA00081E090E0089581E090E0089581E090E084
-:101FB000089581E090E00895CF93DF93CDB7DEB729
-:101FC00022970FB6F894DEBF0FBECDBF982F815079
-:101FD000833120F08751833108F066C0E92FFF2755
-:101FE000E15CFC4F82E08183892F9927AA27BB27D8
-:101FF000FC013197EC32F10508F056C0E65BFF4F6B
-:10200000EE0FFF1F0590F491E02D09946D9A43C0E7
-:102010006E9A45C06F9A3FC0209A41C0219A3BC03A
-:10202000229A3DC0239A37C0249A39C0259A33C0DA
-:10203000269A35C0279A2FC0509A31C0519A2BC08A
-:10204000529A2DC0539A27C0549A29C0559A23C03A
-:10205000569A25C0579A1FC0389A21C0399A1BC07A
-:102060003A9A1DC03B9A17C03C9A19C0879A13C070
-:10207000869A15C0859A0FC0849A11C0839A0BC0A6
-:10208000829A0DC0699A07C0689A09C0689A03C00D
-:10209000699A05C06A9A81E090E008C06B9AE1E015
-:1020A000F0E0FA83E98304C084E090E09A838983B6
-:1020B00089819A8122960FB6F894DEBF0FBECDBFFC
-:1020C000DF91CF910895982F8150833130F087515F
-:1020D000833118F084E090E00895892F0E94DC0F8E
-:1020E00081E090E00895CF93DF93CDB7DEB72297DC
-:1020F0000FB6F894DEBF0FBECDBF982F815083314D
-:1021000020F08751833108F066C0E92FFF27E15C9A
-:10211000FC4F81E08183892F9927AA27BB27FC01E7
-:102120003197EC32F10508F056C0EA58FF4FEE0F38
-:10213000FF1F0590F491E02D09946D9843C06E98AF
-:1021400045C06F983FC0209841C021983BC022985D
-:102150003DC0239837C0249839C0259833C02698AD
-:1021600035C027982FC0509831C051982BC0529835
-:102170002DC0539827C0549829C0559823C056980D
-:1021800025C057981FC0389821C039981BC03A986D
-:102190001DC03B9817C03C9819C0879813C08698FB
-:1021A00015C085980FC0849811C083980BC0829881
-:1021B0000DC0699807C0689809C0689803C06998FD
-:1021C00005C06A9881E090E008C06B98E1E0F0E01B
-:1021D000FA83E98304C084E090E09A83898389814B
-:1021E0009A8122960FB6F894DEBF0FBECDBFDF9165
-:1021F000CF910895FB011082833091F0843028F450
-:10220000813051F0823029F409C0843059F0853092
-:1022100059F085E090E0089583B107C086B105C00C
-:1022200089B103C08CB101C08FB1808381E090E09F
-:102230000895833091F0843028F4813051F0823059
-:1022400029F409C0843059F0853069F084E090E0C9
-:10225000089565B905C068B903C06BB901C06EB90E
-:1022600081E090E0089561BB81E090E00895982FAF
-:10227000E82FFF27E15CFC4F8181823019F086E076
-:1022800090E00895892F9927AA27BB27FC01319751
-:10229000EC32F10540F4EE55FF4FEE0FFF1F0590B5
-:1022A000F491E02D099484E090E00895662311F004
-:1022B000759AC5C07598C3C0662311F0769ABFC0E1
-:1022C0007698BDC0662311F0779AB9C07798B7C0E9
-:1022D000662311F0289AB3C02898B1C0662311F084
-:1022E000299AADC02998ABC0662311F02A9AA7C0DD
-:1022F0002A98A5C0662311F02B9AA1C02B989FC0E5
-:10230000662311F02C9A9BC02C9899C0662311F07B
-:102310002D9A95C02D9893C0662311F02E9A8FC0E8
-:102320002E988DC0662311F02F9A89C02F9887C0F0
-:10233000662311F0589A83C0589881C0662311F023
-:10234000599A7DC059987BC0662311F05A9A77C07C
-:102350005A9875C0662311F05B9A71C05B986FC084
-:10236000662311F05C9A6BC05C9869C0662311F01B
-:102370005D9A65C05D9863C0662311F05E9A5FC088
-:102380005E985DC0662311F05F9A59C05F9857C090
-:10239000662311F0409A53C0409851C0662311F053
-:1023A000419A4DC041984BC0662311F0429A47C0F4
-:1023B000429845C0662311F0439A41C043983FC0FC
-:1023C000662311F0449A3BC0449839C0662311F04B
-:1023D0008F9A35C08F9833C0662311F08E9A2FC024
-:1023E0008E982DC0662311F08D9A29C08D9827C034
-:1023F000662311F08C9A23C08C9821C0662311F0BB
-:102400008B9A1DC08B981BC0662311F08A9A17C047
-:102410008A9815C0662311F0709A11C070980FC089
-:10242000662311F0719A0BC0719809C0662311F0F0
-:10243000729A05C0729803C0662321F0739A81E0F6
-:1024400090E00895739881E090E008951F93182F0D
-:102450008150833130F08751833118F084E090E06F
-:102460000FC0E12FFF27E15CFC4F83E08183812FC8
-:102470000E94DC0F61E0812F0E94371181E090E023
-:102480001F910895CF93DF93982FEB011882E82FC7
-:10249000FF27E15CFC4F8181813019F086E090E0FC
-:1024A0007DC0892F9927AA27BB27FC013197EC32E1
-:1024B000F10540F4E253FF4FEE0FFF1F0590F4913A
-:1024C000E02D099484E090E069C0659B65C062C01E
-:1024D000669B62C05FC0679B5FC05CC0189B5CC0AE
-:1024E00059C0199B59C056C01A9B56C053C01B9B5C
-:1024F00053C050C01C9B50C04DC01D9B4DC04AC016
-:102500001E9B4AC047C01F9B47C044C0489B44C055
-:1025100041C0499B41C03EC04A9B3EC03BC04B9B13
-:102520003BC038C04C9B38C035C04D9B35C032C015
-:102530004E9B32C02FC04F9B2FC02CC0309B2CC055
-:1025400029C0319B29C026C0329B26C023C0339BA3
-:1025500023C020C0349B20C01DC07F9B1DC01AC05B
-:102560007E9B1AC017C07D9B17C014C07C9B14C0F3
-:1025700011C07B9B11C00EC07A9B0EC00BC0609B2C
-:102580000BC008C0619B08C005C0629B05C002C0AB
-:10259000639B02C081E0888381E090E0DF91CF916E
-:1025A0000895CF93DF93CDB7DEB721970FB6F89498
-:1025B000DEBF0FBECDBF9BE19093E504BE016F5F10
-:1025C0007F4F0E9442128093E60489818093E70442
-:1025D0001092E80484E090E00E94B20121960FB6C8
-:1025E000F894DEBF0FBECDBFDF91CF9108959AE181
-:1025F0009093E5040E9437118093E6041092E7045B
-:1026000083E090E00E94B201089598E19093E50480
-:102610000E9419118093E6041092E70483E090E091
-:102620000E94B2010895982F89E18093E5049330C8
-:1026300099F0943028F4913059F0923029F40AC07E
-:10264000943061F0953061F085E090E020E00BC0BF
-:1026500023B107C026B105C029B103C02CB101C008
-:102660002FB181E090E08093E6042093E70410927C
-:10267000E80484E090E00E94B201089597E190930D
-:10268000E5040E9426128093E6041092E70483E09A
-:1026900090E00E94B201089595E19093E5040E94B4
-:1026A00073108093E6041092E70483E090E00E94A8
-:1026B000B201089596E19093E5040E94DC0F8093A7
-:1026C000E6041092E70483E090E00E94B2010895CE
-:1026D00084E18093E50481E08093E6041092E704AE
-:1026E00083E090E00E94B201089582E18093E504C6
-:1026F00081E08093E6041092E70483E090E00E947A
-:10270000B201089583E18093E50481E08093E604BB
-:102710001092E70483E090E00E94B201089580E106
-:102720008093E50481E08093E6041092E70483E05F
-:1027300090E00E94B201089591E19093E5040E9417
-:1027400063108093E6041092E70483E090E00E9417
-:10275000B2010895FC0180818531C9F1863180F490
-:10276000823131F1833130F48031D1F0813109F09F
-:102770004CC01AC0833109F1843109F046C022C02F
-:10278000883189F1893128F4863129F18731E9F5D9
-:1027900026C08A3189F18A3158F18B31B1F531C0C7
-:1027A00082810E948F13089582810E949C13089554
-:1027B000638182810E9475130895638182810E94E2
-:1027C00082130895638182810E9468130895828133
-:1027D0000E944C13089582810E945A1308958281A9
-:1027E0000E943E130895638182810E94051308951B
-:1027F00082810E9413130895638182810E94F712DF
-:10280000089582810E94D11208958093E50483E0A7
-:102810008093E6041092E70483E090E00E94B20106
-:102820000895E82F8152883018F084E090E00895F0
-:10283000FF27E15CFC4F84E0818381E090E0089514
-:10284000E82FFF27E15CFC4F8181843019F084E0A0
-:1028500090E00895118281E090E0089510927C004C
-:10286000823039F0833069F0813041F082E090E0CD
-:10287000089580917C00806480937C0081E090E0EA
-:10288000089580917C00806C80937C0081E090E0D2
-:10289000089593E890937A0090917C00907F982B14
-:1028A00090937C0080917A00806480937A0080917C
-:1028B0007A0086FDFCCF809178009091790020E02D
-:1028C00030E040E050E080917A00806480937A00AC
-:1028D00080917A0086FDFCCF8091780090917900FC
-:1028E000480F591F2F5F3F4F2430310561F780910A
-:1028F0007A008F7780937A00CA019695879596958E
-:1029000087950895CF93DF93EB0119821882282FC2
-:102910003327F901E15CFC4F8181843019F086E0B6
-:1029200090E00AC088E290E0821B930B0E94491459
-:102930009983888381E090E0DF91CF91089593E2BD
-:102940009093E5040E942E148093E6041092E7040D
-:1029500083E090E00E94B2010895CF93DF93CDB75A
-:10296000DEB722970FB6F894DEBF0FBECDBF92E25E
-:102970009093E504BE016F5F7F4F0E9482148093A5
-:10298000E60429813A81832F99278093E7042093D5
-:10299000E8041092E90485E090E00E94B2012296DA
-:1029A0000FB6F894DEBF0FBECDBFDF91CF91089573
-:1029B00091E29093E504E82FFF27E15CFC4F8181D1
-:1029C000843019F084E090E003C0118281E090E04F
-:1029D0008093E6041092E70483E090E00E94B20145
-:1029E0000895E82F80E28093E5048E2F815288308D
-:1029F00018F084E090E007C0FF27E15CFC4F84E022
-:102A0000818381E090E08093E6041092E70483E004
-:102A100090E00E94B2010895FC018081813271F042
-:102A2000823218F48032B1F405C0823259F0833218
-:102A300089F40CC082810E94F114089582810E9461
-:102A4000D814089582810E94AD14089582810E9455
-:102A50009F1408958093E50483E08093E604109228
-:102A6000E70483E090E00E94B2010895ECEBF0E00F
-:102A70008081846080838BE080934C038CE0809322
-:102A80004D0381E090E00895ECEBF0E080818B7FD6
-:102A9000808310924C0310924D0381E090E00895E2
-:102AA0008093B800E9EBF0E080818C7F80838081A7
-:102AB000808381E090E008958091B9009927887F14
-:102AC000907008958091B90084EA8093BC00809151
-:102AD000BC0087FFFCCF81E090E0089584E98093FB
-:102AE000BC008091BC0084FDFCCF81E090E00895A3
-:102AF000AC0120E030E00FC0FA01E20FF31F80814B
-:102B00008093BB0084E88093BC008091BC0087FF69
-:102B1000FCCF2F5F3F4F2617370774F3089584E8E3
-:102B20008093BC008091BC0087FFFCCF8091BB00EC
-:102B30009927089585E38093E50481E08093E60476
-:102B400020E030E00FC084E88093BC008091BC009E
-:102B500087FFFCCF8091BB00F901E951FB4F8083D7
-:102B60002F5F3F4F2617370774F3FB01E951FB4FE7
-:102B70001082CB0103960E94B20108959B01BC0113
-:102B8000C9010E94781581E08093E6041092E70461
-:102B900083E090E00E94B201089584E98093BC0034
-:102BA0008091BC0084FDFCCF81E08093E60410920C
-:102BB000E70483E090E00E94B20108958091B9009B
-:102BC00084EA8093BC008091BC0087FFFCCF81E049
-:102BD0008093E6041092E70483E090E00E94B20143
-:102BE00008958093B800E9EBF0E080818C7F8083CA
-:102BF0008081808381E08093E6041092E70483E083
-:102C000090E00E94B2010895ECEBF0E080818B7FB0
-:102C1000808310924C0310924D0381E08093E60470
-:102C20001092E70483E090E00E94B2010895ECEB7B
-:102C3000F0E08081846080838BE080934C038CE0A3
-:102C400080934D0381E08093E6041092E70483E0D3
-:102C500090E00E94B2010895FC0180818093E50418
-:102C60008433D1F0853338F4813379F0823381F0C5
-:102C7000803331F507C08633E9F08633A0F087331F
-:102C8000F9F41BC00E94171608950E9404160895B7
-:102C900082810E94F115089582813396BF019927A0
-:102CA0000E94BE15089563817727828199270E942B
-:102CB0009A1508950E94DE1508950E94CD15089575
-:102CC00083E08093E6041092E70483E090E00E94A2
-:102CD000B2010895782F613079F0613050F06230A0
-:102CE00021F0633009F059C002C061E003C061E027
-:102CF00004C060E030E002C060E031E04330D9F071
-:102D0000443028F4413089F0423090F40CC0453012
-:102D100031F04530A0F0463009F03FC002C040E03D
-:102D200005C040E006C041E007C041E050E005C0FA
-:102D300041E050E006C040E051E020E003C040E048
-:102D400051E021E0239884B1866084B985B1817F08
-:102D500085B980E090E0772311F081E090E075E0A4
-:102D6000880F991F7A95E1F78065660F660F660FE9
-:102D7000682B330F330F362B352B440F432B4CBDB1
-:102D80002DBD88E0809345038AE08093460389E067
-:102D90008093470381E090E0089582E090E00895F9
-:102DA0001CBC1DBC109245031092460310924703B1
-:102DB00081E090E00895AC0120E030E009C0E60F2A
-:102DC000F71F80818EBD0DB407FEFDCF2F5F3F4FF3
-:102DD000E22FFF27E417F50794F381E090E00895D0
-:102DE000DC0120E030E040E050E015C01EBC09C02E
-:102DF00083E0493E58071CF088E090E008954F5F5B
-:102E00005F4F0DB407FEF4CFFB01E20FF31F8EB549
-:102E100080832F5F3F4F2A173B0744F381E090E008
-:102E20000895CF93DF93EC01A0E0B0E020E030E024
-:102E300018C0FE01E20FF31F80818EBD08C01196FD
-:102E400083E0A93EB8071CF088E090E00FC00DB405
-:102E500007FEF5CFFB01E20FF31F8EB580832F5FD6
-:102E60003F4F241735072CF381E090E0DF91CF919D
-:102E70000895EF92FF920F931F938B01E5EEEE2ED4
-:102E8000E4E0FE2E23E42093E504B7016E5F7F4F5C
-:102E9000A8010E9411178093E6040E5F1F4FE00EF9
-:102EA000F11EF7011082C80101960E94B2011F9124
-:102EB0000F91FF90EF900895EF92FF920F931F9361
-:102EC0008C01F5EEEF2EF4E0FF2E84E48093E50410
-:102ED000B7016E5F7F4FC8010E94F0168093E60431
-:102EE0000E5F1F4FE00EF11EF7011082C801019620
-:102EF0000E94B2011F910F91FF90EF90089593E40B
-:102F00009093E50499270E94DB168093E6041092C3
-:102F1000E70483E090E00E94B201089581E4809389
-:102F2000E5040E94D0168093E6041092E70483E043
-:102F300090E00E94B201089590E49093E5040E940D
-:102F40006A168093E6041092E70483E090E00E9402
-:102F5000B2010895CF93DF93EC0188818334A9F007
-:102F6000843428F4803441F0813409F50BC0843472
-:102F700099F08534E1F414C04C816B818A810E9400
-:102F80009C1720C00E948E171DC0BE016D5F7F4F31
-:102F90008A810E947F1716C08A8199270E945C1738
-:102FA0006A817727CE0103960E9439170BC0809360
-:102FB000E50483E08093E6041092E70483E090E068
-:102FC0000E94B201DF91CF910895209A219A229A0E
-:102FD0002398249A259A2C982D9881E08093500369
-:102FE00082E080935103809352038093530381E0E6
-:102FF00090E00895109250031092510310925203E2
-:103000001092530381E090E00895289829982A9817
-:1030100080E29EE40197F1F7289A8AE0982F9A952A
-:10302000F1F72A9A299A8A95F1F70895282F299875
-:1030300087FD02C02A9801C02A9A8AE0982F9A95A3
-:10304000F1F7299A8A95F1F7299826FF02C02A9A62
-:1030500001C02A988AE0982F9A95F1F7299A8A95C3
-:10306000F1F70895282F220F30E0299827FF02C09A
-:103070002A9A01C02A988AE0982F9A95F1F7299AFE
-:103080008A95F1F73F5F373011F0220FEECF0895A8
-:10309000282F30E0299827FF02C02A9A01C02A98D9
-:1030A0008AE0982F9A95F1F7299A8A95F1F73F5F70
-:1030B000383011F0220FEECF089529982A988AE02F
-:1030C000982F9A95F1F7299A982F9A95F1F72998C0
-:1030D0002898982F9A95F1F7299A982F9A95F1F7B1
-:1030E00029988A95F1F7289A80E090E00895299828
-:1030F00028982A982B9A08950E94051880E30E9428
-:10310000161880E60E94321808950E94051880E083
-:103110000E94161880E00E9432180E9477180895C5
-:103120000F931F93182F062F0E94051880E40E940A
-:103130001618812F0E943218802F0E94481881E0B3
-:1031400090E01F910F9108951F93182F0E9405186A
-:1031500080EC0E941618812F0E9432180E945D1880
-:1031600099271F91089529988AE08A95F1F72A985E
-:1031700090E030E0990F299A2AE0822F8A95F1F7A2
-:1031800029981B999F5F822F8A95F1F73F5F38300E
-:1031900089F72898299A822F8A95F1F7289A2998F1
-:1031A0002A95F1F7892F992708951F93182F0E94C8
-:1031B000051880E80E941618812F0E9432180E947C
-:1031C000B31899271F910895DF92EF92FF920F9302
-:1031D0001F93CF93DF93D82E7B018A01C0E0D0E00C
-:1031E00009C08D2D8C0F0E94D518F801EC0FFD1F22
-:1031F00080832196CE15DF05A1F781E090E0DF9175
-:10320000CF911F910F91FF90EF90DF9008950F9352
-:103210001F93082F162F0E947C18612F802F0E9469
-:10322000901881E090E01F910F910895DF92EF9246
-:10323000FF920F931F93CF93DF93D82E7B018A01C8
-:10324000C0E0D0E009C0F801EC0FFD1F60818D2DBA
-:103250008C0F0E9407192196CE15DF05A1F781E09A
-:1032600090E0DF91CF911F910F91FF90EF90DF9051
-:10327000089594E09093E5040E9416198093E60463
-:103280001092E70483E090E00E94B2010895EF926B
-:10329000FF920F931F938B0195EEE92E94E0F92E88
-:1032A00093E09093E504A7014E5F5F4F0E94E418FE
-:1032B0008093E6040E5F1F4FE00EF11EF7011082AF
-:1032C000C80101960E94B2011F910F91FF90EF90EB
-:1032D000089582E08093E504109250031092510308
-:1032E000109252031092530381E08093E6041092EF
-:1032F000E70483E090E00E94B201089581E08093AA
-:10330000E5040E94E5178093E6041092E70483E049
-:1033100090E00E94B2010895FC018381823069F03F
-:10332000833018F48130F1F405C0833049F08430E3
-:10333000C9F40FC00E947E1908950E94691908956A
-:10334000AF014A5F5F4F6581772784810E944719EB
-:103350000895AF014A5F5F4F6581772784810E949E
-:103360003919089580818093E50483E08093E60411
-:103370001092E70483E090E00E94B20108951F924A
-:103380000F920FB60F9211240F900FBE0F901F9047
-:1033900018959C010897029718F084E090E0089532
-:1033A000F901E15CFC4F8DE0818328303105B1F0FB
-:1033B0002930310519F087E090E00895259A81E0E1
-:1033C00090E0909389008093880081E8809380004A
-:1033D00089E08093810081E090E00895249A81E063
-:1033E0008093B30089E68093B00081E090E0089577
-:1033F0009C01FC01E15CFC4F81818D3019F086E07D
-:1034000090E008952830310539F12930310519F05F
-:1034100087E090E0089563307105B1F06430710584
-:1034200044F46130710561F06230710509F040C00B
-:1034300009C06430710551F065307105C9F508C0E7
-:1034400081E007C082E005C083E003C084E001C0E2
-:1034500085E08093810029C064307105E9F0653012
-:10346000710554F46230710599F06330710594F47C
-:1034700061307105E9F40AC06630710589F0663083
-:10348000710564F06730710599F40CC089E60BC0D2
-:103490008AE609C08BE607C08CE605C08DE603C04E
-:1034A0008EE601C08FE68093B00081E090E0089541
-:1034B00081E090E008959C01FC01E15CFC4F81817A
-:1034C0008D3019F086E090E008952830310569F0DC
-:1034D0002930310519F087E090E008957093890054
-:1034E0006093880081E090E008956093B30081E0EC
-:1034F00090E0089523E52093E5040E945B1A8093F1
-:10350000E6041092E70483E090E00E94B20108957F
-:1035100022E52093E5040E94F8198093E6041092B6
-:10352000E70483E090E00E94B201089520E5209333
-:10353000E5040E94C9198093E6041092E70483E031
-:1035400090E00E94B2010895FC01E15CFC4F118201
-:103550008830910531F08930910531F086E090E0B6
-:1035600008951092B00004C0109281001092800063
-:103570000E94DC0F81E090E0089521E52093E504AE
-:103580000E94A41A8093E6041092E70483E090E07E
-:103590000E94B2010895FC018081813579F0823565
-:1035A00018F48035F1F405C0823569F08335C9F42B
-:1035B00011C0828199270E94961A089582819927C5
-:1035C0000E94BD1A089563817727828199270E94FE
-:1035D000881A089563817727828199270E947A1A31
-:1035E00008958093E50483E08093E6041092E70455
-:1035F00083E090E00E94B2010895CF93DF93CDB7AE
-:10360000DEB7DF91CF910895089581E090E00895AD
-:1036100008958A3310F4805301C087556A3310F43B
-:10362000605301C067556F708295807F682B862F2D
-:103630009927089508958230A1F0833028F48823D3
-:1036400061F0813039F40BC0843079F0843058F067
-:103650008530B9F080E090E0089582E107C08EE007
-:1036600005C088E003C086E001C082E08093E200EC
-:103670008CE08093E30087E38093E40081E090E0B6
-:1036800008951092E2008CE08093E30087E380933A
-:10369000E40081E090E00895813091F0813038F0CD
-:1036A0008230E1F0833061F180E090E00895809114
-:1036B000DB008F778093DB008091DB008F7D16C06D
-:1036C0008091DB0080688093DB008091DB008F7D40
-:1036D0008093DB008091DB0080610DC08091DB0076
-:1036E00080688093DB008091DB0080628093DB0048
-:1036F0008091DB008F7E8093DB0081E090E0089575
-:103700008091DB0080688093DB008091DB00806229
-:103710008093DB008091DB0080618093DB0081E09F
-:1037200090E008951F93982F162F8FE080935103F8
-:103730008093520310927406442319F081E0809321
-:103740007406109268061092690610926A0610922A
-:103750006B06ECE6F6E0119286E0E437F807D9F75D
-:1037600020E030E0822F8295807F8093ED001092E0
-:10377000EE001092EF002F5F3F4F2F30310591F791
-:10378000892F0E941B1B892B89F0812F0E944C1BC3
-:10379000892B61F08091D80082608093D80080915D
-:1037A000D90082FFFCCF81E090E002C082E090E08F
-:1037B0001F9108958295807F8093ED0008959B016D
-:1037C000AC0180917406882381F4822F8295880F42
-:1037D000807E8093F60063E0569547953795279550
-:1037E0006A95D1F72093F7000895DA01C90153E0F3
-:1037F000880F991FAA1FBB1F5A95D1F78760809326
-:10380000F400292F3A2F4B2F55272093F5009D01C7
-:10381000442755272093F6008B2F9927AA27BB27EB
-:103820008093F7000895EF92FF920F931F9380917A
-:1038300074068823C1F42091F20022952695277002
-:103840003327442755278091F300992703E0880FF9
-:10385000991F0A95E1F77C0100271127E22AF32A34
-:10386000042B152B33C02091F3008091F200E090DF
-:10387000F1006091F0009927AA27BB27DC01992766
-:103880008827332744275527522F442733272227B9
-:10389000822B932BA42BB52BFF2400271127102F4D
-:1038A0000F2DFE2CEE248E299F29A02BB12BE62E66
-:1038B000FF2400271127E82AF92A0A2B1B2B73E083
-:1038C00016950795F794E7947A95D1F7C801B70153
-:1038D0001F910F91FF90EF9008959B01AC01809193
-:1038E0007406882371F4822F8295880F807E8093DE
-:1038F000F200E3E05695479537952795EA95D1F77D
-:1039000025C073E0220F331F441F551F7A95D1F74E
-:103910008091F0009927AA27BB2787709070A0702C
-:10392000B070282B392B4A2B5B2B2093F000BB2740
-:10393000A52F942F832F8093F100CA01AA27BB27BC
-:103940008093F200252F3327442755272093F30037
-:103950000895982F80917406882321F08091EF00BC
-:10396000806103C08091EF008F7E8093EF009230E2
-:1039700091F1933028F4992359F0913031F422C019
-:103980009330E1F1943009F450C080E090E0089564
-:103990008091EF008F7B8093EF008091EF008F7715
-:1039A0008093EF008091EF008F7D8093EF008091F6
-:1039B000F0008B7F8093F0008091F4008B7F8093E8
-:1039C000F40030C08091EF0080648093EF0080911C
-:1039D000EF008F771BC08091EF008F778093EF000F
-:1039E0008091EF0080648093EF008091EF008F7DE5
-:1039F0008093EF008091F000846012C08091EF000E
-:103A00008F7B8093EF008091EF0080688093EF00C0
-:103A10008091EF008F7D8093EF008091F0008B7F8D
-:103A20008093F00081E090E008958091EF008F7B1B
-:103A30008093EF008091EF0080688093EF00809189
-:103A4000EF0080628093EF008091F00084608093AB
-:103A5000F00081E090E008959F92AF92BF92CF92E4
-:103A6000DF92EF92FF920F931F93E82F962E59014A
-:103A70006A01C801B7012E2F2295207F2093ED0007
-:103A80004091DE00FF27EB51FD4F21E030E0008048
-:103A900002C0220F331F0A94E2F7422B4093DE004C
-:103AA0000E94DF1BC601B5010E946D1C892D0E947A
-:103AB000A91C892B19F482E090E002C081E090E01B
-:103AC0001F910F91FF90EF90DF90CF90BF90AF903C
-:103AD0009F9008958091EF0087FD04C08091EF00D2
-:103AE00086FF3CC08091EF0087FD0AC08091EF0007
-:103AF00086FF06C08091F00082FD02C081E02FC0E9
-:103B00008091EF0087FD0AC08091EF0086FF06C01C
-:103B10008091F00082FF02C082E021C08091EF001E
-:103B200087FF0AC08091EF0086FD06C08091F000FB
-:103B300082FD02C083E013C08091EF0087FF0EC0BA
-:103B40008091EF0086FD0AC08091EF0085FF06C0DE
-:103B50008091F00082FF02C084E001C080E09927DC
-:103B60000895982F893008F098E08091EF00807FC9
-:103B7000892B8093EF00FB0120E004C081918093AA
-:103B8000FA002F5F2917D1F70895EF92FF920F9354
-:103B90001F93F62E8A018295807F8093ED000E940C
-:103BA0006A1DE82EB8018F2D0E94B11D81E00E9490
-:103BB000A91C8091EE0086FFFCCF8091EE008F7BE8
-:103BC0008093EE008E2D0E94A91C81E090E01F9151
-:103BD0000F91FF90EF900895FF920F931F93F62E91
-:103BE0008A018295807F8093ED0084E00E94A91C69
-:103BF000B8018F2D0E94B11D1F910F91FF90089564
-:103C0000AC0120E030E0FA01E20FF31F8091FA00EE
-:103C100080832F5F3F4F28303105A9F70895AEED1F
-:103C2000B0E02C91E5EEF2E0E80FF11D81E090E0CC
-:103C3000008002C0880F991F0A94E2F7282B2C936A
-:103C40000895AEEDB0E02C91E5EEF2E0E80FF11D45
-:103C500081E090E0008002C0880F991F0A94E2F78B
-:103C6000809582238C9308952091E0008091E1005B
-:103C70009927982F88273327822B932B009779F049
-:103C800020E030E002C096958795422F2F5F3F4F8E
-:103C900080FFF9CF4F3018F4842F992708958FEFC4
-:103CA00090E00895982F9295907F9093ED000E9458
-:103CB000211E80E00E94A91C81E090E00895CF932E
-:103CC000DF931092510310925203C0E0D0E08C2F8A
-:103CD0000E94521E2196CF30D105C9F78091D8009D
-:103CE0008D7F8093D8008091D90082FDFCCF81E048
-:103CF00090E0DF91CF9108951F938295807F80930C
-:103D0000ED000E946A1D182F82E00E94A91C80917C
-:103D1000EE0086FFFCCF8091EE008F7B8093EE005B
-:103D2000812F0E94A91C81E090E01F91089586E7F1
-:103D30008093E50481E08093E60480916806909189
-:103D40006906A0916A06B0916B068093E704292F5B
-:103D50003A2F4B2F55272093E8049D0144275527E0
-:103D60002093E9048B2F9927AA27BB278093EA0485
-:103D7000109268061092690610926A0610926B06FD
-:103D8000ACE6B6E026E030E08C91F901EB51FB4F58
-:103D900080831D922F5F3F4F2E303105A9F710927F
-:103DA000F3048FE090E00E94B201089595E79093AC
-:103DB000E5040E947C1E8093E6041092E70483E0F1
-:103DC00090E00E94B201089594E79093E5040E9468
-:103DD000521E8093E6041092E70483E090E00E9474
-:103DE000B201089592E79093E5040E94C51D809367
-:103DF000E6041092E70483E090E00E94B201089587
-:103E0000EF92FF920F931F9393E79093E5040E9424
-:103E10002C1D8093E6041092E70483E090E00E945A
-:103E2000B2011F910F91FF90EF9008950E94EC1D39
-:103E300087E78093E50481E08093E6041092E7042D
-:103E400083E090E00E94B201089581E78093E50449
-:103E50000E945F1E8093E6041092E70483E090E0E6
-:103E60000E94B2010895462F90E79093E50462E026
-:103E70000E94921B8093E6041092E70483E090E096
-:103E80000E94B2010895EF92FF920F931F93FC01DD
-:103E90008081833701F1843748F48137C9F0823754
-:103EA00008F06BC0803709F081C00DC0853709F478
-:103EB0006CC0853708F45DC0863709F46AC087375F
-:103EC00009F074C06BC0638182810E94331F79C086
-:103ED0000E94251F76C000002581332744275527DF
-:103EE000542F432F322F222786819927AA27BB27B9
-:103EF000DC0199278827280F391F4A1F5B1F8481FF
-:103F0000280F311D411D511D87819927AA27BB27E5
-:103F1000B82FAA2799278827280F391F4A1F5B1F08
-:103F2000E184FF2400271127102F0F2DFE2CEE24F3
-:103F300082859927AA27BB27DC0199278827E80EC5
-:103F4000F91E0A1F1B1F8085E80EF11C011D111DA3
-:103F500083859927AA27BB27B82FAA2799278827BF
-:103F6000E80EF91E0A1F1B1F638182810E94001F39
-:103F700028C082810E94E41E24C0AF014C5F5F4FC5
-:103F8000638182810E94F21E1CC082810E94D61E23
-:103F900018C0828199270E94971E13C0AF014C5F01
-:103FA0005F4F638182810E94161F0BC08093E504DE
-:103FB00083E08093E6041092E70483E090E00E949F
-:103FC000B2011F910F91FF90EF9008951F920F92F1
-:103FD0000FB60F9211241F932F933F934F935F932C
-:103FE0006F937F938F939F93AF93BF93EF93FF93C1
-:103FF0001091ED000E94341E8F3F31F18295807F39
-:104000008093ED000E94131C60936806709369060C
-:1040100080936A0690936B068CE696E00E94001EE1
-:104020000E94131C609368067093690680936A0669
-:1040300090936B068091EE008F7D8093EE0083E07D
-:104040000E94A91C1093ED00FF91EF91BF91AF91D9
-:104050009F918F917F916F915F914F913F912F91A0
-:104060001F910F900FBE0F901F901895DC0180E1FB
-:10407000A030B80718F082E090E00895F999FECFDB
-:104080009D0109C032BD21BD2F5F3F4FF89AE60F59
-:10409000F71F80B58083822F8A1BE82FFF27E41744
-:1040A000F50780F381E090E00895DC0180E1A03025
-:1040B000B80718F082E090E00895F999FECF9D01CD
-:1040C0000AC032BD21BD2F5F3F4FE60FF71F808131
-:1040D00080BDFA9AF99A822F8A1BE82FFF27E417EE
-:1040E000F50778F381E090E008950F931F938B011B
-:1040F00021E82093E5040E9455208093E604109265
-:10410000E7041F930F9384EF92E09F938F930E9495
-:10411000FD1A83E090E00E94B2010F900F900F9083
-:104120000F901F910F910895CF92DF92EF92FF921F
-:104130000F931F937B0105EE14E020E82093E50424
-:1041400022E0C22ED12CC00ED11EAB01B6010E94BE
-:1041500036208093E60482E090E0E80EF91E0E0D12
-:104160001F1DF8011082DF92CF9281E093E09F93B0
-:104170008F930E94FD1AC70101960E94B2010F9011
-:104180000F900F900F901F910F91FF90EF90DF9085
-:10419000CF900895EF92FF920F931F93CF93DF93E9
-:1041A000EC018B819927F82EEE248A81E80EF11C10
-:1041B0008D819927182F00278C81080F111DFF92E0
-:1041C000EF921F930F938BE093E09F938F930E9446
-:1041D000FD1A88812DB73EB72A5F3F4F0FB6F8947E
-:1041E0003EBF0FBE2DBF803819F0813869F405C07D
-:1041F000B801C7010E94942012C02696A801BE01F2
-:10420000C7010E9475200BC08093E50483E0809372
-:10421000E6041092E70483E090E00E94B201DF918F
-:10422000CF911F910F91FF90EF900895CF93DF935F
-:10423000AC01029710F442E050E0A0917706B091F3
-:104240007806FD01C0E0D0E020E030E020C08081B1
-:1042500091818417950769F482819381209719F0E1
-:104260009B838A8304C090937806809377069F018E
-:1042700032C04817590738F42115310519F0821753
-:10428000930708F49C01EF010280F381E02D309741
-:10429000F1F62115310599F1C901841B950B04979D
-:1042A00008F4A901E0E0F0E028C08D919C911197FD
-:1042B00082179307F9F44817590781F4ED018A81B1
-:1042C0009B81309719F09383828304C09093780682
-:1042D000809377069D012E5F3F4F4CC0841B950B4A
-:1042E000FD01E80FF91F4193519302978D939C9321
-:1042F0009F0140C0FD01A281B3811097B1F680916A
-:10430000750690917606892B41F480913203909145
-:104310003303909376068093750620913403309191
-:1043200035032115310549F48DB7282F33278091A6
-:10433000300390913103281B390BA0917506B09181
-:1043400076062A1B3B0B2417350790F0CA0102960C
-:104350002817390768F09D012E5F3F4FC901840F70
-:10436000951F90937606809375064D935C9302C0DB
-:1043700020E030E0C901DF91CF910895CF93DF9322
-:10438000009709F44EC0EC0122971B821A82A0917B
-:104390007706B0917806109711F140E050E001C027
-:1043A000DC01AC17BD0700F1BB83AA83FE0121919C
-:1043B0003191E20FF31FEA17FB0771F48D919C9185
-:1043C0001197280F391F2E5F3F4F39832883FD0136
-:1043D000828193819B838A834115510559F4D0933F
-:1043E0007806C09377061DC0FD0182819381AD01DF
-:1043F0000097B1F6FA01D383C28321913191E20F84
-:10440000F31FEC17FD0769F488819981280F391F84
-:104410002E5F3F4FFA01318320838A819B819383F2
-:104420008283DF91CF91089597FB092E07260AD04A
-:1044300077FD04D00CD006D000201AF47095619559
-:104440007F4F0895F6F7909581959F4F0895AA1B89
-:10445000BB1B51E107C0AA1FBB1FA617B70710F06F
-:10446000A61BB70B881F991F5A95A9F780959095A1
-:08447000BC01CD010895FFCF4E
-:10447800456D62656464656450726F6A65637473E0
-:10448800004F63746F70757355534220496E74659D
-:10449800726661636520436F6E766572746572201B
-:1044A800616E6420492F4F20457874656E73696F7B
-:1044B8006E003230303831313038006669727374CA
-:1044C800207061636B6574206F662061206C6F6E6D
-:1044D80067206D65737361676520286C656E677406
-:1044E800683A202564290A006F63746F7075732019
-:1044F8006C6F6E672072756E6E696E67206D65737E
-:10450800736167650A006F63746F7075732E6C6FE3
-:104518006E675F696E646578203C206F63746F70A6
-:1045280075732E6C6F6E675F62797465730A006EBF
-:104538006F74206C617374207061636B65743A20CA
-:1045480064696666203E2036340A006C6173742004
-:104558007061636B65740A007061727365722C20F8
-:10456800636865636B3A2025582C20636F6D6D6115
-:104578006E643A2025580A0063616C6C696E672086
-:10458800696F5F7061727365720A0063616C6C6950
-:104598006E67206164635F7061727365720A00639D
-:1045A800616C6C696E67206932635F7061727365F4
-:1045B800720A0063616C6C696E67207370695F7062
-:1045C80061727365720A0063616C6C696E67207052
-:1045D800776D5F7061727365720A0063616C6C69F4
-:1045E8006E672063616E5F7061727365720A006343
-:1045F800616C6C696E6720656570726F6D5F706164
-:10460800727365720A00756E6B6E6F776E20636DDC
-:10461800640A00726563656976696E6720636F6D09
-:104628006D616E643A20255820286C656E67746841
-:104638003A202575290A00676574206E6578740A22
-:104648000067657420616E642065786563757465BC
-:104658000A0009040000010203040506070001021C
-:10466800030405067772697474656E3A2025730A27
-:1046780000726561643A2025730A00656570726F7F
-:104688006D5F7061727365723A206C656E677468ED
-:104698003A2025752C20616464723A2025750A0039
-:0646A8002000790600006D
-:00000001FF
diff --git a/firmware/octopus_relais.hex b/firmware/octopus_relais.hex
deleted file mode 100644
index 68d0cd1..0000000
--- a/firmware/octopus_relais.hex
+++ /dev/null
@@ -1,959 +0,0 @@
-:100000000C94F6000C9415010C9415010C94150138
-:100010000C9415010C94C1030C9415010C9415015A
-:100020000C9415010C9415010C9415010C941501F8
-:100030000C94A5190C9415010C9415010C94150140
-:100040000C94B0030C9415010C9417010C94150139
-:100050000C9415010C9415010C9415010C941501C8
-:100060000C9415010C9415010C9415010C941501B8
-:100070000C9415010C9415010C9415010C941501A8
-:100080000C9415010C9415010C9415019D0F9F0FF4
-:10009000A10FA30FA50FA70FA90FAB0FAD0FAF0FA8
-:1000A000B10FB30FB50FB70FB90FBB0FBD0FBF0F18
-:1000B000C10FFC0FFC0FFC0FFC0FFC0FFC0FC30F5C
-:1000C000C50FC70FC90FCB0FCD0FCF0FD10FD50F56
-:1000D000DB0FDF0FE30FE70FEB0FEF0FF30FF50F62
-:1000E000F70FF90F2A102C102E1030103210341088
-:1000F000361038103A103C103E1040104210441098
-:10010000461048104A104C104E1089108910891062
-:100110008910891089105010521054105610581020
-:100120005A105C105E10621068106C107010741021
-:1001300078107C108010821084108610DF10E5107B
-:10014000EB10F110F710FD10031109110F1115112B
-:100150001B11211127112D11331139113F11451197
-:100160004B11DD10DD10DD10DD10DD10DD10511143
-:1001700057115D11631169116F1175117B11851193
-:100180008F119911A311AD11B711C111CD11D31157
-:10019000D911DF1120122312261229122C122F122C
-:1001A0003212351238123B123E12411244124712DB
-:1001B0004A124D125012531256121E121E121E12C5
-:1001C0001E121E121E1259125C125F12621265126A
-:1001D0006E126B1268126B126E1271127412771219
-:1001E0007D127A127A127D128012831211241FBEA0
-:1001F000CFEFD0E1DEBFCDBF13E0A0E0B1E0E6E994
-:10020000F9E300E00BBF02C007900D92AC33B107D9
-:10021000D9F716E0ACE3B3E001C01D92A237B107F5
-:10022000E1F70E942F010C94C91C0C9400001F924E
-:100230000F920FB60F9211240F900FBE0F901F90C8
-:100240001895AC0120E030E002C02F5F3F4FFA016B
-:10025000E20FF31F80818823C1F7C90108956F92CF
-:100260007F928F929F92AF92BF92CF92DF92EF9246
-:10027000FF920F93DF93CF9300D00F92CDB7DEB7ED
-:10028000F8940E94FA080E947F0E8FEF87BB18BA7D
-:100290000E94760981E897E10E94C10985E69CE009
-:1002A0000E94C60981E090E00E94CB09DE01119610
-:1002B000E6EFF2E083E001900D928150E1F7CE018C
-:1002C00001960E94B40D80E091E00E94520E81E1FF
-:1002D00091E00E944A0E82E491E00E94420E0E9448
-:1002E0008A0D4C0164EF71E00E94D90960E070E072
-:1002F000C4010E94FE0C3C0140E050E0BC01C4017E
-:100300000E94FF092CE1A22E22E0B22ECC24DD2493
-:1003100090E4E92EF12C02E021E030E041E050E0F1
-:10032000B301C4010E94930C88E2A82E83E0B82E8A
-:1003300021E030E041E050E0B301C4010E94CB0C69
-:1003400010929A031092990310929C0310929B03AF
-:100350000E94AD1A8FE784BB8AE285BB0E94CD0361
-:1003600085E585BB0E94CD0315BA0E94050F0E944A
-:10037000FA080E94840E7894FFCF0F931F93CF93B7
-:10038000DF938C018134910510F18091A503909148
-:10039000A603892BE1F41F930F938BE491E09F93C5
-:1003A0008F930E94A61A1092A2031092A103109399
-:1003B000A4030093A30381E090E09093A6038093AD
-:1003C000A50300E410E00F900F900F900F9068E0ED
-:1003D0008BE20E944309C0E0D0E00DC0E091A10390
-:1003E000F091A203EC0FFD1FE551FB4F608189E204
-:1003F0000E9443092196C017D10780F38091990389
-:1004000090919A03019749F467E08BE20E944309B7
-:1004100010929A03109299030AC063E08BE20E9443
-:10042000430981E090E090939A0380939903DF91D0
-:10043000CF911F910F910895CF93DF938091A503E2
-:100440009091A603019709F04CC088E791E09F9333
-:100450008F930E94A61A2091A1033091A20380914C
-:10046000A3039091A4030F900F9028173907C8F5A4
-:1004700086E991E09F938F930E94A61AC091A303EF
-:10048000D091A4038091A1039091A203C81BD90B22
-:100490008091A1039091A203805C9F4F9093A2034F
-:1004A0008093A1030F900F90C134D1055CF08FEBC6
-:1004B00091E09F938F930E94A61A80E490E00E949F
-:1004C000BD010DC08BED91E09F938F930E94A61A02
-:1004D000CE010E94BD011092A6031092A5030F90B9
-:1004E0000F90DF91CF9108951F93CF93DF93EC018D
-:1004F0001092A2031092A1031092A6031092A503DA
-:100500008881182F12951F7090E09F938F93812FF1
-:1005100090E09F938F9388EE91E09F938F930E943A
-:10052000A61A8DB79EB706960FB6F8949EBF0FBE5B
-:100530008DBF143009F445C0153050F4113019F155
-:10054000113090F0123049F1133009F069C02FC01A
-:10055000163009F44AC01630F0F1173009F44FC0D4
-:10056000183009F05DC052C08881863041F48A811C
-:10057000813009F069C0CE010E94721965C0CE01B8
-:100580000E94FE0E61C088E092E09F938F930E94CC
-:10059000A61ACE010E94591355C08BE192E09F9399
-:1005A0008F930E94A61ACE010E94A4144BC08FE222
-:1005B00092E09F938F930E94A61ACE010E94EC15A1
-:1005C00041C083E492E09F938F930E94A61ACE01CC
-:1005D0000E94931737C087E592E09F938F930E9404
-:1005E000A61ACE010E94741A2DC08BE192E09F934F
-:1005F0008F930E94A61ACE010E94A50523C08BE608
-:1006000092E09F938F930E94A61A1CC083E992E008
-:100610009F938F930E94A61ACE010E94591B12C06D
-:100620008AEA92E09F938F930E94A61A8881809312
-:10063000EB0483E08093EC041092ED0483E090E0FF
-:100640000E94BD010F900F90DF91CF911F910895EF
-:10065000CF93DF93EC01898190E09F938F9387EB99
-:1006600092E09F938F930E94A61A80919B03909192
-:100670009C030F900F900F900F90019791F58BEDC9
-:1006800092E09F938F930E94A61A20E030E00F9093
-:100690000F90E0919D03F0919E03E20FF31FDE01A6
-:1006A000A20FB31F8C91E555FC4F80832F5F3F4F06
-:1006B0002034310571F780919D0390919E03805CF9
-:1006C0009F4F90939E0380939D0320919D033091B3
-:1006D0009E0380919F039091A00328173907E8F1AA
-:1006E00027C085EE92E09F938F930E94A61A1092E6
-:1006F0009E0310929D0320E030E00F900F90E09158
-:100700009D03F0919E03E20FF31FDE01A20FB31FC2
-:100710008C91E555FC4F80832F5F3F4F203431058E
-:1007200071F730939E0320939D038981803448F4B0
-:1007300010929C0310929B038BEA93E00E94740238
-:100740000CC081E090E090939C0380939B0389818F
-:1007500090E09093A00380939F03DF91CF91089541
-:100760001F920F920FB60F9211248F930E94CF0EFB
-:100770008091450382BF8F910F900FBE0F901F9005
-:1007800018951F920F920FB60F9211240E945A0EC5
-:100790000F900FBE0F901F90189520E040E45CE989
-:1007A000CA010197F1F72F5F2931D1F70895882306
-:1007B00021F0813059F084E008958EE080936F033A
-:1007C0008093700388E18AB981E008958EE0809378
-:1007D00054038093550388E180939A0081E0089543
-:1007E000882321F0813071F084E0089510926F0326
-:1007F000109270031092900019B81AB810929500D8
-:1008000081E00895109254031092550310929800BD
-:100810001092990010929A0010929D0081E0089524
-:10082000882321F0813039F084E0089520939000EE
-:1008300069B981E00895209398006093990081E060
-:100840000895623011F492E001C090E0882321F015
-:10085000813061F084E0089580919500990F990F9F
-:10086000990F982B9093950081E0089580919D00B9
-:10087000990F990F990F982B90939D0081E00895FF
-:10088000663029F0673039F0653041F402C020E06D
-:1008900006C020E001C021E090E002C021E091E02C
-:1008A000882321F0813069F084E0089580919500DB
-:1008B000220F220F990F922B982B9093950081E095
-:1008C000089580919D00220F220F990F922B982B53
-:1008D00090939D0081E00895653419F06F3419F408
-:1008E00005C021E001C020E090E002C021E091E0DD
-:1008F000882321F0813079F084E00895809195007B
-:100900002295220F207E9295907F922B982B909388
-:10091000950081E0089580919D002295220F207E10
-:100920009295907F922B982B90939D0081E0089553
-:10093000982FFA018230A0F084E008952191992344
-:1009400019F0913059F404C05D9BFECF2CB906C05C
-:1009500080919B0085FFFCCF20939C0061507040EC
-:100960006115710559F781E00895882321F08130E0
-:1009700039F084E008955D9BFECF6CB981E0089565
-:1009800080919B0085FFFCCF60939C0081E00895DF
-:10099000E82FDB01823010F084E008959A0113C043
-:1009A000EE2321F0E13031F084E00AC05F9BFECFFE
-:1009B0008CB106C080919B0087FFFCCF80919C008A
-:1009C0008D93215030401216130654F381E00895A0
-:1009D000882321F0813031F084E008955F9BFECFC1
-:1009E0008CB1089580919B0087FFFCCF80919C0083
-:1009F000089570E00E9498048093EC041092ED0436
-:100A000083E090E00E94BD0108950E94400480931D
-:100A1000EC041092ED0483E090E00E94BD01089583
-:100A20000E9440048093EC041092ED0483E090E077
-:100A30000E94BD0108950E9421048093EC0410924D
-:100A4000ED0483E090E00E94BD0108950F930E94A1
-:100A500010048093EC041092ED0483E090E00E9477
-:100A6000BD010F9108950E94F0038093EC04109251
-:100A7000ED0483E090E00E94BD010895882321F0F9
-:100A8000813051F084E011C08EE080936F03809339
-:100A9000700388E18AB908C08EE080935403809384
-:100AA000550388E180939A0081E08093EC041092D2
-:100AB000ED0483E090E00E94BD010895CF92DF92A3
-:100AC000EF92FF920F931F93DF93CF93CDB7DEB7D3
-:100AD0008B01CDB6DEB62DB73EB7261B370B0FB652
-:100AE000F8943EBF0FBE2DBFEDB6FEB60894E11CD4
-:100AF000F11CAB01B7010E94C8048093EC0420E014
-:100B000030E00AC0F701E20FF31F8081F901E351E1
-:100B1000FB4F80832F5F3F4F201731079CF3F80175
-:100B2000E351FB4F1082C80103960E94BD010FB62E
-:100B3000F894DEBE0FBECDBECF91DF911F910F9115
-:100B4000FF90EF90DF90CF9008950F93FC0180818C
-:100B50008093EB048081843611F1853648F4823627
-:100B6000B1F08336E0F4803651F0813681F50BC068
-:100B7000873639F18836E9F0853649F515C0828126
-:100B80000E943E052DC082810E94330529C0068146
-:100B900025814481638182810E94260521C0638171
-:100BA00082810E941B051CC0638182810E94050511
-:100BB00017C0AF014C5F5F4F638182810E94F904CF
-:100BC0000FC0638170E082810E945E0509C083E0EE
-:100BD0008093EC041092ED0483E090E00E94BD014C
-:100BE0000F91089587E28093530685E28093520621
-:100BF00090E2909354061092550628E030E030932E
-:100C000057062093560683E280935F0681E2809325
-:100C10005E069093600610926106309363062093FF
-:100C200062060895089560916B0681E20E9443096F
-:100C3000089568E08BE20E94430961E188E20E9426
-:100C4000430968E08FE20E94430961E18CE20E945F
-:100C5000430961E08FE20E94430910929A031092C7
-:100C6000990365E083E20E94430908950F931F935F
-:100C70008C0160E480E20E944309F80162816058BF
-:100C800084E00E944309F801828180936A061F91E3
-:100C90000F9108950F931F93CF93DF93EC01288555
-:100CA000398512161306DCF58E819F818217930712
-:100CB0001CF568E083E20E94430900E010E00FC0E9
-:100CC000EA85FB85E80FF91F608181E20E944309F4
-:100CD0008E819F8101969F838E830F5F1F4F8E8130
-:100CE0009F8128853985083011051CF482179307E8
-:100CF0003CF38217930724F061E087E20E944309E6
-:100D00008B81813031F465E089810E9443091B8227
-:100D100006C061E089810E94430981E08B83DF91F5
-:100D2000CF911F910F910895DF93CF9300D000D002
-:100D3000CDB7DEB7FC013281238110926506109297
-:100D4000640681E0809361062230F1F0233079F16E
-:100D5000213009F057C080913E06809366061092BC
-:100D600067068EE396E09093690680936806868115
-:100D700097818034910509F045C088E090E0909318
-:100D80006706809366063EC08681978190936706CA
-:100D900080936606832F90E0880F991FE09150069C
-:100DA000F0915106E80FF91F8081918127C033230C
-:100DB000B9F0832F90E0880F991FE091A903F0917B
-:100DC000AA03E80FF91F0190F081E02DF093690666
-:100DD000E09368068081809366061092670612C0D1
-:100DE00094E099832A8389E08B839C8384E090E05C
-:100DF0009093670680936606CE01019690936906EC
-:100E0000809368068EE596E00E944A060F900F9048
-:100E10000F900F90CF91DF910895CF93DF9382E2EF
-:100E20000E940B09C82F85FF1AC068E083E20E9468
-:100E30004309C6FF10C02091640630916506809179
-:100E4000660690916706281739072CF48EE596E020
-:100E50000E944A0604C061E087E20E944309DF91D4
-:100E6000CF9108950F931F9388E00E940B09082FDC
-:100E7000182F86FF18C060E085E00E94430960E8F3
-:100E800084E00E94430960E080E20E94430968E038
-:100E900083E20E94430961E087E20E94430962E025
-:100EA00085E00E94430914FF04C060EC89E00E94C1
-:100EB000430907FF04C060ED89E00E9443091F91C8
-:100EC0000F9108958AE00E940B0980FF03C00E94E1
-:100ED0000D07089581FF0DC08AE20E940B098091E1
-:100EE0002B06813061F4E0912E06F0912F060995D2
-:100EF000089582E30E940B098AE30E940B0908957A
-:100F00008EE00E940B0968E08FE20E94430961E0D5
-:100F10008FE20E9443092091660630916706809116
-:100F2000620690916306821793075CF468E083E29F
-:100F30000E94430961E087E20E94430981E08093B7
-:100F400061060895EF92FF920F931F93DF93CF9363
-:100F5000CDB7DEB728970FB6F894DEBF0FBECDBF72
-:100F600086E20E940B0986FF7FC08E010F5F1F4F34
-:100F700049E0E42EF12CEC0EFD1E809152060E94F9
-:100F80000B09F80181938F01EE15FF05B1F78E0172
-:100F90000F5F1F4F68E087E20E94430968E083E229
-:100FA0000E94430980E20E940B098F77682F80E23C
-:100FB0000E944309898190E080769070803291058B
-:100FC00009F440C080349105D1F1892BF1F5F80185
-:100FD00081818630D9F0873048F48130F1F1813059
-:100FE000C8F08330D1F1853081F521C0893019F105
-:100FF0008A3018F4883049F505C08A3071F18B3099
-:1010000021F520C060916B0681E225C0C8010E94D5
-:10101000940623C068E083E20E94430961E081E214
-:101020000E94430960E081E20E9443090BC0C801AD
-:101030000E94360612C0C8010E9419060EC0C801DF
-:101040000E94F80865E083E206C080E20E940B0976
-:101050008058682F80E20E944309F801808188232C
-:10106000D1F465E083E215C02091660630916706F1
-:1010700080916206909163068217930764F4109240
-:1010800067061092660668E083E20E94430961E009
-:1010900087E20E94430928960FB6F894DEBF0FBE80
-:1010A000CDBFCF91DF911F910F91FF90EF900895E9
-:1010B000EF92FF920F931F93DF93CF93CDB7DEB7DD
-:1010C000C054D0400FB6F894DEBF0FBECDBF8CE049
-:1010D0000E940B0980FF03C00E94A2077BC081FF12
-:1010E0002AC08EE20E940B098DE20E940B098983BF
-:1010F0008E010F5F1F4F70E4E72EF12CEC0EFD1EEA
-:101100000F5F1F4F0E943009F80180830E151F05E5
-:10111000B9F780913C03813039F4E0913F03F091BD
-:101120004003CE010196099568E08FE20E944309D1
-:1011300061E08FE22BC082FF2CC086E30E940B0986
-:1011400085E30E940B0989838E010F5F1F4F60E4C6
-:10115000E62EF12CEC0EFD1E0F5F1F4F0E94300992
-:10116000F80180830E151F05B9F780913D0381308A
-:1011700039F4E0914103F0914203CE0101960995C3
-:1011800068E087E30E94430961E087E30E94430926
-:1011900021C083FF1FC08EE30E940B098E010F5FE9
-:1011A0001F4F51E4E52EF12CEC0EFD1E8DE30E9445
-:1011B0000B09F80181938F01EE15FF05B9F78091B6
-:1011C0003E03813039F4E0913F03F0914003CE01BA
-:1011D00001960995C05CDF4F0FB6F894DEBF0FBED5
-:1011E000CDBFCF91DF911F910F91FF90EF900895A8
-:1011F0000895089581E08ABF80E189BFE4E6F0E0C8
-:10120000808187608083E5E6F0E080818360808371
-:10121000A79AAF9A08959FEF9ABB8BBB85B380586E
-:1012200085BBE5E6F0E0808195E08927808385B382
-:10123000805885BB80818927808300001ABA85B3D6
-:10124000805885BB808122E08227808300000000D7
-:1012500089B395B3905895BB908192279083089558
-:1012600085B3805885BBE5E6F0E0808122E08227E7
-:1012700080830000000089B395B3905895BB90819E
-:101280009227908308958BBB8FEF8ABB85B38058DC
-:1012900085BBE5E6F0E0808195E08927808385B312
-:1012A000805885BB8081892780836BBB85B380583C
-:1012B00085BB808191E08927808385B3805885BB79
-:1012C00080818927808308958BBB85B3805885BB37
-:1012D000E5E6F0E0808191E08927808385B380583E
-:1012E00085BB8081892780830895089582E180935A
-:1012F0003E0681E080933F0680E191E090934106B5
-:1013000080934006109242061092430610924406C3
-:1013100088E0809345061092470610924606109288
-:1013200049061092480610924B0610924A061092F7
-:101330004C0610924D0610924E0610924F061092D7
-:101340003C0310923D0310923E0310922B06109224
-:101350002C0610922D06109235061092340610922B
-:10136000A8031092A703089590934706809346061A
-:10137000709349066093480650934B0640934A0683
-:1013800008959093470680934606089590934906E2
-:1013900080934806089590934B0680934A060895DB
-:1013A00080934206089580934306089580934406EF
-:1013B00008950F931F93CF93DF938C01CB01C091BE
-:1013C0003406D091350662E070E00E94A21C10C085
-:1013D000988129818A81823041F4E92FF22F858119
-:1013E00090E08017910709F460870F80D885C02DA1
-:1013F000209771F7DF91CF911F910F910895CF93AF
-:10140000DF939C01E0913406F091350614C0A08171
-:10141000B1818281843061F4848190E082179307E6
-:1014200039F4868190E08617970711F4ED014B831C
-:101430000780F085E02D309751F7DF91CF91089527
-:101440008F929F92BF92CF92DF92EF92FF920F9373
-:101450001F93CF93DF934C01F62ED42EC22EB02EC5
-:10146000E0913406F0913506309799F489E090E0E8
-:101470000E94A31BFC019093350680933406918251
-:101480008082F38210861782D282C4820583E6822C
-:1014900018C0CF010780F085E02D3097D1F78C017F
-:1014A00089E090E00E94A31BFC01E80198878F83EC
-:1014B00091828082F382D282C482B582E6821086D3
-:1014C0001782DF91CF911F910F91FF90EF90DF90E6
-:1014D000CF90BF909F908F900895EF92FF921F93AF
-:1014E000CF93DF937C01C091A703D091A8032097ED
-:1014F00011F011E012C085E090E00E94A31BFC01F6
-:101500009093A8038093A703F182E0821282148251
-:10151000138210E012C01F5FEC018B819C81009749
-:10152000D1F785E090E00E94A31BFC019C838B8394
-:10153000F182E082128314821382812FDF91CF9196
-:101540001F91FF90EF900895EF92FF920F931F93DA
-:10155000CF93DF93E091A703F091A80380E090E0A0
-:101560000380F481E02D01963097D1F7880F991F01
-:101570000E94A31B8093A9039093AA03C091A70381
-:10158000D091A80301C0EC01E880F9808A8190E045
-:10159000880F991F0091A9031091AA03080F191F22
-:1015A000F701808190E00E94A31BF8018083918362
-:1015B00020E030E016C08A8190E0880F991FE0910A
-:1015C000A903F091AA03E80FF91F0190F081E02D23
-:1015D000E20FF31FD701A20FB31F8C9180832F5FFF
-:1015E0003F4FF701808190E02817390724F38B8162
-:1015F0009C81009741F6DF91CF911F910F91FF9051
-:10160000EF9008956F927F928F929F92AF92BF92C8
-:10161000CF92DF92EF92FF920F931F93CF93DF93BE
-:10162000E0913406F0913506CC24DD2409C0828196
-:10163000823019F40894C11CD11C0780F085E02D7C
-:101640003097A9F7C601880F991F0E94A31B8093AA
-:101650005006909351060894C108D1085601AA0C6F
-:10166000BB1C0894C11CD11CB1E06B2E712C8824CA
-:10167000992451C0E0913406F0913506A9E0EA2E94
-:10168000F12C15C0A081B181848190E08615970569
-:1016900019F48381E80EF11CED018D81861521F48A
-:1016A0008281823009F44D010780F085E02D30976A
-:1016B00049F700915006109151060A0D1B1DC701F4
-:1016C0000E94A31BF8018083918320E030E0E09129
-:1016D0005006F0915106EA0DFB1D0190F081E02DBE
-:1016E000E20FF31FD401A20FB31F8C9180832F5FF1
-:1016F0003F4F2930310559F7E0915006F0915106DE
-:10170000EA0DFB1D0190F081E02D8E2D875F828315
-:101710000894611C711CC614D7040CF0ABCFE1E037
-:10172000EE2EF12C79E0A72EB12C662477248824A4
-:10173000992499C0A0913406B091350612C0ED915C
-:10174000FC9111978181823049F4858190E08E155A
-:101750009F0521F48481682E772405C0ED01AF81B7
-:10176000B885109761F701E010E072C0409134062F
-:101770005091350667C0DA01ED91FC91818184308A
-:1017800009F05DC0EA018E8190E08017910709F0B1
-:1017900056C08C8190E08E159F0509F050C0DF0186
-:1017A0009501BF01675F7F4FE0915006F0915106B0
-:1017B000E80DF91D0190F081E02DE20FF31F8D91EE
-:1017C00080832F5F3F4FA617B70771F7E9E0F0E07E
-:1017D000AE0EBF1EA0913406B09135062EC0ED01AD
-:1017E0008A81853039F58C8190E08E159F0511F541
-:1017F0008D8190E080179107E9F4CD91DC911197EC
-:101800009501BE01695F7F4FE0915006F09151064E
-:10181000E80DF91D0190F081E02DE20FF31F899191
-:1018200080832F5F3F4FC617D70771F7E7E0F0E0DF
-:10183000AE0EBF1EED01AF81B885109781F6FA019B
-:10184000478150854115510509F095CF0F5F1F4F16
-:10185000601671060CF08ACF0894E11CF11C82E03E
-:1018600090E0880E991ECE14DF040CF063CFDF9158
-:10187000CF911F910F91FF90EF90DF90CF90BF908D
-:10188000AF909F908F907F906F9008958F929F92CE
-:10189000AF92BF92CF92EF92FF920F931F93CF938D
-:1018A000DF935C014B01122FE0913406F091350675
-:1018B00016C0A081B181848190E0A816B90661F4B8
-:1018C000868190E08815990539F48281843021F46D
-:1018D000ED018C818F5F8C830780F085E02D309740
-:1018E00041F787E090E00E94A31BFC0187E0808322
-:1018F00085E0818312830383F582E482C682EE242D
-:10190000082D2A2D45E067E0CF010E94200ADF91D3
-:10191000CF911F910F91FF90EF90CF90BF90AF901C
-:101920009F908F900895AF92BF92CF92DF92EF92E7
-:10193000FF920F93FC01A114B10401F14230510553
-:1019400071F04330510599F041305105B9F481E00F
-:1019500080932B06B0922F06A0922E060FC081E036
-:1019600080932C06B0923106A092300607C081E029
-:1019700080932D06B0923306A092320620583F4F36
-:10198000CF010E94460C0F91FF90EF90DF90CF9017
-:10199000BF90AF900895AF92BF92CF92DF92EF9237
-:1019A000FF920F93FC014230510571F04330510515
-:1019B00099F041305105B9F481E080933C03B09235
-:1019C0004003A0923F030FC081E080933D03B0929B
-:1019D0004203A092410307C081E080933E03B0928E
-:1019E0004403A0924303CF010E94460C0F91FF9045
-:1019F000EF90DF90CF90BF90AF900895EF920F934C
-:101A00001F93CF93DF93182F062FA0913406B09128
-:101A10003506C0E0D0E014C02D913C911197F9013A
-:101A20008581811751F4FD018281823031F4F90101
-:101A300084818F5F8483C82FD0E0FD01A781B085AA
-:101A4000109751F789E090E00E94A31BFC0189E008
-:101A5000808384E08183028313821482158216823C
-:101A600017821086EC2E00E0212F44E069E0CF01C0
-:101A70000E94200ACE01DF91CF911F910F91EF902C
-:101A80000895DF92EF92FF920F931F93CF93DF930E
-:101A9000182FE62EF42ED22EA0913406B0913506E2
-:101AA000C0E0D0E014C02D913C911197F9018581DF
-:101AB000811751F4FD018281823031F4F901848172
-:101AC0008F5F8483C82FD0E0FD01A781B085109778
-:101AD00051F789E090E00E94A31BFC0189E080831C
-:101AE00084E08183E28213821482F582D6820783A6
-:101AF0001086EC2E00E0212F44E069E0CF010E9427
-:101B0000200ACE01DF91CF911F910F91FF90EF90AE
-:101B1000DF900895EF920F931F9310914F061F5F70
-:101B200010934F0689E090E00E94A31BFC0189E01E
-:101B3000808389E090E09383828382E081831482B2
-:101B40001583168280EA87838AE18087EE2400E08D
-:101B500020E042E069E0CF010E94200A812F90E05E
-:101B60001F910F91EF9008950F931F93CF93DF93E1
-:101B70008C01FC0101900020E9F7E81BF90BCF0173
-:101B8000880F991F0E94A31BEC01F801019000200F
-:101B9000E9F7E01BF10BEE0FFF1FE88323E0298339
-:101BA000AC0120E030E009C0F801E20FF31F8081B2
-:101BB000FA01808311822F5F3F4FF80101900020CE
-:101BC000E9F73197E01BF10B4E5F5F4F2E173F0790
-:101BD00058F3CE010E946D0A90E0DF91CF911F91E2
-:101BE0000F910895EF92FF920F931F93CF93DF937E
-:101BF0008C017B01CA010E94B40D282FE0913406AC
-:101C0000F091350614C0A081B1818281843061F4E5
-:101C1000848190E08017910739F4868190E08E15D9
-:101C20009F0511F4ED0128870780F085E02D30979E
-:101C300051F7DF91CF911F910F91FF90EF90089591
-:101C4000CF93DF93EC01CB010E94B40D382FA0910C
-:101C50003406B091350611C09C91FD01218182812D
-:101C6000823041F4E92FF22F858190E08C179D0797
-:101C700009F43683FD01A781B085109769F7DF91DC
-:101C8000CF9108950E94B40D1816190614F480938C
-:101C90004E0608950E94B40D1816190614F4809388
-:101CA0004D0608950E94B40D1816190614F4809379
-:101CB0004C0608951F9386E00E940B0986FF03C01F
-:101CC0000E9458080EC082FF03C00E94620709C02C
-:101CD00081FF03C00E94320704C084FF02C00E943B
-:101CE000800787E00E940B09182F60E087E00E94C0
-:101CF0004309612F87E00E9443091F91089562E024
-:101D000081E00E94430908950E94020B0E94A40AE8
-:101D10000E94F20561E080E00E94430980E00E9499
-:101D20000B0980FDFBCF62E081E00E94430960E87F
-:101D300084E00E94430960E480E20E94430968E075
-:101D400083E20E94430969E087E20E9443096FE051
-:101D50008DE00E9443096FE08BE00E94430968ED2B
-:101D600089E00E94430963E38FE00E94430966ED26
-:101D700087E00E94430962E085E00E9443096CEC21
-:101D800080E00E94430908958EEC8093450381E032
-:101D900087BF8091450382BF83E083BF0895089584
-:101DA000089583E08093EB0481E08093EC048BE062
-:101DB0008093ED049FE69093EE0483E68093EF0416
-:101DC00084E78093F0049093F10480E78093F20419
-:101DD00085E78093F30483E78093F4048FE5809391
-:101DE000F50480E38093F60481E38093F704109276
-:101DF000F8048EE090E00E94BD010895FC0180810E
-:101E0000833011F40E94D10E08951F9311E0812FA9
-:101E10000E94FE0F60E0812F0E94C4101F5F1431EA
-:101E2000B1F718E1812F0E94FE0F60E0812F0E9420
-:101E3000C4101F5F1B32B1F71F910895FC0110827F
-:101E400075836483738362834183478346830895E4
-:101E5000FC0190818181981710F080E00895A481A1
-:101E6000B5816D938781815019F48181A81BB109D7
-:101E70008783B583A4839FB7F89480818F5F808325
-:101E80009FBF81E00895FC0180818823E9F3A2814E
-:101E9000B3812D918681815019F48181A81BB109EC
-:101EA000B383A28386839FB7F89480818150808317
-:101EB0009FBF822F0895FC018081882319F42FEFA2
-:101EC0003FEF13C0A281B3812D918681815019F417
-:101ED0008181A81BB109B383A28386839FB7F8943D
-:101EE0008081815080839FBF30E0C901089581E0E7
-:101EF000089581E0089581E0089581E00895982F84
-:101F00008150833120F08751833108F075C0E92F6B
-:101F1000F0E0EB5BFC4F82E08183892F90E0FC01D5
-:101F20003197EC32F10508F067C0EA5BFF4FEE0F26
-:101F3000FF1F0590F491E02D0994159A5BC0169A45
-:101F400059C0179A57C0B89A55C0B99A53C0BA9A8F
-:101F500051C0BB9A4FC0BC9A4DC0BD9A4BC0BE9AEF
-:101F600049C0BF9A47C0889A45C0899A43C08A9A97
-:101F700041C08B9A3FC08C9A3DC08D9A3BC08E9ACF
-:101F800039C08F9A37C0A09A35C0A19A33C0A29A9F
-:101F900031C0A39A2FC0A49A2DC0A59A2BC0A69A8F
-:101FA00029C080916100806803C0809161008064D5
-:101FB000809361001FC0809161008062F9CF8091A1
-:101FC00061008061F5CF809161008860F1CF8091E0
-:101FD00061008460EDCF809161008260E9CF8091E3
-:101FE00061008160E5CF109A05C0119A03C0129A72
-:101FF00001C0139A81E0089584E00895982F8150DC
-:10200000833128F08751833110F084E00895892FBF
-:102010000E947F0F81E00895982F8150833120F036
-:102020008751833108F075C0E92FF0E0EB5BFC4F7E
-:1020300081E08183892F90E0FC013197EC32F1053A
-:1020400008F067C0EE58FF4FEE0FFF1F0590F491A8
-:10205000E02D099415985BC0169859C0179857C081
-:10206000B89855C0B99853C0BA9851C0BB984FC0E2
-:10207000BC984DC0BD984BC0BE9849C0BF9847C0E2
-:10208000889845C0899843C08A9841C08B983FC0C2
-:102090008C983DC08D983BC08E9839C08F9837C0C2
-:1020A000A09835C0A19833C0A29831C0A3982FC082
-:1020B000A4982DC0A5982BC0A69829C08091610036
-:1020C0008F7703C0809161008F7B809361001FC078
-:1020D000809161008F7DF9CF809161008F7EF5CF77
-:1020E00080916100877FF1CF809161008B7FEDCF80
-:1020F000809161008D7FE9CF809161008E7FE5CF77
-:10210000109805C0119803C0129801C0139881E07F
-:10211000089584E00895FB011082833089F08430B3
-:1021200028F4813049F0823029F408C0843051F01D
-:10213000853051F085E0089586B307C083B305C0AC
-:1021400080B303C081B101C080B1808381E0089574
-:10215000833089F0843028F4813049F0823029F4CA
-:1021600008C0843051F0853059F084E0089568BB90
-:1021700005C065BB03C062BB01C063B981E00895BF
-:102180006093620081E00895982FE82FF0E0EB5B08
-:10219000FC4F8181823011F086E00895892F90E014
-:1021A000FC013197EC32F10540F4E256FF4FEE0F9F
-:1021B000FF1F0590F491E02D099484E008956623B3
-:1021C00011F01D9AFFC01D98FDC0662311F01E9AE4
-:1021D000F9C01E98F7C0662311F01F9AF3C01F982C
-:1021E000F1C0662311F0C09AEDC0C098EBC0662321
-:1021F00011F0C19AE7C0C198E5C0662311F0C29AF8
-:10220000E1C0C298DFC0662311F0C39ADBC0C39857
-:10221000D9C0662311F0C49AD5C0C498D3C0662330
-:1022200011F0C59ACFC0C598CDC0662311F0C69AEB
-:10223000C9C0C698C7C0662311F0C79AC3C0C79863
-:10224000C1C0662311F0909ABDC09098BBC06623B0
-:1022500011F0919AB7C09198B5C0662311F0929A87
-:10226000B1C09298AFC0662311F0939AABC0939817
-:10227000A9C0662311F0949AA5C09498A3C06623C0
-:1022800011F0959A9FC095989DC0662311F0969A7B
-:1022900099C0969897C0662311F0979A93C0979823
-:1022A00091C0662311F0A89A8DC0A8988BC06623B0
-:1022B00011F0A99A87C0A99885C0662311F0AA9A3F
-:1022C00081C0AA987FC0662311F0AB9A7BC0AB98FF
-:1022D00079C0662311F0AC9A75C0AC9873C06623C0
-:1022E00011F0AD9A6FC0AD986DC0662311F0AE9A33
-:1022F00069C0AE9867C0662321F080916200806853
-:1023000049C0809162008F7745C0662321F080919B
-:10231000620080643FC0809162008F7B3BC0662377
-:1023200021F080916200806235C0809162008F7DD3
-:1023300031C0662321F08091620080612BC08091C2
-:1023400062008F7E27C0662321F080916200886042
-:1023500021C080916200877F1DC0662321F080919B
-:102360006200846017C0809162008B7F13C0662377
-:1023700021F08091620082600DC0809162008D7FAB
-:1023800009C0662321F080916200816003C08091C2
-:1023900062008E7F8093620015C0662311F0189A48
-:1023A00011C018980FC0662311F0199A0BC0199824
-:1023B00009C0662311F01A9A05C01A9803C0662353
-:1023C00019F01B9A81E008951B9881E008951F93EE
-:1023D000182F8150833128F08751833110F084E029
-:1023E0000EC0E12FF0E0EB5BFC4F83E08183812F97
-:1023F0000E947F0F61E0812F0E94C41081E01F9135
-:102400000895CF93DF93982FEB011882E82FF0E027
-:10241000EB5BFC4F8181813011F086E07AC0892F1F
-:1024200090E0FC013197EC32F10540F4E653FF4FA8
-:10243000EE0FFF1F0590F491E02D099484E069C030
-:102440000D9B66C062C00E9B63C05FC00F9B60C0E7
-:102450005CC0B09B5DC059C0B19B5AC056C0B29B16
-:1024600057C053C0B39B54C050C0B49B51C04DC063
-:10247000B59B4EC04AC0B69B4BC047C0B79B48C037
-:1024800044C0809B45C041C0819B42C03EC0829BEE
-:102490003FC03BC0839B3CC038C0849B39C035C023
-:1024A000859B36C032C0869B33C02FC0879B30C00F
-:1024B0002CC0989B2DC029C0999B2AC026C09A9BEE
-:1024C00027C023C09B9B24C020C09C9B21C01DC053
-:1024D000079B1EC01AC0069B1BC017C0059B18C0D7
-:1024E00014C0049B15C011C0039B12C00EC0029BF8
-:1024F0000FC00BC0089B0CC008C0099B09C005C0D9
-:102500000A9B06C002C00B9B03C081E0888301C008
-:1025100081E0DF91CF910895DF93CF930F92CDB7F4
-:10252000DEB79BE19093EB04BE016F5F7F4F0E948B
-:1025300001128093EC0489818093ED041092EE04E3
-:1025400084E090E00E94BD010F90CF91DF9108954B
-:102550009AE19093EB040E94C4108093EC041092D3
-:10256000ED0483E090E00E94BD01089598E190930E
-:10257000EB040E94A8108093EC041092ED0483E019
-:1025800090E00E94BD010895982F89E18093EB04AB
-:10259000933091F0943028F4913051F0923029F436
-:1025A00009C0943059F0953059F085E090E00AC0A8
-:1025B00096B307C093B305C090B303C091B101C0F7
-:1025C00090B181E08093EC049093ED041092EE04BE
-:1025D00084E090E00E94BD01089597E19093EB04A0
-:1025E0000E94E7118093EC041092ED0483E090E0E8
-:1025F0000E94BD01089595E19093EB040E940C1098
-:102600008093EC041092ED0483E090E00E94BD0101
-:10261000089596E19093EB040E947F0F8093EC0461
-:102620001092ED0483E090E00E94BD01089584E1E2
-:102630008093EB0481E08093EC041092ED0483E03E
-:1026400090E00E94BD01089582E18093EB0481E057
-:102650008093EC041092ED0483E090E00E94BD01B1
-:10266000089583E18093EB0481E08093EC04109261
-:10267000ED0483E090E00E94BD01089580E1809325
-:10268000EB0481E08093EC041092ED0483E090E091
-:102690000E94BD01089591E19093EB040E94FE0F0A
-:1026A0008093EC041092ED0483E090E00E94BD0161
-:1026B0000895FC0180818531C9F1863180F4823131
-:1026C00031F1833130F48031D1F0813109F04CC0E7
-:1026D0001AC0833109F1843109F046C022C0883123
-:1026E00089F1893128F4863129F18731E9F526C04D
-:1026F0008A3189F18A3158F18B31B1F531C082814B
-:102700000E943E13089582810E944B1308956381B5
-:1027100082810E9424130895638182810E94311373
-:102720000895638182810E941713089582810E9417
-:10273000FB12089582810E940913089582810E94EC
-:10274000ED120895638182810E94B61208958281FC
-:102750000E94C4120895638182810E94A812089584
-:1027600082810E948C1208958093EB0483E0809311
-:10277000EC041092ED0483E090E00E94BD01089506
-:10278000E82F8152883018F024E030E007C0F0E0F4
-:10279000EB5BFC4F84E0818321E030E0C9010895C8
-:1027A000E82FF0E0EB5BFC4F8181843019F024E0EE
-:1027B00030E003C0118221E030E0C901089517B86C
-:1027C000823039F0833039F0813041F022E030E05E
-:1027D00007C03E9A03C087B1806C87B921E030E022
-:1027E000C901089593E896B997B1907F982B97B94E
-:1027F000369A3699FECF84B195B140E050E020E0A2
-:1028000030E0369A3699FECF84B195B1280F391F42
-:102810004F5F5F4F44305105A1F7379836952795A4
-:1028200036952795C9010895CF93DF93EB0119825F
-:102830001882282F30E0F901EB5BFC4F8181843056
-:1028400019F026E030E00AC088E290E0821B930B8A
-:102850000E94F2139983888321E030E0C901DF915F
-:10286000CF910895982F83E28093EB0417B89230AC
-:1028700039F0933039F0913041F082E090E007C0B8
-:102880003E9A03C087B1806C87B981E090E0809365
-:10289000EC041092ED0483E090E00E94BD010895E5
-:1028A000DF93CF9300D0CDB7DEB792E29093EB04E5
-:1028B000BE016F5F7F4F0E9414148093EC049981D6
-:1028C0008A818093ED049093EE041092EF0485E0EA
-:1028D00090E00E94BD010F900F90CF91DF9108957D
-:1028E00091E29093EB04E82FF0E0EB5BFC4F8181E9
-:1028F000843019F084E090E003C0118281E090E020
-:102900008093EC041092ED0483E090E00E94BD01FE
-:102910000895E82F80E28093EB048E2F8152883057
-:1029200018F084E090E007C0F0E0EB5BFC4F84E03F
-:10293000818381E090E08093EC041092ED0483E0C9
-:1029400090E00E94BD010895FC018081813271F008
-:10295000823218F48032B1F405C0823259F08332E9
-:1029600089F40CC082810E948914089582810E949A
-:102970007014089582810E945014089582810E94EB
-:10298000321408958093EB0483E08093EC0410925A
-:10299000ED0483E090E00E94BD01089584E08093FF
-:1029A0007400109271008BE0809352038CE080934E
-:1029B000530381E090E00895E4E7F0E080818B7FAD
-:1029C0008083109252031092530381E090E00895A7
-:1029D00080937000E1E7F0E080818C7F808381E06C
-:1029E00090E0089580917100887F0895982F84EA7F
-:1029F000809374008091740087FFFCCF80917100F8
-:102A0000887F883011F0803181F49093730084E8DE
-:102A1000809374008091740087FFFCCF80917100D7
-:102A2000887F883129F0803419F022E030E002C03C
-:102A300021E030E0C901089584E980937400809119
-:102A4000740084FDFCCF81E090E00895AC0120E0AB
-:102A500030E094E812C0FA01E20FF31F8081809306
-:102A600073009093740080917100887F883219F010
-:102A700022E030E007C02F5F3F4F261737075CF397
-:102A800021E030E0C901089584EC809374008091C6
-:102A9000740087FFFCCF80917300089585E38093D5
-:102AA000EB0481E08093EC0420E030E094EC0EC075
-:102AB000909374008091740087FFFCCF8091730025
-:102AC000F901E351FB4F80832F5F3F4F26173707F4
-:102AD0007CF3FB01E351FB4F1082CB0103960E9474
-:102AE000BD010895AC0120E030E094E812C0FB0184
-:102AF000E20FF31F808180937300909374008091A4
-:102B00007100887F883219F082E090E007C02F5F63
-:102B10003F4F241735075CF381E090E08093EC048D
-:102B20001092ED0483E090E00E94BD01089584E9D5
-:102B3000809374008091740084FDFCCF81E08093C9
-:102B4000EC041092ED0483E090E00E94BD01089532
-:102B50000E94F6148093EC041092ED0483E090E060
-:102B60000E94BD01089580937000E1E7F0E080814C
-:102B70008C7F808381E08093EC041092ED0483E0ED
-:102B800090E00E94BD010895E4E7F0E080818B7F32
-:102B90008083109252031092530381E08093EC04DF
-:102BA0001092ED0483E090E00E94BD01089584E05E
-:102BB00080937400109271008BE0809352038CE03C
-:102BC0008093530381E08093EC041092ED0483E042
-:102BD00090E00E94BD010895FC0180818093EB0488
-:102BE00080818433D1F0853338F4813379F08233B6
-:102BF00081F0803341F507C08633F1F08633A8F0C9
-:102C0000873309F51DC00E94D71508950E94C41589
-:102C1000089582810E94B3150895BF016D5F7F4FB3
-:102C2000828190E00E9472150895638170E0828134
-:102C300090E00E944E15089582810E94A815089583
-:102C40000E949715089583E08093EC041092ED04A0
-:102C500083E090E00E94BD010895782F613041F03B
-:102C6000613040F0623041F0633009F059C007C074
-:102C700060E006C060E001C061E050E002C061E0D9
-:102C800051E04330B9F0443028F4413059F042303B
-:102C900078F40AC0453099F0453070F0463009F0BC
-:102CA0003FC010C021E00CC021E041E030E00DC089
-:102CB00021E009C020E0F9CF20E041E005C020E09C
-:102CC00040E0F4CF20E040E031E0BB9887B386607D
-:102CD00087BB88B3817F88BB80E090E0772311F0C9
-:102CE00081E090E075E0880F991F7A95E1F78065A3
-:102CF000660F660F660F682B550F550F562B542B1A
-:102D0000220F252B2DB93EB988E080934B038AE032
-:102D100080934C0389E080934D0321E030E002C0B2
-:102D200022E030E0C90108951DB81EB810924B038F
-:102D300010924C0310924D0381E090E00895AC0195
-:102D400020E007C0E60FF71F80818FB9779BFECF89
-:102D50002F5FE22FF0E0E417F507A4F381E090E0A5
-:102D60000895DC0120E030E040E050E013C01FB8DF
-:102D700008C083E0493E580714F088E008954F5F8B
-:102D80005F4F779BF6CF8FB1FB01E20FF31F80837C
-:102D90002F5F3F4F2A173B0754F381E00895CF93ED
-:102DA000DF93EC0120E030E0A0E0B0E017C0FE01CE
-:102DB000E20FF31F80818FB908C0119683E0A93E0E
-:102DC000B8071CF028E030E00EC0779BF6CF8FB13B
-:102DD000FB01E20FF31F80832F5F3F4F241735075E
-:102DE00034F321E030E0C901DF91CF910895DC0197
-:102DF00083E48093EB0440E050E020E030E018C032
-:102E0000FD01E20FF31F80818FB909C04F5F5F4F53
-:102E100083E0493E58071CF028E030E00EC0779B65
-:102E2000F5CF8FB1F901E551FB4F82832F5F3F4F03
-:102E3000261737072CF321E030E02093EC04FB0148
-:102E4000E351FB4F1082CB0103960E94BD01089510
-:102E5000BC0184E48093EB0440E050E020E030E0EB
-:102E600013C01FB808C083E0493E580714F088E03B
-:102E70000FC04F5F5F4F779BF6CF8FB1F901E551E0
-:102E8000FB4F82832F5F3F4F2617370754F381E0B4
-:102E90008093EC04FB01E351FB4F1082CB010396BE
-:102EA0000E94BD01089593E49093EB04282F30E035
-:102EB00090E007C0E60FF71F80818FB9779BFECFA8
-:102EC0009F5FE92FF0E0E217F307A4F381E080931E
-:102ED000EC041092ED0483E090E00E94BD0108959F
-:102EE00081E48093EB041DB81EB810924B0310923E
-:102EF0004C0310924D0381E08093EC041092ED049A
-:102F000083E090E00E94BD01089590E49093EB046B
-:102F10000E942D168093EC041092ED0483E090E063
-:102F20000E94BD010895CF93DF93EC018881833423
-:102F3000A9F0843428F4803441F0813409F50BC0C1
-:102F4000843499F08534E1F414C04C816B818A811A
-:102F50000E94851720C00E9470171DC0BE016D5FC2
-:102F60007F4F8A810E94531716C08A8190E00E9489
-:102F700028176A8170E0CE0103960E94F7160BC0F5
-:102F80008093EB0483E08093EC041092ED0483E0E3
-:102F900090E00E94BD01DF91CF910895B89AB99A4F
-:102FA000BA9ABB98BC9ABD9AC498C59881E08093A0
-:102FB000560382E08093570380935803809359030C
-:102FC00081E090E0089510925603109257031092FA
-:102FD00058031092590381E090E00895C098C19879
-:102FE000C29880E29EE40197F1F7C09A8AE0982F98
-:102FF0009A95F1F7C29AC19A8A95F1F70895282F08
-:10300000C19887FD02C0C29801C0C29A8AE0982F79
-:103010009A95F1F7C19A8A95F1F7C19826FF02C0F7
-:10302000C29A01C0C2988AE0982F9A95F1F7C19A86
-:103030008A95F1F70895880F20E03AE0C19887FF5C
-:1030400002C0C29A01C0C298932F9A95F1F7C19A13
-:10305000932F9A95F1F72F5F273011F0880FEECF5D
-:10306000089520E03AE0C19887FF02C0C29A01C0EB
-:10307000C298932F9A95F1F7C19A932F9A95F1F7E9
-:103080002F5F283011F0880FEECF0895C198C298B5
-:103090008AE0982F9A95F1F7C19A982F9A95F1F7AF
-:1030A000C198C098982F9A95F1F7C19A982F9A9540
-:1030B000F1F7C1988A95F1F7C09A80E00895C19818
-:1030C000C098C298C39A08950E94EE1780E30E94A8
-:1030D000FF1780E60E941B1808950E94EE1780E0FB
-:1030E0000E94FF1780E00E941B18C198C098C298E8
-:1030F000C39A08950F931F93182F062F0E94EE175F
-:1031000080E40E94FF17812F0E941B18802F0E94CD
-:10311000311881E01F910F9108951F93182F0E947D
-:10312000EE1780EC0E94FF17812F0E941B180E944F
-:1031300046181F910895C1988AE08A95F1F7C298C0
-:1031400020E080E04AE0880FC19A942F9A95F1F729
-:10315000C198B3998F5F3AE0942F9A95F1F72F5F5A
-:10316000283089F7C098C19A932F9A95F1F7C09AA1
-:10317000C198932F9A95F1F708951F93182F0E94E5
-:10318000EE1780E80E94FF17812F0E941B180E94F3
-:103190009B181F910895DF92EF92FF920F931F9358
-:1031A000CF93DF93D82E7B018A01C0E0D0E009C025
-:1031B0008D2D8C0F0E94BD18F801EC0FFD1F808330
-:1031C0002196CE15DF05A0F381E090E0DF91CF914D
-:1031D0001F910F91FF90EF90DF9008950F931F9331
-:1031E000082F162F0E946418612F802F0E947A18D2
-:1031F00081E01F910F910895DF92EF92FF920F935C
-:103200001F93CF93DF93D82E7B018A01C0E0D0E0DB
-:1032100009C0F801EC0FFD1F60818D2D8C0F0E94FD
-:10322000EE182196CE15DF05A0F381E090E0DF9146
-:10323000CF911F910F91FF90EF90DF90089594E050
-:103240009093EB040E94FC188093EC041092ED0420
-:1032500083E090E00E94BD010895EF92FF920F93EA
-:103260001F938B019BEEE92E94E0F92E93E090934F
-:10327000EB04A7014E5F5F4F0E94CB188093EC04D4
-:103280000E5F1F4FE00EF11EF7011082C80101967C
-:103290000E94BD011F910F91FF90EF90089582E071
-:1032A0008093EB0410925603109257031092580328
-:1032B0001092590381E08093EC041092ED0483E0B6
-:1032C00090E00E94BD01089581E08093EB040E948C
-:1032D000CE178093EC041092ED0483E090E00E94FE
-:1032E000BD010895FC018381823069F0833018F4B8
-:1032F0008130F1F405C0833049F08430C9F40FC047
-:103300000E94641908950E944F190895AF014A5F01
-:103310005F4F658170E084810E942D190895AF018F
-:103320004A5F5F4F658170E084810E941F19089594
-:1033300080818093EB0483E08093EC041092ED0491
-:1033400083E090E00E94BD0108951F920F920FB696
-:103350000F9211240F900FBE0F901F9018959C0193
-:103360000897029718F024E030E017C0F901EB5BF2
-:10337000FC4F8DE081832830310561F02930310523
-:1033800019F027E030E009C0BD9A81E090E09BBDD4
-:103390008ABD01C0BC9A21E030E0C9010895FC015A
-:1033A000EB5BFC4F118281E090E008959C01FC01F1
-:1033B000EB5BFC4F81818D3019F026E030E029C0B5
-:1033C0002830310521F12930310519F027E030E0AE
-:1033D00020C063307105A9F0643071053CF46130A0
-:1033E000710559F06230710591F409C064307105BE
-:1033F00051F06530710559F408C081E007C082E0E2
-:1034000005C083E003C084E001C085E08EBD21E0FB
-:1034100030E0C90108959C01FC01EB5BFC4F818108
-:103420008D3019F026E030E00DC02830310541F034
-:103430002930310519F027E030E004C07BBD6ABDBA
-:1034400021E030E0C90108959C0183E58093EB04FD
-:10345000F901EB5BFC4F81818D3019F086E090E043
-:103460000DC02830310541F02930310519F087E0D1
-:1034700090E004C07BBD6ABD81E090E08093EC04E5
-:103480001092ED0483E090E00E94BD01089522E5D2
-:103490002093EB040E94D6198093EC041092ED0463
-:1034A00083E090E00E94BD01089521E52093EB04A4
-:1034B000FC01EB5BFC4F118281E08093EC041092E5
-:1034C000ED0483E090E00E94BD01089520E5209383
-:1034D000EB040E94AF198093EC041092ED0483E09A
-:1034E00090E00E94BD010895FC018081813579F052
-:1034F000823518F48035F1F405C0823569F08335E2
-:10350000C9F411C0828190E00E94661A08958281F8
-:1035100090E00E94551A0895638170E0828190E0E6
-:103520000E94471A0895638170E0828190E00E94B2
-:10353000241A08958093EB0483E08093EC041092A6
-:10354000ED0483E090E00E94BD010895DF93CF93E6
-:10355000CDB7DEB7CF91DF910895089581E090E077
-:10356000089508958A3310F4805301C087556A3353
-:1035700010F4605301C067556F708295807F862B71
-:1035800008950895DC0180E1A030B80710F082E0D2
-:103590000895E199FECF9D0109C03FBB2EBB2F5F6F
-:1035A0003F4FE09A8DB3E60FF71F8083822F8A1B6F
-:1035B000E82FF0E0E417F50780F381E00895DC01DF
-:1035C00080E1A030B80710F082E00895E199FECFC5
-:1035D0009D010AC03FBB2EBB2F5F3F4FE60FF71F79
-:1035E00080818DBBE29AE19A822F8A1BE82FF0E05E
-:1035F000E417F50778F381E008950F931F938B018B
-:1036000021E82093EB040E94DF1A8093EC041092CF
-:10361000ED041F930F9389EF92E09F938F930E9485
-:10362000A61A83E090E00E94BD010F900F900F90CA
-:103630000F901F910F910895CF93DF93AC01EB0191
-:1036400080E88093EB0480E14030580710F082E07E
-:1036500015C0E199FECF9A0109C03FBB2EBB2F5F79
-:103660003F4FE09A8DB3E351FB4F8083822F841B41
-:10367000E82FF0E0EC17FD0780F381E08093EC0485
-:10368000FE01E351FB4F10828DEE94E09F938F93E8
-:1036900086E093E09F938F930E94A61ACE01039633
-:1036A0000E94BD010F900F900F900F90DF91CF916E
-:1036B0000895EF92FF920F931F93CF93DF93EC0146
-:1036C0009B8180E02A817C01E20EF11C9D8180E0DB
-:1036D0002C818C01020F111DFF92EF921F930F930B
-:1036E00080E193E09F938F930E94A61A88812DB763
-:1036F0003EB72A5F3F4F0FB6F8943EBF0FBE2DBFB7
-:10370000803819F0813869F405C0B801C7010E94FA
-:103710001C1B12C02696A801BE01C7010E94FD1AFB
-:103720000BC08093EB0483E08093EC041092ED04D3
-:1037300083E090E00E94BD01DF91CF911F910F9136
-:10374000FF90EF900895CF93DF93BC0182309105F5
-:1037500010F462E070E0A0917006B0917106ED0186
-:10376000E0E0F0E040E050E021C0888199818617D8
-:10377000970769F48A819B81309719F0938382833C
-:1037800004C09093710680937006FE0133C06817E1
-:10379000790738F44115510519F08417950708F495
-:1037A000AC01FE018A819B819C01E9012097E9F629
-:1037B00041155105A1F1CA01861B970B049708F426
-:1037C000BA01E0E0F0E029C08D919C911197841737
-:1037D0009507F1F46417750779F4ED018A819B81EF
-:1037E000309719F09383828304C09093710680937D
-:1037F0007006FD0132964CC0CA01861B970BFD0175
-:10380000E80FF91F6193719302978D939C9340C0C9
-:10381000FD01828193819C01D9011097A9F68091C5
-:103820006E0690916F06892B41F480913703909139
-:10383000380390936F0680936E0640913903509140
-:103840003A034115510541F44DB75EB780913503F8
-:1038500090913603481B590B20916E0630916F06EC
-:10386000CA01821B930B8617970780F0AB014E5F4E
-:103870005F4F8417950750F0420F531F50936F0608
-:1038800040936E06F9016193719302C0E0E0F0E0AD
-:10389000CF01DF91CF910895CF93DF93009709F483
-:1038A0004EC0EC0122971B821A82A0917006B09143
-:1038B0007106109701F140E050E0AC17BD0700F130
-:1038C000BB83AA83FE0121913191E20FF31FAE1752
-:1038D000BF0771F48D919C911197280F391F2E5FAE
-:1038E0003F4F39832883FD01828193819B838A83A3
-:1038F0004115510569F4D0937106C09370061FC03D
-:10390000FD0182819381AD01009711F0DC01D5CFDB
-:10391000FA01D383C28321913191E20FF31FCE17B5
-:10392000DF0769F488819981280F391F2E5F3F4F87
-:10393000FA01318320838A819B8193838283DF9183
-:10394000CF91089597FB092E07260AD077FD04D062
-:103950000CD006D000201AF4709561957F4F089521
-:10396000F6F7909581959F4F0895AA1BBB1B51E1D7
-:1039700007C0AA1FBB1FA617B70710F0A61BB70BDF
-:10398000881F991F5A95A9F780959095BC01CD0184
-:063990000895F894FFCF3A
-:10399600456D62656464656450726F6A65637473CD
-:1039A600004F63746F70757355534220496E74658A
-:1039B600726661636520436F6E7665727465722008
-:1039C600616E6420492F4F20457874656E73696F68
-:1039D6006E003230303831313038006669727374B7
-:1039E600207061636B6574206F662061206C6F6E5A
-:1039F60067206D65737361676520286C656E6774F3
-:103A0600683A202564290A006F63746F7075732005
-:103A16006C6F6E672072756E6E696E67206D65736A
-:103A2600736167650A006F63746F7075732E6C6FD0
-:103A36006E675F696E646578203C206F63746F7093
-:103A460075732E6C6F6E675F62797465730A006EAC
-:103A56006F74206C617374207061636B65743A20B7
-:103A660064696666203E2036340A006C61737420F1
-:103A76007061636B65740A007061727365722C20E5
-:103A8600636865636B3A2025582C20636F6D6D6102
-:103A96006E643A2025580A0063616C6C696E672073
-:103AA600696F5F7061727365720A0063616C6C693D
-:103AB6006E67206164635F7061727365720A00638A
-:103AC600616C6C696E67206932635F7061727365E1
-:103AD600720A0063616C6C696E67207370695F704F
-:103AE60061727365720A0063616C6C696E6720703F
-:103AF600776D5F7061727365720A0063616E277419
-:103B06002063616C6C2063616E5F706172736572B5
-:103B1600202D206E6F2043414E2D737570706F728D
-:103B2600740A0063616C6C696E6720656570726FFC
-:103B36006D5F7061727365720A00756E6B6E6F777A
-:103B46006E20636D640A00726563656976696E67E7
-:103B560020636F6D6D616E643A20255820286C6570
-:103B66006E6774683A202575290A00676574206EA9
-:103B76006578740A0067657420616E6420657865EF
-:103B8600637574650A000904007772697474656E5A
-:103B96003A2025730A00726561643A2025730A008B
-:103BA600656570726F6D5F7061727365723A206CD5
-:103BB600656E6774683A2025752C20616464723AD4
-:0C3BC6002025750A002000720600000097
-:00000001FF
diff --git a/firmware/octopus_stable_1_1.hex b/firmware/octopus_stable_1_1.hex
deleted file mode 100644
index 5fa412b..0000000
--- a/firmware/octopus_stable_1_1.hex
+++ /dev/null
@@ -1,971 +0,0 @@
-:100000000C94F6000C9415010C9415010C94150138
-:100010000C9415010C94E4030C9415010C94150137
-:100020000C9415010C9415010C9415010C941501F8
-:100030000C94031A0C9415010C9415010C941501E1
-:100040000C94BD030C9415010C9417010C9415012C
-:100050000C9415010C9415010C9415010C941501C8
-:100060000C9415010C9415010C9415010C941501B8
-:100070000C9415010C9415010C9415010C941501A8
-:100080000C9415010C9415010C941501001002102C
-:100090000410061008100A100C100E101010121088
-:1000A0001410161018101A101C101E1020102210F8
-:1000B0002410661066106610661066106610261012
-:1000C00028102A102C102E10301032103410381036
-:1000D0003C10421046104A104E10521058105A1040
-:1000E0005C106010AF10B110B310B510B710B9109C
-:1000F000BB10BD10BF10C110C310C510C710C91070
-:10010000CB10CD10CF10D110D31015111511151122
-:10011000151115111511D510D710D910DB10DD10E0
-:10012000DF10E110E310E710EB10F110F510F910FB
-:10013000FD100111071109110B110F118111871108
-:100140008D11931199119F11A511AB11B111B71117
-:10015000BD11C311C911CF11D511DB11E111E71187
-:10016000ED117E117E117E117E117E117E11F31133
-:10017000F911FF1105120B12111217121D1227127D
-:1001800033123D12471251125B1265126F12751233
-:100190007B128112CA12CD12D012D312D612D912EA
-:1001A000DC12DF12E212E512E812EB12EE12F1128B
-:1001B000F412F712FA12FD120013C712C712C71277
-:1001C000C712C712C7120313061309130C130F1318
-:1001D000181315131213151318131B131E132113C1
-:1001E00027132413241327132A132D1311241FBE9E
-:1001F000CFEFD0E1DEBFCDBF13E0A0E0B1E0E6E598
-:10020000FAE300E00BBF02C007900D92AC33B107D8
-:10021000D9F716E0ACE3B3E001C01D92A237B107F5
-:10022000E1F70E942C010C942A1D0C9400001F92EF
-:100230000F920FB60F9211240F900FBE0F901F90C8
-:100240001895FC0120E030E002C02F5F3F4F819104
-:100250008823D9F7C9010895CCEFD0E1DEBFCDBF27
-:10026000F8940E9453090E94CC0E8FEF87BB88BB85
-:10027000C7980E94B80981E897E10E94030A85E6C1
-:100280009CE00E94080A81E090E00E940D0ADE01D5
-:100290001196E6EFF2E083E001900D928150E1F7D4
-:1002A000CE0101960E94020E80E091E00E949E0E17
-:1002B00081E191E00E94960E82E491E00E948E0E10
-:1002C0000E94D80D4C0164E670E00E941B0A60E0B9
-:1002D00070E0C4010E94440D3C0140E050E0BC01CC
-:1002E000C4010E943C0A2EE0A22E22E0B22ECC24B1
-:1002F000DD2490E4E92EF12C02E021E030E041E041
-:1003000050E0B301C4010E94D90C8DE2A82E83E015
-:10031000B82E21E030E041E050E0B301C4010E947A
-:10032000110D10929A031092990310929C0310924F
-:100330009B030E940E1B8FE784BB8AE285BB0E9451
-:10034000080485E585BB0E94080415BA0E94520F77
-:100350000E9453090E94D10E7894FFCF0F931F93F0
-:10036000CF93DF93EC018134910510F18091A503C7
-:100370009091A603892BE1F4DF93CF938BE491E076
-:100380009F938F930E94071B1092A2031092A103C8
-:10039000D093A403C093A30381E090E09093A603BD
-:1003A0008093A503C0E4D0E00F900F900F900F90C2
-:1003B00068E08BE20E94A10900E010E00EC0E0912D
-:1003C000A103F091A203E00FF11FE551FB4F608103
-:1003D00089E20E94A1090F5F1F4F0C171D0779F7D3
-:1003E0008091990390919A03019749F467E08BE219
-:1003F0000E94A10910929A03109299030AC063E027
-:100400008BE20E94A10981E090E090939A0380938F
-:100410009903DF91CF911F910F910895CF93DF93AF
-:100420008091A5039091A603019709F04CC088E73D
-:1004300091E09F938F930E94071B2091A10330911D
-:10044000A2038091A3039091A4030F900F9028170B
-:100450003907C8F586E991E09F938F930E94071BA7
-:10046000C091A303D091A4038091A1039091A20312
-:10047000C81BD90B8091A1039091A203805C9F4F70
-:100480009093A2038093A1030F900F90C134D105E4
-:100490005CF08FEB91E09F938F930E94071B80E4A9
-:1004A00090E00E94AE010DC08BED91E09F938F9381
-:1004B0000E94071BCE010E94AE011092A60310926B
-:1004C000A5030F900F90DF91CF9108950F931F9385
-:1004D000CF93DF938C011092A2031092A10310928C
-:1004E000A6031092A503C79AFC018081282F2295AC
-:1004F0002F70C22FDD2799279F938F93DF93CF9380
-:1005000088EE91E09F938F930E94071B8DB79EB753
-:1005100006960FB6F8949EBF0FBE8DBFC430D105AE
-:1005200009F451C0C530D10584F4C130D10569F159
-:10053000C230D1051CF4CD2BC1F074C0C230D1053E
-:1005400071F1239709F06EC034C0C630D10509F4AB
-:100550004EC0C630D1050CF440C0C730D10509F4F7
-:1005600050C0289709F05EC053C0F80180818630E2
-:1005700041F48281813009F06AC0C8010E94D0191B
-:1005800066C0C8010E944B0F62C088E092E09F9352
-:100590008F930E94071BC8010E940F1456C08BE165
-:1005A00092E09F938F930E94071BC8010E945315EE
-:1005B0004CC08FE292E09F938F930E94071BC8016B
-:1005C0000E94731642C083E492E09F938F930E942F
-:1005D000071BC8010E94EE1738C087E592E09F9381
-:1005E0008F930E94071BC8010E94D51A2EC08BE171
-:1005F00092E09F938F930E94071BC8010E94E5051C
-:1006000024C08BE692E09F938F930E94071B1DC02E
-:1006100083E992E09F938F930E94071BC8010E9479
-:10062000B91B13C08AEA92E09F938F930E94071B25
-:10063000F80180818093EB0483E08093EC041092B6
-:10064000ED0483E090E00E94AE010F900F90C798F8
-:10065000DF91CF911F910F9108950F931F93CF9327
-:10066000DF93EC018C010F5F1F4F898199279F93C6
-:100670008F9387EB92E09F938F930E94071B80914B
-:100680009B0390919C030F900F900F900F900197F8
-:1006900091F58BED92E09F938F930E94071B20E0D2
-:1006A00030E00F900F90E0919D03F0919E03E20FD8
-:1006B000F31FDE01A20FB31F8C91E555FC4F808321
-:1006C0002F5F3F4F2034310571F780919D0390914A
-:1006D0009E03805C9F4F90939E0380939D03209187
-:1006E0009D0330919E0380919F039091A003281752
-:1006F0003907F0F128C085EE92E09F938F930E9416
-:10070000071B10929E0310929D0320E030E00F9093
-:100710000F90E0919D03F0919E03E20FF31FDE0125
-:10072000A20FB31F8C91E555FC4F80832F5F3F4F85
-:100730002034310571F730939E0320939D03F80117
-:100740002081203448F410929C0310929B038BEA82
-:1007500093E00E9466020CC081E090E090939C03BD
-:1007600080939B03822F99279093A00380939F03EC
-:10077000DF91CF911F910F9108951F920F920FB6A5
-:100780000F9211242F933F934F935F936F937F9317
-:100790008F939F93AF93BF93EF93FF930E941C0F90
-:1007A0008091450382BFFF91EF91BF91AF919F91DF
-:1007B0008F917F916F915F914F913F912F910F900A
-:1007C0000FBE0F901F9018951F920F920FB60F92A9
-:1007D00011242F933F934F935F936F937F938F9346
-:1007E0009F93AF93BF93EF93FF930E94A60EFF9149
-:1007F000EF91BF91AF919F918F917F916F915F9199
-:100800004F913F912F910F900FBE0F901F90189511
-:1008100020E080E49CE90197F1F72F5F2931C9F7C7
-:100820000895882329F0813069F084E090E00895EC
-:100830008EE080936F038093700388E18AB981E032
-:1008400090E008958EE0809354038093550388E1EF
-:1008500080939A0081E090E00895882329F0813008
-:1008600081F084E090E0089510926F03109270037D
-:100870001092900019B81AB81092950081E090E09B
-:1008800008951092540310925503109298001092FC
-:10089000990010929A0010929D0081E090E00895D6
-:1008A0000F93882329F0813039F084E090E00AC06A
-:1008B0002093900069B904C0209398006093990038
-:1008C00081E090E00F910895623011F492E001C050
-:1008D00090E0882329F0813071F084E090E0089561
-:1008E00080919500990F990F990F982B90939500EF
-:1008F00081E090E0089580919D00990F990F990FE4
-:10090000982B90939D0081E090E00895663061F00F
-:10091000673019F0653019F404C021E003C021E00C
-:1009200004C020E090E002C020E091E0882329F09C
-:10093000813079F084E090E0089580919500220F55
-:10094000220F990F922B982B9093950081E090E0C5
-:10095000089580919D00220F220F990F922B982BC2
-:1009600090939D0081E090E00895653439F06F34F4
-:1009700019F421E091E004C020E001C021E090E002
-:10098000882329F0813089F084E090E008958091F7
-:1009900095002295220F207E9295907F922B982B86
-:1009A0009093950081E090E0089580919D002295BC
-:1009B000220F207E9295907F922B982B90939D00F2
-:1009C00081E090E00895882329F0813049F084E0A7
-:1009D00090E008955D9BFECF6CB981E090E00895B2
-:1009E00080919B0085FFFCCF60939C0081E090E0AC
-:1009F0000895FF920F931F93CF93DF93F82EEB018F
-:100A00008A0181E08F1548F484E090E00DC0F80180
-:100A100061918F018F2D0E94E3042197FFEFCF3F5B
-:100A2000DF07A9F781E090E0DF91CF911F910F914F
-:100A3000FF900895882329F0813039F084E090E018
-:100A400008955F9BFECF8CB106C080919B0087FF0D
-:100A5000FCCF80919C0099270895FF920F931F93DC
-:100A6000CF93DF93F82E8B0181E08F1518F484E08B
-:100A700090E00EC0EA0107C08F2D0E941A05F80110
-:100A800081938F0121971C161D06B4F381E090E03D
-:100A9000DF91CF911F910F91FF90089577270E94CA
-:100AA000F9048093EC041092ED0483E090E00E943E
-:100AB000AE0108950E9486048093EC041092ED0428
-:100AC00083E090E00E94AE0108950E948604809326
-:100AD000EC041092ED0483E090E00E94AE010895D2
-:100AE0000E9464048093EC041092ED0483E090E093
-:100AF0000E94AE0108950F930E9450048093EC046D
-:100B00001092ED0483E090E00E94AE010F910895F1
-:100B10000E942D048093EC041092ED0483E090E099
-:100B20000E94AE0108950E9411048093EC0410927B
-:100B3000ED0483E090E00E94AE010895CF92DF9231
-:100B4000EF92FF920F931F93CF93DF93CDB7DEB752
-:100B50008B01CDB6DEB62DB73EB7261B370B0FB6D1
-:100B6000F8943EBF0FBE2DBFEDB6FEB60894E11C53
-:100B7000F11CAB01B7010E942D058093EC0420E02D
-:100B800030E00AC0F701E20FF31F8081F901E35161
-:100B9000FB4F80832F5F3F4F201731079CF3F801F5
-:100BA000E351FB4F1082C80103960E94AE010FB6BD
-:100BB000F894DEBE0FBECDBEDF91CF911F910F9195
-:100BC000FF90EF90DF90CF9008950F93FC0180810C
-:100BD0008093EB04843611F1853648F48236B1F007
-:100BE0008336E0F4803651F0813681F50BC08736CC
-:100BF00039F18836E9F0853649F515C082810E94C1
-:100C000093052DC082810E94880529C00681258117
-:100C10004481638182810E947B0521C0638182813E
-:100C20000E9470051CC0638182810E945A0517C012
-:100C3000AF014C5F5F4F638182810E944E050FC000
-:100C40006381772782810E949E0509C083E080939B
-:100C5000EC041092ED0483E090E00E94AE010F914D
-:100C6000089587E28093530685E28093520690E2CE
-:100C7000909354061092550628E030E030935706C2
-:100C80002093560683E280935F0681E280935E069E
-:100C9000909360061092610630936306209362067B
-:100CA0000895089560916B0681E20E94A10908955C
-:100CB00068E08BE20E94A10961E188E20E94A1093B
-:100CC00068E08FE20E94A10961E18CE20E94A10923
-:100CD00061E08FE20E94A10910929A031092990399
-:100CE00065E083E20E94A10908950F931F938C0190
-:100CF00060E480E20E94A109F8016281605884E00A
-:100D00000E94A109F801828180936A061F910F91C8
-:100D100008950F931F93CF93DF93EC0128853985B6
-:100D200012161306DCF58E819F81821793071CF53E
-:100D300068E083E20E94A10900E010E00FC08A850C
-:100D40009B85E80FF91F608181E20E94A1098E81D5
-:100D50009F8101969F838E830F5F1F4FEE81FF81DE
-:100D600088859985083011051CF4E817F9073CF3CC
-:100D7000E817F90724F061E087E20E94A1098B815E
-:100D8000813031F465E089810E94A1091B8206C08F
-:100D900061E089810E94A10981E08B83DF91CF917D
-:100DA0001F910F910895CF93DF93CDB7DEB72497AE
-:100DB0000FB6F894DEBF0FBECDBFDC01FC0122816F
-:100DC0003381109265061092640681E0809361067B
-:100DD000832F99278230D9F0833069F1813009F06F
-:100DE00057C080913E0699279093670680936606C8
-:100DF0008EE396E0909369068093680686819781DA
-:100E00008034910509F044C088E090E029C0FD01DC
-:100E1000868197819093670680936606E22FFF276D
-:100E2000EE0FFF1F8091500690915106E80FF91FB9
-:100E30008081918129C02223C1F0E22FFF27EE0F8C
-:100E4000FF1F8091A9039091AA03E80FF91F019059
-:100E5000F081E02DF0936906E09368068081992780
-:100E6000909367068093660613C094E0998383E0AD
-:100E70008A8389E08B839C8384E090E0909367066B
-:100E800080936606CE01019690936906809368066A
-:100E90008EE596E00E94890624960FB6F894DEBF90
-:100EA0000FBECDBFDF91CF910895CF93DF9382E244
-:100EB0000E947809C82FDD27C5FF1AC068E083E2C9
-:100EC0000E94A109C6FF10C02091640630916506FA
-:100ED0008091660690916706281739072CF48EE5F5
-:100EE00096E00E94890604C061E087E20E94A109A1
-:100EF000DF91CF9108951F93CF93DF9388E00E94F5
-:100F00007809182FC82FDD27C6FF18C060E085E0DC
-:100F10000E94A10960E884E00E94A10960E080E2EB
-:100F20000E94A10968E083E20E94A10961E087E2D2
-:100F30000E94A10962E085E00E94A109C4FF04C0EB
-:100F400060EC89E00E94A10917FF04C060ED89E010
-:100F50000E94A109DF91CF911F9108958AE00E941C
-:100F60007809992780FF03C00E945507089581FFE3
-:100F70000DC08AE20E94780980912B06813061F4CD
-:100F8000E0912E06F0912F060995089582E30E94C4
-:100F900078098AE30E94780908958EE00E94780912
-:100FA00068E08FE20E94A10961E08FE20E94A1093E
-:100FB00020916606309167068091620690916306E3
-:100FC000821793075CF468E083E20E94A10961E064
-:100FD00087E20E94A10981E0809361060895AF92A3
-:100FE000BF92CF92DF92EF92FF920F931F93CF9316
-:100FF000DF93CDB7DEB728970FB6F894DEBF0FBEEC
-:10100000CDBF86E20E94780986FF7EC08E010F5F09
-:101010001F4F580169E0C62ED12CCC0EDD1E8091E9
-:1010200052060E947809F80181938F017501EC1531
-:10103000FD05A9F768E087E20E94A10968E083E264
-:101040000E94A10980E20E9478098F77682F80E2D0
-:101050000E94A1098981992780769070803291053C
-:1010600009F440C080349105D1F1892BF1F5F501E7
-:1010700081818630D9F0873048F48130F1F18130B8
-:10108000C8F08330D1F1853081F521C0893019F164
-:101090008A3018F4883049F505C08A3071F18B30F8
-:1010A00021F520C0C5010E94520627C0C5010E943B
-:1010B000D30623C068E083E20E94A10961E081E2D7
-:1010C0000E94A10960E081E20E94A1090BC0C50154
-:1010D0000E94750612C0C5010E9458060EC0C501C7
-:1010E0000E94510965E083E206C080E20E9478090F
-:1010F0008058682F80E20E94A109F701808188232F
-:10110000D1F465E083E215C0209166063091670650
-:1011100080916206909163068217930764F410929F
-:1011200067061092660668E083E20E94A10961E00A
-:1011300087E20E94A10928960FB6F894DEBF0FBE81
-:10114000CDBFDF91CF911F910F91FF90EF90DF9076
-:10115000CF90BF90AF900895CF92DF92EF92FF9221
-:101160000F931F93CF93DF93CDB7DEB7C054D0401A
-:101170000FB6F894DEBF0FBECDBF8CE00E94780999
-:10118000992780FF03C00E94EF077BC081FF2AC020
-:101190008EE20E9478098DE20E94780989838E018F
-:1011A0000F5F1F4F6801FFE3EF2EF12CE00EF11EE1
-:1011B0000F5F1F4F0E946409F80180830E151F0501
-:1011C000B9F780913C03813031F4E0913F03F09115
-:1011D0004003C601099568E08FE20E94A10961E021
-:1011E0008FE22BC082FF2CC086E30E94780985E342
-:1011F0000E94780989838E010F5F1F4F6801EFE31A
-:10120000EE2EF12CE00EF11E0F5F1F4F0E946409BD
-:10121000F80180830E151F05B9F780913D038130D9
-:1012200031F4E0914103F0914203C601099568E071
-:1012300087E30E94A10961E087E30E94A10921C020
-:1012400083FF1FC08EE30E9478098E010F5F1F4F3E
-:10125000680171E4E72EF12CEC0EFD1E8DE30E9477
-:101260007809F80181938F01EE15FF05B9F7809198
-:101270003E03813031F4E0913F03F0914003C60119
-:101280000995C05CDF4F0FB6F894DEBF0FBECDBF2F
-:10129000DF91CF911F910F91FF90EF90DF90CF9052
-:1012A00008950895089581E08ABF80E189BFE4E64A
-:1012B000F0E0808187608083E5E6F0E080818360F4
-:1012C0008083A79AAF9A089585B3805885BBE5E6D9
-:1012D000F0E0808122E0822780830000000089B353
-:1012E00095B3905895BB9081922790839927089544
-:1012F0009FEF9ABB8BBB85B3805885BBE5E6F0E0DA
-:10130000808195E08927808385B3805885BB808163
-:101310008927808300001ABA0E94640999270895DA
-:101320008BBB85B3805885BBE5E6F0E0808191E01A
-:101330008927808385B3805885BB808189278083F6
-:1013400008958BBB8FEF8ABB85B3805885BBE5E6DC
-:10135000F0E0808195E08927808385B3805885BB44
-:10136000808189278083862F0E949009089508959F
-:1013700082E180933E0681E080933F0680E191E028
-:1013800090934106809340061092420610924306C5
-:101390001092440688E0809345061092470610920A
-:1013A0004606109249061092480610924B0610927B
-:1013B0004A0610924C0610924D0610924E0610925C
-:1013C0004F0610923C0310923D0310923E03109280
-:1013D0002B0610922C0610922D06109235061092B4
-:1013E00034061092A8031092A7030895909347061D
-:1013F00080934606709349066093480650934B06C7
-:1014000040934A06089590934706809346060895B0
-:101410009093490680934806089590934B068093D5
-:101420004A060895809342060895809343060895DE
-:10143000809344060895CF93DF939C01CB01E09104
-:101440003406F091350662E070E00E94031D0FC083
-:10145000A081B1818281823039F4ED018D8199279B
-:101460008217930709F468870780F085E02D30978D
-:1014700079F7DF91CF910895CF93DF939C01E091AD
-:101480003406F091350614C0A081B1818281843088
-:1014900061F4848199278217930739F4868199270B
-:1014A0008617970711F4ED014B830780F085E02D37
-:1014B000309751F7DF91CF910895BF92CF92DF928D
-:1014C000EF92FF920F931F93CF93DF936C01162F30
-:1014D000F42EB22EC0913406D09135062097A1F497
-:1014E00089E090E00E94051CFC01909335068093F2
-:1014F0003406D182C082138310861782F282B482AE
-:101500000583E68215C0EC018F8198850097D9F795
-:1015100089E090E00E94051CFC0198878F83D182AE
-:10152000C0821383F282B4820583E682108617821A
-:10153000DF91CF911F910F91FF90EF90DF90CF90AF
-:10154000BF900895EF92FF921F93CF93DF937C019A
-:10155000C091A703D091A803209711F011E012C009
-:1015600085E090E00E94051CFC019093A803809305
-:10157000A703F182E08212821482138210E012C06B
-:101580001F5FEC018B819C810097D1F785E090E093
-:101590000E94051CFC019C838B83F182E0821283F4
-:1015A00014821382812F9927DF91CF911F91FF9091
-:1015B000EF900895EF92FF920F931F93CF93DF93D5
-:1015C000E091A703F091A80380E090E00380F4810C
-:1015D000E02D01963097D1F7880F991F0E94051CC6
-:1015E0009093AA038093A9030091A7031091A803E5
-:1015F000E801E880F9808A81C82FDD27CC0FDD1F44
-:101600008091A9039091AA03C80FD91FF701808187
-:1016100099270E94051C9983888320E030E017C039
-:10162000E801EA81FF27EE0FFF1F8091A903909147
-:10163000AA03E80FF91F0190F081E02DE20FF31FDC
-:10164000D701A20FB31F8C9180832F5F3F4FF7010B
-:1016500080819927281739071CF3E8018B819C8129
-:10166000009711F08C01C4CFDF91CF911F910F91A2
-:10167000FF90EF9008954F925F926F927F928F92BA
-:101680009F92AF92BF92CF92DF92EF92FF920F9311
-:101690001F93CF93DF93E0913406F09135066624D3
-:1016A000772409C08281823019F40894611C711C6E
-:1016B0000780F085E02D3097A9F74301880C991C2D
-:1016C000C4010E94051C9093510680935006E1E0EE
-:1016D000EE2EF12CAA24BB2455C0E0913406F091E3
-:1016E000350679E0C72ED12C15C0A081B181848147
-:1016F00099278E159F0519F48381C80ED11CED0121
-:101700008D818E1521F48281823009F45D0107807C
-:10171000F085E02D309749F7009150061091510661
-:1017200002501040080D191DC6010E94051CF80149
-:101730009183808320E030E0E0915006F0915106E3
-:10174000E80DF91D32970190F081E02DE20FF31FB3
-:10175000D501A20FB31F8C9180832F5F3F4F29309B
-:10176000310551F7E0915006F0915106E80DF91D51
-:1017700032970190F081E02D8C2D875F8283089451
-:10178000E11CF11C6E147F040CF0A7CF61E0C62EA3
-:10179000D12C59E0A52EB12C4424552442E0842EAE
-:1017A000912CA1C0A0913406B091350612C0ED91E4
-:1017B000FC9111978181823049F4858199278C159C
-:1017C0009D0521F48481482E552405C0ED01AF818B
-:1017D000B885109761F731E0E32EF12C79C0609164
-:1017E0003406709135066DC0FB01C081D1818981BD
-:1017F000843009F063C0868199278E159F0509F012
-:101800005DC0848199278C159D0509F057C095010D
-:1018100040E050E0E0915006F0915106E80DF91DCE
-:1018200032970190F081E02DE20FF31FDE01A40F4B
-:10183000B51F8C9180832F5F3F4F4F5F5F4F4930C3
-:10184000510541F789E090E0A80EB91EC091340619
-:10185000D091350631C08A81853059F58C81992720
-:101860008C159D0531F58D8199278E159F0509F5FC
-:1018700008811981950140E050E0E0915006F09117
-:101880005106E80DF91D32970190F081E02DE20F2D
-:10189000F31FD801A40FB51F8C9180832F5F3F4F9A
-:1018A0004F5F5F4F4730510541F7E7E0F0E0AE0E84
-:1018B000BF1E0F80D885C02D209769F6EB016F8180
-:1018C00078856115710509F08FCF0894E11CF11C32
-:1018D0004E145F040CF083CF0894C11CD11CE2E0CD
-:1018E000F0E08E0E9F1E6C147D040CF05BCFDF9138
-:1018F000CF911F910F91FF90EF90DF90CF90BF900D
-:10190000AF909F908F907F906F905F904F900895D1
-:101910006F927F928F929F92AF92BF92CF92DF92FF
-:10192000EF92FF920F93CF93DF935C013B0149014C
-:10193000E0913406F091350616C0A081B181848112
-:101940009927A816B90661F4868199278615970507
-:1019500039F48281843021F4ED018C818F5F8C8396
-:101960000780F085E02D309741F787E090E00E94F6
-:10197000051CFC0187E0808385E0818382820383EC
-:10198000F582E482C682EE24062D2A2D45E067E02A
-:10199000CF010E945D0ADF91CF910F91FF90EF90F0
-:1019A000DF90CF90BF90AF909F908F907F906F907F
-:1019B0000895AF92BF92CF92DF92EF92FF920F9372
-:1019C000FC01A114B10401F14230510571F0433022
-:1019D000510599F041305105B9F481E080932B060F
-:1019E000B0922F06A0922E060FC081E080932C06A5
-:1019F000B0923106A092300607C081E080932D0698
-:101A0000B0923306A092320620583F4FCF010E9479
-:101A1000880C0F91FF90EF90DF90CF90BF90AF9028
-:101A20000895AF92BF92CF92DF92EF92FF920F9301
-:101A3000FC014230510571F04330510599F04130BD
-:101A40005105B9F481E080933C03B0924003A09229
-:101A50003F030FC081E080933D03B0924203A09208
-:101A6000410307C081E080933E03B0924403A092FB
-:101A70004303CF010E94880C0F91FF90EF90DF90FD
-:101A8000CF90BF90AF900895CF92DF92EF920F93D7
-:101A90001F93CF93DF936C018B01A0913406B0911B
-:101AA0003506C0E0D0E014C02D913C911197F901AA
-:101AB00085818C1551F4FD018281823031F4F90168
-:101AC00084818F5F8483C82FDD27FD01A781B085C6
-:101AD000109751F789E090E00E94051CFC0189E015
-:101AE000808384E0818302831382148215821682AC
-:101AF00017821086EC2E00E02C2D44E069E0CF0127
-:101B00000E945D0ACE01DF91CF911F910F91EF905E
-:101B1000DF90CF900895BF92CF92DF92EF92FF9225
-:101B20000F931F93CF93DF936C017B01142FB22E81
-:101B3000A0913406B0913506C0E0D0E014C02D91DC
-:101B40003C911197F90185818C1551F4FD01828139
-:101B5000823031F4F90184818F5F8483C82FDD27BF
-:101B6000FD01A781B085109751F789E090E00E94B0
-:101B7000051CFC0189E0808384E08183E28213827A
-:101B800014821583B68207831086EC2E00E02C2D7C
-:101B900044E069E0CF010E945D0ACE01DF91CF9160
-:101BA0001F910F91FF90EF90DF90CF90BF9008951D
-:101BB000EF920F931F9310914F061F5F10934F06E4
-:101BC00089E090E00E94051CFC0189E0808389E0A7
-:101BD00090E09383828382E081831482158316824E
-:101BE00080EA87838AE18087EE2400E020E042E0FB
-:101BF00069E0CF010E945D0A812F99271F910F9103
-:101C0000EF900895CF93DF93EC01FC010190002049
-:101C1000E9F7E81BF90BCF01880F991F0E94051CFB
-:101C20009C01FE0101900020E9F7EC1BFD0BEE0F7B
-:101C3000FF1FDC01EC9383E0F901818340E050E079
-:101C400009C0FE01E40FF51F80818C93FD01118214
-:101C50004F5F5F4F1296FE0101900020E9F7319728
-:101C6000EC1BFD0B4E175F0760F3C9010E94A20A2F
-:101C70009927DF91CF910895EF92FF920F931F93D1
-:101C8000CF93DF938C017B01CA010E94020E9C015D
-:101C9000E0913406F091350614C0A081B1818281B3
-:101CA000843061F4848199278017910739F4868103
-:101CB00099278E159F0511F4ED0128870780F0857F
-:101CC000E02D309751F7DF91CF911F910F91FF9049
-:101CD000EF9008950F931F93CF93DF938C01CB0167
-:101CE0000E94020E9C01E0913406F09135060FC06F
-:101CF000A081B1818281823039F4ED018D819927F3
-:101D00008017910709F42E830780F085E02D309726
-:101D100079F7DF91CF911F910F9108950E94020EE4
-:101D20001816190614F480934E0608950E94020EA8
-:101D30001816190614F480934D0608950E94020E99
-:101D40001816190614F480934C0608951F9386E024
-:101D50000E947809992786FF03C00E94AC080EC034
-:101D600082FF03C00E94AE0709C081FF03C00E942A
-:101D70007B0704C084FF02C00E94CD0787E00E9459
-:101D80007809182F60E087E00E94A109612F87E0A1
-:101D90000E94A1091F91089562E081E00E94A109BB
-:101DA00008950E943B0B0E94DA0A0E94310661E00E
-:101DB00080E00E94A10980E00E94780980FDFBCFAD
-:101DC00062E081E00E94A10960E884E00E94A1092C
-:101DD00060E480E20E94A10968E083E20E94A10918
-:101DE00069E087E20E94A1096FE08DE00E94A109ED
-:101DF0006FE08BE00E94A10968ED89E00E94A109D3
-:101E000063E38FE00E94A10966ED87E00E94A109CB
-:101E100062E085E00E94A1096CEC80E00E94A109CB
-:101E200008958EEC8093450381E087BF8091450340
-:101E300082BF83E083BF08950895089583E080936F
-:101E4000EB0481E08093EC048BE08093ED049FE64B
-:101E50009093EE0483E68093EF0484E78093F0048C
-:101E60009093F10480E78093F20485E78093F30474
-:101E700083E78093F4048FE58093F50480E38093F7
-:101E8000F60481E38093F7041092F8048EE090E06A
-:101E90000E94AE010895FC018081833011F40E94FC
-:101EA0001E0F08951F9311E0812F0E94751060E0AE
-:101EB000812F0E9462111F5F1431B1F718E1812F49
-:101EC0000E94751060E0812F0E9462111F5F1B321B
-:101ED000B1F71F910895CF93DF93DC01EC01EA8104
-:101EE000FB8121918E81815019F48981E81BF109D0
-:101EF000ED01FB83EA838E839FB7F8948C91815028
-:101F00008C939FBF822F9927DF91CF910895FC0179
-:101F1000108275836483738362834183478346831E
-:101F20000895CF93DF93DC019C91ED01898198178F
-:101F300018F080E090E016C0ED01EC81FD81619326
-:101F40008F81815019F48981E81BF109ED018F839C
-:101F5000FD83EC839FB7F8948C918F5F8C939FBF28
-:101F600081E090E0DF91CF910895FC01808188238A
-:101F7000E9F3CF010E946B0F99270895FC0180813E
-:101F8000882319F48FEF9FEF0895CF010E946B0F04
-:101F90009927089581E090E0089581E090E0089508
-:101FA00081E090E0089581E090E00895CF93DF9381
-:101FB000CDB7DEB722970FB6F894DEBF0FBECDBF08
-:101FC000982F8150833120F08751833108F07EC0F3
-:101FD000E92FFF27EB5BFC4F82E08183892F992754
-:101FE000AA27BB27FC013197EC32F10508F06EC03F
-:101FF000EA5BFF4FEE0FFF1F0590F491E02D09946F
-:10200000159A5BC0169A5DC0179A57C0B89A59C006
-:10201000B99A53C0BA9A55C0BB9A4FC0BC9A51C026
-:10202000BD9A4BC0BE9A4DC0BF9A47C0889A49C05E
-:10203000899A43C08A9A45C08B9A3FC08C9A41C006
-:102040008D9A3BC08E9A3DC08F9A37C0A09A39C0F6
-:10205000A19A33C0A29A35C0A39A2FC0A49A31C0C6
-:10206000A59A2BC0A69A2DC080916100806807C0F8
-:1020700080916100806419C08091610080628093CA
-:1020800061001BC08091610080610FC08091610080
-:102090008860F5CF80916100846007C08091610005
-:1020A0008260EDCF8091610081608093610009C002
-:1020B000109A03C0119A05C0129A81E090E008C0FE
-:1020C000139AE1E0F0E0FA83E98304C084E090E051
-:1020D0009A83898389819A8122960FB6F894DEBF0C
-:1020E0000FBECDBFDF91CF910895982F81508331DE
-:1020F00030F08751833118F084E090E00895892F03
-:102100000E94D60F81E090E00895CF93DF93CDB782
-:10211000DEB722970FB6F894DEBF0FBECDBF982F63
-:102120008150833120F08751833108F07EC0E92F40
-:10213000FF27EB5BFC4F81E08183892F9927AA273A
-:10214000BB27FC013197EC32F10508F06EC0EE5868
-:10215000FF4FEE0FFF1F0590F491E02D09941598A5
-:102160005BC016985DC0179857C0B89859C0B99809
-:1021700053C0BA9855C0BB984FC0BC9851C0BD98C9
-:102180004BC0BE984DC0BF9847C0889849C0899839
-:1021900043C08A9845C08B983FC08C9841C08D98A9
-:1021A0003BC08E983DC08F9837C0A09839C0A19889
-:1021B00033C0A29835C0A3982FC0A49831C0A59869
-:1021C0002BC0A6982DC0809161008F7707C08091A9
-:1021D00061008F7B19C0809161008F7D80936100C9
-:1021E0001BC0809161008F7E0FC080916100877F4E
-:1021F000F5CF809161008B7F07C0809161008D7F5A
-:10220000EDCF809161008E7F8093610009C01098AE
-:1022100003C0119805C0129881E090E008C013989F
-:10222000E1E0F0E0FA83E98304C084E090E09A837F
-:10223000898389819A8122960FB6F894DEBF0FBEFA
-:10224000CDBFDF91CF910895FB011082833091F0D3
-:10225000843028F4813051F0823029F409C0843070
-:1022600059F0853059F085E090E0089586B307C0B5
-:1022700083B305C080B303C081B101C080B1808346
-:1022800081E090E00895833091F0843028F481302B
-:1022900051F0823029F409C0843059F0853069F05A
-:1022A00084E090E0089568BB05C065BB03C062BBD5
-:1022B00001C063B981E090E008956093620081E01D
-:1022C00090E00895982FE82FFF27EB5BFC4F81816A
-:1022D000823019F086E090E00895892F9927AA2787
-:1022E000BB27FC013197EC32F10540F4E256FF4F79
-:1022F000EE0FFF1F0590F491E02D099484E090E02B
-:102300000895662311F01D9AFFC01D98FDC0662335
-:1023100011F01E9AF9C01E98F7C0662311F01F9A9B
-:10232000F3C01F98F1C0662311F0C09AEDC0C098A9
-:10233000EBC0662311F0C19AE7C0C198E5C06623DF
-:1023400011F0C29AE1C0C298DFC0662311F0C39AAF
-:10235000DBC0C398D9C0662311F0C49AD5C0C49815
-:10236000D3C0662311F0C59ACFC0C598CDC06623EF
-:1023700011F0C69AC9C0C698C7C0662311F0C79AA3
-:10238000C3C0C798C1C0662311F0909ABDC0909891
-:10239000BBC0662311F0919AB7C09198B5C066236F
-:1023A00011F0929AB1C09298AFC0662311F0939A3F
-:1023B000ABC09398A9C0662311F0949AA5C09498D5
-:1023C000A3C0662311F0959A9FC095989DC066237F
-:1023D00011F0969A99C0969897C0662311F0979A33
-:1023E00093C0979891C0662311F0A89A8DC0A898C1
-:1023F0008BC0662311F0A99A87C0A99885C066236F
-:1024000011F0AA9A81C0AA987FC0662311F0AB9AF6
-:102410007BC0AB9879C0662311F0AC9A75C0AC98BC
-:1024200073C0662311F0AD9A6FC0AD986DC066237E
-:1024300011F0AE9A69C0AE9867C0662321F0809112
-:10244000620080680DC0809162008F7709C06623AA
-:1024500021F080916200806403C0809162008F7BD4
-:102460008093620051C0662321F0809162008062F7
-:10247000F7CF809162008F7DF3CF662321F08091AA
-:1024800062008061EDCF809162008F7EE9CF66238C
-:1024900021F0809162008860E3CF80916200877FA5
-:1024A000DFCF662321F0809162008460D9CF8091D4
-:1024B00062008B7FD5CF662321F08091620082601D
-:1024C000CFCF809162008D7FCBCF662321F08091AA
-:1024D00062008160C5CF809162008E7FC1CF66238C
-:1024E00011F0189A11C018980FC0662311F0199AAC
-:1024F0000BC0199809C0662311F01A9A05C01A98E2
-:1025000003C0662321F01B9A81E090E008951B9898
-:1025100081E090E008951F93182F8150833130F0AF
-:102520008751833118F084E090E00FC0E12FFF273E
-:10253000EB5BFC4F83E08183812F0E94D60F61E02B
-:10254000812F0E94621181E090E01F910895CF9346
-:10255000DF93982FEB011882E82FFF27EB5BFC4FEE
-:102560008181813019F086E090E07DC0892F992724
-:10257000AA27BB27FC013197EC32F10540F4E65362
-:10258000FF4FEE0FFF1F0590F491E02D099484E0BA
-:1025900090E069C00D9B65C062C00E9B62C05FC0C9
-:1025A0000F9B5FC05CC0B09B5CC059C0B19B59C061
-:1025B00056C0B29B56C053C0B39B53C050C0B49BCF
-:1025C00050C04DC0B59B4DC04AC0B69B4AC047C025
-:1025D000B79B47C044C0809B44C041C0819B41C061
-:1025E0003EC0829B3EC03BC0839B3BC038C0849BA7
-:1025F00038C035C0859B35C032C0869B32C02FC0E5
-:10260000879B2FC02CC0989B2CC029C0999B29C0A8
-:1026100026C09A9B26C023C09B9B23C020C09C9BA6
-:1026200020C01DC0079B1DC01AC0069B1AC017C042
-:10263000059B17C014C0049B14C011C0039B11C09C
-:102640000EC0029B0EC00BC0089B0BC008C0099BAC
-:1026500008C005C00A9B05C002C00B9B02C081E0F8
-:10266000888381E090E0DF91CF910895CF93DF934D
-:10267000CDB7DEB721970FB6F894DEBF0FBECDBF42
-:102680009BE19093EB04BE016F5F7F4F0E94A71206
-:102690008093EC0489818093ED041092EE0484E031
-:1026A00090E00E94AE0121960FB6F894DEBF0FBEF7
-:1026B000CDBFDF91CF9108959AE19093EB040E94F2
-:1026C00062118093EC041092ED0483E090E00E948C
-:1026D000AE01089598E19093EB040E94431180931A
-:1026E000EC041092ED0483E090E00E94AE010895A6
-:1026F000982F89E18093EB04933099F0943028F47B
-:10270000913059F0923029F40AC0943061F095303C
-:1027100061F085E090E020E00BC026B307C023B352
-:1027200005C020B303C021B101C020B181E090E019
-:102730008093EC042093ED041092EE0484E090E08A
-:102740000E94AE01089597E19093EB040E948B12D2
-:102750008093EC041092ED0483E090E00E94AE01BF
-:10276000089595E19093EB040E9485108093EC040A
-:102770001092ED0483E090E00E94AE01089596E18E
-:102780009093EB040E94D60F8093EC041092ED041A
-:1027900083E090E00E94AE01089584E18093EB0411
-:1027A00081E08093EC041092ED0483E090E00E94BD
-:1027B000AE01089582E18093EB0481E08093EC0404
-:1027C0001092ED0483E090E00E94AE01089583E151
-:1027D0008093EB0481E08093EC041092ED0483E09D
-:1027E00090E00E94AE01089580E18093EB0481E0C7
-:1027F0008093EC041092ED0483E090E00E94AE011F
-:10280000089591E19093EB040E9475108093EC047D
-:102810001092ED0483E090E00E94AE010895FC0167
-:1028200080818531C9F1863180F4823131F1833183
-:1028300030F48031D1F0813109F04CC01AC08331BD
-:1028400009F1843109F046C022C0883189F189310B
-:1028500028F4863129F18731E9F526C08A3189F1DA
-:102860008A3158F18B31B1F531C082810E94F41365
-:10287000089582810E9401140895638182810E94DB
-:10288000DA130895638182810E94E71308956381BA
-:1028900082810E94CD13089582810E94B113089510
-:1028A00082810E94BF13089582810E94A31308951C
-:1028B000638182810E946A13089582810E94781345
-:1028C0000895638182810E945C13089582810E9431
-:1028D000361308958093EB0483E08093EC04109208
-:1028E000ED0483E090E00E94AE010895E82F81524C
-:1028F000883018F084E090E00895FF27EB5BFC4FF0
-:1029000084E0818381E090E00895E82FFF27EB5B6E
-:10291000FC4F8181843019F084E090E008951182A9
-:1029200081E090E0089517B8823039F0833049F0A3
-:10293000813021F082E090E008953E9A81E090E0BD
-:10294000089587B1806C87B981E090E0089593E89D
-:1029500096B997B1907F982B97B9369A3699FECF52
-:1029600084B195B120E030E040E050E0369A3699ED
-:10297000FECF84B195B1480F591F2F5F3F4F2430D0
-:102980003105A1F73798CA01969587959695879551
-:102990000895CF93DF93EB0119821882282F3327F4
-:1029A000F901EB5BFC4F8181843019F086E090E007
-:1029B0000AC088E290E0821B930B0E94A7149983BF
-:1029C000888381E090E0DF91CF91089593E2909326
-:1029D000EB040E9493148093EC041092ED0483E0C6
-:1029E00090E00E94AE010895CF93DF93CDB7DEB79C
-:1029F00022970FB6F894DEBF0FBECDBF92E2909340
-:102A0000EB04BE016F5F7F4F0E94C9148093EC04FA
-:102A100029813A81832F99278093ED042093EE0436
-:102A20001092EF0485E090E00E94AE0122960FB66E
-:102A3000F894DEBF0FBECDBFDF91CF91089591E234
-:102A40009093EB04E82FFF27EB5BFC4F81818430F0
-:102A500019F084E090E003C0118281E090E080935F
-:102A6000EC041092ED0483E090E00E94AE01089522
-:102A7000E82F80E28093EB048E2F8152883018F08B
-:102A800084E090E007C0FF27EB5BFC4F84E081838C
-:102A900081E090E08093EC041092ED0483E090E0FC
-:102AA0000E94AE010895FC018081813271F0823272
-:102AB00018F48032B1F405C0823259F0833289F4BF
-:102AC0000CC082810E943815089582810E941F15D2
-:102AD000089582810E94F414089582810E94E61470
-:102AE00008958093EB0483E08093EC041092ED044E
-:102AF00083E090E00E94AE010895E4E7F0E0808179
-:102B0000846080838BE0809352038CE08093530336
-:102B100081E090E00895E4E7F0E080818B7F80839E
-:102B2000109252031092530381E090E00895809335
-:102B30007000E1E7F0E080818C7F8083808180837A
-:102B400081E090E00895809171009927887F9070CE
-:102B500008958091710084EA8093740080917400DC
-:102B600087FFFCCF81E090E0089584E980937400B2
-:102B70008091740084FDFCCF81E090E00895AC0169
-:102B800020E030E00FC0FA01E20FF31F8081809354
-:102B9000730084E8809374008091740087FFFCCFF9
-:102BA0002F5F3F4F2617370774F3089584E880930B
-:102BB00074008091740087FFFCCF80917300992787
-:102BC000089585E38093EB0481E08093EC0420E09A
-:102BD00030E00FC084E8809374008091740087FF18
-:102BE000FCCF80917300F901E351FB4F80832F5F8D
-:102BF0003F4F2617370774F3FB01E351FB4F108259
-:102C0000CB0103960E94AE0108959B01BC01C9014E
-:102C10000E94BF1581E08093EC041092ED0483E0E4
-:102C200090E00E94AE01089584E980937400809141
-:102C3000740084FDFCCF81E08093EC041092ED04DD
-:102C400083E090E00E94AE0108958091710084EAD3
-:102C5000809374008091740087FFFCCF81E08093A3
-:102C6000EC041092ED0483E090E00E94AE01089520
-:102C700080937000E1E7F0E080818C7F8083808129
-:102C8000808381E08093EC041092ED0483E090E077
-:102C90000E94AE010895E4E7F0E080818B7F80839D
-:102CA000109252031092530381E08093EC0410922F
-:102CB000ED0483E090E00E94AE010895E4E7F0E0C7
-:102CC0008081846080838BE0809352038CE08093CA
-:102CD000530381E08093EC041092ED0483E090E0D4
-:102CE0000E94AE010895FC0180818093EB0484333F
-:102CF000D1F0853338F4813379F0823381F0803339
-:102D000031F507C08633E9F08633A0F08733F9F454
-:102D10001BC00E945E1608950E944B160895828182
-:102D20000E943816089582813396BF0199270E9428
-:102D30000516089563817727828199270E94E115FE
-:102D400008950E94251608950E941416089583E0A0
-:102D50008093EC041092ED0483E090E00E94AE01B9
-:102D60000895782F613079F0613050F0623021F0B1
-:102D7000633009F059C002C061E003C061E004C0E3
-:102D800060E030E002C060E031E04330D9F0443030
-:102D900028F4413089F0423090F40CC0453031F0D5
-:102DA0004530A0F0463009F03FC002C040E005C009
-:102DB00040E006C041E007C041E050E005C041E00E
-:102DC00050E006C040E051E020E003C040E051E0A8
-:102DD00021E0BB9887B3866087BB88B3817F88BBBF
-:102DE00080E090E0772311F081E090E075E0880FBB
-:102DF000991F7A95E1F78065660F660F660F682B5D
-:102E0000330F330F362B352B440F432B4DB92EB9CF
-:102E100088E080934B038AE080934C0389E08093A1
-:102E20004D0381E090E0089582E090E008951DB8A0
-:102E30001EB810924B0310924C0310924D0381E088
-:102E400090E00895AC0120E030E008C0E60FF71FE5
-:102E500080818FB9779BFECF2F5F3F4FE22FFF27F7
-:102E6000E417F5079CF381E090E00895DC0120E091
-:102E700030E040E050E014C01FB809C083E0493E94
-:102E800058071CF088E090E008954F5F5F4F779BF4
-:102E9000F5CFFB01E20FF31F8FB180832F5F3F4F10
-:102EA0002A173B074CF381E090E00895CF93DF931E
-:102EB000EC0120E030E0A0E0B0E017C0FE01E20F3E
-:102EC000F31F80818FB908C0119683E0A93EB8072F
-:102ED0001CF088E090E00EC0779BF6CFFB01E20F7C
-:102EE000F31F8FB180832F5F3F4F2417350734F3D3
-:102EF00081E090E0DF91CF910895EF92FF920F93E0
-:102F00001F938B01EBEEEE2EE4E0FE2E23E42093E4
-:102F1000EB04B7016E5F7F4FA8010E9456178093A4
-:102F2000EC040E5F1F4FE00EF11EF7011082C80186
-:102F300001960E94AE011F910F91FF90EF900895AE
-:102F4000EF92FF920F931F938C01FBEEEF2EF4E0B4
-:102F5000FF2E84E48093EB04B7016E5F7F4FC801BE
-:102F60000E9436178093EC040E5F1F4FE00EF11E97
-:102F7000F7011082C80101960E94AE011F910F91C6
-:102F8000FF90EF90089593E49093EB0499270E94AB
-:102F900022178093EC041092ED0483E090E00E94ED
-:102FA000AE01089581E48093EB040E94171780938B
-:102FB000EC041092ED0483E090E00E94AE010895CD
-:102FC00090E49093EB040E94B1168093EC0410926D
-:102FD000ED0483E090E00E94AE010895CF93DF936B
-:102FE000EC0188818334A9F0843428F4803441F0E2
-:102FF000813409F50BC0843499F08534E1F414C0B0
-:103000004C816B818A810E94E01720C00E94D217F8
-:103010001DC0BE016D5F7F4F8A810E94C31716C01D
-:103020008A8199270E94A0176A817727CE0103968B
-:103030000E947D170BC08093EB0483E08093EC0427
-:103040001092ED0483E090E00E94AE01DF91CF91F9
-:103050000895B89AB99ABA9ABB98BC9ABD9AC4987E
-:10306000C59881E08093560382E080935703809354
-:1030700058038093590381E090E00895109256031D
-:1030800010925703109258031092590381E090E078
-:103090000895C098C198C29880E29EE40197F1F724
-:1030A000C09A8AE0982F9A95F1F7C29AC19A8A95A8
-:1030B000F1F70895282FC19887FD02C0C29801C07A
-:1030C000C29A8AE0982F9A95F1F7C19A8A95F1F7FA
-:1030D000C19826FF02C0C29A01C0C2988AE0982F08
-:1030E0009A95F1F7C19A8A95F1F70895282F220F42
-:1030F00030E0C19827FF02C0C29A01C0C2988AE09E
-:10310000982F9A95F1F7C19A8A95F1F73F5F37307A
-:1031100011F0220FEECF0895282F30E0C19827FF3D
-:1031200002C0C29A01C0C2988AE0982F9A95F1F71E
-:10313000C19A8A95F1F73F5F383011F0220FEECF38
-:103140000895C198C2988AE0982F9A95F1F7C19A8C
-:10315000982F9A95F1F7C198C098982F9A95F1F702
-:10316000C19A982F9A95F1F7C1988A95F1F7C09A6C
-:1031700080E090E00895C198C098C298C39A0895DD
-:103180000E94491880E30E945A1880E60E9476182F
-:1031900008950E94491880E00E945A1880E00E9419
-:1031A00076180E94BB1808950F931F93182F062FAF
-:1031B0000E94491880E40E945A18812F0E947618B4
-:1031C000802F0E948C1881E090E01F910F9108954C
-:1031D0001F93182F0E94491880EC0E945A18812FC3
-:1031E0000E9476180E94A11899271F910895C198EE
-:1031F0008AE08A95F1F7C29830E090E0990FC19A81
-:103200002AE0822F8A95F1F7C198B3999F5F822FA8
-:103210008A95F1F73F5F383089F7C098C19A822FBD
-:103220008A95F1F7C09AC1982A95F1F7892F9927C5
-:1032300008951F93182F0E94491880E80E945A1879
-:10324000812F0E9476180E94F71899271F910895E0
-:10325000DF92EF92FF920F931F93CF93DF93D82EBD
-:103260007B018A01C0E0D0E009C08D2D8C0F0E9447
-:103270001919F801EC0FFD1F80832196CE15DF058B
-:10328000A1F781E090E0DF91CF911F910F91FF9026
-:10329000EF90DF9008950F931F93082F162F0E9431
-:1032A000C018612F802F0E94D41881E090E01F91F8
-:1032B0000F910895DF92EF92FF920F931F93CF9398
-:1032C000DF93D82E7B018A01C0E0D0E009C0F8016D
-:1032D000EC0FFD1F60818D2D8C0F0E944B192196E4
-:1032E000CE15DF05A1F781E090E0DF91CF911F912E
-:1032F0000F91FF90EF90DF90089594E09093EB048E
-:103300000E945A198093EC041092ED0483E090E03F
-:103310000E94AE010895EF92FF920F931F938B01CD
-:103320009BEEE92E94E0F92E93E09093EB04A70135
-:103330004E5F5F4F0E9428198093EC040E5F1F4F71
-:10334000E00EF11EF7011082C80101960E94AE0145
-:103350001F910F91FF90EF90089582E08093EB040E
-:10336000109256031092570310925803109259036B
-:1033700081E08093EC041092ED0483E090E00E94E1
-:10338000AE01089581E08093EB040E942918809398
-:10339000EC041092ED0483E090E00E94AE010895E9
-:1033A000FC018381823069F0833018F48130F1F4BC
-:1033B00005C0833049F08430C9F40FC00E94C2199F
-:1033C00008950E94AD190895AF014A5F5F4F65816E
-:1033D000772784810E948B190895AF014A5F5F4F60
-:1033E0006581772784810E947D190895808180936B
-:1033F000EB0483E08093EC041092ED0483E090E012
-:103400000E94AE0108951F920F920FB60F921124E1
-:103410000F900FBE0F901F9018959C010897029770
-:1034200018F084E090E00895F901EB5BFC4F8DE02B
-:1034300081832830310561F02930310519F087E0AA
-:1034400090E00895BD9A81E090E09BBD8ABD08950B
-:10345000BC9A81E090E00895FC01EB5BFC4F118287
-:1034600081E090E008959C01FC01EB5BFC4F8181C1
-:103470008D3019F086E090E008952830310539F15B
-:103480002930310519F087E090E008956330710527
-:10349000A9F0643071053CF46130710559F0623077
-:1034A0007105A9F409C06430710551F065307105EA
-:1034B00071F408C081E007C082E005C083E003C06A
-:1034C00084E001C085E08EBD81E090E0089581E058
-:1034D00090E008959C01FC01EB5BFC4F81818D30F5
-:1034E00019F086E090E008952830310531F0293058
-:1034F000310531F087E090E0089581E090E0089593
-:103500007BBD6ABD81E090E008959C0183E58093D6
-:10351000EB04F901EB5BFC4F81818D3019F086E003
-:1035200090E00DC02830310541F02930310519F007
-:1035300087E090E004C07BBD6ABD81E090E08093AD
-:10354000EC041092ED0483E090E00E94AE01089537
-:1035500022E52093EB040E94331A8093EC0410922E
-:10356000ED0483E090E00E94AE01089521E52093F0
-:10357000EB04FC01EB5BFC4F118281E08093EC04D7
-:103580001092ED0483E090E00E94AE01089520E5E2
-:103590002093EB040E940D1A8093EC041092ED042A
-:1035A00083E090E00E94AE010895FC0180818135A6
-:1035B00079F0823518F48035F1F405C0823569F070
-:1035C0008335C9F411C0828199270E94C71A0895D2
-:1035D000828199270E94B61A089563817727828194
-:1035E00099270E94A81A08956381772782819927D5
-:1035F0000E94851A08958093EB0483E08093EC0485
-:103600001092ED0483E090E00E94AE010895CF9304
-:10361000DF93CDB7DEB7DF91CF910895089581E0B4
-:1036200090E0089508958A3310F4805301C08755BF
-:103630006A3310F4605301C067556F708295807FC4
-:10364000682B862F992708950895DC0180E1A0302A
-:10365000B80718F082E090E00895E199FECF9D014F
-:1036600009C03FBB2EBB2F5F3F4FE09AE60FF71F0D
-:103670008DB38083822F8A1BE82FFF27E417F5077D
-:1036800080F381E090E00895DC0180E1A030B8078C
-:1036900018F082E090E00895E199FECF9D010AC004
-:1036A0003FBB2EBB2F5F3F4FE60FF71F80818DBBC7
-:1036B000E29AE19A822F8A1BE82FFF27E417F50789
-:1036C00078F381E090E008950F931F938B0121E838
-:1036D0002093EB040E94441B8093EC041092ED04B1
-:1036E0001F930F9389EF92E09F938F930E94071B84
-:1036F00083E090E00E94AE010F900F900F900F902A
-:103700001F910F910895CF92DF92EF92FF920F9346
-:103710001F937B010BEE14E020E82093EB0422E0E2
-:10372000C22ED12CC00ED11EAB01B6010E94251BAA
-:103730008093EC0482E090E0E80EF91E0E0D1F1D50
-:10374000F8011082DF92CF9286E093E09F938F93EF
-:103750000E94071BC70101960E94AE010F900F90B7
-:103760000F900F901F910F91FF90EF90DF90CF90EF
-:103770000895EF92FF920F931F93CF93DF93EC0185
-:103780008B819927F82EEE248A81E80EF11C8D8119
-:103790009927182F00278C81080F111DFF92EF9297
-:1037A0001F930F9380E193E09F938F930E94071BD9
-:1037B00088812DB73EB72A5F3F4F0FB6F8943EBFC2
-:1037C0000FBE2DBF803819F0813869F405C0B801EB
-:1037D000C7010E94831B12C02696A801BE01C70123
-:1037E0000E94641B0BC08093EB0483E08093EC0485
-:1037F0001092ED0483E090E00E94AE01DF91CF9142
-:103800001F910F91FF90EF900895CF93DF93AC013C
-:10381000029710F442E050E0A0917006B09171065A
-:10382000FD01C0E0D0E020E030E020C08081918147
-:103830008417950769F482819381209719F09B83FF
-:103840008A8304C090937106809370069F0132C0F2
-:103850004817590738F42115310519F082179307D5
-:1038600008F49C01EF010280F381E02D3097F1F61E
-:103870002115310599F1C901841B950B049708F4B2
-:10388000A901E0E0F0E028C08D919C91119782178A
-:103890009307F9F44817590781F4ED018A819B8158
-:1038A000309719F09383828304C0909371068093BC
-:1038B00070069D012E5F3F4F4CC0841B950BFD0190
-:1038C000E80FF91F4193519302978D939C939F01A9
-:1038D00040C0FD01A281B3811097B1F680916E06C0
-:1038E00090916F06892B41F48091370390913803B2
-:1038F00090936F0680936E062091390330913A03BE
-:103900002115310549F48DB7282F332780913503D0
-:1039100090913603281B390BA0916E06B0916F066B
-:103920002A1B3B0B2417350790F0CA010296281773
-:10393000390768F09D012E5F3F4FC901840F951F25
-:1039400090936F0680936E064D935C9302C020E0C7
-:1039500030E0C901DF91CF910895CF93DF930097B5
-:1039600009F44EC0EC0122971B821A82A0917006C6
-:10397000B0917106109711F140E050E001C0DC01F8
-:10398000AC17BD0700F1BB83AA83FE0121913191E1
-:10399000E20FF31FEA17FB0771F48D919C911197C9
-:1039A000280F391F2E5F3F4F39832883FD01828105
-:1039B00093819B838A834115510559F4D0937106F5
-:1039C000C09370061DC0FD0182819381AD010097F7
-:1039D000B1F6FA01D383C28321913191E20FF31F33
-:1039E000EC17FD0769F488819981280F391F2E5F34
-:1039F0003F4FFA01318320838A819B8193838283A5
-:103A0000DF91CF91089597FB092E07260AD077FD05
-:103A100004D00CD006D000201AF4709561957F4F29
-:103A20000895F6F7909581959F4F0895AA1BBB1BAB
-:103A300051E107C0AA1FBB1FA617B70710F0A61BAE
-:103A4000B70B881F991F5A95A9F780959095BC01CF
-:063A5000CD010895FFCF37
-:103A5600456D62656464656450726F6A656374730C
-:103A6600004F63746F70757355534220496E7465C9
-:103A7600726661636520436F6E7665727465722047
-:103A8600616E6420492F4F20457874656E73696FA7
-:103A96006E003230303831313038006669727374F6
-:103AA600207061636B6574206F662061206C6F6E99
-:103AB60067206D65737361676520286C656E677432
-:103AC600683A202564290A006F63746F7075732045
-:103AD6006C6F6E672072756E6E696E67206D6573AA
-:103AE600736167650A006F63746F7075732E6C6F10
-:103AF6006E675F696E646578203C206F63746F70D3
-:103B060075732E6C6F6E675F62797465730A006EEB
-:103B16006F74206C617374207061636B65743A20F6
-:103B260064696666203E2036340A006C6173742030
-:103B36007061636B65740A007061727365722C2024
-:103B4600636865636B3A2025582C20636F6D6D6141
-:103B56006E643A2025580A0063616C6C696E6720B2
-:103B6600696F5F7061727365720A0063616C6C697C
-:103B76006E67206164635F7061727365720A0063C9
-:103B8600616C6C696E67206932635F706172736520
-:103B9600720A0063616C6C696E67207370695F708E
-:103BA60061727365720A0063616C6C696E6720707E
-:103BB600776D5F7061727365720A0063616E277458
-:103BC6002063616C6C2063616E5F706172736572F5
-:103BD600202D206E6F2043414E2D737570706F72CD
-:103BE600740A0063616C6C696E6720656570726F3C
-:103BF6006D5F7061727365720A00756E6B6E6F77BA
-:103C06006E20636D640A00726563656976696E6726
-:103C160020636F6D6D616E643A20255820286C65AF
-:103C26006E6774683A202575290A00676574206EE8
-:103C36006578740A0067657420616E64206578652E
-:103C4600637574650A000904007772697474656E99
-:103C56003A2025730A00726561643A2025730A00CA
-:103C6600656570726F6D5F7061727365723A206C14
-:103C7600656E6774683A2025752C20616464723A13
-:0C3C86002025750A0020007206000000D6
-:00000001FF
diff --git a/firmware/pin.c b/firmware/pin.c
deleted file mode 100644
index 97218b7..0000000
--- a/firmware/pin.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2009 Embedded Projects (http://www.embedded-projects.net)
- * Author: Benedikt Sauter <sauter@embedded-projects.net>
- * All rights reserved.
- *
- * Short descripton of file:
- *
- *
- * 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 the FH Augsburg 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.
- */
-
-#include <inttypes.h>
-#include <avr/io.h>
-
-#include "pin.h"
-
-
-char pin_get_conf(uint8_t i, pin_conf *p)
-{
- switch(i)
- {
- case 3: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC0; break;
- case 4: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC1; break;
- case 5: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC2; break;
- case 6: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC3; break;
- case 7: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC4; break;
- case 8: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC5; break;
- case 9: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC6; break;
-
- case 10: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF7; break;
- case 11: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF6; break;
- case 12: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF5; break;
- case 13: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF4; break;
- case 14: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF3; break;
- case 15: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF2; break;
- case 16: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF1; break;
- case 17: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF0; break;
-
- case 18: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE0; break;
- case 19: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE1; break;
- case 20: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE2; break;
- case 21: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE3; break;
- case 22: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE5; break;
- case 23: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE6; break;
- case 24: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE7; break;
-
- case 25: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB0; break;
- case 26: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB1; break;
- case 27: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB2; break;
- case 28: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB3; break;
- case 29: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB4; break;
- case 30: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB5; break;
- case 31: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB6; break;
- case 32: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB7; break;
-
- case 33: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD0; break;
- case 34: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD1; break;
- case 35: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD2; break;
- case 36: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD3; break;
- case 37: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD4; break;
- case 38: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD5; break;
- case 39: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD6; break;
- case 40: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD7; break;
-
- default: return 0;
- }
-
- return 1;
-}
diff --git a/firmware/pin.h b/firmware/pin.h
deleted file mode 100644
index f0deda7..0000000
--- a/firmware/pin.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2009 Embedded Projects (http://www.embedded-projecs.net)
- * Author: Michael Hartmann <hartmann@embedded-projects.net>
- * All rights reserved.
- *
- * Short descripton of file:
- *
- *
- * 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 the FH Augsburg 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 PIN_H
-#define PIN_H
-
-#include <inttypes.h>
-
-#define OX_AD7 10
-#define OX_AD6 11
-#define OX_AD5 12
-#define OX_AD4 13
-#define OX_AD3 14
-#define OX_AD2 15
-#define OX_AD1 16
-#define OX_AD0 17
-
-#define OX_RX0 18
-#define OX_TX0 19
-#define OX_RX1 35
-#define OX_TX1 36
-
-#define OX_SS 25
-#define OX_SCK 26
-#define OX_MOSI 27
-#define OX_MISO 28
-
-#define OX_PWM1 30
-#define OX_PWM2 29
-
-#define OX_SCL 33
-#define OX_SDA 34
-
-#define OX_LED1 3
-#define OX_LED2 4
-#define OX_LED3 5
-#define OX_LED4 6
-#define OX_LED5 7
-#define OX_LED6 8
-#define OX_LED7 9
-#define OX_LED_STATUS 32
-
-typedef struct pin_conf {
- volatile unsigned char *ox_port;
- volatile unsigned char *ox_pin;
- volatile unsigned char *ox_ddr;
- volatile unsigned char ox_p;
-} pin_conf;
-
-char pin_get_conf(uint8_t i, pin_conf *p);
-
-#endif /* PIN_H */
diff --git a/firmware/protocol.h b/firmware/protocol.h
index af2c6fb..6ae1c2a 100644
--- a/firmware/protocol.h
+++ b/firmware/protocol.h
@@ -42,12 +42,10 @@
#define CMD_IO_PORT_GET 0x19
#define CMD_IO_PIN_SET 0x1A
#define CMD_IO_PIN_GET 0x1B
-#define CMD_IO_SET_STATUS_LED 0x1C
#define CMD_ADC_INIT_PIN 0x20
-#define CMD_ADC_DEINIT_PIN 0x21
-#define CMD_ADC_GET 0x22
-#define CMD_ADC_REF 0x23
+#define CMD_ADC_GET 0x21
+#define CMD_ADC_REF 0x22
#define CMD_I2C_INIT 0x30
#define CMD_I2C_DEINIT 0x31
@@ -80,17 +78,6 @@
#define CMD_UART_RECV 0x67
#define CMD_UART_SEND 0x68
-#define CMD_CAN_INIT 0x70
-#define CMD_CAN_DEINIT 0x71
-#define CMD_CAN_SEND_DATA 0x72
-#define CMD_CAN_ENABLE_MOB 0x73
-#define CMD_CAN_DISABLE_MOB 0x74
-#define CMD_CAN_SEND_REMOTE 0x75
-#define CMD_CAN_RECEIVE_DATA 0x76
-#define CMD_CAN_SET_AUTOREPLY 0x77
-
-#define CMD_EEPROM_READ_BYTES 0x80
-#define CMD_EEPROM_WRITE_BYTES 0x81
#define PARAM_ADC_AREF 0x01
#define PARAM_ADC_AVCC 0x02
diff --git a/firmware/pwm.c b/firmware/pwm.c
index b8b6231..9e3666d 100644
--- a/firmware/pwm.c
+++ b/firmware/pwm.c
@@ -84,7 +84,7 @@ int pwm_init(int pin)
{
case 9:
/* set pin as output */
- DDRB |=(1<<PB5);
+ OX_DDR9 |=(1<<OX_P9);
OCR1A=1; // TOP
#ifdef OCTOPUS_CAN
/* configure timer, (WGM = FAST PWM) (clear on OCnA, set on TOP COM1A1)*/
@@ -97,7 +97,7 @@ int pwm_init(int pin)
#endif
break;
case 8:
- DDRB |=(1<<PB4);
+ OX_DDR8 |=(1<<OX_P8);
#ifdef OCTOPUS_CAN
OCR2A=1; // TOP
/* configure timer, (WGM = FAST PWM) (clear on OCnA, set on TOP COM1A1)*/
@@ -138,7 +138,7 @@ void pwm_deinit_usb(int pin)
int pwm_deinit(int pin)
{
- octopus.ports[pin]=PIN_NONE;
+ octopus.ports[pin]=PIN_OUT; // this is wrong!
#ifdef OCTOPUS_CAN
switch(pin)
{
diff --git a/firmware/spi.c b/firmware/spi.c
index b3e3a95..2b8abb1 100644
--- a/firmware/spi.c
+++ b/firmware/spi.c
@@ -36,24 +36,26 @@
#include "spi.h"
-
void spi_parser(char *buf)
{
switch(buf[0]) {
case CMD_SPI_INIT:
- spi_init_usb(buf[2], buf[3], buf[4]);
- break;
+ spi_init_usb();
+ break;
case CMD_SPI_DEINIT:
spi_deinit_usb();
- break;
+ break;
+ case CMD_SPI_SPEED:
+ spi_set_speed_usb((int)buf[2]);
+ break;
case CMD_SPI_SEND:
- spi_send_usb(buf[2], &buf[3]);
- break;
+ spi_send_usb(&buf[2], (int)buf[1]);
+ break;
case CMD_SPI_RECV:
- spi_receive_usb((int)buf[2]);
+ spi_receive_usb((int)buf[1]);
case CMD_SPI_SEND_AND_RECV:
- spi_send_and_receive_usb(&buf[3], (int)buf[2]);
- break;
+ spi_send_and_receive_usb(&buf[2], (int)buf[1]);
+ break;
default:
answer[0] = buf[0];
answer[1] = RSP_UNKOWN_CMD;
@@ -62,111 +64,38 @@ void spi_parser(char *buf)
}
}
-void spi_init_usb(uint8_t dord, uint8_t mode, uint8_t speed)
+void spi_init_usb(void)
{
answer[0] = CMD_SPI_INIT;
- answer[1] = (unsigned char) spi_init(dord, mode, speed);
- answer[2] = 0;
+ answer[1] = (unsigned char) spi_init();
+ answer[3] = 0;
CommandAnswer(3);
}
-int spi_init(uint8_t dord, uint8_t mode, uint8_t speed)
+int spi_init(void)
{
- uint8_t cpol, cpha, spr1, spr0, spi2x;
-
- dord = dord ? 1 : 0;
-
- switch(mode)
- {
- case 0:
- cpol = 0;
- cpha = 0;
- break;
- case 1:
- cpol = 0;
- cpha = 1;
- break;
- case 2:
- cpol = 1;
- cpha = 0;
- break;
- case 3:
- cpol = 1;
- cpha = 1;
- break;
- default:
- return RSP_ERROR;
- }
-
- switch(speed)
- {
- case SPI_SPEED_125kHz:
- spi2x = 0;
- spr1 = 1;
- spr0 = 1;
- break;
- case SPI_SPEED_250kHz:
- spi2x = 0;
- spr1 = 1;
- spr0 = 0;
- break;
- case SPI_SPEED_500kHz:
- spi2x = 1;
- spr1 = 1;
- spr0 = 0;
- break;
- case SPI_SPEED_1MHz:
- spi2x = 0;
- spr1 = 0;
- spr0 = 1;
- break;
- case SPI_SPEED_2MHz:
- spi2x = 1;
- spr1 = 0;
- spr0 = 1;
- break;
- case SPI_SPEED_4MHz:
- spi2x = 0;
- spr1 = 0;
- spr0 = 0;
- break;
- case SPI_SPEED_8MHz:
- spi2x = 1;
- spr1 = 0;
- spr0 = 0;
- break;
- default:
- return RSP_ERROR;
- }
+ PORTB &= ~((1 << SCK)|(1<<MISO)|(1<<MOSI)); // SCK have to be low in IDLE
+ DDRB &=~(1 << MISO);
+ DDRB = (1 << MOSI)|(1 << SCK);
- // MOSI, SCK: out/low
- // MISO: in
- DDRB &= ~(1 << MISO);
- DDRB |= (1 << MOSI | 1 << SCK);
- PORTB &= ~(1 << MOSI | 1 << MISO | 1 << SCK); // SCK has to be low in IDLE
+ SPCR = 0;
+ SPSR = 0;
- // SPE: SPI enable
- // DORD: Data Order (0: starting with LSB)
- // MSTR: Master mode
- // SPR1, SPR2, SPI2X: speed
- SPCR = (1 << SPE | dord << DORD | 1 << MSTR | cpol << CPOL | cpha << CPHA |
- spr1 << SPR1 | spr0 << SPR0);
- SPSR = (spi2x << SPI2X);
+ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);
- octopus.ports[5] = PIN_SCK;
- octopus.ports[6] = PIN_MOSI;
- octopus.ports[7] = PIN_MISO;
+ octopus.ports[5]=PIN_SCK;
+ octopus.ports[6]=PIN_MOSI;
+ octopus.ports[7]=PIN_MISO;
return RSP_OK;
}
void spi_deinit_usb(void)
{
- answer[0] = CMD_SPI_DEINIT;
- answer[1] = (unsigned char)spi_deinit();
- answer[2] = 0;
-
+ answer[0]=CMD_SPI_DEINIT;
+ answer[1]=(unsigned char)spi_deinit();
+ answer[2]=0;
CommandAnswer(3);
}
@@ -175,30 +104,36 @@ int spi_deinit(void)
SPCR = 0;
SPSR = 0;
- octopus.ports[5] = PIN_NONE;
- octopus.ports[6] = PIN_NONE;
- octopus.ports[7] = PIN_NONE;
+ octopus.ports[5]=PIN_OUT; // this is wrong!
+ octopus.ports[6]=PIN_OUT; // this is wrong!
+ octopus.ports[7]=PIN_OUT; // this is wrong!
return RSP_OK;
}
+void spi_set_speed_usb(int speed){
-void spi_send_usb(uint8_t length, char * buf)
-{
- answer[0] = CMD_SPI_SEND;
- answer[1] = (unsigned char)spi_send(length, buf);
- answer[2] = 0;
+}
+
+int spi_set_speed(int speed){
+
+ return RSP_OK;
+}
+void spi_send_usb(char * buf, int length)
+{
+ answer[0]=CMD_SPI_SEND;
+ answer[1]=(unsigned char)spi_send(buf,length);
+ answer[2]=0;
CommandAnswer(3);
}
-int spi_send(int length, char * buf)
+int spi_send(char * buf, int length)
{
- uint8_t i;
- for(i = 0; i < length; i++)
- {
+ int i;
+ for(i=0;i<length;i++){
SPDR = buf[i];
- while(!(SPSR & (1 << SPIF)));
+ while ( !(SPSR & (1 << SPIF)) ) ;
}
return RSP_OK;
}
@@ -206,29 +141,22 @@ int spi_send(int length, char * buf)
void spi_receive_usb(int length)
{
- answer[0] = CMD_SPI_RECV;
- answer[1] = (unsigned char)spi_receive(length, (char*)&answer[2]);
- answer[2+length] = 0;
- CommandAnswer(3+length);
+ answer[0]=CMD_SPI_RECV;
+ answer[1]=(unsigned char)spi_receive((char*)&answer[2],length);
+ answer[2]=0;
+ CommandAnswer(length+2);
}
-unsigned char spi_receive(int length, char * buf)
+unsigned char spi_receive( char * buf, int length)
{
int i;
int timeout = 0;
-
- for(i = 0; i < length; i++)
- {
+ for(i=0;i<length;i++){
SPDR = 0;
- while(!(SPSR & (1 << SPIF)))
- {
- if(timeout++ > 1000)
- return RSP_TIMEOUT;
- }
- buf[i] = SPDR;
+ while(!(SPSR & (1 << SPIF))) { timeout++; if( timeout > 1000) return RSP_TIMEOUT; }
+ buf[i]=SPDR;
}
-
return RSP_OK;
}
@@ -236,8 +164,8 @@ void spi_send_and_receive_usb(char * txbuf, int length)
{
answer[0]=CMD_SPI_SEND;
answer[1]=(unsigned char)spi_send_and_receive(txbuf,(char *)&answer[2],length);
- answer[2+length]=0;
- CommandAnswer(3+length);
+ answer[2]=0;
+ CommandAnswer(2+length);
}
@@ -252,3 +180,9 @@ int spi_send_and_receive(char * txbuf, char * rxbuf, int length){
}
return RSP_OK;
}
+
+
+
+
+
+
diff --git a/firmware/spi.h b/firmware/spi.h
index 8a8a1fe..d7cfbf1 100644
--- a/firmware/spi.h
+++ b/firmware/spi.h
@@ -41,25 +41,24 @@
#define MISO PB3
#define SCK PB1
-enum { SPI_SPEED_125kHz, SPI_SPEED_250kHz, SPI_SPEED_500kHz, SPI_SPEED_1MHz,
- SPI_SPEED_2MHz, SPI_SPEED_4MHz, SPI_SPEED_8MHz };
-
void spi_parser(char *buf);
-void spi_init_usb(uint8_t dord, uint8_t mode, uint8_t speed);
-int spi_init(uint8_t dord, uint8_t mode, uint8_t speed);
-
-void spi_deinit_usb(void);
+int spi_init(void);
int spi_deinit(void);
-void spi_send_usb(uint8_t length, char * buf);
-int spi_send(int length, char * buf);
+int spi_set_speed(int speed);
+int spi_send(char * buf, int length);
+unsigned char spi_receive( char * buf, int length);
+int spi_send_and_receive(char * txbuf, char * rxbuf, int length);
-void spi_receive_usb(int length);
-unsigned char spi_receive(int length, char * buf);
+void spi_init_usb(void);
+void spi_deinit_usb(void);
+
+void spi_set_speed_usb(int speed);
+void spi_send_usb(char * buf, int length);
+void spi_receive_usb(int length);
void spi_send_and_receive_usb(char * txbuf, int length);
-int spi_send_and_receive(char * txbuf, char * rxbuf, int length);
#endif /* SPI_H */
diff --git a/firmware/uart.c b/firmware/uart.c
index 9ae00c9..ac856b2 100644
--- a/firmware/uart.c
+++ b/firmware/uart.c
@@ -39,7 +39,7 @@ void uart_parser(char *buf)
break;
default:
answer[1] = RSP_UNKOWN_CMD;
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
}
@@ -47,7 +47,7 @@ void uart_parser(char *buf)
void uart_init_usb(char uartport)
{
answer[1] = (unsigned char)uart_init(uartport);
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -78,7 +78,7 @@ char uart_init(char uartport)
void uart_deinit_usb(char uartport)
{
answer[1] = (unsigned char)uart_deinit(uartport);
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -113,7 +113,7 @@ char uart_deinit(char uartport)
void uart_baudrate_usb(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh)
{
answer[1] = (unsigned char)uart_baudrate(uartport, ubrrll, ubrrlh, ubrrhl, ubrrhh);
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -140,7 +140,7 @@ char uart_baudrate(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ub
void uart_stopbits_usb(char uartport, char stopbits)
{
answer[1] = (unsigned char)uart_stopbits(uartport, stopbits);
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -174,7 +174,7 @@ char uart_stopbits(char uartport, char stopbits)
void uart_databits_usb(char uartport, char databits)
{
answer[1] = (unsigned char)uart_databits(uartport, databits);
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -209,7 +209,7 @@ char uart_databits(char uartport, char databits)
void uart_parity_usb(char uartport, char parity)
{
answer[1] = (unsigned char)uart_databits(uartport, parity);
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -243,7 +243,7 @@ char uart_parity(char uartport, char parity)
void uart_send_usb(char uartport, char length, char *buf)
{
answer[1] = (unsigned char)uart_send(uartport, length, buf);
- answer[2] = 0;
+ answer[2] = '\0';
CommandAnswer(3);
}
@@ -255,7 +255,9 @@ char uart_send(char uartport, unsigned int length, char *buf)
return RSP_UNKOWN_PIN;
while(length--)
+ {
uart_putchar(uartport, *buf++);
+ }
return RSP_OK;
}
@@ -293,8 +295,6 @@ void uart_recv_usb(char uartport, int length)
for(i = 0; i < length; i++)
answer[2+i] = data[i];
- answer[2+length] = 0;
-
CommandAnswer(3+length);
}
@@ -329,5 +329,3 @@ char uart_getchar(char uartport)
return c;
}
-
-
diff --git a/firmware/uart_fifo.c b/firmware/uart_fifo.c
deleted file mode 100644
index d4da869..0000000
--- a/firmware/uart_fifo.c
+++ /dev/null
@@ -1,368 +0,0 @@
-#include <inttypes.h>
-#include <avr/io.h>
-
-#include "uart.h"
-#include "common.h"
-#include "protocol.h"
-#include "fifo.h"
-
-#define BUFSIZE_IN 5
-#define BUFSIZE_OUT 5
-
-uint8_t inbuf0[BUFSIZE_IN];
-uint8_t inbuf1[BUFSIZE_IN];
-fifo_t infifo0;
-fifo_t infifo1;
-
-uint8_t outbuf1[BUFSIZE_OUT];
-uint8_t outbuf0[BUFSIZE_OUT];
-fifo_t outfifo0;
-fifo_t outfifo1;
-
-
-void uart_parser(char *buf)
-{
- answer[0] = buf[0];
-
- switch(buf[0])
- {
- case CMD_UART_INIT:
- uart_init_usb((char)buf[2]);
- break;
- case CMD_UART_DEINIT:
- uart_deinit_usb((char)buf[2]);
- break;
-
- case CMD_UART_BAUDRATE:
- uart_baudrate_usb((char)buf[2], (char)buf[3], (char)buf[4], (char)buf[5], (char)buf[6]);
- break;
- case CMD_UART_STOPBITS:
- uart_stopbits_usb((char)buf[2], (char)buf[3]);
- break;
- case CMD_UART_DATABITS:
- uart_stopbits_usb((char)buf[2], (char)buf[3]);
- break;
- case CMD_UART_PARITY:
- uart_parity_usb((char)buf[2], (char)buf[3]);
- break;
-
- case CMD_UART_SEND:
- uart_send_usb((char)buf[2], (char)buf[3], &buf[4]);
- break;
- case CMD_UART_RECV:
- uart_recv_usb((char)buf[2], (char)buf[3]);
- break;
- default:
- answer[1] = RSP_UNKOWN_CMD;
- answer[2] = 0;
- CommandAnswer(3);
- }
-}
-
-void uart_init_usb(char uartport)
-{
- answer[1] = (unsigned char)uart_init(uartport);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-char uart_init(char uartport)
-{
- switch(uartport)
- {
- case 0:
- octopus.ports[41] = PIN_UART;
- octopus.ports[42] = PIN_UART;
- /* enable transmitter receiver */
- UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
- break;
- case 1:
- octopus.ports[14] = PIN_UART;
- octopus.ports[15] = PIN_UART;
- /* enable transmitter receiver */
- UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
- break;
- default:
- return RSP_UNKOWN_PIN;
- }
-
- return RSP_OK;
-}
-
-void uart_deinit_usb(char uartport)
-{
- answer[1] = (unsigned char)uart_deinit(uartport);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-char uart_deinit(char uartport)
-{
- switch(uartport)
- {
- case 0:
- octopus.ports[41] = PIN_NONE;
- octopus.ports[42] = PIN_NONE;
- UBRR0H = 0;
- UBRR0L = 0;
- UCSR0B = 0;
- UCSR0C = 0;
- break;
- case 1:
- octopus.ports[14] = PIN_NONE;
- octopus.ports[15] = PIN_NONE;
- UBRR1H = 0;
- UBRR1L = 0;
- UCSR1B = 0;
- UCSR1C = 0;
- break;
- default:
- return RSP_UNKOWN_PIN;
- }
-
- return RSP_OK;
-}
-
-void uart_baudrate_usb(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh)
-{
- answer[1] = (unsigned char)uart_baudrate(uartport, ubrrll, ubrrlh, ubrrhl, ubrrhh);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-char uart_baudrate(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh)
-{
- switch(uartport)
- {
- case 0:
- UBRR0H = (ubrrhh << 8) | ubrrhl;
- UBRR0L = (ubrrhl << 8) | ubrrll;
- break;
- case 1:
- UBRR1H = (ubrrhh << 8) | ubrrhl;
- UBRR1L = (ubrrhl << 8) | ubrrll;
- break;
- default:
- return RSP_UNKOWN_PIN;
- }
-
- return RSP_OK;
-}
-
-void uart_stopbits_usb(char uartport, char stopbits)
-{
- answer[1] = (unsigned char)uart_stopbits(uartport, stopbits);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-char uart_stopbits(char uartport, char stopbits)
-{
- char usbs;
-
- switch(stopbits)
- {
- case 1: usbs = 0; break;
- case 2: usbs = 2; break;
- default: usbs = 0; break;
- }
-
- switch(uartport)
- {
- case 0:
- UCSR0C |= (usbs << USBS0);
- break;
- case 1:
- UCSR1C |= (usbs << USBS1);
- break;
- default:
- return RSP_UNKOWN_PIN;
- }
-
- return RSP_OK;
-}
-
-void uart_databits_usb(char uartport, char databits)
-{
- answer[1] = (unsigned char)uart_databits(uartport, databits);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-char uart_databits(char uartport, char databits)
-{
- char ucsz1,ucsz0;
-
- switch(databits) {
- case 5: ucsz1 = 0; ucsz0 = 0; break;
- case 6: ucsz1 = 0; ucsz0 = 1; break;
- case 7: ucsz1 = 1; ucsz0 = 0; break;
- case 8: ucsz1 = 1; ucsz0 = 1; break;
- default: ucsz1 = 1; ucsz0 = 1; break;
- }
-
- switch(uartport)
- {
- case 0:
- UCSR0C |= (ucsz1 << UCSZ01) | (ucsz0 << UCSZ00);
- break;
- case 1:
- UCSR1C |= (ucsz1 << UCSZ11) | (ucsz0 << UCSZ10);
- break;
- default:
- return RSP_UNKOWN_PIN;
- }
-
- return RSP_OK;
-}
-
-void uart_parity_usb(char uartport, char parity)
-{
- answer[1] = (unsigned char)uart_databits(uartport, parity);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-char uart_parity(char uartport, char parity)
-{
- char upm1, upm0;
- switch(parity)
- {
- case 'N': upm1 = 0; upm0 = 0; break;
- case 'E': upm1 = 1; upm0 = 0; break;
- case 'O': upm1 = 1; upm0 = 1; break;
- default: upm1 = 0; upm0 = 0; break;
- }
-
- switch(uartport)
- {
- case 0:
- UCSR0C |= (upm1 << UPM01) | (upm0 << UPM00);
- break;
- case 1:
- UCSR1C |= (upm1 << UPM11) | (upm0 << UPM10);
- break;
- default:
- return RSP_UNKOWN_PIN;
- }
-
- return RSP_OK;
-}
-
-void uart_send_usb(char uartport, char length, char *buf)
-{
- answer[1] = (unsigned char)uart_send(uartport, length, buf);
- answer[2] = 0;
-
- CommandAnswer(3);
-}
-
-
-char uart_send(char uartport, unsigned int length, char *buf)
-{
- if(uartport != 0 && uartport != 1)
- return RSP_UNKOWN_PIN;
-
- while(length--)
- uart_putchar(uartport, *buf++);
-
- return RSP_OK;
-}
-
-char uart_putchar(char uartport, char data)
-{
- switch(uartport)
- {
- case 0:
- fifo_put (&outfifo0, data);
- UCSR0B |= (1 << UDRIE0);
- break;
- case 1:
- fifo_put (&outfifo1, data);
- UCSR1B |= (1 << UDRIE1);
- break;
- default:
- return RSP_UNKOWN_PIN;
- }
-
- return RSP_OK;
-}
-
-
-void uart_recv_usb(char uartport, int length)
-{
- char data[length];
- int i;
-
- answer[1] = (char)uart_recv(uartport, data, length);
-
- for(i = 0; i < length; i++)
- answer[2+i] = data[i];
-
- answer[2+length] = 0;
-
- CommandAnswer(3+length);
-}
-
-char uart_recv(char uartport, char * buf, int length)
-{
- if(uartport != 0 && uartport != 1)
- return RSP_UNKOWN_PIN;
-
- while(length-- > 0)
- *buf++ = uart_getchar(uartport);
-
- return RSP_OK;
-}
-
-char uart_getchar(char uartport)
-{
- char c;
-
- switch(uartport)
- {
- case 0:
- while (!(UCSR0A & (1 << RXC0)));
- c = UDR0;
- break;
- case 1:
- while (!(UCSR1A & (1 << RXC1)));
- c = UDR1;
- break;
- default:
- return RSP_UNKOWN_PIN;
- }
-
- return c;
-}
-
-// Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort
-//SIGNAL (SIG_UART0_RECV)
-//{
-// _inline_fifo_put (&infifo0, UDR0);
-//}
-
-// Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben
-// Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert
-// Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ.
-SIGNAL (SIG_UART0_DATA)
-{
- PORTC ^= 5;
- if (outfifo0.count > 0)
- {
- PORTC ^= 2;
- UDR0 = _inline_fifo_get (&outfifo0);
- }
- else
- {
- PORTC ^= 3;
- UCSR0B &= ~(1 << UDRIE0);
- }
-}
-
diff --git a/firmware/usbn2mc.c b/firmware/usbn2mc.c
index 413009c..d9b0fdd 100644
--- a/firmware/usbn2mc.c
+++ b/firmware/usbn2mc.c
@@ -81,7 +81,7 @@ USBNInitMC (void)
USB_CS_DDR |= (1 << PF_CS);
USB_CS_PORT |= (1 << PF_CS);
- //sei ();
+ sei ();
}