Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 110 → Rev 111

/Classwork/ECE4534 - Embedded Systems/PIC 27J13/circular_buffer.h
File deleted
\ No newline at end of file
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/circular_buffer.c
File deleted
\ No newline at end of file
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/buffer.c
0,0 → 1,56
#include "buffer.h"
#include "maindefs.h"
 
#pragma udata buffer1
static unsigned char buffer1[256];
#pragma udata
 
static BUFFER_DATA *buffer_data;
 
void buffer_init() {
buffer_data->index_read = 0;
buffer_data->index_write = 0;
buffer_data->stored_length = 0;
}
 
char buffer_insert(unsigned char length, unsigned char *msg) {
unsigned char i;
 
// Make sure we have enough space to store message
if (length > BUFFER_SIZE - buffer_data->stored_length) {
DBG_PRINT_BUFFER("Buffer: (ERROR) Not enough free space for insert\r\n");
return -1;
}
 
// Update the amount of used space in the buffer
buffer_data->stored_length += length;
 
// Copy data from msg to buffer
for (i = 0; i < length; i++) {
buffer1[buffer_data->index_write] = *(msg + i);
buffer_data->index_write++; // Will automatically overflow to 0
}
 
return 0;
}
 
char buffer_read(unsigned char length, unsigned char *dest) {
unsigned char i;
 
// Make sure requested data is less than size of stored data
if (length > buffer_data->stored_length) {
DBG_PRINT_BUFFER("Buffer: (ERROR) Read length exceedes stored length\r\n");
return -1;
}
 
// Update the amount of used space in the buffer
buffer_data->stored_length -= length;
 
// Copy data from buffer to dest
for (i = 0; i < length; i++) {
*(dest + i) = buffer1[buffer_data->index_read];
buffer_data->index_read++; // Will automatically overflow to 0
}
 
return 0;
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/buffer.h
0,0 → 1,18
#ifndef __circular_buffer_h
#define __circular_buffer_h
 
#define BUFFER_OK 0
#define BUFFER_ERROR -1
#define BUFFER_SIZE 256
 
typedef struct __BUFFER_DATA {
unsigned char index_read;
unsigned char index_write;
unsigned char stored_length;
} BUFFER_DATA;
 
void buffer_init(BUFFER_DATA *);
char buffer_insert(unsigned char length, unsigned char *msg);
char buffer_read(unsigned char length, unsigned char *dest);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/circular_buffer.o.d
File deleted
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/buffer.o.d
0,0 → 1,9
build/default/production/buffer.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/buffer.c \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/buffer.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/main.o.d
6,7 → 6,9
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/i2c.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/xbee.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/led_driver.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pwm.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/buffer.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
14,7 → 16,6
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/interrupts.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/adc.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/timers.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pwm.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pin_interrupts.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/pin_interrupts.o.d
1,6 → 1,7
build/default/production/pin_interrupts.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pin_interrupts.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pwm.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/msg_queues.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/maindefs.h \
8,6 → 9,5
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pin_interrupts.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pwm.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/pwm.o.d
1,12 → 1,12
build/default/production/pwm.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pwm.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pwm.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pwm.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pwm.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/build/default/production/timers.o.d
3,7 → 3,7
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/msg_queues.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/timers.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/xbee.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/pwm.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
11,5 → 11,4
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/timers.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/Test\ Programs/PIC\ 27J13/adc.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/dist/default/production/PIC_27J13.production.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/dist/default/production/PIC_27J13.production.hex
1,703 → 1,766
:020000040000FA
:0600000054EF14F01200A1
:0600000068EF16F012008B
:020006001200E6
:060008000FEF0FF01200E3
:06000800A7EF0FF012004B
:02000E00C2909E
:040010009D9C1200A1
:04001400B46A1200B8
:0600180078EF0FF012006A
:02001E000200DE
:100020000B290000DF07000011000000FA28000083
:08003000DF06000011000000D2
:08003800D9CFE6FFE1CFD9FFAB
:10004000FD0EDBCFFCF6FE0EDBCFFDF6FCC6E9FFB6
:10005000FDC6EAFFDC0EE926000EEA22EE6AED6A32
:10006000FCC6E9FFFDC6EAFFE00EE926000EEA2223
:10007000EF6AFCC6E9FFFDC6EAFFDE0EE926000EC8
:10008000EA22050EEF6EFCC6E9FFFDC6EAFFE20EAE
:10009000E926000EEA22EF6AFCC6E9FFFDC6EAFF88
:1000A000DF0EE926000EEA22EF6AFCC6E9FFFDC674
:1000B000EAFFDC0EE926000EEA22EE6AED6AFCC6D3
:1000C000E9FFFDC6EAFFE30EE926000EEA22EF6A29
:1000D000FCC6E9FFFDC6EAFFE50EE926000EEA22AE
:1000E000EF6AFCC6E9FFFDC6EAFFE60EE926000E50
:1000F000EA22EF6AFCC6E9FFFDC6EAFFE90EE9263F
:10010000000EEA22EF6AFCC6E9FFFDC6EAFFE70E31
:10011000E926000EEA22EF6AFCC6E9FFFDC6EAFF07
:10012000E80EE926000EEA22220EEF6EE552E7CF36
:10013000D9FF1200FCC6E9FFFDC6EAFFE90EE92679
:10014000000EEA22110EEF6E94869488C76AC66A82
:10015000C56AF00EC6140809C66E770EC86EC78E43
:10016000C68A1200D9CFE6FFE1CFD9FF020EE12601
:10017000FD0EDB5069E0DE6ADD6ADECF10F0DDCF18
:1001800011F0FD0EDB50000111AE02D0D89003D06B
:10019000105C000E115820E2FB0EDBCF12F0FC0EBB
:1001A000DBCF13F0DE501224E96EDD501320EA6E2F
:1001B000EF50E66EFCC610F0FDC611F0DE501024C4
:1001C000E96EDD501120EA6EE552E750EF6EDF2A4E
:1001D000010ED3E3DB2AD1D7FD0EDB50E66EFCC661
:1001E000E9FFFDC6EAFFDC0EE926000EEA22E55231
:1001F000E750EE6EED6AFCC6E9FFFDC6EAFFE70ECA
:10020000E926000EEA22FE0EDBCFEFFFFCC6E9FF77
:10021000FDC6EAFFDF0EE926000EEA22EF6AFCC601
:10022000E9FFFDC6EAFFDE0EE926000EEA22090E0E
:10023000EF6EFCC6E9FFFDC6EAFFE80EE926000EF8
:10024000EA22200EEF6EC580020EE15C02E2E16A56
:10025000E552E16EE552E7CFD9FF1200D9CFE6FFB4
:10026000E1CFD9FFFD0EDB5038E0FD0EDB50E66E2E
:10027000FCC6E9FFFDC6EAFFDC0EE926000EEA2215
:10028000E552E750EE6EED6AFCC6E9FFFDC6EAFFF7
:10029000E70EE926000EEA22FE0EDBCFEFFFFCC6DA
:1002A000E9FFFDC6EAFFDF0EE926000EEA22EF6A4B
:1002B000FCC6E9FFFDC6EAFFDE0EE926000EEA22D3
:1002C000090EEF6EFCC6E9FFFDC6EAFFE80EE9265F
:1002D000000EEA22210EEF6EC580E552E7CFD9FF6E
:1002E0001200D9CFE6FFE1CFD9FFFCC6E9FFFDC67A
:1002F000EAFFE90EE926000EEA22100EEF6E948660
:100300009488FE0EDB50E824C86EC76AC66AC56AC8
:10031000F00EC6140E09C66EC78EC580C68AE55299
:10032000E7CFD9FF1200FCC6E9FFFDC6EAFFE90EE0
:10033000E926000EEA22EF50110802E1ADEF01F0CC
:10034000FCC6E9FFFDC6EAFFE90EE926000EEA2237
:10035000EF50100801E10CDA1200FCC6E9FFFDC6FF
:10036000EAFFE80EE926000EEA22EF50200801E03D
:10037000ADD0FCC6E9FFFDC6EAFFDE0EE926000EA1
:10038000EA22EF500B0A1CE0020A04E00C0A01E129
:100390009CD01200FCC6E9FFFDC6EAFFDE0EE9268E
:1003A000000EEA220B0EEF6EFCC6E9FFFDC6EAFF67
:1003B000E70EE926000EEA22EF50E824C96E12008B
:1003C000C5BC62D0FCC6E9FFFDC6EAFFDF0EE92628
:1003D000000EEA22EF50106E116AFCC6E9FFFDC65E
:1003E000EAFFDC0EE926000EEA22EECF12F0EFCF94
:1003F00013F011501318E8AE02D0133404D0125089
:10040000105C135011581EE2FCC6E9FFFDC6EAFF5E
:10041000FCC610F0FDC611F0DF0EE926000EEA2240
:10042000EF501024E96E000E1120EA6EEF50C96EF5
:10043000FCC6E9FFFDC6EAFFDF0EE926000EEA2250
:10044000EF2A1200FCC6E9FFFDC6EAFFDE0EE92630
:10045000000EEA22050EEF6EC584FCC6E9FFFDC65C
:10046000EAFFE80EE926000EEA22220EEF6E000EE9
:10047000E66EE66A2B0EE66EE66A80EC09F0E5525F
:10048000E552E552E5521200FCC6E9FFFDC6EAFF5F
:10049000DE0EE926000EEA22050EEF6EC584FCC6CC
:1004A000E9FFFDC6EAFFE80EE926000EEA22220E69
:1004B000EF6E000EE66EE66A2C0EE66EE66A80ECE3
:1004C00009F0E552E552E552E5521200FCC6E9FF9B
:1004D000FDC6EAFFE80EE926000EEA22EF502108E9
:1004E00001E0E7D0FCC6E9FFFDC6EAFFDE0EE92623
:1004F000000EEA22EF500D0A01E1ACD0010A01E141
:100500009DD00B0A43E00C0A1DE0020A04E00C0A2D
:1005100001E1CFD01200FCC6E9FFFDC6EAFFDE0E06
:10052000E926000EEA220B0EEF6EFCC6E9FFFDC6BF
:10053000EAFFE70EE926000EEA22EF50E82401095F
:10054000C96E1200C5AC7AD0FCC6E9FFFDC6EAFF51
:10055000DE0EE926000EEA22050EEF6EC584FCC60B
:10056000E9FFFDC6EAFFE80EE926000EEA22220EA8
:10057000EF6E000EE66EE66A2E0EE66EE66A80EC20
:1005800009F0E552E552E552E5521200FCC6E9FFDA
:10059000FDC6EAFFFCC610F0FDC611F0DF0EE9262D
:1005A000000EEA22EF501024E96E000E1120EA6ED0
:1005B000C9CFEFFFFCC6E9FFFDC6EAFFDF0EE92663
:1005C000000EEA22EF2AFCC6E9FFFDC6EAFFDF0EB5
:1005D000E926000EEA22EF50106E116AFCC6E9FF10
:1005E000FDC6EAFFDC0EE926000EEA22EECF12F08D
:1005F000EFCF13F011501318E8AE02D0133404D02B
:100600001250105C135011580CE2FCC6E9FFFDC6F5
:10061000EAFFDE0EE926000EEA220C0EEF6EC59A06
:100620000BD0FCC6E9FFFDC6EAFFDE0EE926000E90
:10063000EA220D0EEF6EC58AC5881200FCC6E9FFDE
:10064000FDC6EAFFDE0EE926000EEA22070EEF6E77
:10065000C5861200FCC6E9FFFDC6EAFFDE0EE926EC
:10066000000EEA22050EEF6EC584FCC6E9FFFDC64A
:10067000EAFFE80EE926000EEA22220EEF6EFCC623
:10068000E9FFFDC6EAFFFCC610F0FDC611F0FCC68E
:10069000E6FFFDC6E6FF2D0EE66EDC0EE926000E37
:1006A000EA22EF50E66E80EC09F0E552E552E552A1
:1006B000E5521200D9CFE6FFE1CFD9FFFCC6E9FF32
:1006C000FDC6EAFFE00EE926000EEA22010EEF6EFB
:1006D000FCC6E9FFFDC6EAFFDC0EE926000EEA22B1
:1006E000EE6AED6AFE0EDB5035E0C7AA1DD0FCC6EF
:1006F000E9FFFDC6EAFFDE0EE926000EEA22050E3E
:10070000EF6EFCC6E9FFFDC6EAFFE20EE926000E29
:10071000EA22EF2AFCC6E9FFFDC6EAFFE10EE92660
:10072000000EEA22050E1FD0C7A40AD0FCC6E9FFBE
:10073000FDC6EAFFDE0EE926000EEA22080E13D0FF
:10074000FCC6E9FFFDC6EAFFDE0EE926000EEA223E
:10075000070E09D0FCC6E9FFFDC6EAFFDE0EE9265A
:10076000000EEA22060EEF6EE552E7CFD9FF120027
:10077000D9CFE6FFE1CFD9FF090EE126010EDB6AF2
:10078000020EDB6A030EDB6A040EDB6A080EDB6A0C
:10079000C6AC23D0C69CFCC6E9FFFDC6EAFFDE0E50
:1007A000E926000EEA22050EEF6E010EF36E040E2E
:1007B000F3CFDBFFFCC6E9FFFDC6EAFFE20EE92648
:1007C000000EEA22EF2AFCC6E9FFFDC6EAFFE10EB1
:1007D000E926000EEA22040EEF6EC7A005D0C9502C
:1007E000DF6EDE52010EDD6E040EDB5001E03AD208
:1007F000FCC6E9FFFDC6EAFFDE0EE926000EEA228E
:10080000EF50070A01E17BD10F0A01E16FD00E0A18
:1008100017E0030A01E026D2C7A624D2010EDBCFDF
:10082000E6FF48DFE552FCC6E9FFFDC6EAFFDE0E43
:10083000E926000EEA22EF50080801E013D237D073
:10084000C7A810D0FCC6E9FFFDC6EAFFE00EE92606
:10085000000EEA22EF2A010EDB5001E1F9D1C7AA0E
:100860009CD1E3D1010EDB5001E1FCD1FCC6E9FFD4
:10087000FDC6EAFFE00EE926000EEA22EF2AC7BA1B
:1008800018D0C7B40AD0FCC6E9FFFDC6EAFFDE0EE9
:10089000E926000EEA22070EE4D1FCC6E9FFFDC6F8
:1008A000EAFFDE0EE926000EEA22080EEF6E030EC6
:1008B000BAD1FCC6E9FFFDC6EAFFE20EE926000E4A
:1008C000EA22EF2AFCC6E9FFFDC6EAFFDE0EE926B2
:1008D000000EEA22050EEF6EFCC6E9FFFDC6EAFF38
:1008E000E10EE926000EEA22060EBBD1FCC6E9FFA6
:1008F000FDC6EAFFE50EE926000EEA22EF5001E010
:100900007ED002EC0AF0E76E080EE7CFDBFFDB508B
:100910002A0803E1080EDB501BE1C968FCC6E9FFA9
:10092000FDC6EAFFDF0EE926000EEA22010EEF6E99
:10093000FCC6E9FFFDC6EAFFE50EE926000EEA2245
:10094000010EEF6EFCC6E9FFFDC6EAFFE60E51D0D0
:10095000FCC6E9FFFDC6EAFFFCC612F0FDC613F0B7
:10096000FCC6E6FFFDC6E6FFE40EE926000EEA221D
:10097000EF50E66EE66ADC0EE66EE2EC09F0146E0D
:10098000050EE15E1450106E116A10BE1168FCC6AF
:10099000E9FFFDC6EAFFDC0EE926000EEA2210C0E0
:1009A000EEFF11C0EDFFFCC6E9FFFDC6EAFFDC0E5D
:1009B000E926000EEA22EECF10F0EFCF11F011344D
:1009C00001E350D110500008000E115401E34AD148
:1009D000FCC6E9FFFDC6EAFFEF50C96EDF0EE9264F
:1009E000000EEA22010EEF6EFCC6E9FFFDC6EAFF2B
:1009F000E50EE926000EEA22010EEF6E71D0FCC66C
:100A0000E9FFFDC6EAFFE60EE926000EEA22EF50F6
:100A100026E0FCC6E9FFFDC6EAFFDF0EE926000E70
:100A2000EA22EFCF10F0FCC6E9FFFDC6EAFFE30EB5
:100A3000E926000EEA22EF50105C02E2C96846D0B7
:100A4000FCC6E9FFFDC6EAFFE50EE926000EEA2234
:100A5000EF6AFCC6E9FFFDC6EAFFE60E4BD0FCC616
:100A6000E9FFFDC6EAFFDF0EE926000EEA22EF509D
:100A7000106E116AFCC6E9FFFDC6EAFFDC0EE9262E
:100A8000000EEA22EECF12F0EFCF13F01150131840
:100A9000E8AE02D0133404D01250105C1350115839
:100AA00024E2FCC6E9FFFDC6EAFFFCC610F0FDC665
:100AB00011F0DF0EE926000EEA22EF500F0110249C
:100AC000E96E000E1120EA6EEF50C96EFCC6E9FF18
:100AD000FDC6EAFFDF0EE926000EEA22EF2A010E2C
:100AE000F36E020EF3CFDBFFBDD0FCC6E9FFFDC6FF
:100AF000EAFFE50EE926000EEA22EF6AA9D0C7A8B0
:100B000052D0FCC6E9FFFDC6EAFFE00EE926000E62
:100B1000EA22EF2A010EDB5040E0C7AA21D0FCC632
:100B2000E9FFFDC6EAFFFCC610F0FDC611F0DC0EC1
:100B3000E926000EEA221050EE24E76E1150EE2056
:100B4000EA6EE7CFE9FFDFCFEFFFFCC6E9FFFDC6A6
:100B5000EAFFDC0EE926000EEA22EE2AEF221DD083
:100B6000FCC6E9FFFDC6EAFFE20EE926000EEA2216
:100B7000EF2AFCC6E9FFFDC6EAFFE10EE926000EFA
:100B8000EA22060EEF6EFCC6E9FFFDC6EAFFDE0EA6
:100B9000E926000EEA22050E5AD0010EF36E030E6E
:100BA000F3CFDBFF55D0010EDB505CE0FCC6E9FF64
:100BB000FDC6EAFFE00EE926000EEA22EF2AC7AAE8
:100BC00021D0FCC6E9FFFDC6EAFFFCC610F0FDC659
:100BD00011F0DC0EE926000EEA221050EE24E76E3A
:100BE0001150EE20EA6EE7CFE9FFDFCFEFFFFCC642
:100BF000E9FFFDC6EAFFDC0EE926000EEA22EE2A36
:100C0000EF2230D0C7A411D0FCC6E9FFFDC6EAFF31
:100C1000DE0EE926000EEA22080EEF6E010EF36EDC
:100C2000030EF3CFDBFFC96E1DD0FCC6E9FFFDC686
:100C3000EAFFE20EE926000EEA22EF2AFCC6E9FFEF
:100C4000FDC6EAFFE10EE926000EEA22060EEF6E6F
:100C5000FCC6E9FFFDC6EAFFDE0EE926000EEA2229
:100C6000050EEF6E010EDB5003E1020EDB5002E0D9
:100C7000C6A8C688FCC6E9FFFDC6EAFFDC0EE92669
:100C8000000EEA22EECF10F0EFCF11F0113425E282
:100C90001050DA08000E115420E2030EDB501DE163
:100CA000FCC6E9FFFDC6EAFFDE0EE926000EEA22D9
:100CB000050EEF6EFCC6E9FFFDC6EAFFE20EE9266F
:100CC000000EEA22EF2AFCC6E9FFFDC6EAFFE10EAC
:100CD000E926000EEA22070EEF6E030EDB5070E0ED
:100CE000FCC6E9FFFDC6EAFFFCC610F0FDC611F028
:100CF000DC0EE926000EEA22EECF12F0EFCF13F061
:100D00001206135A10501224E96E11501320EA6E85
:100D1000EF50E66EFCC6E9FFFDC6EAFFE30EE926EA
:100D2000000EEA22E552E750EF6EFCC6E9FFFDC671
:100D3000EAFFE00EE926000EEA22EF50E66EFCC65E
:100D4000E9FFFDC6EAFFFCC610F0FDC611F0DC0E9F
:100D5000E926000EEA221050EE24E76E1150EE2034
:100D6000EA6EE7CFE9FFE552E750EF6EFCC6E9FF18
:100D7000FDC6EAFFFCC610F0FDC611F0FCC6E6FF9A
:100D8000FDC6E6FF290EE66EDC0EE926000EEA221D
:100D9000EECF12F0EFCF13F0010E1224E66E80ECCE
:100DA00009F0E552E552E552E552FCC6E9FFFDC601
:100DB000EAFFDC0EE926000EEA22EE6AED6A47D071
:100DC000FCC6E9FFFDC6EAFFE20EE926000EEA22B4
:100DD000EFCF10F0010E105C3AE3FCC6E9FFFDC650
:100DE000EAFFE20EE926000EEA22050EEFCFDBFF56
:100DF000FCC6E9FFFDC6EAFFE10EE926000EEA2285
:100E0000060EEFCFDBFFFCC6E9FFFDC6EAFFE00EF2
:100E1000E926000EEA22070EEFCFDBFFD950050FBF
:100E2000E66E000EDA20E66E280EE66E030EE66E23
:100E300080EC09F0E552E552E552E552FCC6E9FFC7
:100E4000FDC6EAFFE20EE926000EEA22EF6A090E6D
:100E5000E15C02E2E16AE552E16EE552E7CFD9FFDB
:100E60001200FCC6E9FFFDC6EAFFE80EE926000E07
:0C0E7000EA22EF50220801E1000C010C06
:040E7C00D9CFE6FFE5
:100E8000E1CFD9FFE652FD0EDBCFE9FFFE0EDBCF4F
:100E9000EAFF060EE926000EEA22EF6AFD0EDBCF1E
:100EA000E9FFFE0EDBCFEAFF070EE926000EEA227D
:100EB000EF6ADF6A030EDF5C15E2FD0EDBCFE9FFB0
:100EC000FE0EDBCFEAFFDF50020DE950F324E96E9E
:100ED000EA50F420EA6EEE50EFCFEAFFE96EEF6AD7
:100EE000DF2AE8D7E552E552E7CFD9FF1200050126
:100EF000FA6B000EEA6F0B0EEB6F000EEC6F0A0E32
:100F0000ED6F000EEE6F090EEF6F000EF26F080E20
:100F1000F36F000EF46F070EF56F000EF66F060EFE
:100F2000F76FEA0EE66E050EE66EA8DFE552E552B3
:100F3000F20EE66E050EE66EA1DFE552E5521200F6
:100F4000D9CFE6FFE1CFD9FF050EE126FC0EDB503D
:100F5000E66ED950030FE96EDACFEAFFE552E750AB
:100F6000EE6EED6AFD0EDBCFE9FFFE0EDBCFEAFF92
:100F7000060EE926000EEA22EFCFDFFFFD0EDBCFE3
:100F8000E9FFFE0EDBCFEAFFDF50020DE950F3244C
:100F9000E96EEA50F420EA6E010EEECFDBFF020E9E
:100FA000EDCFDBFF010EDBCFE9FF020EDBCFEAFF67
:100FB000EF5002E0FF0E64D0010EDBCFE9FF020E1E
:100FC000DBCFEAFFEE52FC0EDBCFEFFF010EDBCFF3
:100FD000E9FF020EDBCFEAFFE926000EEA22FB0E54
:100FE000DBCFEFFF030EDBCFE6FF040EDBCFE6FF28
:100FF000F90EDBCFE6FFFA0EDBCFE6FF010EDBCF0B
:10100000E9FF020EDBCFEAFF030EE926000EEA221B
:10101000E9CF10F0EACF11F0E9CFE6FFEACFE6FF23
:1010200057EC13F0126E060EE15E1250FD0EDBCF90
:10103000E9FFFE0EDBCFEAFF060EE926000EEA22EC
:10104000EF28106E030E116E0C6E10C007F062ECEC
:1010500014F00350E66EFD0EDBCFE9FFFE0EDBCF92
:10106000EAFF060EE926000EEA22E552E750EF6E8F
:10107000010EDBCFE9FF020EDBCFEAFF010EEF6EC0
:10108000106E050EE15C02E2E16AE552E16E10507D
:10109000E552E7CFD9FF1200D9CFE6FFE1CFD9FF64
:1010A000050EE126FD0EDBCFE9FFFE0EDBCFEAFFEA
:1010B000070EE926000EEA22EFCFDFFFFD0EDBCFA1
:1010C000E9FFFE0EDBCFEAFFDF50020DE950F3240B
:1010D000E96EEA50F420EA6E010EEECFDBFF020E5D
:1010E000EDCFDBFF010EDBCFE9FF020EDBCFEAFF26
:1010F000EF0401E086D0010EDBCFE9FF020EDBCF6B
:10110000EAFFEE52EFCF10F0FC0EDB50D880105407
:1011100002E2FD0E77D0010EDBCFE9FF020EDBCF3E
:10112000EAFFEE52EF50E66ED950030FE96EDACFC8
:10113000EAFFE552E750EE6EED6A030EDBCFE6FF05
:10114000040EDBCFE6FF010EDBCFE9FF020EDBCFA3
:10115000EAFF030EE926000EEA22E9CF10F0EACFFB
:1011600011F0E9CFE6FFEACFE6FFF80EDBCFE6FFAE
:10117000F90EDBCFE6FF57EC13F0126E060EE15EC0
:101180001250FD0EDBCFE9FFFE0EDBCFEAFF070EAC
:10119000E926000EEA22EF28106E030E116E0C6E87
:1011A00010C007F062EC14F00350E66EFD0EDBCFCA
:1011B000E9FFFE0EDBCFEAFF070EE926000EEA226A
:1011C000E552E750EF6E010EDBCFE9FF020EDBCFF9
:1011D000EAFFE926000EEA22EF50E66EFA0EDBCFB8
:1011E000E9FFFB0EDBCFEAFFE552E750EF6E010EA1
:1011F000DBCFE9FF020EDBCFEAFFEF6A030EDB5025
:1012000001D0FC0E106E050EE15C02E2E16AE552CF
:10121000E16E1050E552E7CFD9FF1200D9CFE6FFBB
:10122000E1CFD9FF030EE126FD0EDBCFE9FFFE0E75
:10123000DBCFEAFF070EE926000EEA22EFCFDFFF41
:10124000FD0EDBCFE9FFFE0EDBCFEAFFDF50020D24
:10125000E950F324E96EEA50F420EA6E010EEECF75
:10126000DBFF020EEDCFDBFF010EDBCFE9FF020E4D
:10127000DBCFEAFFEF040BE1010EDBCFE9FF020E4B
:10128000DBCFEAFFE926000EEA22EF5001D0000E84
:10129000106E030EE15C02E2E16AE552E16E10506D
:1012A000E552E7CFD9FF1200D9CFE6FFE1CFD9FF52
:1012B000FD0EDBCFE9FFFE0EDBCFEAFFE9CF10F03A
:1012C000EACF11F0FD0EDBCFE9FFFE0EDBCFEAFF28
:1012D000070EE926000EEA22EF50020D1050F3240B
:1012E000E96E1150F420EA6EEE50EFCFEAFFE96E9E
:1012F000EF50E552E7CFD9FF1200D38E0300120062
:10130000D9CFE6FFE1CFD9FFFB0EDBCFE6FFFC0E26
:10131000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FF09
:10132000EA0EE66E050EE66E0BDE106E060EE15E50
:101330001050E552E7CFD9FF1200D9CFE6FFE1CF39
:10134000D9FFFA0EDBCFE6FFFB0EDBCFE6FFFC0E8C
:10135000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FFC9
:10136000EA0EE66E050EE66E97DE106E070EE15E83
:101370001050E552E7CFD9FF1200EA0EE66E050ED7
:10138000E66E4CDFE552E5521200D9CFE6FFE1CF21
:10139000D9FFFB0EDBCFE6FFFC0EDBCFE6FFFD0E39
:1013A000DBCFE6FFFE0EDBCFE6FFF20EE66E050EAC
:1013B000E66EC6DD106E060EE15E1050E552E7CF18
:1013C000D9FF1200D9CFE6FFE1CFD9FFFA0EDBCF6C
:1013D000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0EEC
:1013E000DBCFE6FFFE0EDBCFE6FFF20EE66E050E6C
:1013F000E66E52DE106E070EE15E1050E552E7CF4A
:10140000D9FF1200F20EE66E050EE66E07DFE5521A
:10141000E55212000501FA5101E11200F1EC0EF063
:10142000F3CF10F0F4CF11F0F350F41001E01200FC
:10143000D5EC0EF0F3CF10F0F4CF11F0F350F41020
:1014400001E11200EA0EE66E050EE66E2DDFE552B2
:10145000E552000901E012007DEF09F0FDEC0EF00D
:10146000F3CF10F0F4CF11F0F350F41001E11200BB
:101470000501010EFA6FEA0EE66E050EE66E14DF48
:10148000E552E552000903E00501FA6B12000A0E6D
:0A149000E66E24EC14F0E552EED7EE
:06149A00D9CFE6FFE1CF0F
:1014A000D9FF938093928A908A92FD0EDBCFFBF551
:1014B000FE0EDBCFFCF5FBC5E9FFFCC5EAFFF30E32
:1014C000E926000EEA22EF6AFBC5E9FFFCC5EAFF48
:1014D000F40EE926000EEA22EF6AFBC5E9FFFCC51F
:1014E000EAFFF50EE926000EEA220A0EEF6EFBC5B2
:1014F000E9FFFCC5EAFF030EE926000EEA22E9CF68
:10150000FDF5EACFFEF5E552E7CFD9FF1200D9CFBE
:10151000E6FFE1CFD9FFFE0EDB507E0823E1FBC5DD
:10152000E9FFFCC5EAFFF30EE926000EEA22EF6AA6
:10153000FBC5E9FFFCC5EAFFF40EE926000EEA222E
:10154000EF6AFBC5E9FFFCC5EAFF7E0EEF6EFBC547
:10155000E9FFFCC5EAFFF50EE926000EEA220B0EB4
:10156000EF6EB8D0FBC5E9FFFCC5EAFFF50EE92632
:10157000000EEA22EF500F0A01E192D0010A2EE09C
:10158000020A1AE0070A02E0010AA4D0FBC5E9FF3B
:10159000FCC5EAFFEE52010EE926000EEA22FE0E1D
:1015A000DBCFEFFFFBC5E9FFFCC5EAFFF50EE9263F
:1015B000000EEA220C0E8DD0FBC5E9FFFCC5EAFF48
:1015C000EE52FE0EDBCFEFFFFBC5E9FFFCC5EAFFE5
:1015D000F50EE926000EEA220E0E7BD0FBC5E9FFD0
:1015E000FCC5EAFFF30EE926000EEA22EFCF10F069
:1015F000FBC5E9FFFCC5EAFFEE52EECF11F0EFCFDD
:1016000012F01150105C000E125426E2FBC5E9FFE7
:10161000FCC5EAFFF30EE926000EEA22EF500501B1
:10162000EA6AFD25E96EFE51EA22FE0EDBCFEFFFEE
:10163000FBC5E9FFFCC5EAFFF40EE926000EEA222D
:10164000FE0EDB50EF26FBC5E9FFFCC5EAFFF30EFB
:10165000E926000EEA22EF2AFBC5E9FFFCC5EAFFF6
:10166000F30EE926000EEA22EF50106E116AFBC558
:10167000E9FFFCC5EAFFEE52EECF12F0EFCF13F018
:101680001250101827E11350111824E1FBC5E9FF8F
:10169000FCC5EAFFF50EE926000EEA220F0E19D06E
:1016A000FBC5E9FFFCC5EAFFF40EE926000EEA22BD
:1016B000EF28E86C106EFE0EDB50105C01E10ED8D6
:1016C000FBC5E9FFFCC5EAFFF50EE926000EEA229C
:1016D0000A0EEF6EE552E7CFD9FF1200D9CFE6FF31
:1016E000E1CFD9FFE652FDC5E9FFFEC5EAFFEF50A5
:1016F0008A0A40E01F0A38E0340A30E0360A28E05F
:10170000060A20E0030A18E0190A10E01B0A08E0A4
:10171000180A47E1FDC5E6FFFEC5E6FF3C0E2FD0E7
:10172000FDC5E6FFFEC5E6FF3D0E29D0FDC5E6FF7F
:10173000FEC5E6FF3E0E23D0FDC5E6FFFEC5E6FF73
:101740003F0E1DD0FDC5E6FFFEC5E6FF400E17D0DB
:10175000FDC5E6FFFEC5E6FF410E11D0FDC5E6FF63
:10176000FEC5E6FF420E0BD0FDC5E6FFFEC5E6FF57
:10177000430E05D0FDC5E6FFFEC5E6FF440EE66E4E
:10178000FBC5E9FFFCC5EAFFEE52EF50E66E80ECC8
:1017900009F0E552E552E552E552DF6EDFCF10F079
:1017A0001034E552E552E7CFD9FF1200D9CFE6FF5A
:1017B000E1CFD9FF020EE126010EDB6A7E0EE66E56
:1017C0000DEC14F0E552A850020BFDE06BD80009B7
:1017D000FAE1E66A0DEC14F0E552A850020BFDE0C8
:1017E00061D80009FAE1FC0EDBCFE6FF0DEC14F046
:1017F000E552A850020BFDE055D80009FAE1DF6A76
:10180000FC0EDB50DF5C2DE2DF50E76EFD0EDBCF20
:10181000E9FFFE0EDBCFEAFFE750E926000EEA22E1
:10182000EF50E66E0DEC14F0E552DF50E76EFD0E62
:10183000DBCFE9FFFE0EDBCFEAFFE750E926000E23
:10184000EA22010EDBCFE7FFEF50E726010EE7CFDC
:10185000DBFFA850020BFDE025D80009FAE1DF2AE2
:10186000CFD7010EDB28E86CE66E0DEC14F0E552E4
:10187000A8A2FED7020EE15C02E2E16AE552E16E47
:10188000E552E7CFD9FF1200D9CFE6FFE1CFD9FF6C
:10189000FE0EDB5002E08A8201D08A92E552E7CF49
:1018A000D9FF1200D9CFE6FFE1CFD9FFE652815030
:1018B000010BDF6EDF5002E0010E01D0000EE55299
:0818C000E552E7CFD9FF120049
:0818C800D9CFE6FFE1CFD9FF03
:1018D000180EE126020EDB6A030EDB6AFC0ED3143F
:1018E0000009D36EF70EE66E040EE66E1AEC12F0E7
:1018F000E552E552000EE66E040EE66E4DEC0AF07F
:10190000E552E552000EE66E050EE66E1CEC00F0A8
:10191000E552E55277EC07F0C2EC0DF0DDEC11F08A
:1019200034EC14F089EC0FF09AEC0FF0D1EC0EF0DF
:10193000CCEC0EF00F0148691F0E496F5F0EE66E8A
:1019400071EC01F0E5522EEC0AF0000EE66E0C0E82
:10195000E66ED950010FE66E000EDA20E66EDC0E60
:10196000E66E9DEC09F0106E050EE15E1050DF6E24
:10197000DFCF10F0103403E3FC0EDF5CE4D7010E80
:10198000DB504D0AE0E0010ADEE0070ADCE0010A74
:10199000DAE0030AD8E0010AD6E00F0AD4E0010A2F
:1019A000D2E0020A01E1D6D0070A01E1D0D0010A53
:1019B00001E1CAD0030A01E1C4D0010A01E1BED0AD
:1019C0007F0A01E1B8D0010A01E1B2D0030A01E1C6
:1019D0007BD0010A61E0120AB6E0030A4FE0010A77
:1019E000B2E0070AB0E0020A12E0010A03E0360A98
:1019F000AAE0BAD0020EDB6ADF50F36E020EDBCF34
:101A0000F4FFF350F45C9FE2020EDB2AF5D7020EDE
:101A1000DB6ADF04F36E020EDBCFF4FFF350F45CFD
:101A200003E2020EDB2AF5D70C010051090A01E19D
:101A30008AD7010A01E187D70F0A01E184D7010A99
:101A400001E181D7020A07E0060A01E07CD7010E16
:101A5000DF6E006F05D0010EDF6E030EDBCF00FCE2
:101A6000000EE66E0C0EE66E2A0EE66EDFCFE6FF87
:101A7000C5EC09F0E552E552E55258D0020EDB6A9A
:101A8000DF50F36E020EDBCFF4FFF350F45C01E3A2
:101A90005AD7020EDB2AF4D7D950040FE96EDACFF9
:101AA000EAFF000EEE6E0C0EED6E020EDB6A050E06
:101AB000DF5CF36E020EDBCFF4FFF350F45C01E366
:101AC00042D7020EDB2AF3D7D950060FE96EDACFE0
:101AD000EAFF000EEE6E0C0EED6E020EDB6A0C0ECF
:101AE000DF5CF36E020EDBCFF4FFF350F45C03E235
:101AF000020EDB2AF4D7060EDBCFE9FF070EDBCFA1
:101B0000EAFF0C0EE926000EEA22030EEFCFDBFF00
:101B1000060EDBCFE9FF070EDBCFEAFF0C0EE9264E
:101B2000000EEA22EF50E66E2BEC0EF0E5520BD7DA
:101B3000D950080F11D0D9500A0F0ED0D9500C0F20
:101B40000BD0D9500E0F08D0D950100F05D0D95056
:101B5000120F02D0D950140FE96EDACFEAFF000E4F
:101B6000EE6E0C0EED6EEFD6020EDB6ADF50F36EFA
:101B7000020EDBCFF4FFF350F45C01E3E4D6020E77
:041B8000DB2AF4D791
:0C1B84009290929292949296899089928D
:101B900089948996E66AE66A08D8E552E552120009
:101BA00089820000899200001200D9CFE6FFE1CFC0
:101BB000D9FF020EE1268990DE6ADD6ADECF10F0E1
:101BC000DDCF11F0D890115004E6080E105C000E25
:101BD000115814E2FD0EDB50010BE8B08984E8A037
:101BE0008994DEDFFD0EDBCFF3FFF390F342F3CFFA
:101BF000DBFFDF2A010EE2E3DB2AE0D7DE6ADD6AE3
:101C0000DECF10F0DDCF11F0D890115004E6080EB1
:101C1000105C000E115814E2FE0EDB50010BE8B010
:101C20008984E8A08994BCDFFE0EDBCFF3FFF3903C
:101C3000F342F3CFDBFFDF2A010EE2E3DB2AE0D73A
:101C40008980020EE15C02E2E16AE552E16EE55252
:101C5000E7CFD9FF1200D9CFE6FFE1CFD9FF030EBE
:101C6000E126DF6A010EDB6A020EDB6A0A0E106EE5
:101C70000C6EFE0EDBCF07F062EC14F0020E03C018
:101C8000DBFFDB50090A36E0010A30E00F0A2AE0E8
:101C9000010A24E0030A1EE0010A18E0070A12E024
:101CA000010A0CE0030A06E0010A27E1010EE6C77B
:101CB000DBFF23D0010EE7C7DBFF1FD0010EE8C713
:101CC000DBFF1BD0010EE9C7DBFF17D0010EEAC70F
:101CD000DBFF13D0010EEBC7DBFF0FD0010EECC70B
:101CE000DBFF0BD0010EEDC7DBFF07D0010EEEC707
:101CF000DBFF03D0010EEFC7DBFF0A0E106E0C6E88
:101D0000FE0EDBCF07F062EC14F0020E07C0DBFF23
:101D1000DB50090A2DE0010A28E00F0A23E0010A3E
:101D20001EE0030A19E0010A14E0070A0FE0010AA5
:101D30000AE0030A05E0010A1DE1E6C7DFFF1AD049
:101D4000E7C7DFFF17D0E8C7DFFF14D0E9C7DFFF21
:101D500011D0EAC7DFFF0ED0EBC7DFFF0BD0ECC717
:101D6000DFFF08D0EDC7DFFF05D0EEC7DFFF02D0F1
:101D7000EFC7DFFF010EDBCFE6FFDFCFE6FF15DFAA
:101D8000E552E552030EE15C02E2E16AE552E16EE2
:081D9000E552E7CFD9FF120074
:081D9800A58A9F86F08C9D8650
:101DA0001200D08EF28EF29C1200F250800B800A4C
:101DB00001E0010E106E116A10BE116810C0F3FF31
:101DC00011C0F4FF1200F250400B400A01E0010E76
:101DD000106E116A10BE116810C0F3FF11C0F4FF3D
:101DE0001200F2BC04D0E1DFF350F41002E0F36A19
:101DF00002D0010EF36EF46A1200F3DFF3CF10F09D
:101E0000F4CF11F0F350F41007E1CFDFF350F410EA
:101E100003E1010EF36E01D0F36AF46A1200DACF27
:101E2000E4FFE2CFDAFFE9CFE4FFEACFE4FFF6CF49
:101E3000E4FFF7CFE4FFF8CFE4FFF5CFE4FFF3CF03
:101E4000E4FFF4CFE4FFFACFE4FFFBCFE4FF00EEC2
:101E500000F0100EE80403E3EECFE4FFFBD700EE42
:101E600010F0050EE80403E3EECFE4FFFBD7E652E3
:101E70009EA60CD0010EE66E44EC0CF0E55293ECFD
:101E800001F09E96E66A44EC0CF0E552A4AA03D059
:101E90003AEC12F0A49AF2A003D0ACEC0FF0F2905E
:101EA000E55200EE14F0050EE80403E3E5CFEDFF84
:101EB000FBD700EE0FF0100EE80403E3E5CFEDFFD3
:101EC000FBD7E5CFFBFFE5CFFAFFE5CFF4FFE5CF8A
:101ED000F3FFE5CFF5FFE5CFF8FFE5CFF7FFE5CF5F
:101EE000F6FFE5CFEAFFE5CFE9FFE5CFDAFF110026
:101EF000D8CFE4FFE0CFE4FFE46EDACFE4FFE652B0
:101F0000E552E5CFDAFFE550E5CFE0FFE5CFD8FFBA
:021F10001000BF
:0E1F1200928A94948B940E01100EE16FF0866B
:101F2000F19A12008B84640EE66EF6EC13F0E55223
:101F30008B94120004010F0EF96FF19E9388938A1F
:101F4000938C938E8188818A818C818E8A888A8AFB
:101F50008A8C8A8EF2861200D9CFE6FFE1CFD9FFB4
:101F6000E652F00E8114E8380F0BDF6EDF500401EB
:101F7000F919010B13E0F9A105D0000EE66EE66A2F
:101F8000470E04D0000EE66EE66A460EE66EE66A7E
:101F900080EC09F0E552E552E552E552DF500401CC
:101FA000F919020B13E0F9A305D0000EE66EE66AFC
:101FB000490E04D0000EE66EE66A480EE66EE66A4A
:101FC00080EC09F0E552E552E552E552DF5004019C
:101FD000F919040B13E0F9A505D0000EE66EE66AC8
:101FE0004B0E04D0000EE66EE66A4A0EE66EE66A16
:101FF00080EC09F0E552E552E552E552DF5004016C
:10200000F919080B13E0F9A705D0000EE66EE66A91
:102010004D0E04D0000EE66EE66A4C0EE66EE66AE1
:1020200080EC09F0E552E552E552E552DFCFF9F4D4
:0A203000E552E552E7CFD9FF120098
:06203A00D9CFE6FFDACF6A
:10204000E6FFE1CFD9FFE2CFDAFFE652E652E652F1
:10205000DF6AF8CF01F0F6CF02F0FD0EDB80DB8205
:10206000DB84DB86DB88DB8AFC0EDB84DB86DB88BB
:10207000DB8ADB8CDB8EFD0EDBCFE6FFC00EBA10F9
:10208000E552E714BA6EFC0EDBCFE6FF0F0EBA1076
:10209000E552E714BA6E3F0E106EFD0EDB50105C79
:1020A00002E194940FD0FD0EDB50BF0802E194943E
:1020B00009D0FD0EDB507F0804E0FD0EDB50FF0869
:1020C00001E1949401C0F8FF02C0F6FFE552E55229
:0E20D000E552E552E5CFDAFFE7CFD9FF120067
:0220DE00D9CF58
:1020E000E6FFDACFE6FFE1CFD9FFE2CFDAFFC26A3F
:1020F000C16AFC0EDB50400DF350C00B106EFC0E9D
:10210000DB407F0B3C0B1010C26EFD0EDB50040D4C
:10211000F350380B116EFD0EDB380F0B070B106EF2
:10212000FD0EDB50800B10101110C16EF90EDBCFCD
:1021300010F0FA0EDBCF11F011C010F0116A10C0D0
:1021400048FFF90EDBCF49FF060E106EFB0EDB5089
:10215000C00B10C0E7FFE75204E0E8427F0BE70640
:10216000FCE10E01B86FFC0EDBAE03D09E9C9D8C93
:10217000F28CC280E552E5CFDAFFE7CFD9FF12003B
:102180001E0EF66E000EF76E000EF86E06010900C8
:10219000F550F56F0900F550F66F03E1F56701D0D2
:1021A0003DD00900F550F06F0900F550F16F0900BE
:1021B000F550F26F09000900F550E96E0900F5507D
:1021C000EA6E090009000900F550F36F0900F550A7
:1021D000F46F09000900F6CFF7F6F7CFF8F6F8CF5D
:1021E000F9F6F0C6F6FFF1C6F7FFF2C6F8FF0601F2
:1021F000F35302E1F45307E00900F550EE6EF307E4
:10220000F8E2F407F9D7F7C6F6FFF8C6F7FFF9C604
:0E221000F8FF0601F507000EF65BBFD71200BF
:02221E00D9CF16
:10222000E6FFDACFE6FFE1CFD9FFE2CFDAFFE652F1
:10223000E652E652DF6AF8CF01F0F6CF02F0FD0E6B
:10224000DB80DB82DB84DB86DB88DB8AFC0EDB84E5
:10225000DB86DB88DB8ADB8CDB8EFD0EDBCFE6FFEB
:10226000C00EB410E552E714B46EFC0EDBCFE6FFEF
:102270000F0EB410E552E714B46E3F0E106EFD0E53
:10228000DB50105C01E10DD0FD0EDB50BF0801E119
:1022900008D0FD0EDB507F0804E0FD0EDB50FF0888
:1022A00000E101C0F8FF02C0F6FFE552E552E55239
:0C22B000E552E5CFDAFFE7CFD9FF1200BE
:0422BC00D9CFE6FF91
:1022C000DACFE6FFE1CFD9FFE2CFDAFF0C0EBA6E2C
:1022D000FC0E0F015217DB50180BE840E840E840B5
:1022E0001F0B5213070E521506E1CA94FD0EDB5068
:1022F000CB6ECA841DD0070E5215010806E17694F4
:10230000FD0EDB50776E768413D0070E521502084F
:1023100006E11E95FD0EDBCF1FFF1E8509D0070EBF
:102320005215030805E11B95FD0EDBCF1CFF1B8535
:0C233000E552E5CFDAFFE7CFD9FF12003D
:04233C00D9CFE6FF10
:10234000DACFE6FFE1CFD9FFE2CFDAFF0C0EB46EB1
:10235000C70E0F015217FC0EDB50700BE8407F0BCD
:102360005213380E521506E1CA94FD0EDB50CB6EA7
:10237000CA841DD0380E5215080806E17694FD0E69
:10238000DB50776E768413D0380E5215100806E1B4
:102390001E95FD0EDBCF1FFF1E8509D0380E52158E
:1023A000180805E11B95FD0EDBCF1CFF1B85E552D0
:0A23B000E5CFDAFFE7CFD9FF1200F6
:0623BA00949094928B90B8
:1023C0008B920E010E0ECB6F120ECC6F12008F0E81
:1023D000E66EE6685EEC11F0E552E552F40EE66E4C
:1023E000010EE66EFAEC12F0E552E552FC0EE66ED6
:1023F0003F0EE66E1DEC10F0E552E5528F0EE66ED4
:10240000E6689EEC11F0E552E552F40EE66E010E20
:10241000E66ECBEC12F0E552E552FC0EE66E3F0E96
:10242000E66E0FEC11F0E552E552120079EC14F073
:042430000AEF00F0BF
:0C243400D9CFE6FFE1CFD9FF190EE66E0C
:10244000E66A3C0EE66E92EC12F0E552E552E55279
:102450000E01060EF76FC56F190EE66EE66A7C0E6A
:10246000E66E56EC12F0E552E552E552E552E7CF42
:10247000D9FF1200A4AA06D082EC13F0E66E87EC16
:102480000AF0E5520501FFA710D0AC98AC889C98E3
:102490009C88000EE66EE66A1E0EE66EE66A80EC2A
:0C24A00009F0E552E552E552E552120049
:0424AC00D9CFE6FF9F
:1024B000DACFE6FFE1CFD9FFE2CFDAFFA86A9C6A64
:1024C000FD0EDBB0A888DBA202D0A88C9C8CDBB40C
:1024D000A88EDBA602D09C8801D09C8ADBA802D003
:1024E000A88401D0A894DBBA9C86DBAC02D0A38A76
:1024F00001D0A39ADBAE02D0A38801D0A398FB0E33
:10250000DB50AB6EFC0EDBCF11F011C010F0116A86
:1025100010507D6EA88A9C8EE552E5CFDAFFE7CF9A
:04252000D9FF1200CD
:0C252400D9CFE6FFDACFE6FFE1CFD9FF08
:10253000E2CFDAFFAD6AAC6AFD0EDBB0AD88DBA29C
:1025400002D0AD8CAC8CDBB4AD8EDBA602D0AC88F7
:1025500001D0AC8ADBB8AD84DBBAAC86DBAC02D090
:102560009D8A01D09D9ADBAE02D09D8801D09D98B6
:10257000FB0EDB50B06EFC0EDBCF11F011C010F083
:10258000116A10507F6EAD8AAC8EE552E5CFDAFF4E
:06259000E7CFD9FF1200A5
:0A259600D9CFE6FFDACFE6FFE1CF70
:1025A000D9FFE2CFDAFFE652E652FC0EDBCF10F0A5
:1025B000FD0EDBCF11F0060ED89010361136E80470
:1025C000FBE110C0DEFF11C0DDFF010EDB50B56E78
:1025D000DF50E840E8403F0B300B106ECF0EB414D4
:1025E0001010B46EE552E552E552E5CFDAFFE7CFC1
:0425F000D9FF1200FD
:0C25F400D9CFE6FFDACFE6FFE1CFD9FF38
:10260000E2CFDAFFE652E652FC0EDBCF10F0FD0E11
:10261000DBCF11F0060ED89010361136E804FBE13E
:1026200010C0DEFF11C0DDFF010EDB50BB6EDF50BE
:10263000E840E8403F0B300B106ECF0EBA1410107C
:10264000BA6EE552E552E552E5CFDAFFE7CFD9FFA2
:02265000120076
:0E2652009280FE0EE66E1F0EE66EE66A840EA5
:10266000E66EE10EE66E6FEC10F0106E050EE15EA8
:10267000105012007BEF14F007EF00F0D9CFE6FF07
:10268000E1CFD9FF030EE12670EC14F0F3CFDEFFAB
:10269000F4CFDDFF020EF36EDB6E030EE15C02E2AF
:0E26A000E16AE552E16EE552E7CFD9FF120084
:0226AE00D9CF82
:1026B000E6FFDACFE6FFFA0EE3CFD9FFFB0EE3CF5A
:1026C000DAFFFC0EE3CFE9FFFD0EE3CFEAFFE9CF2F
:1026D000F3FFEACFF4FFF80EE35003E1F90EE35005
:1026E00008E0F80EE30602E2F90EE306DECFEEFFA5
:1026F000F2D7FF0EE3CFDAFFE552FF0EE3CFD9FFAB
:04270000E55212008C
:0C270400D9CFE6FFDACFE6FFE1CFD9FF26
:10271000E2CFDAFFE652F20E0501FF179CAC03D0C0
:10272000FF919CB0FF819CB4FF859CB2FF87AA50AB
:10273000DF6EDF50E552E552E5CFDAFFE7CFD9FF94
:02274000120085
:0E274200FEC6E9FFFFC6EAFFEF6AFEC6E9FF2A
:10275000FFC6EAFFEE52EF6AFEC6E9FFFFC6EAFFD8
:10276000020EE926000EEA22EF6AFEC6E9FFFFC666
:0E277000EAFF030EE926000EEA22EF6A1200CD
:02277E00D9CFB1
:10278000E6FFDACFE6FFE1CFD9FFE2CFDAFFE6528C
:10279000E652FC0EDBCFDEFFDBCFDDFF010EDB50B0
:1027A000CF6EDF50CE6EE552E552E552E5CFDAFF4F
:0627B000E7CFD9FF120083
:0A27B600D9CFE6FFDACFE6FFE1CF4E
:1027C000D9FFE2CFDAFFFD0EDB50FB0BCA6ECC6AFD
:1027D0009E92FD0EDBAE02D09D8201D09D92CA84F6
:0C27E000E552E5CFDAFFE7CFD9FF120089
:0427EC00FF0EE350A9
:1027F000166EEF0E01D0F30EE76EE72EFDEF13F02D
:102800000C0E156EE76AE72E03EF14F0152E02EF9B
:0A28100014F0162EFBEF13F0120077
:06281A00D9CFE6FFDACF82
:10282000E6FFE1CFD9FFE2CFDAFFA8AC04D0A89051
:102830000501FFB3A880FD0EDB50A96EE552E5CF80
:08284000DAFFE7CFD9FF120017
:08284800FF0EE350166E480E6E
:1028500001D04C0EE76EE72EFED7E76AE72EFED7D3
:08286000162EF7D7000012004C
:08286800050EE66EDBEC13F037
:10287000E55212001200330EE66EF30EE66EBFEC68
:0828800013F0E552E5521200CD
:08288800B00EF36E00EE00F04B
:102890000E0E01D81200EA6002D0EE6AFCD7F350A7
:0828A000E9601200EE6AFCD7AA
:0828A8001DEE00F02DEE00F022
:1028B000F86A0F9CC0EC10F003EC00F064EC0CF034
:0428C000FBD7120030
:0C28C400036A080EE76ED8900736033652
:1028D0000C50035C02E3036E072AE72EF7D71200C1
:1028E000C450136E126AC3501210F36E13C0F4FF7B
:0228F0001200D4
:0428F200BA6A1200AC
:0428F600C282120088
:0628FA0000EEFE9CFC9EB6
:0B2900008EFC60DAF266B6BEE4FEF664
:05290B0000EEFE9CFC43
:0C2910009E8EFC60DAF266B6BEE4FEF6B5
:04001400BA6A1200B2
:0600180002EF10F01200DF
:02001E000500DB
:10002000492D0000DF05000011000000372D000001
:10003000EA03000012000000362D0000F804000062
:1000400001000000352D0000FF0500000100000048
:0C005000342D0000FE050000010000003F
:04005C00D9CFE6FF13
:10006000E1CFD9FFFD0EDBCFFEF3FE0EDBCFFFF3BA
:10007000FEC3E9FFFFC3EAFFDC0EE926000EEA2219
:10008000EE6AED6AFEC3E9FFFFC3EAFFE00EE92670
:10009000000EEA22EF6AFEC3E9FFFFC3EAFFDE0EAD
:1000A000E926000EEA22050EEF6EFEC3E9FFFFC34C
:1000B000EAFFE20EE926000EEA22EF6AFEC3E9FF3C
:1000C000FFC3EAFFDF0EE926000EEA22EF6AFEC355
:1000D000E9FFFFC3EAFFDC0EE926000EEA22EE6A22
:1000E000ED6AFEC3E9FFFFC3EAFFE30EE926000E57
:1000F000EA22EF6AFEC3E9FFFFC3EAFFE50EE92645
:10010000000EEA22EF6AFEC3E9FFFFC3EAFFE60E34
:10011000E926000EEA22EF6AFEC3E9FFFFC3EAFF09
:10012000E90EE926000EEA22EF6AFEC3E9FFFFC3EB
:10013000EAFFE70EE926000EEA22EF6AFEC3E9FFB6
:10014000FFC3EAFFE80EE926000EEA22220EEF6E58
:10015000E552E7CFD9FF1200FEC3E9FFFFC3EAFF74
:10016000E90EE926000EEA22110EEF6E94869488BD
:10017000C76AC66AC56AF00EC6140809C66E770E4D
:10018000C86EC78EC68A1200D9CFE6FFE1CFD9FF6D
:10019000020EE126FD0EDB5069E0DE6ADD6ADECF8D
:1001A00010F0DDCF11F0FD0EDB50000111AE02D0DA
:1001B000D89003D0105C000E115820E2FB0EDBCF6C
:1001C00012F0FC0EDBCF13F0DE501224E96EDD508E
:1001D0001320EA6EEF50E66EFEC310F0FFC311F07D
:1001E000DE501024E96EDD501120EA6EE552E75032
:1001F000EF6EDF2A010ED3E3DB2AD1D7FD0EDB50F1
:10020000E66EFEC3E9FFFFC3EAFFDC0EE926000E3F
:10021000EA22E552E750EE6EED6AFEC3E9FFFFC346
:10022000EAFFE70EE926000EEA22FE0EDBCFEFFF23
:10023000FEC3E9FFFFC3EAFFDF0EE926000EEA2254
:10024000EF6AFEC3E9FFFFC3EAFFDE0EE926000EF8
:10025000EA22090EEF6EFEC3E9FFFFC3EAFFE80ED4
:10026000E926000EEA22200EEF6EC580020EE15C48
:1002700002E2E16AE552E16EE552E7CFD9FF1200F2
:10028000D9CFE6FFE1CFD9FFFD0EDB5038E0FD0E00
:10029000DB50E66EFEC3E9FFFFC3EAFFDC0EE92692
:1002A000000EEA22E552E750EE6EED6AFEC3E9FF6A
:1002B000FFC3EAFFE70EE926000EEA22FE0EDBCFBF
:1002C000EFFFFEC3E9FFFFC3EAFFDF0EE926000EE2
:1002D000EA22EF6AFEC3E9FFFFC3EAFFDE0EE9266A
:1002E000000EEA22090EEF6EFEC3E9FFFFC3EAFF2C
:1002F000E80EE926000EEA22210EEF6EC580E552D7
:10030000E7CFD9FF1200D9CFE6FFE1CFD9FFFEC377
:10031000E9FFFFC3EAFFE90EE926000EEA22100E0C
:10032000EF6E94869488FE0EDB50E824C86EC76A90
:10033000C66AC56AF00EC6140E09C66EC78EC580A1
:10034000C68AE552E7CFD9FF1200FEC3E9FFFFC31B
:10035000EAFFE90EE926000EEA22EF50110802E159
:10036000BFEF01F0FEC3E9FFFFC3EAFFE90EE92694
:10037000000EEA22EF50100801E10CDA1200FEC371
:10038000E9FFFFC3EAFFE80EE926000EEA22EF507C
:10039000200801E0ADD0FEC3E9FFFFC3EAFFDE0E97
:1003A000E926000EEA22EF500B0A1CE0020A04E0E4
:1003B0000C0A01E19CD01200FEC3E9FFFFC3EAFF73
:1003C000DE0EE926000EEA220B0EEF6EFEC3E9FFF9
:1003D000FFC3EAFFE70EE926000EEA22EF50E82409
:1003E000C96E1200C5BC62D0FEC3E9FFFFC3EAFFBD
:1003F000DF0EE926000EEA22EF50106E116AFEC3EE
:10040000E9FFFFC3EAFFDC0EE926000EEA22EECF89
:1004100012F0EFCF13F011501318E8AE02D01334DE
:1004200004D01250105C135011581EE2FEC3E9FFB5
:10043000FFC3EAFFFEC310F0FFC311F0DF0EE92691
:10044000000EEA22EF501024E96E000E1120EA6E31
:10045000EF50C96EFEC3E9FFFFC3EAFFDF0EE926D6
:10046000000EEA22EF2A1200FEC3E9FFFFC3EAFFF3
:10047000DE0EE926000EEA22050EEF6EC584FEC3ED
:10048000E9FFFFC3EAFFE80EE926000EEA22220E8A
:10049000EF6E000EE66EE66A2B0EE66EE66ADDECA7
:1004A00009F0E552E552E552E5521200FEC3E9FFBC
:1004B000FFC3EAFFDE0EE926000EEA22050EEF6E0C
:1004C000C584FEC3E9FFFFC3EAFFE80EE926000E7C
:1004D000EA22220EEF6E000EE66EE66A2C0EE66E43
:1004E000E66ADDEC09F0E552E552E552E55212000C
:1004F000FEC3E9FFFFC3EAFFE80EE926000EEA2289
:10050000EF50210801E0E7D0FEC3E9FFFFC3EAFF97
:10051000DE0EE926000EEA22EF500D0A01E1ACD012
:10052000010A01E19DD00B0A43E00C0A1DE0020A1A
:1005300004E00C0A01E1CFD01200FEC3E9FFFFC3C3
:10054000EAFFDE0EE926000EEA220B0EEF6EFEC376
:10055000E9FFFFC3EAFFE70EE926000EEA22EF50AB
:10056000E8240109C96E1200C5AC7AD0FEC3E9FFC8
:10057000FFC3EAFFDE0EE926000EEA22050EEF6E4B
:10058000C584FEC3E9FFFFC3EAFFE80EE926000EBB
:10059000EA22220EEF6E000EE66EE66A2E0EE66E80
:1005A000E66ADDEC09F0E552E552E552E55212004B
:1005B000FEC3E9FFFFC3EAFFFEC310F0FFC311F063
:1005C000DF0EE926000EEA22EF501024E96E000E3D
:1005D0001120EA6EC9CFEFFFFEC3E9FFFFC3EAFFB8
:1005E000DF0EE926000EEA22EF2AFEC3E9FFFFC371
:1005F000EAFFDF0EE926000EEA22EF50106E116AC4
:10060000FEC3E9FFFFC3EAFFDC0EE926000EEA2283
:10061000EECF12F0EFCF13F011501318E8AE02D066
:10062000133404D01250105C135011580CE2FEC366
:10063000E9FFFFC3EAFFDE0EE926000EEA220C0EF8
:10064000EF6EC59A0BD0FEC3E9FFFFC3EAFFDE0ED3
:10065000E926000EEA220D0EEF6EC58AC58812004B
:10066000FEC3E9FFFFC3EAFFDE0EE926000EEA2221
:10067000070EEF6EC5861200FEC3E9FFFFC3EAFF57
:10068000DE0EE926000EEA22050EEF6EC584FEC3DB
:10069000E9FFFFC3EAFFE80EE926000EEA22220E78
:1006A000EF6EFEC3E9FFFFC3EAFFFEC310F0FFC316
:1006B00011F0FEC3E6FFFFC3E6FF2D0EE66EDC0E73
:1006C000E926000EEA22EF50E66EDDEC09F0E55275
:1006D000E552E552E5521200D9CFE6FFE1CFD9FF4E
:1006E000FEC3E9FFFFC3EAFFE00EE926000EEA229F
:1006F000010EEF6EFEC3E9FFFFC3EAFFDC0EE92641
:10070000000EEA22EE6AED6AFE0EDB5035E0C7AA63
:100710001DD0FEC3E9FFFFC3EAFFDE0EE926000E8F
:10072000EA22050EEF6EFEC3E9FFFFC3EAFFE20E09
:10073000E926000EEA22EF2AFEC3E9FFFFC3EAFF23
:10074000E10EE926000EEA22050E1FD0C7A40AD04A
:10075000FEC3E9FFFFC3EAFFDE0EE926000EEA2230
:10076000080E13D0FEC3E9FFFFC3EAFFDE0EE92641
:10077000000EEA22070E09D0FEC3E9FFFFC3EAFF1D
:10078000DE0EE926000EEA22060EEF6EE552E7CFF6
:10079000D9FF1200D9CFE6FFE1CFD9FF090EE1263C
:1007A000010EDB6A020EDB6A030EDB6A040EDB6AF3
:1007B000080EDB6AC6AC23D0C69CFEC3E9FFFFC3AC
:1007C000EAFFDE0EE926000EEA22050EEF6E010EAC
:1007D000F36E040EF3CFDBFFFEC3E9FFFFC3EAFFB6
:1007E000E20EE926000EEA22EF2AFEC3E9FFFFC36C
:1007F000EAFFE10EE926000EEA22040EEF6EC7A022
:1008000005D0C950DF6EDE52010EDD6E040EDB50E6
:1008100001E03AD2FEC3E9FFFFC3EAFFDE0EE9269C
:10082000000EEA22EF50070A01E17BD10F0A01E135
:100830006FD00E0A17E0030A01E026D2C7A624D221
:10084000010EDBCFE6FF48DFE552FEC3E9FFFFC341
:10085000EAFFDE0EE926000EEA22EF50080801E06A
:1008600013D237D0C7A810D0FEC3E9FFFFC3EAFFF9
:10087000E00EE926000EEA22EF2A010EDB5001E12C
:10088000F9D1C7AA9CD1E3D1010EDB5001E1FCD123
:10089000FEC3E9FFFFC3EAFFE00EE926000EEA22ED
:1008A000EF2AC7BA18D0C7B40AD0FEC3E9FFFFC306
:1008B000EAFFDE0EE926000EEA22070EE4D1FEC3AF
:1008C000E9FFFFC3EAFFDE0EE926000EEA22080E6A
:1008D000EF6E030EBAD1FEC3E9FFFFC3EAFFE20EDB
:1008E000E926000EEA22EF2AFEC3E9FFFFC3EAFF72
:1008F000DE0EE926000EEA22050EEF6EFEC3E9FFCA
:10090000FFC3EAFFE10EE926000EEA22060EBBD184
:10091000FEC3E9FFFFC3EAFFE50EE926000EEA2267
:10092000EF5001E07ED0A4EC0AF0E76E080EE7CFAE
:10093000DBFFDB502A0803E1080EDB501BE1C9682E
:10094000FEC3E9FFFFC3EAFFDF0EE926000EEA223D
:10095000010EEF6EFEC3E9FFFFC3EAFFE50EE926D5
:10096000000EEA22010EEF6EFEC3E9FFFFC3EAFFAD
:10097000E60E51D0FEC3E9FFFFC3EAFFFEC312F04B
:10098000FFC313F0FEC3E6FFFFC3E6FFE40EE92654
:10099000000EEA22EF50E66EE66ADC0EE66E84ECAC
:1009A0000AF0146E050EE15E1450106E116A10BE4E
:1009B0001168FEC3E9FFFFC3EAFFDC0EE926000E63
:1009C000EA2210C0EEFF11C0EDFFFEC3E9FFFFC336
:1009D000EAFFDC0EE926000EEA22EECF10F0EFCFA0
:1009E00011F0113401E350D110500008000E1154E1
:1009F00001E34AD1FEC3E9FFFFC3EAFFEF50C96E2E
:100A0000DF0EE926000EEA22010EEF6EFEC3E9FFBB
:100A1000FFC3EAFFE50EE926000EEA22010EEF6EA3
:100A200071D0FEC3E9FFFFC3EAFFE60EE926000E20
:100A3000EA22EF5026E0FEC3E9FFFFC3EAFFDF0E24
:100A4000E926000EEA22EFCF10F0FEC3E9FFFFC354
:100A5000EAFFE30EE926000EEA22EF50105C02E204
:100A6000C96846D0FEC3E9FFFFC3EAFFE50EE926E9
:100A7000000EEA22EF6AFEC3E9FFFFC3EAFFE60EBB
:100A80004BD0FEC3E9FFFFC3EAFFDF0EE926000EED
:100A9000EA22EF50106E116AFEC3E9FFFFC3EAFFBE
:100AA000DC0EE926000EEA22EECF12F0EFCF13F0B3
:100AB00011501318E8AE02D0133404D01250105C59
:100AC0001350115824E2FEC3E9FFFFC3EAFFFEC33F
:100AD00010F0FFC311F0DF0EE926000EEA22EF50FE
:100AE0000F011024E96E000E1120EA6EEF50C96E5E
:100AF000FEC3E9FFFFC3EAFFDF0EE926000EEA228C
:100B0000EF2A010EF36E020EF3CFDBFFBDD0FEC362
:100B1000E9FFFFC3EAFFE50EE926000EEA22EF6ACD
:100B2000A9D0C7A852D0FEC3E9FFFFC3EAFFE00E79
:100B3000E926000EEA22EF2A010EDB5040E0C7AAA8
:100B400021D0FEC3E9FFFFC3EAFFFEC310F0FFC3DD
:100B500011F0DC0EE926000EEA221050EE24E76EBA
:100B60001150EE20EA6EE7CFE9FFDFCFEFFFFEC3C3
:100B7000E9FFFFC3EAFFDC0EE926000EEA22EE2AB7
:100B8000EF221DD0FEC3E9FFFFC3EAFFE20EE92614
:100B9000000EEA22EF2AFEC3E9FFFFC3EAFFE10EDF
:100BA000E926000EEA22060EEF6EFEC3E9FFFFC340
:100BB000EAFFDE0EE926000EEA22050E5AD0010EEB
:100BC000F36E030EF3CFDBFF55D0010EDB505CE07C
:100BD000FEC3E9FFFFC3EAFFE00EE926000EEA22AA
:100BE000EF2AC7AA21D0FEC3E9FFFFC3EAFFFEC375
:100BF00010F0FFC311F0DC0EE926000EEA221050BF
:100C0000EE24E76E1150EE20EA6EE7CFE9FFDFCF6A
:100C1000EFFFFEC3E9FFFFC3EAFFDC0EE926000E8B
:100C2000EA22EE2AEF2230D0C7A411D0FEC3E9FF9A
:100C3000FFC3EAFFDE0EE926000EEA22080EEF6E81
:100C4000010EF36E030EF3CFDBFFC96E1DD0FEC3A2
:100C5000E9FFFFC3EAFFE20EE926000EEA22EF2ACF
:100C6000FEC3E9FFFFC3EAFFE10EE926000EEA2218
:100C7000060EEF6EFEC3E9FFFFC3EAFFDE0EE926B4
:100C8000000EEA22050EEF6E010EDB5003E1020EAC
:100C9000DB5002E0C6A8C688FEC3E9FFFFC3EAFF37
:100CA000DC0EE926000EEA22EECF10F0EFCF11F0B5
:100CB000113425E21050DA08000E115420E2030E20
:100CC000DB501DE1FEC3E9FFFFC3EAFFDE0EE926AC
:100CD000000EEA22050EEF6EFEC3E9FFFFC3EAFF36
:100CE000E20EE926000EEA22EF2AFEC3E9FFFFC367
:100CF000EAFFE10EE926000EEA22070EEF6E030E70
:100D0000DB5070E0FEC3E9FFFFC3EAFFFEC310F053
:100D1000FFC311F0DC0EE926000EEA22EECF12F03E
:100D2000EFCF13F01206135A10501224E96E11502F
:100D30001320EA6EEF50E66EFEC3E9FFFFC3EAFF41
:100D4000E30EE926000EEA22E552E750EF6EFEC3FD
:100D5000E9FFFFC3EAFFE00EE926000EEA22EF50AA
:100D6000E66EFEC3E9FFFFC3EAFFFEC310F0FFC358
:100D700011F0DC0EE926000EEA221050EE24E76E98
:100D80001150EE20EA6EE7CFE9FFE552E750EF6E33
:100D9000FEC3E9FFFFC3EAFFFEC310F0FFC311F07B
:100DA000FEC3E6FFFFC3E6FF290EE66EDC0EE92672
:100DB000000EEA22EECF12F0EFCF13F0010E122454
:100DC000E66EDDEC09F0E552E552E552E552FEC370
:100DD000E9FFFFC3EAFFDC0EE926000EEA22EE6A15
:100DE000ED6A47D0FEC3E9FFFFC3EAFFE20EE92642
:100DF000000EEA22EFCF10F0010E105C3AE3FEC3C2
:100E0000E9FFFFC3EAFFE20EE926000EEA22050E23
:100E1000EFCFDBFFFEC3E9FFFFC3EAFFE10EE926E8
:100E2000000EEA22060EEFCFDBFFFEC3E9FFFFC391
:100E3000EAFFE00EE926000EEA22070EEFCFDBFF05
:100E4000D950050FE66E000EDA20E66E280EE66E2B
:100E5000030EE66EDDEC09F0E552E552E552E5528F
:100E6000FEC3E9FFFFC3EAFFE20EE926000EEA2215
:100E7000EF6A090EE15C02E2E16AE552E16EE552D9
:100E8000E7CFD9FF1200FEC3E9FFFFC3EAFFE80E78
:100E9000E926000EEA22EF50220801E1000C010CC5
:100EA000D9CFE6FFE1CFD9FFE652FD0EDBCFE9FF58
:100EB000FE0EDBCFEAFF040EE926000EEA22EF6AFF
:100EC000FD0EDBCFE9FFFE0EDBCFEAFF050EE926C4
:100ED000000EEA22EF6ADF6A020EDF5C15E2FD0E09
:100EE000DBCFE9FFFE0EDBCFEAFFDF50020DE9505A
:100EF000F324E96EEA50F420EA6EEE50EFCFEAFFF9
:100F0000E96EEF6ADF2AE8D7E552E552E7CFD9FF6D
:100F100012000401F76B000EDF6F0B0EE06F000E86
:100F2000E16F0A0EE26F000EE56F090EE66F000E2C
:100F3000E76F080EE86F000EEB6F070EEC6F000E08
:100F4000ED6F060EEE6F000EF16F050EF26F000EE4
:100F5000F36F040EF46FDF0EE66E040EE66EA0DF94
:100F6000E552E552E50EE66E040EE66E99DFE552B7
:100F7000E552EB0EE66E040EE66E92DFE552E552A8
:100F8000F10EE66E040EE66E8BDFE552E5521200BE
:100F9000D9CFE6FFE1CFD9FF050EE126FC0EDB50ED
:100FA000E66ED950030FE96EDACFEAFFE552E7505B
:100FB000EE6EED6AFD0EDBCFE9FFFE0EDBCFEAFF42
:100FC000040EE926000EEA22EFCFDFFFFD0EDBCF95
:100FD000E9FFFE0EDBCFEAFFDF50020DE950F324FC
:100FE000E96EEA50F420EA6E010EEECFDBFF020E4E
:100FF000EDCFDBFF010EDBCFE9FF020EDBCFEAFF17
:10100000EF5002E0FF0E5CD0010EDBCFE9FF020ED5
:10101000DBCFEAFFEE52FC0EDBCFEFFF010EDBCFA2
:10102000E9FF020EDBCFEAFFE926000EEA22FB0E03
:10103000DBCFEFFF030EDBCFE6FF040EDBCFE6FFD7
:10104000F90EDBCFE6FFFA0EDBCFE6FF010EDBCFBA
:10105000E9FF020EDBCFEAFF030EE926000EEA22CB
:10106000E9CF10F0EACF11F0E9CFE6FFEACFE6FFD3
:1010700055EC15F0126E060EE15E1250FD0EDBCF40
:10108000E9FFFE0EDBCFEAFF040EE926000EEA229E
:10109000EF28010BE66EFD0EDBCFE9FFFE0EDBCF86
:1010A000EAFF040EE926000EEA22E552E750EF6E51
:1010B000010EDBCFE9FF020EDBCFEAFF010EEF6E80
:1010C000106E050EE15C02E2E16AE552E16E10503D
:1010D000E552E7CFD9FF1200D9CFE6FFE1CFD9FF24
:1010E000050EE126FD0EDBCFE9FFFE0EDBCFEAFFAA
:1010F000050EE926000EEA22EFCFDFFFFD0EDBCF63
:10110000E9FFFE0EDBCFEAFFDF50020DE950F324CA
:10111000E96EEA50F420EA6E010EEECFDBFF020E1C
:10112000EDCFDBFF010EDBCFE9FF020EDBCFEAFFE5
:10113000EF0401E07ED0010EDBCFE9FF020EDBCF32
:10114000EAFFEE52EFCF10F0FC0EDB50D8801054C7
:1011500002E2FD0E6FD0010EDBCFE9FF020EDBCF06
:10116000EAFFEE52EF50E66ED950030FE96EDACF88
:10117000EAFFE552E750EE6EED6A030EDBCFE6FFC5
:10118000040EDBCFE6FF010EDBCFE9FF020EDBCF63
:10119000EAFF030EE926000EEA22E9CF10F0EACFBB
:1011A00011F0E9CFE6FFEACFE6FFF80EDBCFE6FF6E
:1011B000F90EDBCFE6FF55EC15F0126E060EE15E80
:1011C0001250FD0EDBCFE9FFFE0EDBCFEAFF050E6E
:1011D000E926000EEA22EF28010BE66EFD0EDBCFBA
:1011E000E9FFFE0EDBCFEAFF050EE926000EEA223C
:1011F000E552E750EF6E010EDBCFE9FF020EDBCFC9
:10120000EAFFE926000EEA22EF50E66EFA0EDBCF87
:10121000E9FFFB0EDBCFEAFFE552E750EF6E010E70
:10122000DBCFE9FF020EDBCFEAFFEF6A030EDB50F4
:1012300001D0FC0E106E050EE15C02E2E16AE5529F
:10124000E16E1050E552E7CFD9FF1200D9CFE6FF8B
:10125000E1CFD9FF030EE126FD0EDBCFE9FFFE0E45
:10126000DBCFEAFF050EE926000EEA22EFCFDFFF13
:10127000FD0EDBCFE9FFFE0EDBCFEAFFDF50020DF4
:10128000E950F324E96EEA50F420EA6E010EEECF45
:10129000DBFF020EEDCFDBFF010EDBCFE9FF020E1D
:1012A000DBCFEAFFEF040BE1010EDBCFE9FF020E1B
:1012B000DBCFEAFFE926000EEA22EF5001D0000E54
:1012C000106E030EE15C02E2E16AE552E16E10503D
:1012D000E552E7CFD9FF1200D9CFE6FFE1CFD9FF22
:1012E000FD0EDBCFE9FFFE0EDBCFEAFFE9CF10F00A
:1012F000EACF11F0FD0EDBCFE9FFFE0EDBCFEAFFF8
:10130000050EE926000EEA22EF50020D1050F324DC
:10131000E96E1150F420EA6EEE50EFCFEAFFE96E6D
:10132000EF50E552E7CFD9FF1200D38E0300120031
:10133000D9CFE6FFE1CFD9FFFB0EDBCFE6FFFC0EF6
:10134000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FFD9
:10135000DF0EE66E040EE66E1BDE106E060EE15E1C
:101360001050E552E7CFD9FF1200D9CFE6FFE1CF09
:10137000D9FFFA0EDBCFE6FFFB0EDBCFE6FFFC0E5C
:10138000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FF99
:10139000DF0EE66E040EE66E9FDE106E070EE15E57
:1013A0001050E552E7CFD9FF1200DF0EE66E040EB3
:1013B000E66E4CDFE552E5521200D9CFE6FFE1CFF1
:1013C000D9FFFB0EDBCFE6FFFC0EDBCFE6FFFD0E09
:1013D000DBCFE6FFFE0EDBCFE6FFE50EE66E040E8A
:1013E000E66ED6DD106E060EE15E1050E552E7CFD8
:1013F000D9FF1200D9CFE6FFE1CFD9FFFA0EDBCF3C
:10140000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0EBB
:10141000DBCFE6FFFE0EDBCFE6FFE50EE66E040E49
:10142000E66E5ADE106E070EE15E1050E552E7CF11
:10143000D9FF1200E50EE66E040EE66E07DFE552F8
:10144000E5521200D9CFE6FFE1CFD9FFFB0EDBCF8B
:10145000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E68
:10146000DBCFE6FFEB0EE66E040EE66E91DD106E4E
:10147000060EE15E1050E552E7CFD9FF1200D9CF3A
:10148000E6FFE1CFD9FFFA0EDBCFE6FFFB0EDBCFA5
:10149000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E28
:1014A000DBCFE6FFEB0EE66E040EE66E15DE106E89
:1014B000070EE15E1050E552E7CFD9FF1200EB0EA8
:1014C000E66E040EE66EC2DEE552E5521200D9CF9A
:1014D000E6FFE1CFD9FFFB0EDBCFE6FFFC0EDBCF53
:1014E000E6FFFD0EDBCFE6FFFE0EDBCFE6FFF10EE3
:1014F000E66E040EE66E4CDD106E060EE15E1050D8
:10150000E552E7CFD9FF1200D9CFE6FFE1CFD9FFEF
:10151000FA0EDBCFE6FFFB0EDBCFE6FFFC0EDBCFE8
:10152000E6FFFD0EDBCFE6FFFE0EDBCFE6FFF10EA2
:10153000E66E040EE66ED0DD106E070EE15E105012
:10154000E552E7CFD9FF1200F10EE66E040EE66E0B
:101550007DDEE552E55212000401F75101E112006F
:1015600089EC0FF0F3CF10F0F4CF11F0F350F4103A
:1015700001E012006DEC0FF0F3CF10F0F4CF11F09A
:10158000F350F41001E11200E50EE66E040EE66E73
:10159000A3DEE552E552000901E01200DF0EE66E1F
:1015A000040EE66E99DEE552E552000901E01200F4
:1015B00095EF09F095EC0FF0F3CF10F0F4CF11F0A8
:1015C000F350F41001E112000401010EF76FE50E73
:1015D000E66E040EE66E80DEE552E552000909E192
:1015E000DF0EE66E040EE66E77DEE552E552000988
:1015F00003E00401F76B12000A0EE66E48EC16F0E9
:04160000E552E5D7F3
:0C160400D9CFE6FFE1CFD9FF180EE12698
:10161000020EDB6A030EDB6AFC0ED3140009D36EE4
:10162000F70EE66E020EE66E46EC14F0E552E55259
:10163000000EE66E020EE66E49EC0DF0E552E55244
:10164000000EE66E030EE66E2EEC00F0E552E5525B
:10165000F90EE66E020EE66E7BEC11F0E552E552F5
:1016600089EC07F0C3EC13F071EC10F04FEC12F0C2
:101670003EEC12F069EC0FF060EC0FF00F014869DE
:101680001F0E496FACEC00F0DAEC0AF0000EE66ECB
:101690000C0EE66ED950010FE66E000EDA20E66EF3
:1016A000DC0EE66EFAEC09F0106E050EE15E1050ED
:1016B000DF6EDFCF10F010341DE3FC0EDF5C000E98
:1016C000E66E0C0EE66ED950010FE66E000EDA20C3
:1016D000E66EDC0EE66EB5EC09F0106E050EE15E0E
:1016E0001050DF6EDFCF10F0103401E221D1FC0E7C
:1016F000DF5CCAD7010EDB50440A01E10FD1070AB3
:1017000001E109D1010A01E103D1030A01E1FDD0A0
:10171000010A01E1F7D07F0A01E1F1D0010A01E1FC
:10172000EBD0030A01E1A8D0010A01E18DD0120A31
:10173000ABE0030A01E17AD0010AA6E0070AA4E0BF
:10174000020A11E0010A02E0360A9ED7020EDB6AA5
:10175000DF50F36E020EDBCFF4FFF350F45C94E243
:10176000020EDB2AF5D7020EDB6ADF04F36E020EEF
:10177000DBCFF4FFF350F45C03E2020EDB2AF5D773
:101780000C010051090A01E17FD7010A01E17CD770
:101790000F0A01E179D7010A01E176D7020A17E0C1
:1017A000060A01E071D7010EDF6E0201FB51106ED7
:1017B000116A113409E21050DC08000E115404E2E1
:1017C0000C01DC0E006F24D0FBC200FC21D0020112
:1017D000FB51106E116A11340EE21050DC08000E3D
:1017E000115409E2DC0EDF6E000EE66E0C0EE66EA2
:1017F000DC0EE66E08D0FBC2DFFF000EE66E0C0EBC
:10180000E66EFBC2E6FFF0EC11F0E552E552E55260
:10181000000EE66E0C0EE66E2A0EE66EDFCFE6FFD9
:1018200067EC0AF0E552E552E55223D1020EDB6A7D
:10183000DF50F36E020EDBCFF4FFF350F45C01E3F4
:1018400023D7020EDB2AF4D7D950040FE96EDACF82
:10185000EAFF000EEE6E0C0EED6E020EDB6A050E58
:10186000DF5CF36E020EDBCFF4FFF350F45C01E3B8
:101870000BD7020EDB2AF3D7D950060FE96EDACF69
:10188000EAFF000EEE6E0C0EED6E020EDB6A0C0E21
:10189000DF5CF36E020EDBCFF4FFF350F45C03E287
:1018A000020EDB2AF4D7060EDBCFE9FF070EDBCFF3
:1018B000EAFF0C0EE926000EEA22E9CF10F0EACF8B
:1018C00011F0E9CFE6FFEACFE6FF0C0EDF5CE66E33
:1018D00090EC11F0E552E552E552060EDBCFE9FF40
:1018E000070EDBCFEAFF0C0EE926000EEA22EF50CE
:1018F000E66EDAEC10F0BDD0D950080F11D0D950F7
:101900000A0F0ED0D9500C0F0BD0D9500E0F08D0A3
:10191000D950100F05D0D950120F02D0D950140F42
:10192000E96EDACFEAFF000EEE6E0C0EED6EACD66D
:10193000010EDB500A0A1DE0470A01E1A5D6010AA3
:1019400001E1A2D6070A01E19FD6010A01E19CD676
:10195000030A01E199D6010A01E196D60F0A06E0D1
:10196000010A01E088D0D7EC13F08ED6D9EC13F041
:101970008BD6D950160FE96EDACFEAFF000EEE6E65
:101980000C0EED6E160EDBCFE9FF170EDBCFEAFF74
:10199000100EEF6E160EDBCFE9FF170EDBCFEAFF5E
:1019A000EE52EF6A160EDBCFE9FF170EDBCFEAFF30
:1019B000020EE926000EEA22EE6AEE6AEE6AEE6A8E
:1019C000160EDBCFE9FF170EDBCFEAFF020EE9268A
:1019D000000EEA22040EE926000EEA22EE6AEE6A02
:1019E000EE6AEE6A160EDBCFE9FF170EDBCFEAFFD9
:1019F0000A0EE926000EEA22EE6AED6A160EDBCF29
:101A0000E9FF170EDBCFEAFF0C0EE926000EEA22F3
:101A1000EF6A160EDBCFE9FF170EDBCFEAFF0D0EE4
:101A2000E926000EEA22010EEF6E160EDBCFE9FF6B
:101A3000170EDBCFEAFF0E0EE926000EEA22030E98
:101A4000DBCFEFFFDB2ADB50640802E1030EDB6A29
:101A50000F0EDF6EDFCFE6FF000EE66E0C0EE66EB9
:101A6000D2EC0EF0E552E552E552640EE66E1AEC49
:101A700016F0E55209D6020EDB6ADF50F36E020E55
:101A8000DBCFF4FFF350F45C01E3FED5020EDB2A5A
:021A9000F4D789
:0E1A9200D9CFE6FFE1CFD9FF938093928A90DF
:101AA0008A92FD0EDBCFFCF2FE0EDBCFFDF2FCC214
:101AB000E9FFFDC2EAFFF30EE926000EEA22EF6A13
:101AC000FCC2E9FFFDC2EAFFF40EE926000EEA229D
:101AD000EF6AFCC2E9FFFDC2EAFFF50EE926000E3F
:101AE000EA220A0EEF6EFCC2E9FFFDC2EAFF030E16
:101AF000E926000EEA22E9CFFEF2EACFFFF2E55234
:101B0000E7CFD9FF1200D9CFE6FFE1CFD9FFFE0E14
:101B1000DB507E0823E1FCC2E9FFFDC2EAFFF30EC1
:101B2000E926000EEA22EF6AFCC2E9FFFDC2EAFFE5
:101B3000F40EE926000EEA22EF6AFCC2E9FFFDC2BC
:101B4000EAFF7E0EEF6EFCC2E9FFFDC2EAFFF50E72
:101B5000E926000EEA220B0EEF6EB8D0FCC2E9FFB8
:101B6000FDC2EAFFF50EE926000EEA22EF500F0A49
:101B700001E192D0010A2EE0020A1AE0070A02E00F
:101B8000010AA4D0FCC2E9FFFDC2EAFFEE52010E39
:101B9000E926000EEA22FE0EDBCFEFFFFCC2E9FFD2
:101BA000FDC2EAFFF50EE926000EEA220C0E8DD0EA
:101BB000FCC2E9FFFDC2EAFFEE52FE0EDBCFEFFFF3
:101BC000FCC2E9FFFDC2EAFFF50EE926000EEA229B
:101BD0000E0E7BD0FCC2E9FFFDC2EAFFF30EE92640
:101BE000000EEA22EFCF10F0FCC2E9FFFDC2EAFFCF
:101BF000EE52EECF11F0EFCF12F01150105C000E4C
:101C0000125426E2FCC2E9FFFDC2EAFFF30EE92608
:101C1000000EEA22EF500201EA6AFE25E96EFF514A
:101C2000EA22FE0EDBCFEFFFFCC2E9FFFDC2EAFFB6
:101C3000F40EE926000EEA22FE0EDB50EF26FCC26F
:101C4000E9FFFDC2EAFFF30EE926000EEA22EF2AC1
:101C5000FCC2E9FFFDC2EAFFF30EE926000EEA220C
:101C6000EF50106E116AFCC2E9FFFDC2EAFFEE52AE
:101C7000EECF12F0EFCF13F01250101827E11350EF
:101C8000111824E1FCC2E9FFFDC2EAFFF50EE926C6
:101C9000000EEA220F0E19D0FCC2E9FFFDC2EAFFD6
:101CA000F40EE926000EEA22EF28E86C106EFE0E14
:101CB000DB50105C01E10ED8FCC2E9FFFDC2EAFF77
:101CC000F50EE926000EEA220A0EEF6EE552E7CF86
:101CD000D9FF1200D9CFE6FFE1CFD9FFE652FEC20D
:101CE000E9FFFFC2EAFFEF508A0A40E01F0A38E02E
:101CF000340A30E0360A28E0060A20E0030A18E039
:101D0000190A10E01B0A08E0180A47E1FEC2E6FFC4
:101D1000FFC2E6FF3C0E2FD0FEC2E6FFFFC2E6FF89
:101D20003D0E29D0FEC2E6FFFFC2E6FF3E0E23D0E5
:101D3000FEC2E6FFFFC2E6FF3F0E1DD0FEC2E6FF79
:101D4000FFC2E6FF400E17D0FEC2E6FFFFC2E6FF6D
:101D5000410E11D0FEC2E6FFFFC2E6FF420E0BD0DD
:101D6000FEC2E6FFFFC2E6FF430E05D0FEC2E6FF5D
:101D7000FFC2E6FF440EE66EFCC2E9FFFDC2EAFFC9
:101D8000EE52EF50E66EDDEC09F0E552E552E55219
:101D9000E552DF6EDFCF10F01034E552E552E7CFA9
:101DA000D9FF1200D9CFE6FFE1CFD9FF020EE1261D
:101DB000010EDB6A7E0EE66E31EC16F0E552A8509D
:101DC000020BFDE06BD80009FAE1E66A31EC16F08F
:101DD000E552A850020BFDE061D80009FAE1FC0EC3
:101DE000DBCFE6FF31EC16F0E552A850020BFDE028
:101DF00055D80009FAE1DF6AFC0EDB50DF5C2DE20A
:101E0000DF50E76EFD0EDBCFE9FFFE0EDBCFEAFF12
:101E1000E750E926000EEA22EF50E66E31EC16F0AC
:101E2000E552DF50E76EFD0EDBCFE9FFFE0EDBCFA4
:101E3000EAFFE750E926000EEA22010EDBCFE7FFBA
:101E4000EF50E726010EE7CFDBFFA850020BFDE0C5
:101E500025D80009FAE1DF2ACFD7010EDB28E86C8C
:101E6000E66E31EC16F0E552A8A2FED7020EE15C58
:101E700002E2E16AE552E16EE552E7CFD9FF1200D6
:101E8000D9CFE6FFE1CFD9FFFE0EDB5002E08A8218
:101E900001D08A92E552E7CFD9FF1200D9CFE6FFF1
:101EA000E1CFD9FFE6528150010BDF6EDF5002E037
:101EB000010E01D0000EE552E552E7CFD9FF120026
:101EC000A58A9F86F194A292F190F09C9D86F2865D
:101ED0001200D08EF28EF28C1200F250800B800A2B
:101EE00001E0010E106E116A10BE116810C0F3FF00
:101EF00011C0F4FF1200F250400B400A01E0010E45
:101F0000106E116A10BE116810C0F3FF11C0F4FF0B
:101F10001200F2BC04D0E1DFF350F41002E0F36AE7
:101F200002D0010EF36EF46A1200F3DFF3CF10F06B
:101F3000F4CF11F0F350F41007E1CFDFF350F410B9
:101F400003E1010EF36E01D0F36AF46A1200DACFF6
:101F5000E4FFE2CFDAFFE9CFE4FFEACFE4FFF6CF18
:101F6000E4FFF7CFE4FFF8CFE4FFF5CFE4FFF3CFD2
:101F7000E4FFF4CFE4FFFACFE4FFFBCFE4FF00EE91
:101F800000F0100EE80403E3EECFE4FFFBD700EE11
:101F900010F0050EE80403E3EECFE4FFFBD7E652B2
:101FA000A4AA03D067EC14F0A49A9EA603D0A5ECD3
:101FB00001F09E96E55200EE14F0050EE80403E3EE
:101FC000E5CFEDFFFBD700EE0FF0100EE80403E3C2
:101FD000E5CFEDFFFBD7E5CFFBFFE5CFFAFFE5CF80
:101FE000F4FFE5CFF3FFE5CFF5FFE5CFF8FFE5CF51
:101FF000F7FFE5CFF6FFE5CFEAFFE5CFE9FFE5CF55
:10200000DAFF1100D8CFE4FFE0CFE4FFE46EDACFCF
:10201000E4FFE2CFDAFFE9CFE4FFEACFE4FFF6CF57
:10202000E4FFF7CFE4FFF8CFE4FFF5CFE4FFF3CF11
:10203000E4FFF4CFE4FFFACFE4FFFBCFE4FF00EED0
:1020400000F0100EE80403E3EECFE4FFFBD700EE50
:1020500010F0050EE80403E3EECFE4FFFBD7E652F1
:10206000F0A003D047EC12F0F090F2A003D060ECA7
:1020700012F0F290F2A403D0CAEC13F0F294A1A2F1
:1020800003D0E4EC13F0A192E55200EE14F0050E3B
:10209000E80403E3E5CFEDFFFBD700EE0FF0100EF1
:1020A000E80403E3E5CFEDFFFBD7E5CFFBFFE5CF8A
:1020B000FAFFE5CFF4FFE5CFF3FFE5CFF5FFE5CF7E
:1020C000F8FFE5CFF7FFE5CFF6FFE5CFEAFFE5CF75
:1020D000E9FFE5CFDAFFE550E5CFE0FFE5CFD8FF38
:0220E0001000EE
:0E20E20092909292929492968990899289940B
:1020F0008996E66AE66A08D8E552E55212008982B6
:102100000000899200001200D9CFE6FFE1CFD9FF8D
:10211000020EE1268990DE6ADD6ADECF10F0DDCFA7
:1021200011F0D890115004E6080E105C000E115802
:1021300014E2FD0EDB50010BE8B08984E8A089941D
:10214000DEDFFD0EDBCFF3FFF390F342F3CFDBFFD7
:10215000DF2A010EE2E3DB2AE0D7DE6ADD6ADECFAA
:1021600010F0DDCF11F0D890115004E6080E105C8D
:10217000000E115814E2FE0EDB50010BE8B089840A
:10218000E8A08994BCDFFE0EDBCFF3FFF390F342AF
:10219000F3CFDBFFDF2A010EE2E3DB2AE0D7898001
:1021A000020EE15C02E2E16AE552E16EE552E7CF40
:1021B000D9FF1200D9CFE6FFE1CFD9FF030EE12608
:1021C000DF6A010EDB6A020EDB6A0A0E106E0C6E0D
:1021D000FE0EDBCF07F076EC16F0020E03C0DBFF3D
:1021E000DB50090A36E0010A30E00F0A2AE0010A52
:1021F00024E0030A1EE0010A18E0070A12E0010ABF
:102200000CE0030A06E0010A27E1010EE6C5DBFF48
:1022100023D0010EE7C5DBFF1FD0010EE8C5DBFFB1
:102220001BD0010EE9C5DBFF17D0010EEAC5DBFFAD
:1022300013D0010EEBC5DBFF0FD0010EECC5DBFFA9
:102240000BD0010EEDC5DBFF07D0010EEEC5DBFFA5
:1022500003D0010EEFC5DBFF0A0E106E0C6EFE0EF2
:10226000DBCF07F076EC16F0020E07C0DBFFDB5089
:10227000090A2DE0010A28E00F0A23E0010A1EE006
:10228000030A19E0010A14E0070A0FE0010A0AE054
:10229000030A05E0010A1DE1E6C5DFFF1AD0E7C524
:1022A000DFFF17D0E8C5DFFF14D0E9C5DFFF11D08D
:1022B000EAC5DFFF0ED0EBC5DFFF0BD0ECC5DFFFBB
:1022C00008D0EDC5DFFF05D0EEC5DFFF02D0EFC5BA
:1022D000DFFF010EDBCFE6FFDFCFE6FF15DFE552C4
:1022E000E552030EE15C02E2E16AE552E16EE5527D
:0622F000E7CFD9FF120048
:0A22F600FAC5E9FFFBC5EAFFEF6A35
:10230000FAC5E9FFFBC5EAFFEE52EF6AFAC5E9FF3D
:10231000FBC5EAFF020EE926000EEA22EF6A120070
:10232000D9CFE6FFE1CFD9FFE652FE0EDB50106EAB
:10233000116AFAC5E9FFFBC5EAFF020EE926000EA5
:10234000EA22EF50126E136A000ED8801256010E68
:10235000135613501118E8AE02D0113404D01050A7
:10236000125C1150135802E2FF0E35D0FAC5E9FF96
:10237000FBC5EAFF020EE926000EEA22FE0EDB5044
:10238000EF26DF6AFE0EDB50DF5C24E2DF50E76EF3
:10239000FC0EDBCFE9FFFD0EDBCFEAFFE750E926BD
:1023A000000EEA22EF50E66EFAC5E9FFFBC5EAFF30
:1023B000EE52EF50EA6A000FE96E010EEA22E55292
:1023C000E750EF6EFAC5E9FFFBC5EAFFEE52EF2AD0
:1023D000DF2AD8D7000EE552E552E7CFD9FF120029
:1023E000D9CFE6FFE1CFD9FFE652FE0EDBCF10F0EA
:1023F000FAC5E9FFFBC5EAFF020EE926000EEA2254
:10240000EF50D880105402E2FF0E33D0FAC5E9FF36
:10241000FBC5EAFF020EE926000EEA22FE0EDB50A3
:10242000EF5EDF6AFE0EDB50DF5C22E2FAC5E9FFF9
:10243000FBC5EAFFEF50EA6A000FE96E010EEA22DF
:10244000EF50E66EDF50E76EFC0EDBCFE9FFFD0ECE
:10245000DBCFEAFFE750E926000EEA22E552E7501B
:10246000EF6EFAC5E9FFFBC5EAFFEF2ADF2ADAD7EC
:0C247000000EE552E552E7CFD9FF120044
:04247C00928A949418
:102480008B940E01020EE16FF086F19A12008B849C
:10249000010EE66E84EC16F0E5528B9412000501F5
:1024A0000F0EFD6FF19E9388938A938C938E818893
:1024B000818A818C818E8A888A8A8A8C8A8E12008F
:1024C000D9CFE6FFE1CFD9FFE652F00E8114E8380C
:1024D0000F0BDF6EDF500501FD19010B13E0FDA1AD
:1024E00005D0000EE66EE66A460E04D0000EE66EDB
:1024F000E66A470EE66EE66A98EC09F0E552E552A8
:10250000E552E552DF500501FD19020B13E0FDA372
:1025100005D0000EE66EE66A480E04D0000EE66EA8
:10252000E66A490EE66EE66A98EC09F0E552E55275
:10253000E552E552DF500501FD19040B13E0FDA53E
:1025400005D0000EE66EE66A4A0E04D0000EE66E76
:10255000E66A4B0EE66EE66A98EC09F0E552E55243
:10256000E552E552DF500501FD19080B13E0FDA708
:1025700005D0000EE66EE66A4C0E04D0000EE66E44
:10258000E66A4D0EE66EE66A98EC09F0E552E55211
:10259000E552E552DFCFFDF5E552E552E7CFD9FF31
:0225A000120027
:0E25A200D9CFE6FFDACFE6FFE1CFD9FFE2CFD7
:1025B000DAFFE652E652E652DF6AF8CF01F0F6CFD4
:1025C00002F0FD0EDB80DB82DB84DB86DB88DB8ACE
:1025D000FC0EDB84DB86DB88DB8ADB8CDB8EFD0E8E
:1025E000DBCFE6FFC00EBA10E552E714BA6EFC0E60
:1025F000DBCFE6FF0F0EBA10E552E714BA6E3F0EBE
:10260000106EFD0EDB50105C02E194940FD0FD0EB5
:10261000DB50BF0802E1949409D0FD0EDB507F0827
:1026200004E0FD0EDB50FF0801E1949401C0F8FFC7
:1026300002C0F6FFE552E552E552E552E5CFDAFF7A
:06264000E7CFD9FF1200F4
:0A264600D9CFE6FFDACFE6FFE1CFBF
:10265000D9FFE2CFDAFFC26AC16AFC0EDB50400D3F
:10266000F350C00B106EFC0EDB407F0B3C0B1010C8
:10267000C26EFD0EDB50040DF350380B116EFD0ED3
:10268000DB380F0B070B106EFD0EDB50800B1010AC
:102690001110C16EF90EDBCF10F0FA0EDBCF11F086
:1026A00011C010F0116A10C048FFF90EDBCF49FFCE
:1026B000060E106EFB0EDB50C00B10C0E7FFE7529A
:1026C00004E0E8427F0BE706FCE10E01B86FFC0E68
:1026D000DBAE03D09E9C9D8CF28CC280E552E5CF90
:0826E000DAFFE7CFD9FF120079
:0826E8001E0EF66E000EF76EE7
:1026F000000EF86E05010900F550F56F0900F55060
:10270000F66F03E1F56701D03DD00900F550F06F99
:102710000900F550F16F0900F550F26F090009004A
:10272000F550E96E0900F550EA6E0900090009004C
:10273000F550F36F0900F550F46F09000900F6CF6A
:10274000F7F5F7CFF8F5F8CFF9F5F0C5F6FFF1C5D5
:10275000F7FFF2C5F8FF0501F35302E1F45307E078
:102760000900F550EE6EF307F8E2F407F9D7F7C564
:10277000F6FFF8C5F7FFF9C5F8FF0501F507000EEC
:06278000F65BBFD712005A
:0A278600940EE66EFEEC15F0E5522D
:10279000D59E1200000EE66EE66A0A0EE66EE66A46
:1027A00098EC09F0E552E552E552E5521200D58E5B
:1027B0001200D59E1200330EE66EF30EE66EE2ECCA
:1027C00015F0E552E55212000501FE5106E18AECD2
:1027D00015F00501010EFE6F04D0A5EC15F0050102
:1027E000FE6BE66AE50EE66EC6EC15F0E552E552C4
:1027F000120079808AEC15F00501010EFE6F1200BF
:0C2800007990A5EC15F00501FE6B1200AC
:04280C00D9CFE6FF3B
:10281000DACFE6FFE1CFD9FFE2CFDAFF0C0EBA6ED6
:10282000FC0E0F015217DB50180BE840E840E8405F
:102830001F0B5213070E521506E1CA94FD0EDB5012
:10284000CB6ECA841DD0070E5215010806E176949E
:10285000FD0EDB50776E768413D0070E52150208FA
:1028600006E11E95FD0EDBCF1FFF1E8509D0070E6A
:102870005215030805E11B95FD0EDBCF1CFF1B85E0
:0C288000E552E5CFDAFFE7CFD9FF1200E8
:04288C00D9CFE6FFBB
:10289000E1CFD9FF190EE66EE66A3C0EE66EBFEC9C
:1028A00014F0E552E552E5520E01050EF76F060EE3
:1028B000C66F190EE66EE66A7C0EE66E83EC14F0C7
:1028C000E552E552E552E552E7CFD9FF1200A4AA3E
:1028D00006D0A7EC15F0E66E83EC0DF0E55205018D
:1028E000FCA710D0AC98AC889C989C88000EE66E33
:1028F000E66A1E0EE66EE66ADDEC09F0E552E55288
:06290000E552E552120051
:0A290600D9CFE6FFDACFE6FFE1CFFC
:10291000D9FFE2CFDAFFA86A9C6AFD0EDBB0A88877
:10292000DBA202D0A88C9C8CDBB4A88EDBA602D0E4
:102930009C8801D09C8ADBA802D0A88401D0A894EE
:10294000DBBA9C86DBAC02D0A38A01D0A39ADBAEB3
:1029500002D0A38801D0A398FB0EDB50AB6EFC0E17
:10296000DBCF11F011C010F0116A10507D6EA88AF3
:0E2970009C8EE552E5CFDAFFE7CFD9FF1200CB
:02297E00D9CFAF
:10298000E6FFDACFE6FFE1CFD9FFE2CFDAFFAD6AAB
:10299000AC6AFD0EDBB0AD88DBA202D0AD8CAC8C96
:1029A000DBB4AD8EDBA602D0AC8801D0AC8ADBB83C
:1029B000AD84DBBAAC86DBAC02D09D8A01D09D9A97
:1029C000DBAE02D09D8801D09D98FB0EDB50B06E2F
:1029D000FC0EDBCF11F011C010F0116A10507F6EA9
:1029E000AD8AAC8EE552E5CFDAFFE7CFD9FF120012
:1029F000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFFAA
:102A0000E652E652FC0EDBCF10F0FD0EDBCF11F0EC
:102A1000060ED89010361136E804FBE110C0DEFF38
:102A200011C0DDFF010EDB50BB6EDF50E840E84017
:102A30003F0B300B106ECF0EBA141010BA6EE55269
:0E2A4000E552E552E5CFDAFFE7CFD9FF1200ED
:022A4E00928074
:102A5000FE0EE66E1F0EE66EE66A840EE66EE10E70
:102A6000E66E23EC13F0106E050EE15E10501200BE
:102A700098EF16F007EF00F0D9CFE6FFE1CFD9FFCE
:102A8000030EE1268FEC16F0F3CFDEFFF4CFDDFF6F
:102A9000020EF36EDB6E030EE15C02E2E16AE552C8
:0A2AA000E16EE552E7CFD9FF120006
:062AAA00D9CFE6FFDACFF0
:102AB000E6FFFA0EE3CFD9FFFB0EE3CFDAFFFC0E01
:102AC000E3CFE9FFFD0EE3CFEAFFE9CFF3FFEACF63
:102AD000F4FFF80EE35003E1F90EE35008E0F80EBE
:102AE000E30602E2F90EE306DECFEEFFF2D7FF0EB9
:102AF000E3CFDAFFE552FF0EE3CFD9FFE552120034
:102B0000949094928B908B920E010E0ECB6F0F0EC1
:102B1000CC6F12008F0EE66EE66806EC14F0E552FC
:102B2000E552E66A020EE66EF8EC14F0E552E55264
:102B30009EA2FED7FC0EE66E3F0EE66ED1EC12F0C2
:0E2B4000E552E552BF80BF8212000AEF00F09E
:022B4E00D9CFDD
:102B5000E6FFDACFE6FFE1CFD9FFE2CFDAFFE652B8
:102B6000F20E0501FC179CAC03D0FC919CB0FC81DB
:102B70009CB4FC859CB2FC87AA50DF6EDF50E55206
:0C2B8000E552E5CFDAFFE7CFD9FF1200E5
:042B8C00D9CFE6FFB8
:102B9000DACFE6FFE1CFD9FFE2CFDAFFE652E65225
:102BA000FC0EDBCFDEFFDBCFDDFF010EDB507B6EEB
:102BB000DF507A6EE552E552E552E5CFDAFFE7CF16
:042BC000D9FF120027
:0C2BC400D9CFE6FFDACFE6FFE1CFD9FF62
:102BD000E2CFDAFFE652E652FC0EDBCFDEFFDBCFC0
:102BE000DDFF010EDB50CF6EDF50CE6EE552E552B9
:0C2BF000E552E5CFDAFFE7CFD9FF120075
:042BFC00D9CFE6FF48
:102C0000DACFE6FFE1CFD9FFE2CFDAFFFD0EDB50EE
:102C10007F0BD56ED76AD66AF294FD0EDBAE02D07A
:102C2000F28A01D0F29AD58EE552E5CFDAFFE7CFEE
:042C3000D9FF1200B6
:0C2C3400FF0EE350166EEF0E01D0F30E01
:102C4000E76EE72E21EF16F00C0E156EE76AE72E01
:102C500027EF16F0152E26EF16F0162E1FEF16F0A2
:022C6000120060
:0E2C6200D9CFE6FFDACFE6FFE1CFD9FFE2CF10
:102C7000DAFFA8AC04D0A8900501FCB3A880FD0E33
:102C8000DB50A96EE552E5CFDAFFE7CFD9FF12009E
:102C9000FF0EE350166E480E01D04C0EE76EE72E85
:102CA000FED7E76AE72EFED7162EF7D700001200F0
:102CB000B00EF36E00EE00F00E0E01D81200EA60C6
:102CC00002D0EE6AFCD7F350E9601200EE6AFCD73E
:102CD0001DEE00F02DEE00F0F86A0F9C74EC13F07E
:0C2CE00003EC00F002EC0BF0FBD712003C
:042CEC00036A080E61
:102CF000E76ED890073603360C50035C02E3036E90
:082D0000072AE72EF7D71200A5
:082D0800FF0EE350E84E12003B
:0E2D1000000000D000D000D0E82EFAD712004C
:022D1E00C4509F
:102D2000136E126AC3501210F36E13C0F4FF120038
:042D3000C282120049
:012D3400009E
:012D3500009D
:012D3600009C
:092D370000EEFE9CFC9E8EFC6087
:092D4000DAF266B6BEE4FEF6000C
:072D490000EEFE9CFC9E8ED3
:0A2D5000FC60DAF266B6BEE4FEF69F
:020000040001F9
:01FFF800AA5E
:01FFFA00FD09
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/interrupts.c
19,16 → 19,24
void interrupt_init() {
// Peripheral interrupts can have their priority set to high or low
// Decide on the priority of the enabled peripheral interrupts (0 is low, 1 is high)
// INTCON2bits.TMR0IP = 0; // Timer0 interrupt
// IPR1bits.TMR1IP = 1; // Timer1 interrupt
// IPR1bits.RC1IP = 0; // USART1 RX interrupt
IPR3bits.RC2IP = 1; // USART2 RX interrupt
IPR1bits.SSPIP = 1; // I2C interrupt
// IPR1bits.ADIP = 0; // ADC interupt
// INTCON2bits.RBIP = 1; // Port B interrupt
INTCON3bits.INT1IP = 1; // INT1 interrupt
// I2C interupts must be specifically enabled
 
// High priority interrupts
IPR3bits.RC2IP = 1; // USART2 RX interrupt
IPR1bits.SSPIP = 1; // I2C interrupt
 
// Low priority interrupts
// IPR1bits.RC1IP = 0; // USART1 RX interrupt
INTCON2bits.TMR0IP = 0; // Timer0 interrupt
// IPR1bits.TMR1IP = 0; // Timer1 interrupt
IPR2bits.TMR3IP = 0; // Timer 3 interrupt
// IPR1bits.ADIP = 0; // ADC interupt
INTCON2bits.RBIP = 0; // Port B interrupt
INTCON3bits.INT1IP = 0; // INT1 interrupt
// Enable I2C interrupt
PIE1bits.SSPIE = 1;
// Enable Port B interrupt
INTCONbits.RBIE = 1;
}
 
void interrupt_enable() {
36,7 → 44,7
// Enable both high-priority interrupts and low-priority interrupts
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 0;
INTCONbits.GIEL = 1;
}
 
int interrupt_in_high_interrupt_routine() {
70,17 → 78,19
void InterruptHandlerLow();
 
#pragma code InterruptVectorLow = 0x18
 
void InterruptVectorLow(void) {
_asm
goto InterruptHandlerLow //jump to interrupt routine
_endasm
_endasm
}
 
#pragma code InterruptVectorHigh = 0x08
 
void InterruptVectorHigh(void) {
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
_endasm
}
 
//----------------------------------------------------------------------------
89,100 → 99,112
 
#pragma code
#pragma interrupt InterruptHandlerHigh
 
void InterruptHandlerHigh() {
// We need to check the interrupt flag of each enabled high-priority interrupt to
// see which device generated this interrupt. Then we can call the correct handler.
 
// Check to see if we have an interrupt on USART2 RX
if (PIR3bits.RC2IF) {
DBG_PRINT_INT("INT: UART2 RX\r\n");
// Call the interrupt handler
uart_recv_interrupt_handler();
 
// Clear the interrupt flag
PIR3bits.RC2IF = 0;
}
 
// // Nofity the xbee to stop sending serial data
// xbee_set_RTS(1);
 
// Check to see if we have an I2C interrupt
if (PIR1bits.SSPIF) {
// Nofity the xbee to stop sending serial data
xbee_set_RTS(1);
DBG_PRINT_INT("INT: I2C\r\n");
// Call the handler
i2c_interrupt_handler();
 
// Clear the interrupt flag
PIR1bits.SSPIF = 0;
 
// Notify xbee to resume sending serial data
xbee_set_RTS(0);
}
 
// Check to see if we have an interrupt on USART2 RX
if (PIR3bits.RC2IF) {
// Call the interrupt handler
uart_recv_interrupt_handler();
// //Notify xbee to resume sending serial data
// xbee_set_RTS(0);
 
// Clear the interrupt flag
PIR3bits.RC2IF = 0;
}
// The *last* thing I do here is check to see if we can
// allow the processor to go to sleep
// This code *DEPENDS* on the code in messages.c being
// initialized using "init_queues()" -- if you aren't using
// this, then you shouldn't have this call here
// MQ_sleep_high_interrupt_if_okay();
}
 
#ifdef _MASTER
//----------------------------------------------------------------------------
// Low priority interrupt routine
// this parcels out interrupts to individual handlers
#pragma code
#pragma interruptlow InterruptHandlerLow
// This works the same way as the "High" interrupt handler
 
void InterruptHandlerLow() {
// Check to see if we have an interrupt on INT1
if (INTCON3bits.INT1IF) {
DBG_PRINT_INT("INT: INT1\r\n");
int1_interrupt_handler();
 
INTCON3bits.INT1IF = 0;
}
#endif
 
// Check to see if we have an interrupt on any port B inputs <4:7>
if (INTCONbits.RBIF) {
DBG_PRINT_INT("INT: Port B\r\n");
port_b_int_interrupt_handler();
 
INTCONbits.RBIF = 0;
}
// Check to see if we have an interrupt on timer 0
if (INTCONbits.TMR0IF) {
DBG_PRINT_INT("INT: Timer 0\r\n");
// Call the handler
timer0_interrupt_handler();
 
// Clear this interrupt flag
INTCONbits.TMR0IF = 0;
}
 
// // Check to see if we have an interrupt on timer 1
// if (PIR1bits.TMR1IF) {
// // Call the interrupt handler
// timer1_interrupt_handler();
//
// // Clear the interrupt flag
// PIR1bits.TMR1IF = 0;
//
// // Call the interrupt handler
// timer1_interrupt_handler();
// }
 
// The *last* thing I do here is check to see if we can
// allow the processor to go to sleep
// This code *DEPENDS* on the code in messages.c being
// initialized using "init_queues()" -- if you aren't using
// this, then you shouldn't have this call here
// MQ_sleep_high_interrupt_if_okay();
}
// Check to see if we have an interrupt on timer 3
if (PIR2bits.TMR3IF) {
DBG_PRINT_INT("INT: Timer 3\r\n");
timer3_interrupt_handler();
 
//----------------------------------------------------------------------------
// Low priority interrupt routine
// this parcels out interrupts to individual handlers
#pragma code
#pragma interruptlow InterruptHandlerLow
// This works the same way as the "High" interrupt handler
void InterruptHandlerLow() {
 
// // Check to see if we have an interrupt on timer 0
// if (INTCONbits.TMR0IF) {
// // Clear this interrupt flag
// INTCONbits.TMR0IF = 0;
PIR2bits.TMR3IF = 0;
}
// // Check to see if we have an interrupt on USART1 RX
// if (PIR1bits.RC1IF) {
// // Call the interrupt handler
// uart_recv_interrupt_handler();
//
// // Call the handler
// timer0_interrupt_handler();
// }
// // Clear the interrupt flag
// PIR1bits.RC1IF = 0;
// }
 
// // Check to see if we have an interrupt on USART1 RX
// if (PIR1bits.RC1IF) {
// // Clear the interrupt flag
// PIR1bits.RC1IF = 0;
// // Check to see if we have an interrupt on ADC
// if (PIR1bits.ADIF) {
// // Call the interrupt handler
// adc_interrupt_handler();
//
// // Call the interrupt handler
// uart_recv_interrupt_handler();
// }
// // Check to see if we have an interrupt on ADC
// if (PIR1bits.ADIF) {
// // Clear the interrupt flag
// PIR1bits.ADIF = 0;
//
// // Call the interrupt handler
// adc_interrupt_handler();
// }
// // Clear the interrupt flag
// PIR1bits.ADIF = 0;
// }
}
 
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/main.c
10,6 → 10,7
#include "pwm.h"
#include "delays.h"
#include "pin_interrupts.h"
#include "buffer.h"
 
#pragma config WDTEN = OFF // Turn off watchdog timer
#pragma config XINST = OFF // Turn off extended instruction set
42,8 → 43,8
*
* RB0 - XBee CTS (PPS)
* RB1 - XBee RTS (PPS)
* RB2 - XBee RX (PPS)
* RB3 - XBee Tx (PPS)
* RB2 - XBee Tx (PPS)
* RB3 - XBee Rx (PPS)
* RB4 - Button Input (Port B Interrupt on Change)
* RB5 - Button Input (Port B Interrupt on Change)
* RB6 - Button Input (Port B Interrupt on Change)
53,18 → 54,17
#pragma udata umain_1
static unsigned char msgbuffer[MSGLEN + 1];
#pragma udata umain_2
static I2C_DATA i2c_i;
static I2C_DATA i2c_data;
#pragma udata
static XBEE_DATA xbee_c;
static UART_DATA uart_c;
static XBEE_DATA xbee_data;
static UART_DATA uart_data;
static BUFFER_DATA buffer_data;
 
void main(void) {
char length;
unsigned char msgtype;
unsigned char i = 0;
unsigned char last_data_received = 0;
// unsigned int adc_last_value; // Holds 12 bit ADC value
// unsigned char adc_last_value_shifted; // Holds upper 4 bits
unsigned char counter = 0;
 
// Pointers to allow parsing of xbee data from arbitrary byte array
XBEE_RX_AT_COMMAND_RESPONSE_FRAME *frame_at_cmd_response;
85,16 → 85,22
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
/* -------------------------------------------------------------------- */
 
uart_init(&uart_c); // Initialize the UART handler code
xbee_init(&xbee_c); // Initialize the XBee handler code
i2c_init(&i2c_i); // Initialize the I2C handler code
uart_init(&uart_data); // Initialize the UART handler code
xbee_init(&xbee_data); // Initialize the XBee handler code
i2c_init(&i2c_data); // Initialize the I2C handler code
buffer_init(&buffer_data);
// adc_init(); // Initialize the ADC
MQ_init(); // Initialize message queues before enabling any interrupts
timers_init(); // Initialize timers
led_driver_init(); // Initialize the driver for the LED display
port_b_int_init(); // Initialze Port B interrupt handler
 
#ifdef _BASE_STATION
intx_init(); // IR receiver input
#endif
#ifdef _REMOTE
pwm_init(); // Initialize the PWM output driver
timers_init(); // Initialize timers
intx_init();
port_b_int_init(); // Initialze Port B interrupt handler
#endif
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
103,54 → 109,15
ANCON1 = 0x1F;
 
// Configure the hardware i2c device as a slave
#ifdef _MASTER
#ifdef _BASE_STATION
i2c_configure_master();
#endif
#ifdef _SLAVE
#ifdef _REMOTE
i2c_configure_slave(0x5F);
#endif
 
DBG_PRINT_MAIN("\r\nMain: Program Started\r\n");
 
#ifdef _MASTER
// Delay a bit to allow XBees to start up
for (i = 0; i < 20; i++)
Delay10KTCYx(255);
 
pwm_start();
 
while (1) {
/* XBee Demo */
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
frame_tx_data->destination_16.INT_16.int_value = 0x0000;
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
frame_tx_data->data[0] = i;
i++;
if (i == 100)
i = 0;
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
xbee_process_transmit_frame((void *) msgbuffer, length);
Delay10KTCYx(100);
 
/* I2C Demo */
// Write 2 bytes
msgbuffer[0] = 0x4;
msgbuffer[1] = 0x2;
i2c_master_send(0x5F, 2, msgbuffer);
while (i2c_master_busy());
 
// Read 2 bytes back
i2c_master_recv(0x5F, 2);
while (i2c_master_busy());
// Delay10KTCYx(100);
}
#endif
 
// Loop and process recieved messages from interrupts
while (1) {
// Call a routine that blocks until either message queues are not empty
186,12 → 153,23
switch (msgbuffer[0]) {
case 0x2:
length = 1;
msgbuffer[0] = 1; // Size
// Return size of stored data in buffer
if (buffer_data.stored_length > MSGLEN) {
msgbuffer[0] = MSGLEN;
} else {
msgbuffer[0] = buffer_data.stored_length;
}
MQ_sendmsg_FromMainToHigh(length, MSGTYPE_I2C_REPLY, (void *) msgbuffer);
break;
case 0x4:
length = 1;
msgbuffer[0] = last_data_received;
// Return data stored in buffer
if (buffer_data.stored_length > MSGLEN) {
length = MSGLEN;
buffer_read(MSGLEN, msgbuffer);
} else {
length = buffer_data.stored_length;
buffer_read(buffer_data.stored_length, msgbuffer);
}
MQ_sendmsg_FromMainToHigh(length, MSGTYPE_I2C_REPLY, (void *) msgbuffer);
break;
case 0x6:
225,6 → 203,7
DBG_PRINT_MAIN("Main: (ERROR) I2C Master Receive Failed\r\n");
break;
/* -----------------------------------------------------------*/
 
/* --- XBee Message Handlers ---------------------------------*/
case MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE:
DBG_PRINT_MAIN("Main: XBee AT command frame\r\n");
245,7 → 224,9
DBG_PRINT_MAIN("%X ", frame_data_packet->data[i]);
}
DBG_PRINT_MAIN("\r\n");
last_data_received = frame_data_packet->data[0];
// Store received data into buffer
buffer_insert(length - XBEE_RX_DATA_PACKET_FRAME_SIZE, frame_data_packet->data);
// Send value of first byte received to LED display
led_driver_num(frame_data_packet->data[0]);
break;
case MSGTYPE_XBEE_RX_DATA_TX_STATUS:
281,12 → 262,37
frame_modem_status = (void *) msgbuffer;
break;
/* -----------------------------------------------------------*/
/* --- Port B Interrupt Handlers -----------------------------*/
};
continue;
}
 
// Process low priority queue
length = MQ_recvmsg_ToMainFromLow(MSGLEN, &msgtype, (void *) msgbuffer);
if (length < 0) {
// No message, check the error code to see if it is concern
if (length != MSG_QUEUE_EMPTY) {
DBG_PRINT_MAIN("Main: (ERROR) Bad low priority receive, code = %d\r\n", length);
}
} else {
switch (msgtype) {
/* --- Port B Interrupt Handlers -----------------------------*/
case MSGTYPE_PORTB_4_DOWN:
DBG_PRINT_MAIN("Main: Port B4 Down\r\n");
#ifdef _REMOTE
timer3_enable();
#endif
#ifdef _BASE_STATION
timer0_enable();
#endif
break;
case MSGTYPE_PORTB_4_UP:
DBG_PRINT_MAIN("Main: Port B4 Up\r\n");
#ifdef _REMOTE
timer3_disable();
#endif
#ifdef _BASE_STATION
timer0_disable();
#endif
break;
case MSGTYPE_PORTB_5_DOWN:
DBG_PRINT_MAIN("Main: Port B5 Down\r\n");
307,8 → 313,47
DBG_PRINT_MAIN("Main: Port B7 Up\r\n");
break;
/* -----------------------------------------------------------*/
/* --- Timer Interrupt Handlers ------------------------------*/
case MSGTYPE_TIMER0:
DBG_PRINT_MAIN("Main: Timer 0\r\n");
/* XBee Demo */
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
frame_tx_data->destination_16.INT_16.int_value = 0x0000;
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
frame_tx_data->data[0] = counter;
counter++;
if (counter == 100)
counter = 0;
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
xbee_process_transmit_frame((void *) msgbuffer, length);
Delay10KTCYx(100);
 
// /* I2C Demo */
// // Write 2 bytes
// msgbuffer[0] = 0x4;
// msgbuffer[1] = 0x2;
// i2c_master_send(0x5F, 2, msgbuffer);
// while (i2c_master_busy());
//
// // Read 2 bytes back
// i2c_master_recv(0x5F, 2);
// while (i2c_master_busy());
break;
// case MSGTYPE_ADC_NEWVALUE:
// // Get the value in the ADC
// adc_last_value = *((unsigned int*) msgbuffer);
// adc_last_value_shifted = adc_last_value >> 4;
// DBG_PRINT_MAIN("Main: ADC Value = %d\r\n", adc_last_value);
//
// adc_start();
// break;
default:
DBG_PRINT_MAIN("Main: (ERROR) Unexpected msg in high queue, length = %d, type = %d\r\n", length, msgtype);
DBG_PRINT_MAIN("Main: (ERROR) Unexpected msg in low queue, length = %d, type = %d\r\n", length, msgtype);
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%X ", msgbuffer[i]);
}
317,63 → 362,5
};
continue;
}
 
// // Process low priority queue
// length = MQ_recvmsg_ToMainFromLow(MSGLEN, &msgtype, (void *) msgbuffer);
// if (length < 0) {
// // No message, check the error code to see if it is concern
// if (length != MSG_QUEUE_EMPTY) {
// DBG_PRINT_MAIN("Main: (ERROR) Bad low priority receive, code = %d\r\n", length);
// }
// } else {
// switch (msgtype) {
// case MSGTYPE_TIMER0:
// DBG_PRINT_MAIN("Timer 0 Triggered\r\n");
// // Write 2 bytes
// msgbuffer[0] = 0x4;
// msgbuffer[1] = 0x3;
// i2c_master_send(0x5F, 2, msgbuffer);
// while (i2c_master_busy());
//
// // Read 3 bytes
// i2c_master_recv(0x5F, 3);
// while (i2c_master_busy());
//
// break;
// break;
// case MSGTYPE_ADC_NEWVALUE:
// // Get the value in the ADC
// adc_last_value = *((unsigned int*)msgbuffer);
// adc_last_value_shifted = adc_last_value >> 4;
// DBG_PRINT_MAIN("Main: ADC Value = %d\r\n", adc_last_value);
//
// frame_tx_data = (void *) msgbuffer;
// frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
// frame_tx_data->frame_id = 0;
// frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
// frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
// frame_tx_data->destination_16.INT_16.int_value = 0x0000;
// frame_tx_data->broadcast_radius = 0;
// frame_tx_data->options = 0x01; // Disable ACK
//
// frame_tx_data->data[0] = adc_last_value_shifted;
//
// length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
//
// xbee_process_transmit_frame((void *) msgbuffer, length);
//
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// Delay10KTCYx(255);
// Delay10KTCYx(255);
//
// adc_start();
// break;
// default:
// DBG_PRINT_MAIN("Main: (ERROR) Unexpected msg in low queue, type = %d\r\n", msgtype);
// break;
// };
// continue;
// }
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/maindefs.h
5,8 → 5,8
#include <stdio.h>
 
//#define _DEBUG
//#define _MASTER
#define _SLAVE
#define _BASE_STATION
//#define _REMOTE
 
// Enable or disable debug prints depending on project preprocessor (_DEBUG)
#ifdef _DEBUG
13,12 → 13,16
#define DBG_PRINT_MAIN(x) printf(x)
#define DBG_PRINT_I2C(x)
#define DBG_PRINT_XBEE(x)
#define DBG_PRINT_PORTB_INT(x)
#define DBG_PRINT_PORTB_INT(x) printf(x)
#define DBG_PRINT_INT(x) printf(x)
#define DBG_PRINT_BUFFER(x)
#else
#define DBG_PRINT_MAIN(x)
#define DBG_PRINT_I2C(x)
#define DBG_PRINT_XBEE(x)
#define DBG_PRINT_PORTB_INT(x)
#define DBG_PRINT_INT(x)
#define DBG_PRINT_BUFFER(x)
#endif
 
//#define memcpy(a,b,c) memcpy((a),(const void*)(b),(c))
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/msg_queues.c
11,34 → 11,34
// FromMainQueueToLow: Writer is main(), Reader is a low priority interrupt
// FromMainQueueToHigh: Writer is main(), Reader is a high priority interrupt
 
//#pragma udata msgqueue1_1
//static msg MQ_ToMainFromLow_1;
//#pragma udata msgqueue1_2
//static msg MQ_ToMainFromLow_2;
#pragma udata msgqueue1_1
static msg MQ_ToMainFromLow_1;
#pragma udata msgqueue1_2
static msg MQ_ToMainFromLow_2;
 
#pragma udata msgqueue2_1
static msg MQ_ToMainFromHigh_1;
#pragma udata msgqueue2_2
static msg MQ_ToMainFromHigh_2;
#pragma udata msgqueue2_3
static msg MQ_ToMainFromHigh_3;
//#pragma udata msgqueue2_3
//static msg MQ_ToMainFromHigh_3;
 
//#pragma udata msgqueue3_1
//static msg MQ_FromMainToLow_1;
//#pragma udata msgqueue3_2
//static msg MQ_FromMainToLow_2;
#pragma udata msgqueue3_1
static msg MQ_FromMainToLow_1;
#pragma udata msgqueue3_2
static msg MQ_FromMainToLow_2;
 
#pragma udata msgqueue4_1
static msg MQ_FromMainToHigh_1;
#pragma udata msgqueue4_2
static msg MQ_FromMainToHigh_2;
#pragma udata msgqueue4_3
static msg MQ_FromMainToHigh_3;
//#pragma udata msgqueue4_3
//static msg MQ_FromMainToHigh_3;
 
#pragma udata
//static msg_queue MQ_ToMainFromLow;
static msg_queue MQ_ToMainFromLow;
static msg_queue MQ_ToMainFromHigh;
//static msg_queue MQ_FromMainToLow;
static msg_queue MQ_FromMainToLow;
static msg_queue MQ_FromMainToHigh;
 
static unsigned char MQ_Main_Willing_To_Block;
56,23 → 56,23
void MQ_init() {
MQ_Main_Willing_To_Block = 0;
 
// MQ_ToMainFromLow.queue[0] = &MQ_ToMainFromLow_1;
// MQ_ToMainFromLow.queue[1] = &MQ_ToMainFromLow_2;
MQ_ToMainFromLow.queue[0] = &MQ_ToMainFromLow_1;
MQ_ToMainFromLow.queue[1] = &MQ_ToMainFromLow_2;
 
MQ_ToMainFromHigh.queue[0] = &MQ_ToMainFromHigh_1;
MQ_ToMainFromHigh.queue[1] = &MQ_ToMainFromHigh_2;
MQ_ToMainFromHigh.queue[2] = &MQ_ToMainFromHigh_3;
// MQ_ToMainFromHigh.queue[2] = &MQ_ToMainFromHigh_3;
 
// MQ_FromMainToLow.queue[0] = &MQ_FromMainToLow_1;
// MQ_FromMainToLow.queue[1] = &MQ_FromMainToLow_2;
MQ_FromMainToLow.queue[0] = &MQ_FromMainToLow_1;
MQ_FromMainToLow.queue[1] = &MQ_FromMainToLow_2;
 
MQ_FromMainToHigh.queue[0] = &MQ_FromMainToHigh_1;
MQ_FromMainToHigh.queue[1] = &MQ_FromMainToHigh_2;
MQ_FromMainToHigh.queue[2] = &MQ_FromMainToHigh_3;
// MQ_FromMainToHigh.queue[2] = &MQ_FromMainToHigh_3;
 
// MQ_init_queue(&MQ_ToMainFromLow);
MQ_init_queue(&MQ_ToMainFromLow);
MQ_init_queue(&MQ_ToMainFromHigh);
// MQ_init_queue(&MQ_FromMainToLow);
MQ_init_queue(&MQ_FromMainToLow);
MQ_init_queue(&MQ_FromMainToHigh);
}
 
191,29 → 191,29
_endasm
}
 
///* Message Queue 1 - Low Interrupt -> Main */
//signed char MQ_sendmsg_ToMainFromLow(unsigned char length, unsigned char msgtype, void *data) {
//#ifdef DEBUG
// if (!interrupt_in_low_interrupt_routine()) {
// return (MSG_NOT_IN_LOW);
// }
//#endif
// return (MQ_send_msg(&MQ_ToMainFromLow, length, msgtype, data));
//}
//
//signed char MQ_recvmsg_ToMainFromLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
//#ifdef DEBUG
// if (!interrupt_in_main_routine()) {
// return (MSG_NOT_IN_MAIN);
// }
//#endif
// return (MQ_recv_msg(&MQ_ToMainFromLow, maxlength, msgtype, data));
//}
//
//unsigned char MQ_peek_ToMainFromLow() {
// return (MQ_peek_msg(&MQ_ToMainFromLow));
//}
/* Message Queue 1 - Low Interrupt -> Main */
signed char MQ_sendmsg_ToMainFromLow(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_low_interrupt_routine()) {
return (MSG_NOT_IN_LOW);
}
#endif
return (MQ_send_msg(&MQ_ToMainFromLow, length, msgtype, data));
}
 
signed char MQ_recvmsg_ToMainFromLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_main_routine()) {
return (MSG_NOT_IN_MAIN);
}
#endif
return (MQ_recv_msg(&MQ_ToMainFromLow, maxlength, msgtype, data));
}
 
unsigned char MQ_peek_ToMainFromLow() {
return (MQ_peek_msg(&MQ_ToMainFromLow));
}
 
/* Message Queue 2 - High Interrupt -> Main */
signed char MQ_sendmsg_ToMainFromHigh(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
237,29 → 237,29
return (MQ_peek_msg(&MQ_ToMainFromHigh));
}
 
///* Message Queue 3 - Main -> Low Interrupt */
//signed char MQ_sendmsg_FromMainToLow(unsigned char length, unsigned char msgtype, void *data) {
//#ifdef DEBUG
// if (!interrupt_in_main_routine()) {
// return (MSG_NOT_IN_MAIN);
// }
//#endif
// return (MQ_send_msg(&MQ_FromMainToLow, length, msgtype, data));
//}
//
//signed char MQ_recvmsg_FromMainToLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
//#ifdef DEBUG
// if (!interrupt_in_low_interrupt_routine()) {
// return (MSG_NOT_IN_LOW);
// }
//#endif
// return (MQ_recv_msg(&MQ_FromMainToLow, maxlength, msgtype, data));
//}
//
//unsigned char MQ_peek_FromMainToLow() {
// return (MQ_peek_msg(&MQ_FromMainToLow));
//}
/* Message Queue 3 - Main -> Low Interrupt */
signed char MQ_sendmsg_FromMainToLow(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_main_routine()) {
return (MSG_NOT_IN_MAIN);
}
#endif
return (MQ_send_msg(&MQ_FromMainToLow, length, msgtype, data));
}
 
signed char MQ_recvmsg_FromMainToLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_low_interrupt_routine()) {
return (MSG_NOT_IN_LOW);
}
#endif
return (MQ_recv_msg(&MQ_FromMainToLow, maxlength, msgtype, data));
}
 
unsigned char MQ_peek_FromMainToLow() {
return (MQ_peek_msg(&MQ_FromMainToLow));
}
 
/* Message Queue 4 - Main -> High Interrupt */
signed char MQ_sendmsg_FromMainToHigh(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
307,9 → 307,9
if (MQ_check_msg_queue_unread(&MQ_ToMainFromHigh)) {
return;
}
// if (MQ_check_msg_queue_unread(&MQ_ToMainFromLow)) {
// return;
// }
if (MQ_check_msg_queue_unread(&MQ_ToMainFromLow)) {
return;
}
 
// If everything checks out, go to sleep
MQ_enter_sleep_mode();
329,10 → 329,10
MQ_Main_Willing_To_Block = 0;
return;
}
// if (MQ_check_msg_queue_unread(&MQ_ToMainFromLow)) {
// MQ_Main_Willing_To_Block = 0;
// return;
// }
if (MQ_check_msg_queue_unread(&MQ_ToMainFromLow)) {
MQ_Main_Willing_To_Block = 0;
return;
}
// Sleep for a period of time before checking again
Delay1KTCYx(10);
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/msg_queues.h
5,7 → 5,7
#define MSGLEN 220
 
// The maximum number of messages in a single queue
#define MSGQUEUELEN 3 // DO NOT CHANGE THIS!
#define MSGQUEUELEN 2 // DO NOT CHANGE THIS!
 
typedef struct __msg {
unsigned char full; // Indicates that data resides in this msg
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/Makefile-default.mk
40,11 → 40,11
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE}
 
# Object Files Quoted if spaced
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/adc.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_driver.o ${OBJECTDIR}/main.o ${OBJECTDIR}/msg_queues.o ${OBJECTDIR}/timers.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/xbee.o ${OBJECTDIR}/pwm.o ${OBJECTDIR}/circular_buffer.o ${OBJECTDIR}/pin_interrupts.o
POSSIBLE_DEPFILES=${OBJECTDIR}/adc.o.d ${OBJECTDIR}/i2c.o.d ${OBJECTDIR}/interrupts.o.d ${OBJECTDIR}/led_driver.o.d ${OBJECTDIR}/main.o.d ${OBJECTDIR}/msg_queues.o.d ${OBJECTDIR}/timers.o.d ${OBJECTDIR}/uart.o.d ${OBJECTDIR}/xbee.o.d ${OBJECTDIR}/pwm.o.d ${OBJECTDIR}/circular_buffer.o.d ${OBJECTDIR}/pin_interrupts.o.d
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/adc.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_driver.o ${OBJECTDIR}/main.o ${OBJECTDIR}/msg_queues.o ${OBJECTDIR}/timers.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/xbee.o ${OBJECTDIR}/pwm.o ${OBJECTDIR}/pin_interrupts.o ${OBJECTDIR}/buffer.o
POSSIBLE_DEPFILES=${OBJECTDIR}/adc.o.d ${OBJECTDIR}/i2c.o.d ${OBJECTDIR}/interrupts.o.d ${OBJECTDIR}/led_driver.o.d ${OBJECTDIR}/main.o.d ${OBJECTDIR}/msg_queues.o.d ${OBJECTDIR}/timers.o.d ${OBJECTDIR}/uart.o.d ${OBJECTDIR}/xbee.o.d ${OBJECTDIR}/pwm.o.d ${OBJECTDIR}/pin_interrupts.o.d ${OBJECTDIR}/buffer.o.d
 
# Object Files
OBJECTFILES=${OBJECTDIR}/adc.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_driver.o ${OBJECTDIR}/main.o ${OBJECTDIR}/msg_queues.o ${OBJECTDIR}/timers.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/xbee.o ${OBJECTDIR}/pwm.o ${OBJECTDIR}/circular_buffer.o ${OBJECTDIR}/pin_interrupts.o
OBJECTFILES=${OBJECTDIR}/adc.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_driver.o ${OBJECTDIR}/main.o ${OBJECTDIR}/msg_queues.o ${OBJECTDIR}/timers.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/xbee.o ${OBJECTDIR}/pwm.o ${OBJECTDIR}/pin_interrupts.o ${OBJECTDIR}/buffer.o
 
 
CFLAGS=
150,12 → 150,6
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/pwm.o pwm.c
@${DEP_GEN} -d ${OBJECTDIR}/pwm.o
${OBJECTDIR}/circular_buffer.o: circular_buffer.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/circular_buffer.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/circular_buffer.o circular_buffer.c
@${DEP_GEN} -d ${OBJECTDIR}/circular_buffer.o
${OBJECTDIR}/pin_interrupts.o: pin_interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/pin_interrupts.o.d
162,6 → 156,12
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/pin_interrupts.o pin_interrupts.c
@${DEP_GEN} -d ${OBJECTDIR}/pin_interrupts.o
${OBJECTDIR}/buffer.o: buffer.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/buffer.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/buffer.o buffer.c
@${DEP_GEN} -d ${OBJECTDIR}/buffer.o
else
${OBJECTDIR}/adc.o: adc.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
223,12 → 223,6
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/pwm.o pwm.c
@${DEP_GEN} -d ${OBJECTDIR}/pwm.o
${OBJECTDIR}/circular_buffer.o: circular_buffer.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/circular_buffer.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/circular_buffer.o circular_buffer.c
@${DEP_GEN} -d ${OBJECTDIR}/circular_buffer.o
${OBJECTDIR}/pin_interrupts.o: pin_interrupts.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/pin_interrupts.o.d
235,6 → 229,12
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/pin_interrupts.o pin_interrupts.c
@${DEP_GEN} -d ${OBJECTDIR}/pin_interrupts.o
${OBJECTDIR}/buffer.o: buffer.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@${RM} ${OBJECTDIR}/buffer.o.d
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/buffer.o buffer.c
@${DEP_GEN} -d ${OBJECTDIR}/buffer.o
endif
 
# ------------------------------------------------------------------------------------
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/Makefile-genesis.properties
1,5 → 1,5
#
#Fri Mar 30 14:44:06 EDT 2012
#Tue Apr 03 16:15:57 EDT 2012
default.com-microchip-mplab-nbide-toolchainC18-C18LanguageToolchain.md5=eb0ef9909fcaf68601725ab898eb3904
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\mplabc18\\v3.40\\bin
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=aacb4af1231509e2c363b0acdc0000a5
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/nbproject/configurations.xml
14,8 → 14,8
<itemPath>uart.h</itemPath>
<itemPath>xbee.h</itemPath>
<itemPath>pwm.h</itemPath>
<itemPath>circular_buffer.h</itemPath>
<itemPath>pin_interrupts.h</itemPath>
<itemPath>buffer.h</itemPath>
</logicalFolder>
<logicalFolder name="LibraryFiles"
displayName="Library Files"
42,8 → 42,8
<itemPath>uart.c</itemPath>
<itemPath>xbee.c</itemPath>
<itemPath>pwm.c</itemPath>
<itemPath>circular_buffer.c</itemPath>
<itemPath>pin_interrupts.c</itemPath>
<itemPath>buffer.c</itemPath>
</logicalFolder>
<logicalFolder name="ExternalFiles"
displayName="Important Files"
106,8 → 106,8
</C18>
<C18-AS>
<property key="default.radix" value="HEX"/>
<property key="hex.output.format" value="INHX32"/>
<property key="enable.case.sensitivity" value="true"/>
<property key="hex.output.format" value="INHX32"/>
<property key="preprocessor.macros" value=""/>
<property key="warning.level" value="0"/>
<property key="cross.reference.file" value=""/>
120,9 → 120,9
</C18-LD>
<C18LanguageToolchain>
<property key="stack-analysis-mplink" value="false"/>
<property key="stack-analysis-mcc18" value="false"/>
<property key="stack-analysis" value="false"/>
<property key="extended-mode-mcc18" value="false"/>
<property key="stack-analysis" value="false"/>
<property key="stack-analysis-mcc18" value="false"/>
<property key="extended-mode" value="false"/>
<property key="extended-mode-mpasm" value="false"/>
<property key="extended-mode-mplink" value="false"/>
145,8 → 145,8
<property key="programoptions.preserveprogramrange.start" value="0x0"/>
<property key="voltagevalue" value="3.25"/>
<property key="programoptions.preserveprogramrange" value="false"/>
<property key="memories.programmemory.start" value="0x0"/>
<property key="programoptions.eraseb4program" value="true"/>
<property key="memories.programmemory.start" value="0x0"/>
<property key="memories.programmemory.end" value="0x1fff7"/>
<property key="poweroptions.powerenable" value="false"/>
</PICkit3PlatformTool>
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/pin_interrupts.c
12,7 → 12,7
TRISCbits.TRISC2 = 0;
LATCbits.LATC2 = 0;
 
RPINR1 = 16; // Bind INT1 interrupt to RP2
RPINR1 = 2; // Bind INT1 interrupt to RP2
 
INTCON3bits.INT1IE = 1; // Enable interrupt for INT1
INTCON2bits.INTEDG1 = 0; // Trigger on falling edge
20,7 → 20,7
 
void int1_interrupt_handler() {
LATCbits.LATC2 = 1;
Delay10KTCYx(100);
Delay10TCYx(1);
LATCbits.LATC2 = 0;
}
 
44,9 → 44,6
LATBbits.LATB5 = 1;
LATBbits.LATB6 = 1;
LATBbits.LATB7 = 1;
 
// Enable Port B interrupt
INTCONbits.RBIE = 1;
}
 
void port_b_int_interrupt_handler() {
56,46 → 53,46
// Query which pin input value changed and send value to main()
if ((new_state ^ port_b_prev_state) & 0x01) {
if (port_b_prev_state & 0x01) {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B4 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_4_DOWN, (void *) 0);
} else {
// Pin transitioned LOW -> HIGH (button released)
DBG_PRINT_PORTB_INT("Port B4 LOW->HIGH\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_4_UP, (void *) 0);
} else {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B4 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_4_DOWN, (void *) 0);
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_4_UP, (void *) 0);
}
}
if ((new_state ^ port_b_prev_state) & 0x02) {
if (port_b_prev_state & 0x02) {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B5 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_5_DOWN, (void *) 0);
} else {
// Pin transitioned LOW -> HIGH (button released)
DBG_PRINT_PORTB_INT("Port B5 LOW->HIGH\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_5_UP, (void *) 0);
} else {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B5 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_5_DOWN, (void *) 0);
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_5_UP, (void *) 0);
}
}
if ((new_state ^ port_b_prev_state) & 0x04) {
if (port_b_prev_state & 0x04) {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B6 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_6_DOWN, (void *) 0);
} else {
// Pin transitioned LOW -> HIGH (button released)
DBG_PRINT_PORTB_INT("Port B6 LOW->HIGH\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_6_UP, (void *) 0);
} else {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B6 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_6_DOWN, (void *) 0);
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_6_UP, (void *) 0);
}
}
if ((new_state ^ port_b_prev_state) & 0x08) {
if (port_b_prev_state & 0x08) {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B7 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_7_DOWN, (void *) 0);
} else {
// Pin transitioned LOW -> HIGH (button released)
DBG_PRINT_PORTB_INT("Port B7 LOW->HIGH\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_7_UP, (void *) 0);
} else {
// Pin transitioned HIGH -> LOW (button pressed)
DBG_PRINT_PORTB_INT("Port B7 HIGH->LOW\r\n");
MQ_sendmsg_ToMainFromHigh(0, MSGTYPE_PORTB_7_DOWN, (void *) 0);
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_7_UP, (void *) 0);
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/pwm.c
10,20 → 10,22
LATCbits.LATC1 = 0;
 
RPOR11 = 14; // Set RP11 to ECCP1 PWM Output Channel A
RPOR12 = 18; // Set RP12 to ECCP2 PWM Output Channel A
RPOR12 = 15; // Set RP12 to ECCP1 PWM Output Channel B
}
 
void pwm_start() {
OpenEPWM1(0xFF, ECCP_1_SEL_TMR12);
SetDCEPWM1(500);
OpenEPWM1(0xFF, ECCP_1_SEL_TMR12); // 38kHz Frequency
SetDCEPWM1(512); // 50% Duty Cycle
 
// Wait for completion of a full PWM cycle before enabling output mode
while(!PIR1bits.TMR2IF);
SetOutputEPWM1(SINGLE_OUT, PWM_MODE_1);
 
OpenEPWM2(0xFF, ECCP_2_SEL_TMR12);
SetDCEPWM2(500);
SetOutputEPWM2(SINGLE_OUT, PWM_MODE_1);
// Enable ECCP1 output channels A and B
PSTR1CONbits.STRA = 1;
PSTR1CONbits.STRB = 1;
}
 
void pwm_stop() {
CloseEPWM1();
CloseEPWM2();
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/pwm.h
5,4 → 5,6
void pwm_start(void);
void pwm_stop(void);
 
static char pwm_on = 0;
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/timers.c
3,8 → 3,7
#include "msg_queues.h"
#include <timers.h>
#include "timers.h"
#include "adc.h"
#include "xbee.h"
#include "pwm.h"
 
void timers_init() {
/*--------------------Timer Delay Formulas-------------------- */
11,30 → 10,75
/* InitTMR0 = 256 - ( Delay * Frequency ) / ( 4* Prescaler) */
/* Delay = (256 - InitTMR0 * Prescaler) / (Frequency / 4) */
/* ----------------------------------------------------------- */
#ifdef _BASE_STATION
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_32);
T0CONbits.TMR0ON = 0; // Timer 0 initially off
#endif
 
// Set timer 0 to overflow every 512 clocks
// OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_256);
// Set timer 1 to overflow every two seconds
// // Set timer 1 to overflow every two seconds
// OpenTimer1(TIMER_INT_ON & T1_16BIT_RW &
// T1_SOURCE_PINOSC & T1_PS_1_1 &
// T1_OSC1EN_ON & T1_SYNC_EXT_OFF,
// TIMER_GATE_OFF & TIMER_GATE_INT_OFF);
#ifdef _REMOTE
// Open timer 2 for ECCP1 (PWM)
OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
 
// Open timer 2 for CCP1 (PWM)
OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
// Open timer 3 for PWM IR signaling
OpenTimer3(TIMER_INT_ON & T3_16BIT_RW & T3_SOURCE_FOSC_4 &
T3_OSC1EN_OFF & T3_PS_1_1 & T3_SYNC_EXT_OFF, TIMER_GATE_OFF);
T3CONbits.TMR3ON = 0; // Timer 3 initially off
#endif
}
 
// Interrupt handler for timer 0
void timer0_interrupt_handler() {
// xbee_process_transmit_frame_interrupt();
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_TIMER0, (void *) 0);
}
 
void timer0_enable() {
T0CONbits.TMR0ON = 1;
}
 
void timer0_disable() {
T0CONbits.TMR0ON = 0;
}
 
// Interrupt handler for timer 1
void timer1_interrupt_handler() {
// Set timer to overflow every 10ms
WriteTimer1(62259);
}
 
// xbee_process_transmit_frame_interrupt();
}
void timer3_interrupt_handler() {
if (!pwm_on) {
// Turn on PWM
pwm_start();
pwm_on = 1;
WriteTimer3(0xE500); // Send 38kHz pulses for 600us
} else {
// Turn off PWM
pwm_stop();
pwm_on = 0;
WriteTimer3(0xE500); // Send low for 0.6ms
// WriteTimer3(0xD000); // Send low for 1ms
// WriteTimer3(0xA000); // Send low for 2ms
// WriteTimer3(0x1000); // Send low for 5ms
}
}
 
void timer3_enable() {
// Enable timer and start PWM
T3CONbits.TMR3ON = 1;
pwm_start();
pwm_on = 1;
}
 
void timer3_disable() {
// Disable timer and stop PWM
T3CONbits.TMR3ON = 0;
pwm_stop();
pwm_on = 0;
}
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/timers.h
3,7 → 3,12
 
void timers_init(void);
void timer0_interrupt_handler(void);
void timer0_enable(void);
void timer0_disable(void);
void timer1_interrupt_handler(void);
void timer2_interrupt_handler(void);
void timer3_interrupt_handler(void);
void timer3_enable(void);
void timer3_disable(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 27J13/uart.c
18,10 → 18,10
USART_CONT_RX & // Continuously recieve messages
USART_BRGH_HIGH, 25); // Set UART speed to 115200 baud
 
// UART2 RX Pin RP6
RPINR16 = 6; // 10 is PPS RP6
// UART2 TX Pin RP5
RPOR5 = 6; // 6 is TX2/CK2 (EUSART2 Asynchronous Transmit/Asynchronous Clock Output)
// UART2 RX Pin RP5
RPINR16 = 5; // 5 is PPS RP5
// UART2 TX Pin RP6
RPOR6 = 6; // 6 is TX2/CK2 (EUSART2 Asynchronous Transmit/Asynchronous Clock Output)
Open2USART(USART_TX_INT_OFF & // Interrupt on TX off
USART_RX_INT_ON & // Interrupt on RX on