aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWinfried Ritsch <ritsch@users.sourceforge.net>2005-04-12 09:14:51 +0000
committerWinfried Ritsch <ritsch@users.sourceforge.net>2005-04-12 09:14:51 +0000
commitc4a712f3106d076f09ccb6783501d97e1f8490f8 (patch)
treef0fdf71af37e7554059202577edd1f91014a78f9
This commit was generated by cvs2svn to compensate for changes in r2726,svn2git-root
which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/iem/comport/; revision=2727
-rw-r--r--bird/bird.c375
-rw-r--r--bird/bird.dllbin0 -> 36864 bytes
-rw-r--r--bird/bird.pd_linuxbin0 -> 6896 bytes
-rw-r--r--comport.dllbin0 -> 36864 bytes
-rw-r--r--comport.expbin0 -> 578 bytes
-rw-r--r--comport.libbin0 -> 1952 bytes
-rw-r--r--comport.pd_linuxbin0 -> 9604 bytes
-rw-r--r--comport/CHANGES.txt8
-rw-r--r--comport/LICENCE.txt360
-rw-r--r--comport/README.txt29
-rw-r--r--comport/comport.c979
-rw-r--r--comport/makefile82
-rw-r--r--comport/testcomport.pd81
-rw-r--r--docs/Serial-Programming-HOWTO.book.pdfbin0 -> 19999 bytes
-rw-r--r--docs/serial.docbin0 -> 127488 bytes
-rw-r--r--docs/serial.pdf1565
-rw-r--r--licence.txt361
-rw-r--r--makefile104
-rw-r--r--pd_bird.bat5
-rw-r--r--pd_comport.bat5
-rw-r--r--testbird.pd96
-rw-r--r--testbird.sh2
-rw-r--r--testcomport.pd78
-rw-r--r--testcomport.sh2
-rw-r--r--vcmakefile.dsp85
-rw-r--r--vcmakefile.dsw29
-rw-r--r--vcmakefile.ncbbin0 -> 33792 bytes
-rw-r--r--vcmakefile.optbin0 -> 53760 bytes
-rw-r--r--vcmakefile.plg29
29 files changed, 4275 insertions, 0 deletions
diff --git a/bird/bird.c b/bird/bird.c
new file mode 100644
index 0000000..5f3df3c
--- /dev/null
+++ b/bird/bird.c
@@ -0,0 +1,375 @@
+/***********************************************************************
+************************************************************************
+bird.c - controls and parses one flock of bird out of a comport
+
+Author: W. Ritsch 16.01.97
+Desc.: put the object in a correct parse state and send commands
+
+first input: where data from bird is thrown in (eg.from comport)
+first output: a list of data which size is dependen on the parse mode
+second output: to control the bird eg connect to a comport in
+
+*/
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include <stdlib.h>
+#include <stdio.h> /* general I/O */
+#include <string.h> /* for string commands */
+#include "m_pd.h"
+
+#define B_MAX_DATA 32 /* Maximal awaited data per record */
+#define B_MAX_CMDDATA 6 /* Maximum of awaited cmd arguments */
+
+typedef struct {
+
+ t_object x_obj;
+ t_outlet *x_out2;
+ t_int x_n;
+ t_atom *x_vec;
+
+ int databytes; /* expected databytes */
+ int datacount; /* count bytes in record */
+ int phase_wait; /* wait for phasebit */
+
+ int datamode; /* data mode is data or examine*/
+/* int flowmode; stream or point mode */
+ int phase_error;
+
+ void (*writefun)(void *this,unsigned char c);
+
+ unsigned char data[B_MAX_DATA]; /* maximal record length */
+ char *argname;
+ int argc;
+ int argv[B_MAX_DATA];
+
+ int verbose;
+
+} bird_t;
+
+bird_t *bird_init( bird_t *this);
+int bird_data( bird_t *this, unsigned char data );
+void bird_setwritefun(bird_t *this,void (*newwritefun)(void *bird,unsigned char c));
+void bird_send(bird_t *this,unsigned char chr);
+void bird_bang(bird_t *this);
+void bird_set(bird_t *this,char *cmdname,long *cmddata);
+
+
+
+typedef struct {
+
+ char *name;
+ unsigned char cmd;
+ int cmdbytes; /* number of cmd arguments */
+ int cmdsize; /* size of arguments in bytes (most 2) */
+ int databytes; /* number of awaited data */
+ int datamode; /* data mode is ignore, point flow or examine*/
+
+} bird_cmd;
+
+
+/* defines Modes for data receiving */
+#define B_MODE_IGNORE 0
+#define B_MODE_POINT 1
+#define B_MODE_STREAM 2
+#define B_MODE_EXAM 3
+
+/*#define B_STREAM_ON 1
+ #define B_STREAM_OFF 0
+*/
+#define B_WAIT_PHASE 1
+#define B_FOUND_PHASE 0
+
+
+/* definitions */
+
+/* cmds accepted by the flock */
+static bird_cmd cmds[]= {
+
+ /* cmd , value, nr of cmdatabytes, cmddatasize, nr datainbytes
+ data modes, if change always point */
+ {"ANGLES", 'W', 0, 0, 6, B_MODE_POINT},
+ {"MATRIX", 'X', 0, 0, 18, B_MODE_POINT},
+ {"POSITION", 'V', 0, 0, 6, B_MODE_POINT},
+ {"QUATER", 0x5C, 0, 0, 8, B_MODE_POINT},
+ {"POSANG", 'Y', 0, 0, 12, B_MODE_POINT},
+ {"POSMAT", 'Z', 0, 0, 24, B_MODE_POINT},
+ {"POSQUATER", ']', 0, 0, 14, B_MODE_POINT},
+ /* output cmd */
+ {"POINT", 'B', 0, 0, 0, B_MODE_POINT},
+ {"STREAM", 64, 0, 0, 0, B_MODE_STREAM},
+ {"RUN", 'F', 0, 0, 0, B_MODE_IGNORE},
+ {"SLEEP", 'G', 0, 0, 0, B_MODE_IGNORE},
+ /* set cmds */
+ {"AngleAlign1", 'J', 6, 2, 0, B_MODE_IGNORE},
+ {"AngleAlign2", 'q', 3, 2, 0, B_MODE_IGNORE},
+ {"Hemisphere", 'L', 2, 1, 0, B_MODE_IGNORE},
+ {"RefFrame1", 'H', 6, 2, 0, B_MODE_IGNORE},
+ {"RefFrame2", 'r', 3, 2, 0, B_MODE_IGNORE},
+ {"RepRate1", 'Q', 0, 0, 0, B_MODE_IGNORE},
+ {"RepRate2", 'R', 0, 0, 0, B_MODE_IGNORE},
+ {"RepRate8", 'S', 0, 0, 0, B_MODE_IGNORE},
+ {"RepRate32", 'T', 0, 0, 0, B_MODE_IGNORE},
+ { NULL, '\0', 0, 0, 0, B_MODE_IGNORE}
+};
+
+
+
+/* -------------------- the serial object methods -------------------- */
+bird_t *bird_init( bird_t *this)
+{
+ if(this == NULL){
+ this = malloc(sizeof(bird_t));
+ }
+ if(this == NULL){
+ post("Could not allocate data for bird_t");
+ }
+
+ this->databytes = 0;
+ this->datacount = 0;
+ this->phase_wait = B_WAIT_PHASE;
+ this->datamode = B_MODE_IGNORE;
+ this->phase_error = 0;
+ this->writefun = NULL;
+
+ this->argname = "STARTUP_MODE";
+ this->argc = 0;
+
+
+ return this;
+}
+
+int bird_data( bird_t *this, unsigned char data )
+{
+ int i;
+
+ if(this->datamode != B_MODE_IGNORE){
+
+ /* STREAM or POINT Mode */
+
+ /* Phase was detected */
+ if(this->phase_wait == B_FOUND_PHASE && data < 0x80){
+
+ this->data[this->datacount] = data; /* store data */
+ this->datacount++; /* increment counter */
+
+ if(this->databytes <= this->datacount){ /* last byte of record */
+ this->datacount = 0;
+ this->phase_wait = B_WAIT_PHASE;
+
+ /* interpret and output */
+ this->argc = this->databytes / 2;
+ for(i=0;i<this->databytes;i+=2){
+
+ this->argv[i/2] = (this->data[i]<<2)+(this->data[i+1]<<9);
+
+ /* printf("list[%2d]=%7d (%3d,%3d) ",i,
+ ((this->data[i]<<2)+(this->data[i+1]<<9)),
+ this->data[i],this->data[i+1]);
+ */
+ }
+ // printf("\n");
+ return this->argc;
+ };
+ }
+ else{ /* Phase wait */
+
+ if( (data & 0x80) == 0x00 ){ /* phase bit not found */
+ if(this->phase_error == 0)
+ if(this->verbose)post("phase error:%x",data);
+ this->phase_error++;
+ }
+ else{
+ this->phase_wait = B_FOUND_PHASE; /* phase found */
+ this->data[0] = data & 0x7F; /* store first data */
+ this->datacount = 1; /* wait for next */
+ this->phase_error = 0; /* phase error reset */
+ };
+
+ };
+ }; /* stream or point mode */
+ return 0;
+}
+
+
+void bird_setwritefun(bird_t *bird,void (*newwritefun)(void *this,unsigned char c))
+{
+ //if(bird == NULL) return; better segfault and you find the error...
+ bird->writefun = newwritefun;
+}
+
+void bird_send(bird_t *this,unsigned char chr)
+{
+ // if(this == NULL)return; better segfault and you find the error...
+ if(this->writefun)this->writefun(this,chr);
+}
+
+/* with bang to trigger a data output (POINT) */
+
+void bird_bang(bird_t *this)
+{
+ if(this->datamode == B_MODE_POINT)
+ bird_send(this,'B');
+}
+
+/* set the modes for the bird */
+void bird_set(bird_t *this,char *cmdname,long *cmddata)
+{
+ int i,j;
+ long data;
+ bird_cmd *cmd = cmds;
+
+ /* search for cmd */
+ while(cmd->name != (char *) 0l && strcmp(cmd->name,cmdname) != 0)cmd++;
+
+ if(cmd->name == (char *) 0l){
+ post("bird:Dont know how to set %s",cmdname);
+ return;
+ }
+
+ /* CMD found */
+ if(cmd->databytes > 0){ /* if databytes awaited, else dont change */
+
+ this->databytes = cmd->databytes; /* expected databytes per record */
+ this->datacount = 0; /* start with first */
+ this->argname = cmd->name;
+
+ if( cmd->datamode == B_MODE_EXAM)
+ this->phase_wait = B_FOUND_PHASE; /* wait for phase-bit */
+ else
+ this->phase_wait = B_WAIT_PHASE; /* wait for phase-bit */
+ }
+
+ if( cmd->datamode != B_MODE_IGNORE) /* go into data mode */
+ this->datamode = cmd->datamode;
+
+
+ if(cmd->cmdbytes >= 0){ /* is a real cmd for bird */
+
+ bird_send(this,cmd->cmd);
+
+ for(i=0; i < cmd->cmdbytes;i++){
+
+ data = cmddata[i];
+
+ for(j=0; j < cmd->cmdsize;j++){ /* send it bytewise */
+ bird_send(this, (unsigned char) (data&0xFF));
+ data >>= 8;
+ };
+ };
+
+ }
+
+ if(this->verbose)post("command %s (%c): databytes=%d, mode=%d, phase=%d",
+ cmd->name,cmd->cmd,
+ this->databytes,
+ this->datamode, this->phase_wait);
+
+}
+
+
+/* ---------------- pd object bird ----------------- */
+
+/* code for bird pd class */
+
+
+void bird_float(bird_t *x, t_floatarg f)
+{
+ int n,i;
+
+ if((n=bird_data(x,(unsigned char) f)) > 0){
+
+ /* make list and output */
+
+ for(i=0; i < x->argc ; i++){
+ x->x_vec[i].a_type = A_FLOAT;
+ x->x_vec[i].a_w.w_float = x->argv[i];
+ }
+ outlet_list(x->x_obj.ob_outlet, &s_list, x->argc, x->x_vec);
+ }
+}
+
+void bird_setting(bird_t *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i;
+ char *cmdnam;
+ long buffer[ B_MAX_CMDDATA ];
+
+ if(argc < 1) return;
+ cmdnam = argv[0].a_w.w_symbol->s_name;
+
+ if(argc > (B_MAX_CMDDATA +1))
+ argc = B_MAX_CMDDATA +1;
+
+ for(i=1;i< argc;i++)
+ if(argv[i].a_type != A_FLOAT)
+ post("bird set arg %d no float",i);
+ else
+ buffer[i-1] = argv[i].a_w.w_float;
+
+ bird_set(x,cmdnam,buffer);
+}
+
+void bird_verbose(bird_t *x, t_floatarg f)
+{
+ if(f) x->verbose = 1;
+ else x->verbose = 0;
+}
+
+void bird_free(bird_t *x)
+{
+ freebytes(x->x_vec, x->x_n * sizeof(*x->x_vec));
+}
+
+t_class *bird_class;
+
+void bird_output(void *x,unsigned char c)
+{
+ outlet_float(((bird_t *)x)->x_out2, (t_float) c);
+}
+
+void *bird_new(void)
+{
+ bird_t *x;
+
+ x = (bird_t *)pd_new(bird_class);
+
+ outlet_new(&x->x_obj, &s_list);
+ x->x_out2 = outlet_new(&x->x_obj, &s_float);
+
+
+ x->x_vec = (t_atom *)getbytes((x->x_n=B_MAX_DATA) * sizeof(*x->x_vec));
+
+ bird_init(x);
+ bird_setwritefun(x,bird_output);
+
+ bird_set(x,"RUN",NULL);
+
+ bird_set(x,"POSANG",NULL);
+ // out_byte('W');
+
+ bird_set(x,"POINT",NULL);
+ // out_byte(64);
+
+ x->verbose = 0;
+
+ return (void *)x;
+}
+
+void bird_setup(void)
+{
+ bird_class = class_new(gensym("bird"), (t_newmethod)bird_new,
+ (t_method)bird_free, sizeof(bird_t), 0, 0);
+
+ /* maximum commandatasize is 6*/
+ class_addmethod(bird_class, (t_method)bird_setting, gensym("set"), A_GIMME, 0);
+ class_addmethod(bird_class, (t_method)bird_verbose, gensym("verbose"), A_FLOAT, 0);
+
+ class_addbang(bird_class,bird_bang);
+
+ class_addfloat(bird_class, bird_float);
+}
+
diff --git a/bird/bird.dll b/bird/bird.dll
new file mode 100644
index 0000000..a2a18ee
--- /dev/null
+++ b/bird/bird.dll
Binary files differ
diff --git a/bird/bird.pd_linux b/bird/bird.pd_linux
new file mode 100644
index 0000000..7021aa1
--- /dev/null
+++ b/bird/bird.pd_linux
Binary files differ
diff --git a/comport.dll b/comport.dll
new file mode 100644
index 0000000..ad6ecb7
--- /dev/null
+++ b/comport.dll
Binary files differ
diff --git a/comport.exp b/comport.exp
new file mode 100644
index 0000000..b79b0b4
--- /dev/null
+++ b/comport.exp
Binary files differ
diff --git a/comport.lib b/comport.lib
new file mode 100644
index 0000000..c456240
--- /dev/null
+++ b/comport.lib
Binary files differ
diff --git a/comport.pd_linux b/comport.pd_linux
new file mode 100644
index 0000000..d3c3a57
--- /dev/null
+++ b/comport.pd_linux
Binary files differ
diff --git a/comport/CHANGES.txt b/comport/CHANGES.txt
new file mode 100644
index 0000000..3247476
--- /dev/null
+++ b/comport/CHANGES.txt
@@ -0,0 +1,8 @@
+1.0RC1 - (12.4.2005)
+
+ first check in pure-data.sourceforge.net
+ added print feature and USB devices from posted by Marc Boon
+
+0.9beta2 (somedate before 2004)
+
+ CHANGES.txt startet
diff --git a/comport/LICENCE.txt b/comport/LICENCE.txt
new file mode 100644
index 0000000..9ca2743
--- /dev/null
+++ b/comport/LICENCE.txt
@@ -0,0 +1,360 @@
+comport - PD External for the serial Ports
+
+Institute for Electronic Music and Acoustics
+Copyright (C) 1998-2005 Winfried Ritsch
+
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version. (see below)
+
+--------------------------- GPL.TXT -------------------------
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
diff --git a/comport/README.txt b/comport/README.txt
new file mode 100644
index 0000000..aff44fa
--- /dev/null
+++ b/comport/README.txt
@@ -0,0 +1,29 @@
+comport - PD external for unix/windows to use the serial ports
+
+ (c) 1998-2005 Winfried Ritsch (see LICENCE.txt)
+ Institute for Electronic Music - Graz
+
+on Windows the COM0, COM1, ... are used and
+under Unix devices /dev/ttyS0, /dev/ttyS1, ...
+and new on unix /dev/USB0, ... and can be accessed via a Index.
+
+Please see testcomport.pd for more help.
+
+USE: There should be a external comport.dll for windows, comport.pd_linux for linux and so on.
+
+just copy it to the extra folder of your pd Installation or working directory.
+Please see testcomport.pd for more help.
+
+compile:
+
+ Unix (Linux):
+ make pd_linux, make pd_irix5, make pd_irix6
+ should produce a comport.pd_linux, ....
+
+
+ Windows: use nmake or just use Fast Build under MSVC++
+ nmake pd_nt
+
+
+If you have improvements or questions feel free to contact me under
+ritsch _at_ iem.at
diff --git a/comport/comport.c b/comport/comport.c
new file mode 100644
index 0000000..0fa9369
--- /dev/null
+++ b/comport/comport.c
@@ -0,0 +1,979 @@
+/* comport - PD external for unix/windows
+
+ (c) 1998-2005 Winfried Ritsch (see LICENCE.txt)
+ Institute for Electronic Music - Graz
+
+*/
+
+#include "m_pd.h"
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#include <windows.h>
+#include <commctrl.h>
+#else
+#include <sys/time.h>
+#include <fcntl.h>
+#include <termios.h> /* for TERMIO ioctl calls */
+#include <unistd.h>
+#define HANDLE int
+#define INVALID_HANDLE_VALUE -1
+#endif
+
+#include <string.h>
+#include <errno.h>
+
+
+typedef struct comport
+{
+ t_object x_obj;
+
+ long n; /* the state of a last input */
+
+ HANDLE comhandle; /* holds the comport handle */
+
+#ifdef NT
+ DCB dcb; /* holds the comm pars */
+ DCB dcb_old; /* holds the comm pars */
+ COMMTIMEOUTS old_timeouts;
+#else
+ struct termios oldcom_termio; /* save the old com config */
+ struct termios com_termio; /* for the new com config */
+#endif
+
+ short comport; /* holds the comport # */
+ float baud; /* holds the current baud rate */
+
+ short rxerrors; /* holds the rx line errors */
+
+ t_clock *x_clock;
+ int x_hit;
+ double x_deltime;
+
+} t_comport;
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+#ifndef ON
+#define ON 1
+#define OFF 0
+#endif
+
+/*
+ Serial Port Return Values
+*/
+#define NODATAAVAIL -1
+#define RXERRORS -2
+#define RXBUFOVERRUN -4
+#define TXBUFOVERRUN -5
+
+#ifdef NT
+
+#define COMPORT_MAX 8
+static char *sys_com_port[COMPORT_MAX] =
+{
+ "COM1", "COM2", "COM3", "COM4",
+ "COM5", "COM6", "COM7", "COM8"
+};
+
+static
+long baudspeedbittable[] =
+{
+ CBR_256000,
+ CBR_128000,
+ CBR_115200,
+ CBR_57600,
+ CBR_56000,
+ CBR_38400,
+ CBR_19200,
+ CBR_14400,
+ CBR_9600,
+ CBR_4800,
+ CBR_2400,
+ CBR_1200,
+ CBR_600,
+ CBR_300,
+ CBR_110
+};
+
+#else /* NT */
+
+#ifdef IRIX
+#define COMPORT_MAX 2
+static char *sys_com_port[COMPORT_MAX] =
+{
+ "/dev/ttyd1", "/dev/ttyd2"
+};
+#define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY)
+#define TIONREAD FIONREAD /* re map the IOCTL function */
+#define BAUDRATE_256000 -1
+#define BAUDRATE_128000 -1
+#define BAUDRATE_115200 -1
+#define BAUDRATE_57600 -1
+#define BAUDRATE_56000 -1
+#define BAUDRATE_38400 B38400
+#define BAUDRATE_14400 B19200 /* 14400 gibts nicht */
+#else /* IRIX */
+#define COMPORT_MAX 16
+static char *sys_com_port[COMPORT_MAX] =
+{
+ "/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3",
+ "/dev/ttyS4", "/dev/ttyS5", "/dev/ttyS6", "/dev/ttyS7",
+ "/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2", "/dev/ttyUSB3",
+ "/dev/ttyUSB4", "/dev/ttyUSB5", "/dev/ttyUSB6", "/dev/ttyUSB7"
+};
+#define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY)
+#define BAUDRATE_256000 -1
+#define BAUDRATE_128000 -1
+#define BAUDRATE_115200 B115200
+#define BAUDRATE_57600 B57600
+#define BAUDRATE_56000 B57600 /* 56000 gibts nicht */
+#define BAUDRATE_38400 B38400
+#define BAUDRATE_14400 B19200 /* 14400 gibts nicht */
+
+#endif /* else IRIX */
+
+static
+short baudspeedbittable[] =
+{
+ BAUDRATE_256000, /* CPU SPECIFIC */
+ BAUDRATE_128000, /* CPU SPECIFIC */
+ BAUDRATE_115200, /* CPU SPECIFIC */
+ BAUDRATE_57600, /* CPU SPECIFIC */
+ BAUDRATE_56000,
+ BAUDRATE_38400, /* CPU SPECIFIC */
+ B19200,
+ BAUDRATE_14400,
+ B9600,
+ B4800,
+ B2400,
+ B1200,
+ B600,
+ B300,
+ B110
+};
+
+struct timeval null_tv;
+
+#endif /* else NT */
+
+
+#define BAUDRATETABLE_LEN 15
+
+static
+long baudratetable[] =
+{
+ 256000L,
+ 128000L,
+ 115200L,
+ 57600L,
+ 56000L,
+ 38400L,
+ 19200L,
+ 14400L,
+ 9600L,
+ 4800L,
+ 2400L,
+ 1200L,
+ 600L,
+ 300L,
+ 110L
+}; /* holds the baud rate selections */
+
+t_class *comport_class;
+
+/* --------- sys independend serial setup helpers ---------------- */
+
+static long get_baud_ratebits(t_float *baud)
+{
+ int i = 0;
+
+ while(i < BAUDRATETABLE_LEN && baudratetable[i] > *baud)
+ i++;
+
+ /* nearest Baudrate finding */
+ if(i==BAUDRATETABLE_LEN || baudspeedbittable[i] < 0){
+ post("*Warning* The baud rate %d is not suported or out of range, using 9600\n",*baud);
+ i = 7;
+ }
+ *baud = baudratetable[i];
+
+ return baudspeedbittable[i];
+}
+
+
+/* ------------ sys dependend serial setup helpers ---------------- */
+
+
+/* --------------------- NT ------------------------------------ */
+
+#ifdef NT
+
+
+static float set_baudrate(t_comport *x,t_float baud)
+{
+ x->dcb.BaudRate = get_baud_ratebits(&baud);
+
+ return baud;
+}
+
+/* bits are 5,6,7,8(default) */
+
+static float set_bits(t_comport *x, int nr)
+{
+
+ if(nr < 4 && nr > 8)
+ nr = 8;
+
+ // number of bits/byte, 4-8
+ return x->dcb.ByteSize = nr;
+}
+
+
+/* 1 ... Parity even, -1 parity odd , 0 (default) no parity */
+static float set_parity(t_comport *x,int n)
+{
+ switch(n){
+ case 1:
+ x->dcb.fParity = TRUE; // enable parity checking
+ x->dcb.Parity = 2; // 0-4=no,odd,even,mark,space
+ return 1;
+
+ case -1:
+ x->dcb.fParity = TRUE; // enable parity checking
+ x->dcb.Parity = 1; // 0-4=no,odd,even,mark,space
+ return -1;
+
+ default:
+ x->dcb.fParity = FALSE; // enable parity checking
+ x->dcb.Parity = 0; // 0-4=no,odd,even,mark,space
+ }
+ return 0;
+}
+
+
+/* aktivate second stop bit with 1, 0(default)*/
+static float set_stopflag(t_comport *x, int nr)
+{
+ if(nr == 1){
+ x->dcb.StopBits = 1; // 0,1,2 = 1, 1.5, 2
+ return 1;
+ }
+ else
+ x->dcb.StopBits = 0; // 0,1,2 = 1, 1.5, 2
+
+ return 0;
+}
+
+/* never testet */
+static int set_ctsrts(t_comport *x, int nr)
+{
+ if(nr == 1){
+ x->dcb.fOutxCtsFlow = TRUE; // CTS output flow control
+ x->dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control
+ return 1;
+ }
+ x->dcb.fOutxCtsFlow = FALSE; // CTS output flow control
+ x->dcb.fRtsControl = RTS_CONTROL_DISABLE; // RTS flow control
+ return 0;
+}
+
+static int set_xonxoff(t_comport *x, int nr)
+{
+ // x->dcb.fTXContinueOnXoff = FALSE; // XOFF continues Tx
+
+ if(nr == 1){
+ x->dcb.fOutX = TRUE; // XON/XOFF out flow control
+ x->dcb.fInX = TRUE; // XON/XOFF in flow control
+ return 1;
+ }
+
+ x->dcb.fOutX = FALSE; // XON/XOFF out flow control
+ x->dcb.fInX = FALSE; // XON/XOFF in flow control
+ return 0;
+}
+
+
+static int set_serial(t_comport *x)
+{
+
+ if (SetCommState(x->comhandle, &(x->dcb)))
+ return 1;
+
+ return 0;
+}
+
+static HANDLE open_serial(int com_nr, t_comport *x)
+{
+ HANDLE fd;
+
+ COMMTIMEOUTS timeouts;
+
+ float *baud = &(x->baud);
+
+ if(com_nr < 0 || com_nr >= COMPORT_MAX) {
+ post("comport open %d, baud %d not valid (args: [portnum] [baud])",com_nr,*baud);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ fd = CreateFile( sys_com_port[com_nr],
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ 0,
+ OPEN_EXISTING,
+ FILE_FLAG_OVERLAPPED,
+ 0);
+
+ if(fd == INVALID_HANDLE_VALUE)
+ {
+ post("** ERROR ** could not open device %s:\n failure(%d): %s\n",
+ sys_com_port[com_nr],errno,strerror(errno));
+ return INVALID_HANDLE_VALUE;
+ }
+
+ /* Save the Current Port Configuration */
+
+ if (!GetCommState(fd, &(x->dcb_old))){
+ post("** ERROR ** could not get old dcb of device %s\n",
+ sys_com_port[com_nr]);
+
+ CloseHandle(fd);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ memset(&(x->dcb), sizeof(DCB), 0);
+
+ if (!GetCommState(fd, &(x->dcb))){
+ post("** ERROR ** could not get new dcb of device %s\n",
+ sys_com_port[com_nr]);
+
+ CloseHandle(fd);
+ return INVALID_HANDLE_VALUE;
+ }
+
+
+ x->dcb.fBinary = TRUE; // binary mode, no EOF check
+
+ // x->dcb.fOutxDsrFlow = FALSE; // DSR output flow control
+ // x->dcb.fDtrControl = DTR_CONTROL_DISABLE; // DTR flow control type
+
+ // x->dcb.fDsrSensitivity = FALSE; // DSR sensitivity
+
+ x->dcb.fErrorChar = FALSE; // enable error replacement
+ // x->dcb.fNull = FALSE; // enable null stripping
+
+ // DWORD x->dcb.fAbortOnError:1; // abort reads/writes on error
+
+ // char x->dcb.XonChar; // Tx and Rx XON character
+ // char x->dcb.XoffChar; // Tx and Rx XOFF character
+ // char x->dcb.ErrorChar; // error replacement character
+ // char x->dcb.EofChar; // end of input character
+ // char x->dcb.EvtChar; // received event character
+
+
+ set_bits(x,8); /* CS8 */
+ set_stopflag(x,0); /* ~CSTOPB */
+ set_ctsrts(x,0); /* ~CRTSCTS;*/
+ set_xonxoff(x,1); /* (IXON | IXOFF | IXANY) */
+ set_baudrate(x,*baud);
+
+ x->comhandle = fd;
+
+ if(set_serial(x))
+ {
+ post("Opened serial line device %s\n",sys_com_port[com_nr]);
+ }
+ else
+ {
+ post("** ERROR ** could not set params to control dcb of device %s\n",
+ sys_com_port[com_nr]);
+ CloseHandle(fd);
+ return INVALID_HANDLE_VALUE;
+ }
+
+
+
+ if (!GetCommTimeouts(fd, &(x->old_timeouts))){
+ post("Couldnt get old timeouts for serial device");
+ };
+
+ //setting new timeouts for read to immidiatly return
+ timeouts.ReadIntervalTimeout = MAXDWORD;
+ timeouts.ReadTotalTimeoutMultiplier = 0;
+ timeouts.ReadTotalTimeoutConstant = 0;
+ timeouts.WriteTotalTimeoutMultiplier = 0;
+ timeouts.WriteTotalTimeoutConstant = 0;
+
+ if (!SetCommTimeouts(fd, &timeouts)){
+ post("Couldnt set timeouts for serial device");
+ return INVALID_HANDLE_VALUE;
+ };
+
+
+ return fd;
+}
+
+static HANDLE close_serial(t_comport *x)
+{
+ if(x->comhandle != INVALID_HANDLE_VALUE){
+
+ if (!SetCommState(x->comhandle, &(x->dcb_old)) )
+ {
+ post("** ERROR ** could not reset params to DCB of device %s\n",
+ sys_com_port[x->comport]);
+ }
+
+ if (!SetCommTimeouts(x->comhandle, &(x->old_timeouts))){
+ post("Couldnt reset old_timeouts for serial device");
+ };
+
+ CloseHandle(x->comhandle);
+ }
+
+ return INVALID_HANDLE_VALUE;
+}
+
+
+static int write_serial(t_comport *x, unsigned char chr)
+{
+ OVERLAPPED osWrite = {0};
+ DWORD dwWritten;
+ DWORD dwRes;
+
+ /* post("open send %d",chr); */
+
+ if (!WriteFile(x->comhandle, &chr, 1, &dwWritten, &osWrite)) {
+ if (GetLastError() != ERROR_IO_PENDING)
+ post("WriteFile failed, but isn't delayed on serialdevice");
+ return 0;
+ }
+ return 1;
+}
+
+#else /* NT */
+/* ----------------- POSIX - UNIX ------------------------------ */
+
+
+static float set_baudrate(t_comport *x,t_float baud)
+{
+ struct termios *tio = &(x->com_termio);
+
+ long baudbits = get_baud_ratebits(&baud);
+
+ cfsetispeed(tio, baudbits);
+ cfsetospeed(tio, baudbits);
+
+ return baud;
+}
+
+/* bits are 5,6,7,8(default) */
+
+static float set_bits(t_comport *x, int nr)
+{
+ struct termios *tio = &(x->com_termio);
+ tio->c_cflag &= ~CSIZE;
+ switch(nr){
+ case 5: tio->c_cflag |= CS5; return 5;
+ case 6: tio->c_cflag |= CS6; return 6;
+ case 7: tio->c_cflag |= CS7; return 7;
+ default: tio->c_cflag |= CS8;
+ }
+ return 8;
+}
+
+
+/* 1 ... Parity even, -1 parity odd , 0 (default) no parity */
+static float set_parity(t_comport *x,int n)
+{
+ struct termios *tio = &(x->com_termio);
+
+ switch(n){
+ case 1:
+ tio->c_cflag |= PARENB; tio->c_cflag &= ~PARODD; return 1;
+ case -1:
+ tio->c_cflag |= PARENB | PARODD; return -1;
+ default:
+ tio->c_cflag &= ~PARENB;
+ }
+ return 0;
+}
+
+
+/* aktivate second stop bit with 1, 0(default)*/
+static float set_stopflag(t_comport *x, int nr)
+{
+ struct termios *tio = &(x->com_termio);
+
+ if(nr == 1){
+ tio->c_cflag |= CSTOPB;
+ return 1;
+ }
+ else
+ tio->c_cflag &= ~CSTOPB;
+ return 0;
+}
+
+/* never testet */
+static int set_ctsrts(t_comport *x, int nr)
+{
+ struct termios *tio = &(x->com_termio);
+
+ if(nr == 1){
+ tio->c_cflag |= CRTSCTS;
+ return 1;
+ }
+ tio->c_cflag &= ~CRTSCTS;
+ return 0;
+}
+
+static int set_xonxoff(t_comport *x, int nr)
+{
+ struct termios *tio = &(x->com_termio);
+
+ if(nr == 1){
+ tio->c_iflag |= (IXON | IXOFF | IXANY);
+ return 1;
+ }
+
+ tio->c_iflag &= ~IXON & ~IXOFF & ~IXANY;
+ return 0;
+}
+
+static int open_serial(int com_nr, t_comport *x)
+{
+ HANDLE fd;
+ struct termios *old = &(x->oldcom_termio);
+ struct termios *new = &(x->com_termio);
+ float *baud = &(x->baud);
+
+ if(com_nr < 0 || com_nr >= COMPORT_MAX) {
+ post("comport open %d, baud %d not valid (args: [portnum] [baud])");
+ return INVALID_HANDLE_VALUE;
+ }
+
+ if((fd = open(sys_com_port[com_nr], OPENPARAMS)) == INVALID_HANDLE_VALUE)
+ {
+ post("** ERROR ** could not open device %s:\n failure(%d): %s\n",
+ sys_com_port[com_nr],errno,strerror(errno));
+ return INVALID_HANDLE_VALUE;
+ }
+
+ /* set no wait on any operation */
+ fcntl(fd, F_SETFL, FNDELAY);
+
+ /* Save the Current Port Configuration */
+ if(tcgetattr(fd, old) == -1 || tcgetattr(fd, new) == -1){
+ post("** ERROR ** could not get termios-structure of device %s\n",
+ sys_com_port[com_nr]);
+ close(fd);
+ return INVALID_HANDLE_VALUE;
+ }
+
+
+ /* Setupt the new port configuration...NON-CANONICAL INPUT MODE
+ .. as defined in termios.h
+ */
+
+ /* enable input and ignore modem controls */
+ new->c_cflag |= (CREAD | CLOCAL);
+
+ /* always nocanonical, this means raw i/o no terminal */
+ new->c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+
+ /* no post processing */
+ new->c_oflag &= ~OPOST;
+
+ /* setup to return after 0 seconds
+ ..if no characters are received
+ TIME units are assumed to be 0.1 secs */
+ /* not needed anymore ??? in new termios in linux
+ new->c_cc[VMIN] = 0;
+ new->c_cc[VTIME] = 0;
+ */
+
+ /* defaults, see input */
+
+ set_bits(x,8); /* CS8 */
+ set_stopflag(x,0); /* ~CSTOPB */
+ set_ctsrts(x,0); /* ~CRTSCTS;*/
+ set_xonxoff(x,1); /* (IXON | IXOFF | IXANY) */
+ set_baudrate(x,*baud);
+
+ if(tcsetattr(fd, TCSAFLUSH, new) != -1)
+ {
+ post("Opened serial line device %s\n",sys_com_port[com_nr]);
+ }
+ else
+ {
+ post("** ERROR ** could not set params to ioctl of device %s\n",
+ sys_com_port[com_nr]);
+ close(fd);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ return fd;
+}
+
+
+static int close_serial(t_comport *x)
+{
+ struct termios *tios = &(x->com_termio);
+ HANDLE fd = x->comhandle;
+
+ if(fd != INVALID_HANDLE_VALUE){
+ tcsetattr(fd, TCSANOW, tios);
+ close(fd);
+ }
+ return INVALID_HANDLE_VALUE;
+}
+
+
+static int set_serial(t_comport *x)
+{
+ if(tcsetattr(x->comhandle, TCSAFLUSH, &(x->com_termio)) == -1)
+ return 0;
+ return 1;
+}
+
+static int write_serial(t_comport *x, unsigned char chr)
+{
+
+ return write(x->comhandle,(char *) &chr,1);
+
+ /* flush pending I/O chars */
+ /* but nowadays discards them ;-(
+ else{
+ ioctl(x->comhandle,TCFLSH,TCOFLUSH);
+ }
+ */
+}
+
+
+#endif /* else NT */
+
+
+/* ------------------- serial pd methods --------------------------- */
+static void comport_pollintervall(t_comport *x, t_floatarg g)
+{
+ if (g < 1) g = 1;
+ x->x_deltime = g;
+}
+
+static void comport_tick(t_comport *x)
+{
+ unsigned char chr;
+ int err;
+ HANDLE fd = x->comhandle;
+
+ x->x_hit = 0;
+
+
+ if(fd == INVALID_HANDLE_VALUE) return;
+
+ /* while there are bytes, read them and send them out, ignore errors */
+#ifdef NT
+ {
+ DWORD dwCommEvent;
+ DWORD dwRead;
+
+ err = 0;
+
+// if (!SetCommMask(x->comhandle, EV_RXCHAR))
+// post(" Error setting communications event mask for serial device");
+
+// for ( ; ; ) {
+// if (WaitCommEvent(x->comhandle, &dwCommEvent,NULL)) {
+ do {
+
+ if(ReadFile(x->comhandle, &chr, 1, &dwRead, NULL))
+ if(dwRead > 0)
+ outlet_float(x->x_obj.ob_outlet, (t_float) chr);
+ else{
+ err = -1;
+ break;
+ }
+ } while (dwRead);
+// }
+// else{
+// post("serial dev: Error in WaitCommEvent");
+ // break;
+// }
+ //}
+ }
+#else
+ {
+ fd_set com_rfds;
+ FD_ZERO(&com_rfds);
+ FD_SET(fd,&com_rfds);
+
+ while((err=select(fd+1,&com_rfds,NULL,NULL,&null_tv)) > 0) {
+
+ err = read(fd,(char *) &chr,1);
+
+ /* while( (err = read(fd,(char *) &chr,1)) > 0){ */
+ outlet_float(x->x_obj.ob_outlet, (t_float) chr);
+
+ };
+ }
+#endif
+
+ if(err < 0){ /* if an readerror detected */
+ if(x->rxerrors == 0) /* post it once */
+ post("RXERRORS on serial line\n");
+ x->rxerrors = 1; /* remember */
+ }
+
+ if (!x->x_hit) clock_delay(x->x_clock, 1);
+}
+
+static void comport_float(t_comport *x,t_float f)
+{
+ unsigned char chr = ((int) f) & 0xFF; /* brutal conv */
+
+ if (write_serial(x,chr) != 1)
+ {
+ post("Write error, maybe TX-OVERRUNS on serial line");
+ }
+}
+
+static void *comport_new(t_floatarg comnr, t_floatarg fbaud) {
+
+ t_comport test;
+ t_comport *x;
+ int com_nr = comnr;
+ HANDLE fd;
+
+
+/* Open the Comport for RD and WR and get a handle */
+ test.baud = fbaud;
+ fd = open_serial(com_nr,&test);
+
+ if(fd == INVALID_HANDLE_VALUE ){
+ /* postings in open routine */
+ return 0;
+ }
+
+ /* Now nothing really bad could happen so we create the class */
+
+ x = (t_comport *)pd_new(comport_class);
+
+ x->comport = com_nr;
+ x->baud = test.baud;
+ x->comhandle = fd; /* holds the comport handle */
+
+#ifdef NT
+
+ memcpy(&(test.dcb_old),&(x->dcb_old),sizeof(DCB)); // save the old com config
+ memcpy(&(test.dcb),&(x->dcb),sizeof(DCB)); // for the new com config
+
+#else
+ /* save the old com and new com config */
+ bcopy(&(test.oldcom_termio),&(x->oldcom_termio),sizeof(struct termios));
+ bcopy(&(test.com_termio),&(x->com_termio),sizeof(struct termios));
+#endif
+
+ x->rxerrors = 0; /* holds the rx line errors */
+
+ outlet_new(&x->x_obj, &s_float);
+
+ x->x_hit = 0;
+ x->x_deltime = 1;
+ x->x_clock = clock_new(x, (t_method)comport_tick);
+
+ clock_delay(x->x_clock, x->x_deltime);
+
+ return x;
+}
+
+
+static void
+comport_free(t_comport *x)
+{
+ post("close serial...");
+
+ clock_unset(x->x_clock);
+ clock_free(x->x_clock);
+ x->comhandle = close_serial(x);
+}
+
+/* ---------------- use serial settings ------------- */
+
+static void comport_baud(t_comport *x,t_floatarg f)
+{
+ if(f == x->baud){
+ post("baudrate already %f\n",x->baud);
+ return;
+ }
+
+ x->baud = set_baudrate(x,f);
+
+ if(x->comhandle == INVALID_HANDLE_VALUE)return;
+
+ if(set_serial(x) == 0){
+ post("** ERROR ** could not set baudrate of device %s\n",
+ sys_com_port[x->comport]);
+ }
+ else post("set baudrate of %s to %f\n",sys_com_port[x->comport],x->baud);
+}
+
+static void comport_bits(t_comport *x,t_floatarg f)
+{
+ f = set_bits(x,f);
+
+ if(x->comhandle == INVALID_HANDLE_VALUE)return;
+
+ if(set_serial(x) == 0){
+ post("** ERROR ** could not set bits of device %s\n",
+ sys_com_port[x->comport]);
+ }
+ else post("set bits of %s to %f\n",sys_com_port[x->comport],f);
+}
+
+
+static void comport_parity(t_comport *x,t_floatarg f)
+{
+ f = set_parity(x,f);
+
+ if(x->comhandle == INVALID_HANDLE_VALUE)return;
+
+ if(set_serial(x) == 0){
+ post("** ERROR ** could not set extra paritybit of device %s\n",
+ sys_com_port[x->comport]);
+ }
+ else post("set extra paritybit of %s to %f\n",sys_com_port[x->comport],f);
+}
+
+static void comport_stopbit(t_comport *x,t_floatarg f)
+{
+ f = set_stopflag(x,f);
+
+ if(x->comhandle == INVALID_HANDLE_VALUE)return;
+
+ if(set_serial(x) == 0){
+ post("** ERROR ** could not set extra stopbit of device %s\n",
+ sys_com_port[x->comport]);
+ }
+ else post("set extra stopbit of %s to %f\n",sys_com_port[x->comport],f);
+}
+
+static void comport_rtscts(t_comport *x,t_floatarg f)
+{
+ f = set_ctsrts(x,f);
+
+ if(x->comhandle == INVALID_HANDLE_VALUE)return;
+
+ if(set_serial(x) == 0){
+ post("** ERROR ** could not set rts_cts of device %s\n",
+ sys_com_port[x->comport]);
+ }
+ else post("set rts-cts of %s to %f\n",sys_com_port[x->comport],f);
+}
+
+static void comport_xonxoff(t_comport *x,t_floatarg f)
+{
+ f = set_xonxoff(x,f);
+
+ if(x->comhandle == INVALID_HANDLE_VALUE)return;
+
+ if(set_serial(x) == 0){
+ post("** ERROR ** could not set xonxoff of device %s\n",
+ sys_com_port[x->comport]);
+ }
+ else post("set xonxoff of %s to %f\n",sys_com_port[x->comport],f);
+}
+
+static void comport_close(t_comport *x)
+{
+ clock_unset(x->x_clock);
+ x->x_hit = 1;
+ x->comhandle = close_serial(x);
+}
+
+static void comport_open(t_comport *x, t_floatarg f)
+{
+ if(x->comhandle != INVALID_HANDLE_VALUE)
+ comport_close(x);
+
+
+ x->comhandle = open_serial(f,x);
+
+ clock_delay(x->x_clock, x->x_deltime);
+}
+
+/*
+ dangerous but if you really have some stupid devicename ...
+ you can open any file on systems if suid is set on pd be careful
+*/
+
+static void comport_devicename(t_comport *x, t_symbol *s)
+{
+ if(x->comport >= 0 && x->comport < COMPORT_MAX){
+ sys_com_port[x->comport] = s->s_name;
+ }
+}
+
+static void comport_print(t_comport *x, t_symbol *s, int argc, t_atom *argv)
+{
+ static char buf[256];
+ while(argc--) {
+ atom_string(argv++, buf, 255);
+ char *pch = buf;
+ while(*pch != 0) {
+ write_serial(x, *pch++);
+ }
+ if(argc > 0) {
+ write_serial(x, ' ');
+ }
+ }
+}
+/* ---------------- SETUP OBJECTS ------------------ */
+
+void comport_setup(void)
+{
+ comport_class
+ = class_new(gensym("comport"), (t_newmethod)comport_new,
+ (t_method)comport_free, sizeof(t_comport),
+ 0, A_DEFFLOAT, A_DEFFLOAT, 0);
+
+ class_addfloat(comport_class, (t_method)comport_float);
+
+ /*
+ class_addbang(comport_class, comport_bang
+ */
+
+
+ class_addmethod(comport_class, (t_method)comport_baud, gensym("baud"),
+ A_FLOAT, 0);
+
+
+ class_addmethod(comport_class, (t_method)comport_bits, gensym("bits"),
+ A_FLOAT, 0);
+ class_addmethod(comport_class, (t_method)comport_stopbit, gensym("stopbit"),
+ A_FLOAT, 0);
+ class_addmethod(comport_class, (t_method)comport_rtscts, gensym("rtscts"),
+ A_FLOAT, 0);
+ class_addmethod(comport_class, (t_method)comport_parity, gensym("parity"),
+ A_FLOAT, 0);
+ class_addmethod(comport_class, (t_method)comport_xonxoff, gensym("xonxoff"),
+ A_FLOAT, 0);
+ class_addmethod(comport_class, (t_method)comport_close, gensym("close"), 0);
+ class_addmethod(comport_class, (t_method)comport_open, gensym("open"),
+ A_FLOAT, 0);
+ class_addmethod(comport_class, (t_method)comport_devicename, gensym("devicename"),
+ A_SYMBOL, 0);
+ class_addmethod(comport_class, (t_method)comport_print, gensym("print"),
+ A_GIMME, 0);
+
+ class_addmethod(comport_class, (t_method)comport_pollintervall, gensym("pollintervall"),
+ A_FLOAT, 0);
+#ifndef NT
+ null_tv.tv_sec = 0; /* no wait */
+ null_tv.tv_usec = 0;
+#endif
+}
+
+
diff --git a/comport/makefile b/comport/makefile
new file mode 100644
index 0000000..48e9db2
--- /dev/null
+++ b/comport/makefile
@@ -0,0 +1,82 @@
+# comport - PD external for unix/windows
+#
+# (c) 1998-2005 Winfried Ritsch (see LICENCE.txt)
+# Institute for Electronic Music - Graz
+#
+#
+
+current:
+ echo choose one command: make pd_linux, make pd_nt, make pd_irix5, make pd_irix6
+
+# ----------------------- NT -----------------------
+pd_nt: comport.dll
+
+.SUFFIXES: .dll
+
+PDNTCFLAGS = /W3 /WX /DNT /DPD /nologo /DWIN2000
+
+VC="C:\Programme\Microsoft Visual Studio\Vc98"
+PDROOT="C:\Programme\pd"
+
+PDNTINCLUDE = /I. /I$(PDROOT)\tcl\include /I$(PDROOT)\src /I$(VC)\include
+
+PDNTLDIR = $(VC)\lib
+PDNTLIB = $(PDNTLDIR)\libc.lib \
+ $(PDNTLDIR)\oldnames.lib \
+ $(PDNTLDIR)\kernel32.lib \
+ $(PDROOT)\bin\pd.lib
+
+.c.dll:
+ cl $(PDNTCFLAGS) $(PDNTINCLUDE) /c $*.c
+ link /dll /export:$*_setup $*.obj $(PDNTLIB)
+
+# ----------------------- IRIX 5.x -----------------------
+pd_irix5: comport.pd_irix5
+
+.SUFFIXES: .pd_irix5
+
+SGICFLAGS5 = -o32 -DPD -DSGI -O2
+
+
+SGIINCLUDE = -I../../src
+
+.c.pd_irix5:
+ cc $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c
+ ld -elf -shared -rdata_shared -o $*.pd_irix5 $*.o
+ rm $*.o
+
+# ----------------------- IRIX 6.x -----------------------
+pd_irix6: comport.pd_irix6
+
+.SUFFIXES: .pd_irix6
+
+SGICFLAGS6 = -DPD -DSGI -n32 \
+ -OPT:roundoff=3 -OPT:IEEE_arithmetic=3 -OPT:cray_ivdep=true \
+ -Ofast=ip32
+
+SGICFLAGS5 = -DPD -O2 -DSGI
+
+SGIINCLUDE = -I/../../src
+
+.c.pd_irix6:
+ cc $(SGICFLAGS6) $(SGIINCLUDE) -o $*.o -c $*.c
+ ld -elf -shared -rdata_shared -o $*.pd_irix6 $*.o
+ rm $*.o
+
+# ----------------------- LINUX i386 -----------------------
+
+pd_linux: comport.pd_linux
+
+.SUFFIXES: .pd_linux
+
+LINUXCFLAGS = -DPD -O2 -funroll-loops -fomit-frame-pointer \
+ -Wall -W -Wshadow -Wstrict-prototypes -Werror \
+ -Wno-unused -Wno-parentheses -Wno-switch
+
+LINUXINCLUDE = -I../../src
+
+.c.pd_linux:
+ cc $(LINUXCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c
+ ld -export_dynamic -shared -o $*.pd_linux $*.o -lc -lm
+ strip --strip-unneeded $*.pd_linux
+ rm $*.o
diff --git a/comport/testcomport.pd b/comport/testcomport.pd
new file mode 100644
index 0000000..0dbfcf2
--- /dev/null
+++ b/comport/testcomport.pd
@@ -0,0 +1,81 @@
+#N canvas 199 244 693 475 10;
+#X obj 97 231 comport 1 9600;
+#X msg 13 213 66;
+#X obj 88 361 print;
+#X floatatom 195 190 4 0 0 0 - - -;
+#X msg 12 171 64;
+#X text 12 191 point;
+#X text 11 150 stream;
+#X msg 13 263 86;
+#X text 13 238 position;
+#X msg 16 307 70;
+#X msg 14 347 71;
+#X text 15 290 run;
+#X text 14 325 sleep;
+#X floatatom 121 269 4 0 0 0 - - -;
+#X obj 90 325 spigot;
+#X msg 109 298 1;
+#X msg 143 299 0;
+#X msg 314 48 bits 8;
+#X msg 313 72 stopbit 0;
+#X msg 312 100 parity 0;
+#X msg 313 129 xonxoff 1;
+#X msg 313 155 rtscts 0;
+#X text 392 103 parity 1=even \, -1=odd \, 0=off;
+#X text 392 74 extra stopbit 1=on \, 0=off;
+#X text 394 49 databits 5 \, 6 \, 7 \, 8;
+#X text 393 20 use exact or higher baudrate;
+#X obj 94 200 r comctl;
+#X obj 271 294 s comctl;
+#X text 394 128 use handshake xon/off 1=on 0=off;
+#X text 392 154 cts/rts hardwarehandshake 1=on 0=off;
+#X msg 318 201 pollintervall 1;
+#X text 430 191 set pollintervall for read in ms;
+#X text 430 205 (default is 1 tick 1ms);
+#X msg 317 233 close;
+#X msg 317 259 open 1;
+#X msg 314 23 baud 10000;
+#X text 383 230 Close Serial port;
+#X text 381 263 Open seriel board Nr (0=COM1 \, 1=COM2 \, ...);
+#X msg 263 354 devicename /dev/ttyS1;
+#X text 257 375 Danger !!! you can open every file in your system and
+maybe if suid is root damage the system.;
+#X text 258 336 set devicename for actuell port \, then close and open
+again;
+#X obj 195 165 spigot;
+#X msg 214 138 1;
+#X msg 247 143 0;
+#X obj 190 112 key;
+#X text 260 324 never should be needed except for sys admins (only
+unix);
+#X msg 309 0 baud 300;
+#X text 3 -10 (C) 1998-2005 IEM Winfried Ritsch GPL (see LICENSE.txt)
+;
+#X text 14 388;
+#X text 1 41 please improve...;
+#X connect 0 0 13 0;
+#X connect 0 0 14 0;
+#X connect 1 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 7 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 14 0 2 0;
+#X connect 15 0 14 1;
+#X connect 16 0 14 1;
+#X connect 17 0 27 0;
+#X connect 18 0 27 0;
+#X connect 19 0 27 0;
+#X connect 20 0 27 0;
+#X connect 21 0 27 0;
+#X connect 26 0 0 0;
+#X connect 30 0 27 0;
+#X connect 33 0 27 0;
+#X connect 34 0 27 0;
+#X connect 35 0 27 0;
+#X connect 41 0 3 0;
+#X connect 42 0 41 1;
+#X connect 43 0 41 1;
+#X connect 44 0 41 0;
+#X connect 46 0 27 0;
diff --git a/docs/Serial-Programming-HOWTO.book.pdf b/docs/Serial-Programming-HOWTO.book.pdf
new file mode 100644
index 0000000..91328af
--- /dev/null
+++ b/docs/Serial-Programming-HOWTO.book.pdf
Binary files differ
diff --git a/docs/serial.doc b/docs/serial.doc
new file mode 100644
index 0000000..8cd6310
--- /dev/null
+++ b/docs/serial.doc
Binary files differ
diff --git a/docs/serial.pdf b/docs/serial.pdf
new file mode 100644
index 0000000..b901cea
--- /dev/null
+++ b/docs/serial.pdf
@@ -0,0 +1,1565 @@
+%PDF-1.2
+%
+1 0 obj<</Producer(htmldoc 1.8.3 Copyright 1997-1999 Easy Software Products, All Rights Reserved.)/CreationDate(D:19991216005723Z)/Title(Serial Programming Guide for POSIX Operating Systems)/Author(Michael R. Sweet)>>endobj
+2 0 obj<</Type/Encoding/Differences[ 32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/minus/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 145/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 159/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]>>endobj
+3 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding 2 0 R>>endobj
+4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier-Oblique/Encoding 2 0 R>>endobj
+5 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman/Encoding 2 0 R>>endobj
+6 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Bold/Encoding 2 0 R>>endobj
+7 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Italic/Encoding 2 0 R>>endobj
+8 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-BoldItalic/Encoding 2 0 R>>endobj
+9 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica-Bold/Encoding 2 0 R>>endobj
+10 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica-Oblique/Encoding 2 0 R>>endobj
+11 0 obj<</Type/Font/Subtype/Type1/BaseFont/Symbol>>endobj
+12 0 obj<</Subtype/Link/Rect[108.0 262.0 145.6 275.0]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+13 0 obj<</Subtype/Link/Rect[145.6 262.0 156.6 275.0]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+14 0 obj<</Subtype/Link/Rect[156.6 262.0 188.0 275.0]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+15 0 obj<</Subtype/Link/Rect[188.0 262.0 200.0 275.0]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+16 0 obj<</Subtype/Link/Rect[200.0 262.0 228.4 275.0]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+17 0 obj<</Subtype/Link/Rect[228.4 262.0 288.9 275.0]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+18 0 obj<</Subtype/Link/Rect[108.0 248.8 145.6 261.8]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+19 0 obj<</Subtype/Link/Rect[145.6 248.8 156.6 261.8]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+20 0 obj<</Subtype/Link/Rect[156.6 248.8 213.1 261.8]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+21 0 obj<</Subtype/Link/Rect[213.1 248.8 229.3 261.8]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+22 0 obj<</Subtype/Link/Rect[229.3 248.8 257.7 261.8]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+23 0 obj<</Subtype/Link/Rect[257.7 248.8 276.0 261.8]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+24 0 obj<</Subtype/Link/Rect[108.0 222.4 145.6 235.4]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+25 0 obj<</Subtype/Link/Rect[145.6 222.4 156.6 235.4]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+26 0 obj<</Subtype/Link/Rect[156.6 222.4 203.9 235.4]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+27 0 obj<</Subtype/Link/Rect[203.9 222.4 232.3 235.4]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+28 0 obj<</Subtype/Link/Rect[232.3 222.4 292.8 235.4]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+29 0 obj<</Subtype/Link/Rect[108.0 209.2 154.1 222.2]/Border[0 0 0]/Dest[384 0 R/XYZ null 812 0]>>endobj
+30 0 obj<</Subtype/Link/Rect[154.1 209.2 167.6 222.2]/Border[0 0 0]/Dest[384 0 R/XYZ null 812 0]>>endobj
+31 0 obj<</Subtype/Link/Rect[167.6 209.2 206.5 222.2]/Border[0 0 0]/Dest[384 0 R/XYZ null 812 0]>>endobj
+32 0 obj<</Subtype/Link/Rect[206.5 209.2 239.5 222.2]/Border[0 0 0]/Dest[384 0 R/XYZ null 812 0]>>endobj
+33 0 obj<</Subtype/Link/Rect[108.0 196.0 154.1 209.0]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+34 0 obj<</Subtype/Link/Rect[154.1 196.0 167.0 209.0]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+35 0 obj<</Subtype/Link/Rect[167.0 196.0 198.4 209.0]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+36 0 obj<</Subtype/Link/Rect[198.4 196.0 234.8 209.0]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+37 0 obj<</Subtype/Link/Rect[234.8 196.0 262.3 209.0]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+38 0 obj[12 0 R
+13 0 R
+14 0 R
+15 0 R
+16 0 R
+17 0 R
+18 0 R
+19 0 R
+20 0 R
+21 0 R
+22 0 R
+23 0 R
+24 0 R
+25 0 R
+26 0 R
+27 0 R
+28 0 R
+29 0 R
+30 0 R
+31 0 R
+32 0 R
+33 0 R
+34 0 R
+35 0 R
+36 0 R
+37 0 R
+]endobj
+39 0 obj<</S/URI/URI(http://www.eia.org)>>endobj
+40 0 obj<</Subtype/Link/Rect[400.2 688.6 448.2 699.6]/Border[0 0 0]/A 39 0 R>>endobj
+41 0 obj<</S/URI/URI(http://www.eia.org)>>endobj
+42 0 obj<</Subtype/Link/Rect[448.2 688.6 491.6 699.6]/Border[0 0 0]/A 41 0 R>>endobj
+43 0 obj<</S/URI/URI(http://www.eia.org)>>endobj
+44 0 obj<</Subtype/Link/Rect[36.0 675.4 90.7 686.4]/Border[0 0 0]/A 43 0 R>>endobj
+45 0 obj<</S/URI/URI(http://www.eia.org)>>endobj
+46 0 obj<</Subtype/Link/Rect[90.7 675.4 125.3 686.4]/Border[0 0 0]/A 45 0 R>>endobj
+47 0 obj[40 0 R
+42 0 R
+44 0 R
+46 0 R
+]endobj
+48 0 obj<</Subtype/Link/Rect[466.4 207.9 509.8 220.9]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+49 0 obj<</Subtype/Link/Rect[36.0 194.7 77.9 207.7]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+50 0 obj<</Subtype/Link/Rect[77.9 194.7 103.8 207.7]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+51 0 obj<</Subtype/Link/Rect[103.8 194.7 119.4 207.7]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+52 0 obj<</Subtype/Link/Rect[119.4 194.7 174.7 207.7]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+53 0 obj<</Subtype/Link/Rect[174.7 194.7 229.4 207.7]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+54 0 obj<</Subtype/Link/Rect[229.4 194.7 274.4 207.7]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+55 0 obj[48 0 R
+49 0 R
+50 0 R
+51 0 R
+52 0 R
+53 0 R
+54 0 R
+]endobj
+56 0 obj<</Subtype/Link/Rect[190.2 623.8 227.8 636.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+57 0 obj<</Subtype/Link/Rect[227.8 623.8 238.8 636.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+58 0 obj<</Subtype/Link/Rect[238.8 623.8 278.5 636.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+59 0 obj<</Subtype/Link/Rect[275.8 623.8 287.1 636.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+60 0 obj<</Subtype/Link/Rect[287.1 623.8 333.5 636.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+61 0 obj[56 0 R
+57 0 R
+58 0 R
+59 0 R
+60 0 R
+]endobj
+62 0 obj<</Subtype/Link/Rect[430.1 481.0 458.8 494.0]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+63 0 obj[62 0 R
+]endobj
+64 0 obj<</Subtype/Link/Rect[83.9 316.4 121.5 329.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+65 0 obj<</Subtype/Link/Rect[121.5 316.4 132.5 329.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+66 0 obj<</Subtype/Link/Rect[132.5 316.4 189.0 329.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+67 0 obj<</Subtype/Link/Rect[189.0 316.4 205.2 329.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+68 0 obj<</Subtype/Link/Rect[205.2 316.4 233.6 329.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+69 0 obj<</Subtype/Link/Rect[233.6 316.4 252.0 329.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+70 0 obj[64 0 R
+65 0 R
+66 0 R
+67 0 R
+68 0 R
+69 0 R
+]endobj
+71 0 obj<</Subtype/Link/Rect[72.0 673.2 131.9 686.2]/Border[0 0 0]/Dest[294 0 R/XYZ null 812 0]>>endobj
+72 0 obj<</Subtype/Link/Rect[72.0 646.8 113.9 659.8]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+73 0 obj<</Subtype/Link/Rect[113.9 646.8 124.9 659.8]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+74 0 obj<</Subtype/Link/Rect[124.9 646.8 156.9 659.8]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+75 0 obj<</Subtype/Link/Rect[156.9 646.8 168.9 659.8]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+76 0 obj<</Subtype/Link/Rect[168.9 646.8 199.1 659.8]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+77 0 obj<</Subtype/Link/Rect[199.1 646.8 279.2 659.8]/Border[0 0 0]/Dest[300 0 R/XYZ null 812 0]>>endobj
+78 0 obj<</Subtype/Link/Rect[108.0 633.6 134.6 646.6]/Border[0 0 0]/Dest[300 0 R/XYZ null 409 0]>>endobj
+79 0 obj<</Subtype/Link/Rect[134.6 633.6 153.8 646.6]/Border[0 0 0]/Dest[300 0 R/XYZ null 409 0]>>endobj
+80 0 obj<</Subtype/Link/Rect[153.8 633.6 182.2 646.6]/Border[0 0 0]/Dest[300 0 R/XYZ null 409 0]>>endobj
+81 0 obj<</Subtype/Link/Rect[182.2 633.6 262.3 646.6]/Border[0 0 0]/Dest[300 0 R/XYZ null 409 0]>>endobj
+82 0 obj<</Subtype/Link/Rect[108.0 620.4 134.6 633.4]/Border[0 0 0]/Dest[303 0 R/XYZ null 793 0]>>endobj
+83 0 obj<</Subtype/Link/Rect[134.6 620.4 145.3 633.4]/Border[0 0 0]/Dest[303 0 R/XYZ null 793 0]>>endobj
+84 0 obj<</Subtype/Link/Rect[145.3 620.4 186.3 633.4]/Border[0 0 0]/Dest[303 0 R/XYZ null 793 0]>>endobj
+85 0 obj<</Subtype/Link/Rect[144.0 607.2 174.9 620.2]/Border[0 0 0]/Dest[303 0 R/XYZ null 264 0]>>endobj
+86 0 obj<</Subtype/Link/Rect[174.9 607.2 224.4 620.2]/Border[0 0 0]/Dest[303 0 R/XYZ null 264 0]>>endobj
+87 0 obj<</Subtype/Link/Rect[108.0 594.0 174.3 607.0]/Border[0 0 0]/Dest[306 0 R/XYZ null 298 0]>>endobj
+88 0 obj<</Subtype/Link/Rect[174.3 594.0 249.5 607.0]/Border[0 0 0]/Dest[306 0 R/XYZ null 298 0]>>endobj
+89 0 obj<</Subtype/Link/Rect[144.0 580.8 170.6 593.8]/Border[0 0 0]/Dest[309 0 R/XYZ null 498 0]>>endobj
+90 0 obj<</Subtype/Link/Rect[170.6 580.8 189.8 593.8]/Border[0 0 0]/Dest[309 0 R/XYZ null 498 0]>>endobj
+91 0 obj<</Subtype/Link/Rect[189.8 580.8 210.3 593.8]/Border[0 0 0]/Dest[309 0 R/XYZ null 498 0]>>endobj
+92 0 obj<</Subtype/Link/Rect[210.3 580.8 245.4 593.8]/Border[0 0 0]/Dest[309 0 R/XYZ null 498 0]>>endobj
+93 0 obj<</Subtype/Link/Rect[245.4 580.8 264.1 593.8]/Border[0 0 0]/Dest[309 0 R/XYZ null 498 0]>>endobj
+94 0 obj<</Subtype/Link/Rect[264.1 580.8 286.4 593.8]/Border[0 0 0]/Dest[309 0 R/XYZ null 498 0]>>endobj
+95 0 obj<</Subtype/Link/Rect[286.4 580.8 323.6 593.8]/Border[0 0 0]/Dest[309 0 R/XYZ null 498 0]>>endobj
+96 0 obj<</Subtype/Link/Rect[144.0 567.6 169.4 580.6]/Border[0 0 0]/Dest[309 0 R/XYZ null 361 0]>>endobj
+97 0 obj<</Subtype/Link/Rect[169.4 567.6 203.0 580.6]/Border[0 0 0]/Dest[309 0 R/XYZ null 361 0]>>endobj
+98 0 obj<</Subtype/Link/Rect[144.0 554.4 170.6 567.4]/Border[0 0 0]/Dest[312 0 R/XYZ null 777 0]>>endobj
+99 0 obj<</Subtype/Link/Rect[170.6 554.4 181.3 567.4]/Border[0 0 0]/Dest[312 0 R/XYZ null 777 0]>>endobj
+100 0 obj<</Subtype/Link/Rect[181.3 554.4 188.9 567.4]/Border[0 0 0]/Dest[312 0 R/XYZ null 777 0]>>endobj
+101 0 obj<</Subtype/Link/Rect[188.9 554.4 220.1 567.4]/Border[0 0 0]/Dest[312 0 R/XYZ null 777 0]>>endobj
+102 0 obj<</Subtype/Link/Rect[108.0 541.2 168.2 554.2]/Border[0 0 0]/Dest[312 0 R/XYZ null 665 0]>>endobj
+103 0 obj<</Subtype/Link/Rect[168.2 541.2 243.4 554.2]/Border[0 0 0]/Dest[312 0 R/XYZ null 665 0]>>endobj
+104 0 obj<</Subtype/Link/Rect[108.0 528.0 156.0 541.0]/Border[0 0 0]/Dest[312 0 R/XYZ null 376 0]>>endobj
+105 0 obj<</Subtype/Link/Rect[156.0 528.0 184.4 541.0]/Border[0 0 0]/Dest[312 0 R/XYZ null 376 0]>>endobj
+106 0 obj<</Subtype/Link/Rect[184.4 528.0 207.0 541.0]/Border[0 0 0]/Dest[312 0 R/XYZ null 376 0]>>endobj
+107 0 obj<</Subtype/Link/Rect[144.0 514.8 172.4 527.8]/Border[0 0 0]/Dest[312 0 R/XYZ null 286 0]>>endobj
+108 0 obj<</Subtype/Link/Rect[172.4 514.8 193.5 527.8]/Border[0 0 0]/Dest[312 0 R/XYZ null 286 0]>>endobj
+109 0 obj<</Subtype/Link/Rect[193.5 514.8 214.9 527.8]/Border[0 0 0]/Dest[312 0 R/XYZ null 286 0]>>endobj
+110 0 obj<</Subtype/Link/Rect[144.0 501.6 184.6 514.6]/Border[0 0 0]/Dest[315 0 R/XYZ null 717 0]>>endobj
+111 0 obj<</Subtype/Link/Rect[184.6 501.6 192.3 514.6]/Border[0 0 0]/Dest[315 0 R/XYZ null 717 0]>>endobj
+112 0 obj<</Subtype/Link/Rect[192.3 501.6 220.7 514.6]/Border[0 0 0]/Dest[315 0 R/XYZ null 717 0]>>endobj
+113 0 obj<</Subtype/Link/Rect[220.7 501.6 239.0 514.6]/Border[0 0 0]/Dest[315 0 R/XYZ null 717 0]>>endobj
+114 0 obj<</Subtype/Link/Rect[144.0 488.4 181.0 501.4]/Border[0 0 0]/Dest[318 0 R/XYZ null 631 0]>>endobj
+115 0 obj<</Subtype/Link/Rect[181.0 488.4 204.5 501.4]/Border[0 0 0]/Dest[318 0 R/XYZ null 631 0]>>endobj
+116 0 obj<</Subtype/Link/Rect[204.5 488.4 215.8 501.4]/Border[0 0 0]/Dest[318 0 R/XYZ null 631 0]>>endobj
+117 0 obj<</Subtype/Link/Rect[215.8 488.4 232.0 501.4]/Border[0 0 0]/Dest[318 0 R/XYZ null 631 0]>>endobj
+118 0 obj<</Subtype/Link/Rect[232.0 488.4 250.3 501.4]/Border[0 0 0]/Dest[318 0 R/XYZ null 631 0]>>endobj
+119 0 obj<</Subtype/Link/Rect[144.0 475.2 183.4 488.2]/Border[0 0 0]/Dest[318 0 R/XYZ null 474 0]>>endobj
+120 0 obj<</Subtype/Link/Rect[183.4 475.2 206.9 488.2]/Border[0 0 0]/Dest[318 0 R/XYZ null 474 0]>>endobj
+121 0 obj<</Subtype/Link/Rect[206.9 475.2 231.1 488.2]/Border[0 0 0]/Dest[318 0 R/XYZ null 474 0]>>endobj
+122 0 obj<</Subtype/Link/Rect[231.1 475.2 247.3 488.2]/Border[0 0 0]/Dest[318 0 R/XYZ null 474 0]>>endobj
+123 0 obj<</Subtype/Link/Rect[247.3 475.2 265.6 488.2]/Border[0 0 0]/Dest[318 0 R/XYZ null 474 0]>>endobj
+124 0 obj<</Subtype/Link/Rect[144.0 462.0 181.0 475.0]/Border[0 0 0]/Dest[318 0 R/XYZ null 262 0]>>endobj
+125 0 obj<</Subtype/Link/Rect[181.0 462.0 188.6 475.0]/Border[0 0 0]/Dest[318 0 R/XYZ null 262 0]>>endobj
+126 0 obj<</Subtype/Link/Rect[188.6 462.0 217.0 475.0]/Border[0 0 0]/Dest[318 0 R/XYZ null 262 0]>>endobj
+127 0 obj<</Subtype/Link/Rect[217.0 462.0 235.4 475.0]/Border[0 0 0]/Dest[318 0 R/XYZ null 262 0]>>endobj
+128 0 obj<</Subtype/Link/Rect[72.0 435.6 113.9 448.6]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+129 0 obj<</Subtype/Link/Rect[113.9 435.6 124.9 448.6]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+130 0 obj<</Subtype/Link/Rect[124.9 435.6 185.1 448.6]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+131 0 obj<</Subtype/Link/Rect[185.1 435.6 202.5 448.6]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+132 0 obj<</Subtype/Link/Rect[202.5 435.6 232.7 448.6]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+133 0 obj<</Subtype/Link/Rect[232.7 435.6 253.5 448.6]/Border[0 0 0]/Dest[324 0 R/XYZ null 812 0]>>endobj
+134 0 obj<</Subtype/Link/Rect[108.0 422.4 127.9 435.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 422 0]>>endobj
+135 0 obj<</Subtype/Link/Rect[127.9 422.4 162.4 435.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 422 0]>>endobj
+136 0 obj<</Subtype/Link/Rect[162.4 422.4 205.5 435.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 422 0]>>endobj
+137 0 obj<</Subtype/Link/Rect[205.5 422.4 244.5 435.4]/Border[0 0 0]/Dest[324 0 R/XYZ null 422 0]>>endobj
+138 0 obj<</Subtype/Link/Rect[144.0 409.2 180.4 422.2]/Border[0 0 0]/Dest[327 0 R/XYZ null 717 0]>>endobj
+139 0 obj<</Subtype/Link/Rect[180.4 409.2 215.2 422.2]/Border[0 0 0]/Dest[327 0 R/XYZ null 717 0]>>endobj
+140 0 obj<</Subtype/Link/Rect[144.0 396.0 171.8 409.0]/Border[0 0 0]/Dest[336 0 R/XYZ null 272 0]>>endobj
+141 0 obj<</Subtype/Link/Rect[171.8 396.0 206.6 409.0]/Border[0 0 0]/Dest[336 0 R/XYZ null 272 0]>>endobj
+142 0 obj<</Subtype/Link/Rect[144.0 382.8 170.0 395.8]/Border[0 0 0]/Dest[342 0 R/XYZ null 777 0]>>endobj
+143 0 obj<</Subtype/Link/Rect[170.0 382.8 204.8 395.8]/Border[0 0 0]/Dest[342 0 R/XYZ null 777 0]>>endobj
+144 0 obj<</Subtype/Link/Rect[144.0 369.6 177.3 382.6]/Border[0 0 0]/Dest[345 0 R/XYZ null 620 0]>>endobj
+145 0 obj<</Subtype/Link/Rect[177.3 369.6 212.1 382.6]/Border[0 0 0]/Dest[345 0 R/XYZ null 620 0]>>endobj
+146 0 obj<</Subtype/Link/Rect[144.0 356.4 180.4 369.4]/Border[0 0 0]/Dest[348 0 R/XYZ null 235 0]>>endobj
+147 0 obj<</Subtype/Link/Rect[180.4 356.4 227.4 369.4]/Border[0 0 0]/Dest[348 0 R/XYZ null 235 0]>>endobj
+148 0 obj<</Subtype/Link/Rect[72.0 330.0 113.9 343.0]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+149 0 obj<</Subtype/Link/Rect[113.9 330.0 124.9 343.0]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+150 0 obj<</Subtype/Link/Rect[124.9 330.0 172.2 343.0]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+151 0 obj<</Subtype/Link/Rect[172.2 330.0 252.3 343.0]/Border[0 0 0]/Dest[354 0 R/XYZ null 812 0]>>endobj
+152 0 obj<</Subtype/Link/Rect[108.0 316.8 134.6 329.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 409 0]>>endobj
+153 0 obj<</Subtype/Link/Rect[134.6 316.8 145.3 329.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 409 0]>>endobj
+154 0 obj<</Subtype/Link/Rect[145.3 316.8 152.9 329.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 409 0]>>endobj
+155 0 obj<</Subtype/Link/Rect[152.9 316.8 199.9 329.8]/Border[0 0 0]/Dest[354 0 R/XYZ null 409 0]>>endobj
+156 0 obj<</Subtype/Link/Rect[108.0 303.6 181.6 316.6]/Border[0 0 0]/Dest[354 0 R/XYZ null 252 0]>>endobj
+157 0 obj<</Subtype/Link/Rect[181.6 303.6 206.4 316.6]/Border[0 0 0]/Dest[354 0 R/XYZ null 252 0]>>endobj
+158 0 obj<</Subtype/Link/Rect[206.4 303.6 214.0 316.6]/Border[0 0 0]/Dest[354 0 R/XYZ null 252 0]>>endobj
+159 0 obj<</Subtype/Link/Rect[214.0 303.6 256.2 316.6]/Border[0 0 0]/Dest[354 0 R/XYZ null 252 0]>>endobj
+160 0 obj<</Subtype/Link/Rect[144.0 290.4 185.9 303.4]/Border[0 0 0]/Dest[360 0 R/XYZ null 777 0]>>endobj
+161 0 obj<</Subtype/Link/Rect[185.9 290.4 230.8 303.4]/Border[0 0 0]/Dest[360 0 R/XYZ null 777 0]>>endobj
+162 0 obj<</Subtype/Link/Rect[230.8 290.4 280.9 303.4]/Border[0 0 0]/Dest[360 0 R/XYZ null 777 0]>>endobj
+163 0 obj<</Subtype/Link/Rect[144.0 277.2 187.7 290.2]/Border[0 0 0]/Dest[360 0 R/XYZ null 274 0]>>endobj
+164 0 obj<</Subtype/Link/Rect[187.7 277.2 232.6 290.2]/Border[0 0 0]/Dest[360 0 R/XYZ null 274 0]>>endobj
+165 0 obj<</Subtype/Link/Rect[232.6 277.2 306.3 290.2]/Border[0 0 0]/Dest[360 0 R/XYZ null 274 0]>>endobj
+166 0 obj<</Subtype/Link/Rect[306.3 277.2 347.8 290.2]/Border[0 0 0]/Dest[360 0 R/XYZ null 274 0]>>endobj
+167 0 obj<</Subtype/Link/Rect[72.0 250.8 113.9 263.8]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+168 0 obj<</Subtype/Link/Rect[113.9 250.8 124.9 263.8]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+169 0 obj<</Subtype/Link/Rect[124.9 250.8 174.7 263.8]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+170 0 obj<</Subtype/Link/Rect[174.7 250.8 204.9 263.8]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+171 0 obj<</Subtype/Link/Rect[204.9 250.8 270.9 263.8]/Border[0 0 0]/Dest[366 0 R/XYZ null 812 0]>>endobj
+172 0 obj<</Subtype/Link/Rect[108.0 237.6 136.4 250.6]/Border[0 0 0]/Dest[366 0 R/XYZ null 422 0]>>endobj
+173 0 obj<</Subtype/Link/Rect[136.4 237.6 157.5 250.6]/Border[0 0 0]/Dest[366 0 R/XYZ null 422 0]>>endobj
+174 0 obj<</Subtype/Link/Rect[157.5 237.6 194.2 250.6]/Border[0 0 0]/Dest[366 0 R/XYZ null 422 0]>>endobj
+175 0 obj<</Subtype/Link/Rect[144.0 224.4 179.8 237.4]/Border[0 0 0]/Dest[369 0 R/XYZ null 389 0]>>endobj
+176 0 obj<</Subtype/Link/Rect[179.8 224.4 195.9 237.4]/Border[0 0 0]/Dest[369 0 R/XYZ null 389 0]>>endobj
+177 0 obj<</Subtype/Link/Rect[195.9 224.4 232.3 237.4]/Border[0 0 0]/Dest[369 0 R/XYZ null 389 0]>>endobj
+178 0 obj<</Subtype/Link/Rect[232.3 224.4 264.7 237.4]/Border[0 0 0]/Dest[369 0 R/XYZ null 389 0]>>endobj
+179 0 obj<</Subtype/Link/Rect[144.0 211.2 177.9 224.2]/Border[0 0 0]/Dest[372 0 R/XYZ null 556 0]>>endobj
+180 0 obj<</Subtype/Link/Rect[177.9 211.2 194.1 224.2]/Border[0 0 0]/Dest[372 0 R/XYZ null 556 0]>>endobj
+181 0 obj<</Subtype/Link/Rect[194.1 211.2 230.5 224.2]/Border[0 0 0]/Dest[372 0 R/XYZ null 556 0]>>endobj
+182 0 obj<</Subtype/Link/Rect[230.5 211.2 262.9 224.2]/Border[0 0 0]/Dest[372 0 R/XYZ null 556 0]>>endobj
+183 0 obj<</Subtype/Link/Rect[144.0 198.0 179.8 211.0]/Border[0 0 0]/Dest[372 0 R/XYZ null 300 0]>>endobj
+184 0 obj<</Subtype/Link/Rect[179.8 198.0 195.9 211.0]/Border[0 0 0]/Dest[372 0 R/XYZ null 300 0]>>endobj
+185 0 obj<</Subtype/Link/Rect[195.9 198.0 234.7 211.0]/Border[0 0 0]/Dest[372 0 R/XYZ null 300 0]>>endobj
+186 0 obj<</Subtype/Link/Rect[234.7 198.0 246.7 211.0]/Border[0 0 0]/Dest[372 0 R/XYZ null 300 0]>>endobj
+187 0 obj<</Subtype/Link/Rect[246.7 198.0 274.5 211.0]/Border[0 0 0]/Dest[372 0 R/XYZ null 300 0]>>endobj
+188 0 obj<</Subtype/Link/Rect[274.5 198.0 317.2 211.0]/Border[0 0 0]/Dest[372 0 R/XYZ null 300 0]>>endobj
+189 0 obj<</Subtype/Link/Rect[108.0 184.8 151.7 197.8]/Border[0 0 0]/Dest[375 0 R/XYZ null 760 0]>>endobj
+190 0 obj<</Subtype/Link/Rect[151.7 184.8 177.7 197.8]/Border[0 0 0]/Dest[375 0 R/XYZ null 760 0]>>endobj
+191 0 obj<</Subtype/Link/Rect[177.7 184.8 201.8 197.8]/Border[0 0 0]/Dest[375 0 R/XYZ null 760 0]>>endobj
+192 0 obj<</Subtype/Link/Rect[201.8 184.8 209.4 197.8]/Border[0 0 0]/Dest[375 0 R/XYZ null 760 0]>>endobj
+193 0 obj<</Subtype/Link/Rect[209.4 184.8 237.8 197.8]/Border[0 0 0]/Dest[375 0 R/XYZ null 760 0]>>endobj
+194 0 obj<</Subtype/Link/Rect[237.8 184.8 256.2 197.8]/Border[0 0 0]/Dest[375 0 R/XYZ null 760 0]>>endobj
+195 0 obj<</Subtype/Link/Rect[144.0 171.6 163.9 184.6]/Border[0 0 0]/Dest[375 0 R/XYZ null 551 0]>>endobj
+196 0 obj<</Subtype/Link/Rect[163.9 171.6 206.9 184.6]/Border[0 0 0]/Dest[375 0 R/XYZ null 551 0]>>endobj
+197 0 obj<</Subtype/Link/Rect[206.9 171.6 242.1 184.6]/Border[0 0 0]/Dest[375 0 R/XYZ null 551 0]>>endobj
+198 0 obj<</Subtype/Link/Rect[242.1 171.6 260.4 184.6]/Border[0 0 0]/Dest[375 0 R/XYZ null 551 0]>>endobj
+199 0 obj<</Subtype/Link/Rect[144.0 158.4 173.0 171.4]/Border[0 0 0]/Dest[375 0 R/XYZ null 214 0]>>endobj
+200 0 obj<</Subtype/Link/Rect[173.0 158.4 189.2 171.4]/Border[0 0 0]/Dest[375 0 R/XYZ null 214 0]>>endobj
+201 0 obj<</Subtype/Link/Rect[189.2 158.4 232.3 171.4]/Border[0 0 0]/Dest[375 0 R/XYZ null 214 0]>>endobj
+202 0 obj<</Subtype/Link/Rect[232.3 158.4 267.5 171.4]/Border[0 0 0]/Dest[375 0 R/XYZ null 214 0]>>endobj
+203 0 obj<</Subtype/Link/Rect[267.5 158.4 285.8 171.4]/Border[0 0 0]/Dest[375 0 R/XYZ null 214 0]>>endobj
+204 0 obj<</Subtype/Link/Rect[144.0 145.2 173.0 158.2]/Border[0 0 0]/Dest[378 0 R/XYZ null 202 0]>>endobj
+205 0 obj<</Subtype/Link/Rect[173.0 145.2 216.1 158.2]/Border[0 0 0]/Dest[378 0 R/XYZ null 202 0]>>endobj
+206 0 obj<</Subtype/Link/Rect[216.1 145.2 238.4 158.2]/Border[0 0 0]/Dest[378 0 R/XYZ null 202 0]>>endobj
+207 0 obj<</Subtype/Link/Rect[238.4 145.2 254.6 158.2]/Border[0 0 0]/Dest[378 0 R/XYZ null 202 0]>>endobj
+208 0 obj<</Subtype/Link/Rect[254.6 145.2 265.3 158.2]/Border[0 0 0]/Dest[378 0 R/XYZ null 202 0]>>endobj
+209 0 obj<</Subtype/Link/Rect[265.3 145.2 309.0 158.2]/Border[0 0 0]/Dest[378 0 R/XYZ null 202 0]>>endobj
+210 0 obj<</Subtype/Link/Rect[309.0 145.2 342.0 158.2]/Border[0 0 0]/Dest[378 0 R/XYZ null 202 0]>>endobj
+211 0 obj<</Subtype/Link/Rect[72.0 118.8 120.6 131.8]/Border[0 0 0]/Dest[384 0 R/XYZ null 812 0]>>endobj
+212 0 obj<</Subtype/Link/Rect[120.6 118.8 134.0 131.8]/Border[0 0 0]/Dest[384 0 R/XYZ null 812 0]>>endobj
+213 0 obj<</Subtype/Link/Rect[134.0 118.8 169.5 131.8]/Border[0 0 0]/Dest[384 0 R/XYZ null 812 0]>>endobj
+214 0 obj<</Subtype/Link/Rect[108.0 105.6 146.9 118.6]/Border[0 0 0]/Dest[384 0 R/XYZ null 422 0]>>endobj
+215 0 obj<</Subtype/Link/Rect[146.9 105.6 179.9 118.6]/Border[0 0 0]/Dest[384 0 R/XYZ null 422 0]>>endobj
+216 0 obj<</Subtype/Link/Rect[108.0 92.4 146.9 105.4]/Border[0 0 0]/Dest[387 0 R/XYZ null 609 0]>>endobj
+217 0 obj<</Subtype/Link/Rect[146.9 92.4 179.9 105.4]/Border[0 0 0]/Dest[387 0 R/XYZ null 609 0]>>endobj
+218 0 obj<</Subtype/Link/Rect[108.0 79.2 146.9 92.2]/Border[0 0 0]/Dest[390 0 R/XYZ null 793 0]>>endobj
+219 0 obj<</Subtype/Link/Rect[146.9 79.2 174.1 92.2]/Border[0 0 0]/Dest[390 0 R/XYZ null 793 0]>>endobj
+220 0 obj<</Subtype/Link/Rect[174.1 79.2 211.7 92.2]/Border[0 0 0]/Dest[390 0 R/XYZ null 793 0]>>endobj
+221 0 obj<</Subtype/Link/Rect[211.7 79.2 244.7 92.2]/Border[0 0 0]/Dest[390 0 R/XYZ null 793 0]>>endobj
+222 0 obj<</Subtype/Link/Rect[108.0 66.0 128.5 79.0]/Border[0 0 0]/Dest[390 0 R/XYZ null 469 0]>>endobj
+223 0 obj<</Subtype/Link/Rect[128.5 66.0 161.5 79.0]/Border[0 0 0]/Dest[390 0 R/XYZ null 469 0]>>endobj
+224 0 obj[71 0 R
+72 0 R
+73 0 R
+74 0 R
+75 0 R
+76 0 R
+77 0 R
+78 0 R
+79 0 R
+80 0 R
+81 0 R
+82 0 R
+83 0 R
+84 0 R
+85 0 R
+86 0 R
+87 0 R
+88 0 R
+89 0 R
+90 0 R
+91 0 R
+92 0 R
+93 0 R
+94 0 R
+95 0 R
+96 0 R
+97 0 R
+98 0 R
+99 0 R
+100 0 R
+101 0 R
+102 0 R
+103 0 R
+104 0 R
+105 0 R
+106 0 R
+107 0 R
+108 0 R
+109 0 R
+110 0 R
+111 0 R
+112 0 R
+113 0 R
+114 0 R
+115 0 R
+116 0 R
+117 0 R
+118 0 R
+119 0 R
+120 0 R
+121 0 R
+122 0 R
+123 0 R
+124 0 R
+125 0 R
+126 0 R
+127 0 R
+128 0 R
+129 0 R
+130 0 R
+131 0 R
+132 0 R
+133 0 R
+134 0 R
+135 0 R
+136 0 R
+137 0 R
+138 0 R
+139 0 R
+140 0 R
+141 0 R
+142 0 R
+143 0 R
+144 0 R
+145 0 R
+146 0 R
+147 0 R
+148 0 R
+149 0 R
+150 0 R
+151 0 R
+152 0 R
+153 0 R
+154 0 R
+155 0 R
+156 0 R
+157 0 R
+158 0 R
+159 0 R
+160 0 R
+161 0 R
+162 0 R
+163 0 R
+164 0 R
+165 0 R
+166 0 R
+167 0 R
+168 0 R
+169 0 R
+170 0 R
+171 0 R
+172 0 R
+173 0 R
+174 0 R
+175 0 R
+176 0 R
+177 0 R
+178 0 R
+179 0 R
+180 0 R
+181 0 R
+182 0 R
+183 0 R
+184 0 R
+185 0 R
+186 0 R
+187 0 R
+188 0 R
+189 0 R
+190 0 R
+191 0 R
+192 0 R
+193 0 R
+194 0 R
+195 0 R
+196 0 R
+197 0 R
+198 0 R
+199 0 R
+200 0 R
+201 0 R
+202 0 R
+203 0 R
+204 0 R
+205 0 R
+206 0 R
+207 0 R
+208 0 R
+209 0 R
+210 0 R
+211 0 R
+212 0 R
+213 0 R
+214 0 R
+215 0 R
+216 0 R
+217 0 R
+218 0 R
+219 0 R
+220 0 R
+221 0 R
+222 0 R
+223 0 R
+]endobj
+225 0 obj<</Subtype/Link/Rect[36.0 673.2 84.6 686.2]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+226 0 obj<</Subtype/Link/Rect[84.6 673.2 97.4 686.2]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+227 0 obj<</Subtype/Link/Rect[97.4 673.2 130.7 686.2]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+228 0 obj<</Subtype/Link/Rect[130.7 673.2 170.2 686.2]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+229 0 obj<</Subtype/Link/Rect[170.2 673.2 198.9 686.2]/Border[0 0 0]/Dest[396 0 R/XYZ null 812 0]>>endobj
+230 0 obj<</Subtype/Link/Rect[72.0 660.0 108.4 673.0]/Border[0 0 0]/Dest[396 0 R/XYZ null 422 0]>>endobj
+231 0 obj<</Subtype/Link/Rect[108.4 660.0 135.9 673.0]/Border[0 0 0]/Dest[396 0 R/XYZ null 422 0]>>endobj
+232 0 obj[225 0 R
+226 0 R
+227 0 R
+228 0 R
+229 0 R
+230 0 R
+231 0 R
+]endobj
+233 0 obj<</Dests 234 0 R>>endobj
+234 0 obj<</Kids[235 0 R]>>endobj
+235 0 obj<</Limits[(0-intro.html)(pinouts)]/Names[(0-intro.html)236 0 R(1)237 0 R(1-basics.html)238 0 R(2-config.html)239 0 R(2_1)240 0 R(2_2)241 0 R(2_2_1)242 0 R(2_3)243 0 R(2_3_1)244 0 R(2_3_2)245 0 R(2_3_3)246 0 R(2_4)247 0 R(2_5)248 0 R(2_5_1)249 0 R(2_5_2)250 0 R(2_5_3)251 0 R(2_5_4)252 0 R(2_5_5)253 0 R(3-modem.html)254 0 R(3_1)255 0 R(3_1_1)256 0 R(3_1_2)257 0 R(3_1_3)258 0 R(3_1_4)259 0 R(3_1_5)260 0 R(4-advanced.html)261 0 R(4_1)262 0 R(4_2)263 0 R(4_2_1)264 0 R(4_2_2)265 0 R(5_1)266 0 R(5_1_1)267 0 R(5_1_2)268 0 R(5_1_3)269 0 R(5_2)270 0 R(5_2_1)271 0 R(5_2_2)272 0 R(5_2_3)273 0 R(6_1)274 0 R(6_2)275 0 R(6_3)276 0 R(6_4)277 0 R(7_1)278 0 R(a-pinouts.html)279 0 R(advanced)280 0 R(ascii)281 0 R(b-ascii.html)282 0 R(basics)283 0 R(config)284 0 R(modem)285 0 R(pinouts)286 0 R]>>endobj
+236 0 obj<</D[294 0 R/XYZ null 698 null]>>endobj
+237 0 obj<</D[294 0 R/XYZ null 812 null]>>endobj
+238 0 obj<</D[294 0 R/XYZ null 148 null]>>endobj
+239 0 obj<</D[318 0 R/XYZ null 90 null]>>endobj
+240 0 obj<</D[300 0 R/XYZ null 409 null]>>endobj
+241 0 obj<</D[303 0 R/XYZ null 793 null]>>endobj
+242 0 obj<</D[303 0 R/XYZ null 264 null]>>endobj
+243 0 obj<</D[306 0 R/XYZ null 298 null]>>endobj
+244 0 obj<</D[309 0 R/XYZ null 498 null]>>endobj
+245 0 obj<</D[309 0 R/XYZ null 361 null]>>endobj
+246 0 obj<</D[312 0 R/XYZ null 777 null]>>endobj
+247 0 obj<</D[312 0 R/XYZ null 665 null]>>endobj
+248 0 obj<</D[312 0 R/XYZ null 376 null]>>endobj
+249 0 obj<</D[312 0 R/XYZ null 286 null]>>endobj
+250 0 obj<</D[315 0 R/XYZ null 717 null]>>endobj
+251 0 obj<</D[318 0 R/XYZ null 631 null]>>endobj
+252 0 obj<</D[318 0 R/XYZ null 474 null]>>endobj
+253 0 obj<</D[318 0 R/XYZ null 262 null]>>endobj
+254 0 obj<</D[351 0 R/XYZ null 130 null]>>endobj
+255 0 obj<</D[324 0 R/XYZ null 422 null]>>endobj
+256 0 obj<</D[327 0 R/XYZ null 717 null]>>endobj
+257 0 obj<</D[336 0 R/XYZ null 272 null]>>endobj
+258 0 obj<</D[342 0 R/XYZ null 777 null]>>endobj
+259 0 obj<</D[345 0 R/XYZ null 620 null]>>endobj
+260 0 obj<</D[348 0 R/XYZ null 235 null]>>endobj
+261 0 obj<</D[360 0 R/XYZ null 60 null]>>endobj
+262 0 obj<</D[354 0 R/XYZ null 409 null]>>endobj
+263 0 obj<</D[354 0 R/XYZ null 252 null]>>endobj
+264 0 obj<</D[360 0 R/XYZ null 777 null]>>endobj
+265 0 obj<</D[360 0 R/XYZ null 274 null]>>endobj
+266 0 obj<</D[366 0 R/XYZ null 422 null]>>endobj
+267 0 obj<</D[369 0 R/XYZ null 389 null]>>endobj
+268 0 obj<</D[372 0 R/XYZ null 556 null]>>endobj
+269 0 obj<</D[372 0 R/XYZ null 300 null]>>endobj
+270 0 obj<</D[375 0 R/XYZ null 760 null]>>endobj
+271 0 obj<</D[375 0 R/XYZ null 551 null]>>endobj
+272 0 obj<</D[375 0 R/XYZ null 214 null]>>endobj
+273 0 obj<</D[378 0 R/XYZ null 202 null]>>endobj
+274 0 obj<</D[384 0 R/XYZ null 422 null]>>endobj
+275 0 obj<</D[387 0 R/XYZ null 609 null]>>endobj
+276 0 obj<</D[390 0 R/XYZ null 793 null]>>endobj
+277 0 obj<</D[390 0 R/XYZ null 469 null]>>endobj
+278 0 obj<</D[396 0 R/XYZ null 422 null]>>endobj
+279 0 obj<</D[381 0 R/XYZ null 554 null]>>endobj
+280 0 obj<</D[366 0 R/XYZ null 812 null]>>endobj
+281 0 obj<</D[396 0 R/XYZ null 812 null]>>endobj
+282 0 obj<</D[393 0 R/XYZ null 424 null]>>endobj
+283 0 obj<</D[300 0 R/XYZ null 812 null]>>endobj
+284 0 obj<</D[324 0 R/XYZ null 812 null]>>endobj
+285 0 obj<</D[354 0 R/XYZ null 812 null]>>endobj
+286 0 obj<</D[384 0 R/XYZ null 812 null]>>endobj
+287 0 obj<</Type/Pages/MediaBox[0 0 595 792]/Count 40/Kids[288 0 R
+291 0 R
+402 0 R
+405 0 R
+294 0 R
+297 0 R
+300 0 R
+303 0 R
+306 0 R
+309 0 R
+312 0 R
+315 0 R
+318 0 R
+321 0 R
+324 0 R
+327 0 R
+330 0 R
+333 0 R
+336 0 R
+339 0 R
+342 0 R
+345 0 R
+348 0 R
+351 0 R
+354 0 R
+357 0 R
+360 0 R
+363 0 R
+366 0 R
+369 0 R
+372 0 R
+375 0 R
+378 0 R
+381 0 R
+384 0 R
+387 0 R
+390 0 R
+393 0 R
+396 0 R
+399 0 R
+]>>endobj
+288 0 obj<</Type/Page/Parent 287 0 R/Contents 289 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F4 5 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+289 0 obj<</Length 290 0 R/Filter/FlateDecode>>stream
+xM0Fm`ɾ
+
+"юqgƺ N[ rм|Լoendstream
+endobj
+290 0 obj
+725
+endobj
+291 0 obj<</Type/Page/Parent 287 0 R/Contents 292 0 R/Resources<</ProcSet[/PDF/Text]>>>>endobj
+292 0 obj<</Length 293 0 R/Filter/FlateDecode>>stream
+x+2T0
+r
+
+endobj
+293 0 obj
+31
+endobj
+294 0 obj<</Type/Page/Parent 287 0 R/Contents 295 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F9 9 0 R/Fa 10 0 R/Fc 11 0 R>>>>/Annots 38 0 R>>endobj
+295 0 obj<</Length 296 0 R/Filter/FlateDecode>>stream
+xM8>&Uذ2RaR58 aȯW Z8&E ҿ\|<
+zӌSQNFݢK4q-d~O!Gc6u|VQFRn(EύH8jH;^Fz:T5+ڋ,GS-jWUdaH<ME,xQcpiMQNu-;xT&"Y(%}{&e\ՈoTpsT6ռT^yuu_|
+ޢkfO&&R#ĨL{l HKpFiSh+|&Kt /=2FHpH.G_j3,*EeF\ؿDѼTi˪& a$L"R%Ml6$Kyɋ?z9d>y9۰TP|DƋ(Pie"GEYeAW0Ո/Dc@i'2^Uf[:vH`CY)n;
+[\EiKx]d@[@NSq
+4@h P>&+T.7}!=Flh)
+Կ^GO08{h mB)T 3]G
+}a?|r] 5 s.oNKcO]^twa7endstream
+endobj
+296 0 obj
+1013
+endobj
+297 0 obj<</Type/Page/Parent 287 0 R/Contents 298 0 R/Resources<</ProcSet[/PDF/Text]/Font<</Fa 10 0 R>>>>>>endobj
+298 0 obj<</Length 299 0 R/Filter/FlateDecode>>stream
+x- Ew:j\Mtj #thI}3ݗ\4 yS#eVҒO)Nwa⌅1lн,TyYFz Yb(؍}Rx*endstream
+endobj
+299 0 obj
+138
+endobj
+300 0 obj<</Type/Page/Parent 287 0 R/Contents 301 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+301 0 obj<</Length 302 0 R/Filter/FlateDecode>>stream
+xVrF+&a>$:lRQ. `@ `݅hӳ
+fgUwlm>(—|UB_Z\w@ yjW cLs{b2"@8ZZ@ >`F7񢀹̵@mΝ5UC|JQ+=}/ttJd u5F׻AQSVٞ)
+50@LrTR0n/y7*4O^ 5* rqJo/1`<Ja+~siBSx 4+GuYv83]ڸw2VKjs
+!CR=^o-ܲTƼ%JG
+`:8B9QڢE$
+endobj
+302 0 obj
+1069
+endobj
+303 0 obj<</Type/Page/Parent 287 0 R/Contents 304 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>/Annots 47 0 R>>endobj
+304 0 obj<</Length 305 0 R/Filter/FlateDecode>>stream
+xY]6}_qO }$Lf:I
+k&/Z[˰+ـ D |tΕtMH7ܼ?)G4[^:lqZdڋ7on~#DI҆0j4
+C{ۨRdjU,T y]esSVԺZeYUr_geahYz"cL@8
+mT }. t9I1 .<UzF „ă'OvGı}p(Nϳ37<jFV UAs)RGή1ʚ;.mQϹw2Un%X*inr(g )5P^ (zVp^.jdRKwd P5
+ *Bqr!?wǕK [?qCԝzMu0 `(7i N¡e2shSQypi ˍϕLeoq8}~)Ij0
+G۹ϢKGCUnP)_9_YN'V
+zDj(gb7daoi ey( ZKģL?%D S_QܲQSpHPI0< 4l[ƵV4lck4<#[i8<"[ixFpY"[ixF8ҰHƼY]F<h=:k:|ab6Y][1-N{K>|_U6$<HT>҉A<0BAuxv:a7?tQ2KX"QR!m}؉C/)N8";q܊#pU3XW`O#T)ct)cIk˃xɁٔ*D=]Zut2pugXrB勗WxK0`<[ƞl0 3'V0g17c5I.ybuB3&tVvnLqK'ɘH9uHLf9D{֝Ҿ}\_Zw4bzr@ x/}yb_d{ٓ~any
+<P 9f%ݝ^4
+[` Cc|2W;/UF|[6y|b6>K:ݛZoD<=7d9LXN4endstream
+endobj
+305 0 obj
+2027
+endobj
+306 0 obj<</Type/Page/Parent 287 0 R/Contents 307 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+307 0 obj<</Length 308 0 R/Filter/FlateDecode>>stream
+xAs9}U@v5V֕,!.LZk$"i }`J9[tun)/ʮ}H1e n@Y~Lh@W6:F.h._1ɕVʕC»vu%DE<r]E<9qB`|;{F0)z64'*3Q-t mڳn}ڮa?|o5#iB8~r"~])
+ׯ)[
+z޽J*rdc$닚"!/Ѽi@%S@B Ȳ0*nWeþiCn͵42Hj^H7Ҳx?V2Gƌκ?~߃ 7EzS 2^/WPЛ' {;۸B t\;Mp/+7x ^-fD~,T
+E  ]^JysN+:_]j e ƃ
+&ȿrS4h:JSO{[I \ni
+ F,7Š&s V/̽Ӏ[/43bm_V g`b]\hFSr SǢ :yՊ&
+u;[w^RI#fμ7Tד- wv|q6;M7xNEAY=GARU vSTaGw1ߍ5|Vo.߽[zU&4}A2å-fLwnF'| m#FÏ_x/I~ή_}Yendstream
+endobj
+308 0 obj
+1178
+endobj
+309 0 obj<</Type/Page/Parent 287 0 R/Contents 310 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>/Annots 55 0 R>>endobj
+310 0 obj<</Length 311 0 R/Filter/FlateDecode>>stream
+x]sd og_ g:9NM<m9uiXgfiZ)Dm].GHve8w.'wӿ][6㍍nǏGϾz)?~?_|WO^<?/>>z|fUŽ{nr;5ۏ?JTP~ҾQm<P=(GO_}z?6~0ތ^B @p 8@p 8@p 8@p 8Jhmi,UG{wZ5~=(兝lֳv#g0/k[n,긭)%:1t9cbrἚ2؆=J_Q܍k_lbFtpD3"jH8옸%KWSjb棬W5\-9TŇYQQuE%KՌ:=lmE@:kt-_[**~^ޛuW >P ]Q2S /W@oq0U^xҍ^e҈|=: wn+QOUGp*u}NG,rÕWSL~9XϸSyԹ.jBW gu1(s>ƼnOfq{ TnJ' 4IiL=z'.Co4U|Rgnj|Ag܇hPbXүdGR>n镫MT+qX <P, yC4)6A^˿i:Wu=v8b̿Lv` ]ӎ#.MbvԆ|_u1o6ȯ1ا!G~]> 8b$iGmő_c&O;jC/7}Q}qŘIӎڐ#.MbvԆ|_u1o6ȯ1ا!G~]> 8b$iGmő_c&O;jC/7}Q}qŘIӎڐ#.MbvԆ|_u1o6ȯ1ا!G~]> 8b$iGmő_c&O;jC/7a2Mu_w/.6kh|b[PC8D~g,07=oTV_[0"NΑW #5gۆc8y}Ck<һ`[}^")sMl _-ȫ7#F&^78[y09j~*/bCdѥ) V;6D-Ǝ~E,y?3ccI2۟25UĜõ6l;{
+ۯjoMzukmlCe^%;/Q ό.mxڬmtb/Q5Y[)-9;s뒜WYr 4m5ۯJhû֦<cTzظ  xo_UxuU_P~_vxIfllt]._^O+Szuc+7fqt٬~#G[
+ +KPۯW[-XXՈv9v#lP@n"f;^І%^ YB =K_bg_gI}Ʀ6*)߯mώVXWC U4dg8!xOxW *5B~UMs9^~;9Jr vqB|F=66CkĶ>3ۯejY>6M)~mZM+CρW`4Hl\c-X }>%&Я"_c~[` }m\/X-+> m,|"Zkm;<Q89G^8Kc27Uw0+<Cԯ+WԀca_}" 9-~^VWs?B/;-n"NURjݖ9;.34NvlYE~|VJ[չIo+5JhŎ<]VRU+Ӽoƛ5VœzjWW{={FU-Wu4}8*m8<y#S'6ވ;JIV${[RC Z޸G~EWڛ_6rBuN~եdaJڎm9+nr8xUzݒ*zŰ*]dZ~Ua;-z'6my}ڵ˯
+Wŏ[oU1mNJWd`~>ٞ2Nt}Y% mkyJsE1ƛowg/+c9[1e|[$szs'/ +nT2I?<a`>g}/ H+e/Z{Bj^Nj}uqSg5@1kxSi~/B-+e/-k5JcBP=ZvCu'g?FpcS+ƥ6(MEk͝`W:fk#z٫+]ia`Kzl@l]_D/wD7,?1hŦ6kmj=-e.S;|Þ:^-"Η %'+h-}^\mضMqzW/w?q Xk;4߁O ZⴅL8WEۦ4N1-xC?!/qw\"Ʃ_R?){/M mx_uUm+m 3=Kt>KY
+#.KLXvLodi)Tyy=L/IWڧB/Wcb~m= Yd' Wˁ<-e2OKT3=3Vim#.zNXm/ItB:n<KIyECjd&U 궬˷ꅪ]w:2/.˾+i$Ϣ.`ztd^*MsymkU.ı~ԝ^%4ҍ7DWVјԣʫxcX*MNE_[Jd.p)_8`z2Sv]>4&\i[&mވ8.e":̭ U7Cy6 yO[E*Jҋ~N{;(r~wt#[97ʋ{!Q'gԍ;ܫ+~τ{UߕGכ;ث-?n]n:ΞdΤӯ#%BƓroh.WįW 5~o\@sx9
+
+*?
+iQU6WܺÇvR:*6~X1@R/N"E_& k]{~Yim`
+!&M_$g-+] \H2U:'ܲ B)RxwOZ[1s73AjVcREQ%G8ņ*8\
+7(L2@AW}\L蚜+ol5ߣJgڬ>;wN<oA;4_l1sU@\ר7ng< >! . [aA@W8a[H[. s-rQQĴY@$vzwMfNQ~|ꢠw5HEӇ-R.-u
+t\i](FQb5z
+p^
+ގ ʮ߃MOdX0U\ַ8ED=_6r %TUN5/,I,4JCmiz>EiѝD;'7 V|oV> _Eendstream
+endobj
+311 0 obj
+6046
+endobj
+312 0 obj<</Type/Page/Parent 287 0 R/Contents 313 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>/Annots 61 0 R>>endobj
+313 0 obj<</Length 314 0 R/Filter/FlateDecode>>stream
+xW]oH}!čOe@%, Zxړd6;3N~ϽMKfr~sw>bX՛W"/xяI矕 )X% ӡʰ!~66iU%eڋDz)^2<zWJdҮƤ^.(sSxV+ieU~ZnA7)U9'o&J72V $%Ej(&tt%^nx b'] &4W{˺Clg2EAVZGdYXK'RsьoQ@f|\PU?d'dS`:ND8S*fD>>!D
+ ts)Onx\`}<> ؏Ti{О}ޮdAt\k7H}p (
+ހ{?ʚܔN==+oyk\%uERIJ4 13"Ӄ.sKpc3GmQRyQXM{Ex-S;w*OBI} #kԿ0 @[HS븕*A-u42[4'qU;Em厮%iBh]nt)obVšaa p5νŷ?:/f7߾MlެPg/~.>ꍌWZ
+FPS#ȱ7 =Ż YDX͌0ds^e
+endobj
+314 0 obj
+1588
+endobj
+315 0 obj<</Type/Page/Parent 287 0 R/Contents 316 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+316 0 obj<</Length 317 0 R/Filter/FlateDecode>>stream
+xVko6_q}ٲ$Ӯ&.uhʤCR5m}RmEH#>ν:1EtUi?:8044BOn̒p\|;ż~~ׯ(`t=$lv<` ANNp=1+aS׈I^0Z(D q^z <2:Y sY.`j? q3y2'99Mi kIJRlI>|-SG½WbL♔v[+f0ilH]fUVlkt.YIk/kY`gǀRX%S*/. ^tE)sdKFk7;6J+?)sl>1:.
+[o`1
+nڈe[YO_ZA[Q44&Fb j<_g]V.u@gX5o^m.)o%Ć`1h)IG]KPyK߬˥Q&.Uyjrr].Cͥ쒥~j<sEDrhW5/Bg;V#f3xaګrm gKzDjȾі=Pk
+OOtBGr܄fhf ɗƝpF&tυ͌\;PEڲjI|$ڴApS]z\e^EN|O.!7ށssNJJ
+
+~#׍N
+ŷ(iљ%xdh&늵x_J L*5R/8Ŀۆv]kX~pYsendstream
+endobj
+317 0 obj
+1156
+endobj
+318 0 obj<</Type/Page/Parent 287 0 R/Contents 319 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+319 0 obj<</Length 320 0 R/Filter/FlateDecode>>stream
+xV]o6}ϯKvlH}<tq2h,QuPeH؏߹CqιјFӫ <:99:pBI$9Df%u;>b|ܧww'>LOO'x8 2YJϚǽ6Xe7_
+ʚF:Zh<14x.83[SJs
+ژ9[L 5 !WlIу̍99S qx5'g8_'VeI(d93\ؓR=<h!|;=OO8Վ,\
+az貵րjH[
+xxX
+E0(
+Z|l)Ȱ{`ШnXVi(2' >M'H'6R?y*g^Ԯ6rSOf*gBb>"W;+e볆lW.>ldDL3CJ
+4a,vWXfo̤ȴ/S\Pt*~9׭߬dGh{hOI[JD{:o kvwk0znk嗆wv[ }
+ƀ.d\
+1\8Y p/3Eq] <=&μ;H1`vpO#]C@=SUsEsq2r:K$ƽHW4mh)
+endobj
+320 0 obj
+1339
+endobj
+321 0 obj<</Type/Page/Parent 287 0 R/Contents 322 0 R/Resources<</ProcSet[/PDF/Text]/Font<</Fa 10 0 R>>>>>>endobj
+322 0 obj<</Length 323 0 R/Filter/FlateDecode>>stream
+x50C
+0(Ε
+endobj
+323 0 obj
+138
+endobj
+324 0 obj<</Type/Page/Parent 287 0 R/Contents 325 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+325 0 obj<</Length 326 0 R/Filter/FlateDecode>>stream
+xKo@|9 ͳzhTZ%m|)ZkxuP;k Y
+<
+}5QdqM`:×$ƈχ78֘MFxz.
+KF5-( |O #LSՕAH\STpcy :BAQVu:"(*=4 .G}t׸L#uT۞eӄzx{;5NO= N E'wӤ{7/ox{1wJw7hJKkRendstream
+endobj
+326 0 obj
+813
+endobj
+327 0 obj<</Type/Page/Parent 287 0 R/Contents 328 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+328 0 obj<</Length 329 0 R/Filter/FlateDecode>>stream
+xQo6)*")>IZaHW@1KNږ'wwcF(Ixt)R'̗3!XTY k]7?n_U_'zC?8ͮzuCr&) -qhRiD[bf'5{!5tTX`ͮoxu崴T̔M2-T"ܴúaxwjTbD=imWS;f-ʢ/SwS/ں5]KŮ?|)`Mr1 ,,@*]߉uӊb0 N%
+5۝KB8f()GA&E+3Yd<:; 4aHŷpF(`a9 49,+s8/\x/G,'$7xWYb1^M8v{,yN$ۂsy$lhW8J;7FBC74iY4.;X8Nc"6fјaE8͢)Ŋqi.6 ,+sW)Gyu~a>;9<?|_w.̄If8ԉTϝpSe'3cAX\ZH)DRy85;=-?>cۮ<͈զYRaH((7@5T9V6 ɻ]<q5:RDb"md巋QlN+(VLFQ
+endobj
+329 0 obj
+1059
+endobj
+330 0 obj<</Type/Page/Parent 287 0 R/Contents 331 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+331 0 obj<</Length 332 0 R/Filter/FlateDecode>>stream
+xXsF~_glY◠y2N:ȴx/:Ew2}wN 0:0Hvݕ\
+ P~%u&(k|T״UFw;L}Sd%29A&xv
+c=;8noz2lQXgq5w7.Af2!JPvkcl7&G2b)"p L"Wnpj W/>ǹ,Nց)rS-OK[[k_B}*:ÃTFw9Hf)RIh~1>Jl#ϗt2N0^טzŧS++CzT@ȴ`֠2'9y,M!ONdT'Wۯjiv*o8lC;p܄yuDI};9/L` e
+z%AZH0WY1bkstjvY3jMc%t]7`ֲ, /`KTWFs%YphTT@L;4h
+o0-$2;YERud_A/Rd 8ńNdJd 7dך+ov1d2)JL+I6K L1Aji\ב*TXX nD Js&Rv-k^gl)&+`0;XpH2#y4/HX)%cN~o:O3k"Bcſn02k ,[[ NE@πdߢV}#kƶԞFS Ǫ&FF)g]fH^L0re<kPWvnt8" p*+
+P .-^0jцKsl4 #~#PXmX#+U'7+24O k²y$Q+iv\> {&^j<ɷ+J/ݰ4{0Wqн]-ީ-urlv^.GSzMGp ?վ2m8o ;,%mo,-fOT-6k씭 *#6l uL4DH\ipP}ҍp ,4ֱ(]g|FʕYf؝ӵ5E8/׹0]>&2M$r' g-Uv,2*jYW '@uӼ1 QP 96`O;'zT]M^͎ -8.f_r3|恹yV'v?۽ /% @4djbuum#^vH.0-?bދendstream
+endobj
+332 0 obj
+1555
+endobj
+333 0 obj<</Type/Page/Parent 287 0 R/Contents 334 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+334 0 obj<</Length 335 0 R/Filter/FlateDecode>>stream
+xVn6}W lٲ_CoE(]ITE*Eg(%mDp8gyS> OCcK FC|fҒ]IZ"\XijN=Ciɤ tfNM>9Og;;\bK!TO2'p(ց)ѡ!,U^{bI?ccru;948 ,*EPx6
+rltˠd7}^Q0-<ţWYb?8Xd"=DS/JqH:@H% 1^l,吙DX
+K?z7R2+0 *}elX8$(W#9g뤀Oc(}rQ_Nf^#@\EE27ukf^kPSXd6-LoNF 5Fa6xn'0K%E**Vv]o:NiNEM\ YtvC\zcH68Y WN/yb~:͟/w}oD hv@g}]ÞweB~^_) pC'Z|&#Uc[&Uq.j:bi8L_LqJ$˛m$_EjULbmW+a᰹HM[8 w^=~0ut@X@$\;f~0o_Ҟ+62bf*eXgoǍ)"Jƪ~s/i2CKԓ)>PUW N&EUR@h 06vqlxl"7&! YoDo~|^Zh77>?og>k]mJ'7}OLf3<ͤ'ifPN@JI-[Uk '"-0֛q1ãzc@PsfL@#M!@
+-e*K2T@0 1&lX^We鴿=Ni0ti泋.\$ K¿XJ?ai}޽|ݝy:{endstream
+endobj
+335 0 obj
+1269
+endobj
+336 0 obj<</Type/Page/Parent 287 0 R/Contents 337 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R/Fc 11 0 R>>>>>>endobj
+337 0 obj<</Length 338 0 R/Filter/FlateDecode>>stream
+xV]o8|اSĊ%[Ң k)` `$QA*)70Po%)+n
+5#6H8arN$KNǟo1:D!kUEx@ 8lZڨ6">
+
+ZG۝2}tfi7BUpy A)B v1{̱T8
+(D+ʩ$fnIX9cB(&=V?誆=VmB9r q$A9kGEhզGЁbTp}o(#moqtX\P~x]LEbKjbe`s j'c0v1&׺Ioۑi8Dsxd_n&1XCR?N$ kwsɚ I [qJ^)SP˳137'',na93b%IQh^)-,CdV#)2kX,: jKOvǭ \/Hendstream
+endobj
+338 0 obj
+967
+endobj
+339 0 obj<</Type/Page/Parent 287 0 R/Contents 340 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+340 0 obj<</Length 341 0 R/Filter/FlateDecode>>stream
+xW]oH}W}%Rp16vUBRTljv5cx?J;ccb@V
+QCl$3`־
+wTLgk8wA"Y~%e?E% jgD _'ە y6HooV
+V[+5Jѳ3ZQ[/)<En\Iue\(\}gPju҂+4G:E Xў8E|^aa]}Mi:NZ
+%57r*L+ˍ0 i$rko7{VamzVo+< x(08H}!Z
+iv`'je)5%BϒhX)uGӻq֞xrb6X
+I™>Q@&0L\WؙlN+ˉF`g |4%s?bc!?@dg6Fõ Q;d0!*Gh"j疈945,Q> ]
+8!pyԫKd`9GbّTF)F`RyŠBP:ox>JƉjV9FPcGȥa&0.d3M+
+l7Kt|\vq)ʥ +R]<Pt'ȺR*ӜFID=c<FTeD;[A ]G.Q\z`BY;:R d
+EJw\i ҝ:G_ ) +mSC*|U62,@ ˟3Ȥ$ yZEwNL=ó_ڷendstream
+endobj
+341 0 obj
+1294
+endobj
+342 0 obj<</Type/Page/Parent 287 0 R/Contents 343 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+343 0 obj<</Length 344 0 R/Filter/FlateDecode>>stream
+xXmoH _oK’>l[kiX+!d\CI*?ۓV(YUBx<=&9!\^܌/u.gqkT맫<U\C;Zv'BB̖KIKJ ־]Y"^j4*1 JPs"@R p!3 hMFR4R:k&m(Q!~eY,T$&\ɔ}!!^sgHx$'&OhK1M$PR430S #kCj֝'\I}&1NonFa1uS5
+M%m֚ӪL+w8Ͻ nS}%tAe0Vfd>< Zik*l|ױ=
+{<UEƧ9Q>k Sp2NU`l|X
+4c#`OH2_GxtWLv <om[k{z(V0x$o>iB`O뵽MC?Ty<Ui<>LEϙ( "38BbӐ\V|{RZI
+0 8VUiM{~=6\($Lbֈ5e n7(+X2bycd\a/HfIW9'BI Ӯ"x!daw,
+Z׻LGq;KV\V3cZ*5z9][K*jW6z32ڳ?7(Tj$ҒXq vގ߉]ZfKLk *" PCaiBt׌:*kTQ BA/sؓ?騳b ;%\,t.M1`L&8Qc"N-
+#ڙ\ K. t{ 3H/ߘ8Eaqjx CTBn,O$ W"
+dT
+jq(xl#W0ŹinӂHHUF#v)$X`s}l&E_"* #DI//?AI!P^ 2 >$<ߦ ν>1{80(0Abh)}T|{W m/iio'5'6R)*!;ASL Ab.v>V^#;)g
+endobj
+344 0 obj
+1499
+endobj
+345 0 obj<</Type/Page/Parent 287 0 R/Contents 346 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+346 0 obj<</Length 347 0 R/Filter/FlateDecode>>stream
+xX]OH}WܧUx+ZC*$cXJ{BG֞!UY $gf=s110<: 1Xo Xek!e^u,J6uqG9Og84G:h[+DVM*
+sx0+@ŦRUsQY96_~ q߀K_`Nt:jV AIڼPQ1_P{B5 Tzo?yS) 2+Ƽ:m2Q qmw8N3 Bz L\nf+Rot띶zmV{?d(DCfyBX9D/Au啢PH<[Hy(D*aԩh[,nj9+fJn 9>MX\EI8JD..1g&l|m~1F;%I94L ӏ+0a3lpe✸ׇj0 Cџ Z nJQUN~ nfU-QW 'J1Ur'cSGp
+[xکa7m(gx=Bl0{8Jk@E>0ֆ &c23ǟn 4 ò0ar0Qet׫ 6 t=aSu%AЛ:d>]V4.y`O?;(C.LLĽ):qmLڮ_ޓ@--1Ł}x(Zdjø[ɚ0ap3$[tw%^US7,Un]w|^ 1xl(IeM6^<rNY]uendstream
+endobj
+347 0 obj
+1265
+endobj
+348 0 obj<</Type/Page/Parent 287 0 R/Contents 349 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+349 0 obj<</Length 350 0 R/Filter/FlateDecode>>stream
+xWMo6WL/E
+ђ,jjl6BڞDlURko )qVP iy3|3DW& 1H;g_?W!s
+|
+EVW"6$Zgt_4zuCnxS![r3< m ᙸ1׳=`cl!w exC_~E"ęV*!rwY.A c7;s".XP!
+0y@"*-Adzg
+9oyL" RT@iYe4KYBCVg!X5viBI^UٸlqgǶ3290c߿/WJ[kH73ql?DSSU+s2b}*AUj礮ZU0iLk i?
+=e{dU Qs\V-j'gQ-de (5V'"#A[
+ S ``Em) lS)j*"[I\JɆr*VEAӉlapItXd["1FMLIt_> 9zO趃
+g M"T$>[c4ߏܐ}jb^V֭y?I{a߰m߰Guf;'$v'0DvLsnEiď.NԎǩ9bc`FY◫
+endobj
+350 0 obj
+1244
+endobj
+351 0 obj<</Type/Page/Parent 287 0 R/Contents 352 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F6 7 0 R/F7 8 0 R/F9 9 0 R/Fa 10 0 R>>>>/Annots 63 0 R>>endobj
+352 0 obj<</Length 353 0 R/Filter/FlateDecode>>stream
+xXRH}+Ta
+~ƍ9
+s%ZV"(ڰj#Yh5ؒym@l+dmBSzz5jH%4nT]=ahb"Ol*pzGsw [R|H< XKDWQ$J(ċPx[ٺ*Ugp?2S+x@z%:9NLف}*9.e{#Jy%-mi]?gHv<:|ހFĒhwSA\hsVJH[r%N:oti?Q/Q" 5(t)or
+endobj
+353 0 obj
+1655
+endobj
+354 0 obj<</Type/Page/Parent 287 0 R/Contents 355 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+355 0 obj<</Length 356 0 R/Filter/FlateDecode>>stream
+xTN1+Fd%ʡ@%Ҫ\8ڋ :KJ&R{f޼f^ٔ9z^䂊&gє
+5^&jO1kW׭5RDl8,~!&=I'9],M I!J@qi!\Iʈm(J7Kg5;V":?uLî!ɽ#puS@kj['\]Dj`(]
+(^UqU;79wR9ܡNJy\2Nx^ lMoe<8 % cV@ 1{1QLKrK04)'VKsDW[.Ix\Cp7BOB3pƤ`=> UBC&
+endobj
+356 0 obj
+763
+endobj
+357 0 obj<</Type/Page/Parent 287 0 R/Contents 358 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/Fa 10 0 R>>>>>>endobj
+358 0 obj<</Length 359 0 R/Filter/FlateDecode>>stream
+xVksFίÇۼNPS&FS7cy<BZM$-]JI+N#vǹ叆E}Y4<7~v>703Rkf/نVM=anSx>>ύ>u,+7'&raMws1kS~ѽ0dVLkaJR:UN=ctaUy d6HLKiamgx4C `_5sUbN't~K_{ک
+˨3(]2></uj]"DvOX!s񗡭(EP$R-#Wq%oYq\.9iӴ veJx/: drπ|,9ܶUgI(UMJiiS즹a_ ӂtI:%#Q_A۾QFh$QDZk.b!Դ?493N:4M^$1YG9-BmC97ԻK/@]-!B#&d
+>C:GA<M, ~}M[.-#F<}\ܢLyH[#y/&BTA]3' ph|VAW!ͱZҘ.0K?=w
+3&ChiD1W.1(' DuԂr@Yt4-*NE]G
+V泗- ajfrs[n(.rEvRUm֐r (<X!~U
+Y..:}۵t&
+ZսbpuO3VM<иئF)۱'y33pha-_?o
+endobj
+359 0 obj
+1103
+endobj
+360 0 obj<</Type/Page/Parent 287 0 R/Contents 361 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F2 4 0 R/F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+361 0 obj<</Length 362 0 R/Filter/FlateDecode>>stream
+xVrF}Wt%
+d-ybκdAbIL[u ӗӧÒ.)>gw\
+8qgaD lrDce<! !?8ےʪ(6d6QQnS)MJEHSJF*%Im6FhS61ڧK3DEd.}? e:SΓ:_'iG**MՖa+hY(Y'>QAhWIZJ]W"#O5RBH%g\Ho6IVL-tQ$FyRT%B1{W::;6
+'ԣI/#VJjgAwCdkG\?5k᳴U֠1'ljI8MU]rJv9hx<GDPJ ?820Ra.e
+n%\A )l\<7燱ـ`1fmJ0u !~VtFїp6?I'_p<'_g8軚%JT1^< %OA|-S8>: G
+IIUwUd(Sd^r#aWb_ Sqr3 Wa
+Y406(Y$4-֪(d~4bq
+8@8)n2$YZ%:V2^R
+tlA \7<[Xv#Et{N/gI.̭Ϗ56G͕!+[l,/ĹS BvLRN=v?59
+2
+TJUQFGUxl]+kkP$*zVbi0Iط$]Rd qoda(UP =lTRw7~
+endobj
+362 0 obj
+1249
+endobj
+363 0 obj<</Type/Page/Parent 287 0 R/Contents 364 0 R/Resources<</ProcSet[/PDF/Text]/Font<</Fa 10 0 R>>>>>>endobj
+364 0 obj<</Length 365 0 R/Filter/FlateDecode>>stream
+x-
+endobj
+365 0 obj
+144
+endobj
+366 0 obj<</Type/Page/Parent 287 0 R/Contents 367 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>/Annots 70 0 R>>endobj
+367 0 obj<</Length 368 0 R/Filter/FlateDecode>>stream
+xVn8}WlVej &P4mVlvuqIE3KuE
+XLGH>B ͻ?*X;=IAl^`4{Pc) FYJ
+#?̯{'!K{/EwTx:f ڦ̈́qd0~
+~L|Lc}6L yW霬)8.*b(jBkPX/ 'ahTP̭QQw*0U4[%pע1;@J}#(v=@W/=fǛWÔSre1wމ\(
+j)+й;*٩tU]iplPR!=f??2kj8Vp-
+㛧$zЖve[UOTe:ȿbg!ft~V=3R`id ,s՝ w
+^9fo><QƔ#RT\:g3̦<6c 8): uRhvlMrl+w{P7p ])<0T\b3΄RkXG:`vol>i~yBk߲E!ՓuKg|cLvg]՗y«S =ΓOװ'u<'Tw'vKDٶoQ-~ KrznGvGxg ߰~/b=͉'/0iendstream
+endobj
+368 0 obj
+971
+endobj
+369 0 obj<</Type/Page/Parent 287 0 R/Contents 370 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+370 0 obj<</Length 371 0 R/Filter/FlateDecode>>stream
+xX]oF}WCŕ KFM Ŗn"U^`sKS}gvm06gΙ͏`:߼`fn1xa7cB&?h;A!{ǧ  *
+VVm$6, je괯9T!yw߉dQ.1c<Oy5F69*BBɀ(Et(IHu0E&f݇#}d`ڿ tW`]>VWeOBL<Xs QZM?ʺMK@;vHO% @R2X<xDAeP` J3$1VM^ɥ 4<f9ǽ (5"̾qkm
+2n --r7=]=”j y}$q`RFݸdjòOI`ٷjP&1* 8A$ɚ=.'w)NJO:^gF_/*NXL
+l?
+9]*(pm*E*PX/?<tǕo覔 rp.ts,qXM./{rح?54QOb4ɛ6~&624j93TF8wj}8/ƛfy~2P!Cwp-k0!N\ Y"N0 4|;,$
+8amT9ag*UhRO(WBU
+zh\
+Go1D
+V"zYҚTr'WKnjh鸜AXM[543և4X$ZA1G<b4%rE][78~x
+=>c&NZ/c#H$W]_'-N
+endstream
+endobj
+371 0 obj
+1289
+endobj
+372 0 obj<</Type/Page/Parent 287 0 R/Contents 373 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+373 0 obj<</Length 374 0 R/Filter/FlateDecode>>stream
+xV]k0}ϯt0RH\;Iu_5i(aDraK%we}Jv>vPޣ{ιV!E?EN.Ef _Wvz5::N(N\M6JM.P8mAfLR8Ɣ.G/D^ :8:!h o;xdv͙e`Ronxct
+endobj
+374 0 obj
+877
+endobj
+375 0 obj<</Type/Page/Parent 287 0 R/Contents 376 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+376 0 obj<</Length 377 0 R/Filter/FlateDecode>>stream
+xWnF}W R9Tɷ8S:I#q Z[\vw)G%%Vq`Yrg7 ~tx"b|G4<Ýӣ)Ӂ_0鲪=YƖn93IyEuyG,t?&^X#`b9'y0YS[r`nNGBLN>TU:Q^QJL'SRTp"覂!m;
+&Dz,S*SLDE^Թ3M؅
+H5U,uʎBKԕչ+|[)TBn7ە[9v|Ls1ٹBj8@b[ĘːL_|Zbk;1ecQUS*뙴$VWX'1<4GN;se]|5(F9TJ>ܙ=iMѕM2#h4>4h1${2Ls
+.e yUL'
+S# Խ8Ϧ=//rۜ]ڻL죸l3`3z+z`zИTvHk:/եӉkfr}k]QQzQ' Ufı_ 6fggo4}nՙ9=lC>IBiIٻһ_ a΄FGqx߅9K{zޠڎF=ǰ2Ny e f{ޠfvΣQCq;Am?3Xׂ3p
+B-@)-7}*t
+L?
+;B"xg(ָh
+
+qH*)xE@KJ' UZb]:W3)Tz*x`cc-JXW.B)l4]0Vi/E *ɡx>D7x,q{v68I-71 $ge#aɔbȵi5,"X-Ri
+M
+Xo`Wm`JD,%V&̻
+"
+R:Y@v X"Tͭ8%.KD Mح z^ zc~
+qz{"zuWL`;kM]jبѮ>zI}mQe#-dP2eY2(BUC}j_5DCxVWp AhFԽI׍xȸ
+ϲ|!^6 D03j#{F/s ]Rt@Kj<O= GgF_৓N'fkM]]7Nb4ʢQ3zq03d2>ƛ.c2\]/z.e3g?^kE[endstream
+endobj
+377 0 obj
+1379
+endobj
+378 0 obj<</Type/Page/Parent 287 0 R/Contents 379 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+379 0 obj<</Length 380 0 R/Filter/FlateDecode>>stream
+xVmo6_q>Llٲ ;] &-D\$%)';R-zu {}9~:L0CZFElAsp]Χ1 k%S5j]ȕ,Y
+dAZ<<F}8dd7J:C],\%Q<85_%?.yS˴OS-n="yv.
+oۈ6N Lx
+G+kUVT!TD9xoriyq&$Pˡ
+8jlL/F 4; =I$r{iumPߝ$˹v>4} E>4qPT@A?9mX[$x3Q_F^h,]`އvjJ<ez}~?O
+j 3 X[:,E޶s|J*SXz8[Fˋ-Ahrk
+endobj
+380 0 obj
+1072
+endobj
+381 0 obj<</Type/Page/Parent 287 0 R/Contents 382 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/Fa 10 0 R>>>>>>endobj
+382 0 obj<</Length 383 0 R/Filter/FlateDecode>>stream
+xT_o0Sۂ)vS[SNLi2n$vf;P}"ui 蜻3Ll.o] .>S 7ΑEXںˤ\9)G@6G~x)d t|_%gO"VUYhفr
+;PxWɺ 6IdX wS`hl`VaS 3^)A+$ukX0HEh!J(n:/]kŅ13P0;ZQI?a/ cX&NRjTC'
+1
+FY
+H"b#-X&'ZFܹlrf?Jѓ*WU%Ґy]}^E9ylenl:1g^# wW9Fd\p,'HW k oendstream
+endobj
+383 0 obj
+603
+endobj
+384 0 obj<</Type/Page/Parent 287 0 R/Contents 385 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F4 5 0 R/F5 6 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+385 0 obj<</Length 386 0 R/Filter/FlateDecode>>stream
+xsFǕrtG۝Np֜:F"H9o|߮$bOt}y_}zߖ:ˡcM;\;?%ԐGNաq0DPQgoؿ$aP'՗<Bφ'ɻhNiSɨ?F%C :i874N&)}H>a56'appyUqmmAQ$ ixL
+>
+ӫOhzL~d-qBry|KJ=el[\ hB#iSqQ;vQCOGue.h6ߨި~zūm`@
+R \jpO4
+}x
+<XhʩL.%8S~׋> 2M@a *r
+m- G]oC#QiW< zGx>a>`(7C
+
+C({u~-c>W/v;թWHcz="{(V<#$@HA)K[VzVFb+V~0v\ M}5raymmsK[!+`*͡KݾAmgKQ=(6d}7G"ʞe f83X~U}oJ^ -Ba{l?C 91zFֳR%| _Q62s0bєj9fI0S\\<cEƳbE+ \²"'I t= z*)m Xa?L^N3&^d<+*1\nxmxmFK):>[v
+BnwZ.)1"YȒuL1]:M>z7D}
+ixDimzO'^͹w%8 )|wIy[%
+endstream
+endobj
+386 0 obj
+1706
+endobj
+387 0 obj<</Type/Page/Parent 287 0 R/Contents 388 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F4 5 0 R/F5 6 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+388 0 obj<</Length 389 0 R/Filter/FlateDecode>>stream
+xOFƳR|q>
+U dqZ=,7_}ljqa6:`f~wf?-aN];~zT% lzө4ܬʶ+-D=Y5V_&8N&9Z]iza
+?Jqx%QxY1!~fbzŬ6+H"1Z2xX[vZWmJm\;-k>EwE7L8JD/J?6ע_3/ɶ,Omb\vn33j?^_́U|a4'!g/5Ǘj^8 7VB y!ѫD9xasN abDWYDTʎ3G$z#~,`NXOãVtO:NEjr7=j (!~d~M[pki<Ld8nє{k iӯˍ QCgHjC9ZKk!7^x&]n5Q
+杹%,{iʅ?l[xx2K$;Mq`e̚WӉM|Ǣw01$A8SQ-F(augtƏn ,`<->xT߫'qG?\:G%TOD̢oq;t+lq+?ܗfMx%0~pPn`.>ڝ~T?x'7`V;
+βɒݐӗ+d M-&%6Fqe@~{8*vo,O{#+r0ZL A1ժS&"x !ØkFZ!,__ \mJ0uCa'B$0Znқ$LD |@8S+m&bH|L
+wXqpMX&]%S|CP<C:$cY4eŚ.[h6dB(Xz}| y7Vmd{L}9Oy##bs
+ Ir
+
+&]hIz7cKBgȤ㊄4R~z̗J*X(^6UsLl(uW7wRTb&C# }9XB֦ydWޤGz[]AOI(H(dBY;E9'B jeprZ(8/άIC_@ks--7MKL{<l
+m\Z=7@
+Px
+Y(TfB q4@h5`eCo^oD^U'&N.vT 's1KR% 
+?96pe*Q f͊gXXX)U1̢(+r"
+^T(LFY`K\p(fY;pde2A4n9 nӵaKϱ8]Dc -#ů
+lb<kG}dJSiX^0^޼u;르_٬x֎Y{X,⏉4j=[mmR$GWD#J}2z`YXi66_NuUıi,4ckדg>@al<k}Z8t 1_p5K~ 1@(6 1cޙB钑yO :4̏R<hXx?N/ᑒ_%xxY{'W ?rPv|4FOuF1j,xƄ=$MSb.-WEfD-l$^dAzr][jn2C%
+õԦ`ڭ)bul6Z<F<ܗ_6uoW׮{|)
+о@_x
+endobj
+389 0 obj
+2397
+endobj
+390 0 obj<</Type/Page/Parent 287 0 R/Contents 391 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F4 5 0 R/F5 6 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+391 0 obj<</Length 392 0 R/Filter/FlateDecode>>stream
+xԙoFAc&,ɖ(;(
+HPI#SGNه,HQ)%`>f.Wrx4s ?{q~u#s_G7v^zAxQ@8<.7tjA)\j'q9 Ǔy: S`1K!:|X_҇o2dUi:U 8}OBvx$oYNjUW㿐
+H vD G*҅%+ T{DLvBL$>$]^zW:28iދ^EqKYWβP## 75 YMz<O~/2=:YME P!ٍBf6!QI3l±
+jFD D&5> d $J0aF#>ݜD|eD)0a`en Ҡ|WB#ږoef lA}IDqlU̐Ť!"~O#OyB>e Q6&>D3{{i++Pz\C )_^
+Z5pw .}d:0}d:>!F֎ڳ9L,hmO2x$ r[j7IXI$oLL!F+؂6\xu5vh$Q.H\ 4IŖ)/Q*^u! hHmi\Ex( 6o9Kqq̿C_(;dKc2pllh%UQȒDcİMXE<,4Tɫ#x:cܞ$armHeZlT^CʡQie]Hpc\%I7 uVs~=+<GJV5.²E!:Zr݇5D5iJ%l"Zɣ' vd"xKDz/ts:QkZu兪Bj1G#lsnF:2$u{3eM Ex5?XX(vHԬ%KlꇑmJ
+
+:V >!_<am̀;۞Uގ!̠vbζi4ں47Jau+`$ƽ
+0L2gb+봑TCCh!~!U;s1P9#2N9@0' pEv)R4d&=ai,2f(8ThYkJ5522M5u˔4>ͲbYzEPTMff\T]&ЏBfӋn(ߧXUննx =j"]RLeƲAstl _&m:lvKځy𨳱  }j-p}6yeۧH N|~ZO<iEt)L6~c|tMa6oB<KJx`3܏4N͑llB:-1mHV{=v
+:CHrO6Q$b$f8(ϴH `"#bBkH~ {AHA E,XugX nSywӓt*l{ aNSґ
+QjT!C?=M$0Z"E5WQD9`ӝ)M#(71=(,DP|I!23ahoޞ"4D>; }AeTlg@RȱG)@_tct|Hrl&V y<Qe J
+`oWj"
+x t2a"5RraO.]ʘ Grg3mM&C 5W6;DZ눼Nb
+"&:VA%rTq4~B
+'[E%dΑd#oBYyHhJ6 Vp<y8OI
+q Z9 3ii+%il@-q÷gG+:bHeTQiªi NQU׃DiKUPvr*sɣ6 ڟ o_2Q!x+/ok9o.*}ޜ<.''ODHf8`u=VrՑ@eG)!H XwŝI>$:6v`lq-p`Ͱ^+D?
+
+f8lx1VZzS.0X? x9STӜ(qQ-:4
+AL#(NBk w `</oq]fjNGQ# j}[47B/0Mm҆Gst+PJ)W?{9Ag\۪bT1/Z> x̛{3:ks1&#20ǘr%@1bvMәZI 7Opzsbo~Wg=ƕ0W71%\Җ^v=0*XRog*@ٷ
+X7Y?끬!31xĿX/'fI-
+/"؀3Z]M]hj
+Z; =N7[jTU4xZ CIqC3)0졶VVKݮbaW.ˇj;q^^nmOEUUf <-`9OͽVdIʃ/R uendstream
+endobj
+392 0 obj
+3524
+endobj
+393 0 obj<</Type/Page/Parent 287 0 R/Contents 394 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F4 5 0 R/F5 6 0 R/Fa 10 0 R>>>>>>endobj
+394 0 obj<</Length 395 0 R/Filter/FlateDecode>>stream
+xV;oAX%Ju% ! 8%
+DJ$b
+J|;ݙ5_m4]tuk5Hr_\|&j{]w@mAmm'WRxnSg_<W~ׂ*G*ʇxYej_K?C>Wz+9wnZ<y;yOq>xЄiAaIv֓0 VB? eAY*Y3hβ̏1R[R;h'CCY ZZ,D3u;˙5h$/-c =r]px&)0!FBC;&DL
+٢@z8m8eڊUcbD؃^ˣ鎮R&0VD*ft5–P 3'%ZkÔa! $:*t{n,$bM
+&r? A#!0ɾKPRFX^uCE5?3
+#Z:$D?S #\R0$38YIظ>|AX;K,狵326))W쯴><C[ywm2aArB09ѵ,c)YN$H:a@*<f%bM7ަ┨wNgG #PRzI\>:)f"J.a28F4M=r .Xej9?2nBHR7)
+
+1 'X`r
+ᜃ8<
+|2>"(G45p#`^K{QNd1*\"1Eȝ4k$MJ䥅>.7tK`?z GCJZ BvʡQCC16k^[^JV
+^;voH+{o9\aYdf v*^PsTw!}_&vendstream
+endobj
+395 0 obj
+1510
+endobj
+396 0 obj<</Type/Page/Parent 287 0 R/Contents 397 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F9 9 0 R/Fa 10 0 R>>>>>>endobj
+397 0 obj<</Length 398 0 R/Filter/FlateDecode>>stream
+xQo0+I vKjS6L+0I]R@^s|}q &R+QB"{̓M,d,g!#"4D_\v&/Z^݉f_m7͝ )ܩ<*fvv*kݾĺد&Q$l"nr{&})je/}1O~1>iTxXz:,J4RhuBvn['4?ׅFL1 :a{ڏ(&ٱŌlVqC|q m d{>㟧/T2E"TD my'6'q =T9QXf21-.r<xL&By]:hKቩ<R*Zb.J(!t5C
+endobj
+398 0 obj
+823
+endobj
+399 0 obj<</Type/Page/Parent 287 0 R/Contents 400 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/Fa 10 0 R>>>>>>endobj
+400 0 obj<</Length 401 0 R/Filter/FlateDecode>>stream
+x[o8+ZUIcKPH-R4>/yFM($0b|RLQ_S:}^o|aL_)+/vf-}N|_ӧ!͔>36u6~Ȱegi|Ue~|:˹\尊J[E;$nt`ʪ[<ڨ8,@cbWc<.$(;+ @S
+`hr,@Y
+iHiK<mwlcY
+HEۈY1 Pb
+endobj
+401 0 obj
+1181
+endobj
+402 0 obj<</Type/Page/Parent 287 0 R/Contents 403 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F9 9 0 R/Fa 10 0 R>>>>/Annots 224 0 R>>endobj
+403 0 obj<</Length 404 0 R/Filter/FlateDecode>>stream
+x͜Mssܭ甒eQ7r,6)JbeD>o7*nL3
+0;*du1EUVV
+׾^W1H׺]i]ljZ cg0f2<JCuxa;Q }T eijqz&ʌm&& j/8MVf-y@xgiudrlM;)fuŨXjT[
+b@K>Uۢ}@dRuI3tfr9@I:S
+֨|$ r
+dU}I_>IeP~eban6ҋ|9:]K?VIWUxKvjWut QúX0ޛb- %cq)E9)L桟>~^z+G@RM3B4pp=JJXQY海2vn;Ԫ4Zk5I]kuobAi?i h@ho{M
+Ԑ% D&M*\fȒuɍ50v/_c ͗k KJ=8nWA+(4`M ~h_'U0BFoe.IO[.)#<繤4o]z!2=׸Rx;Xl*6qBF+4xZu xQNu\UR! #\E32/:op9oyS,a\O#+r #ËU՝ 'v! ?8i m8܇m+ެS?
+s`wId‹לe3WP>)Ew& ѹkj,(-!::`ق5)jt%%"dK~iN, `((^BI +W#.))Y0q6iF;}w3,לAxqT8W ζy$YC8a
+;NI̐=OT *vG@R-ȮKuʰAI
+Y}4`Z+/%p&GaLo?ŒDYPZ 7x G.`f͝_'m
+j݁\8)=j(!zx<5p}~cWEiؐ' w-:0.ۃIRUXq]*n(~
+0+7t0<5!p(ay*zE
+Ӕ,(h]`Up<pw!!\%C)W /&{ '&IFGTT}Ufnݬ×+zl8vt /_fqrAendstream
+endobj
+404 0 obj
+3340
+endobj
+405 0 obj<</Type/Page/Parent 287 0 R/Contents 406 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F9 9 0 R/Fa 10 0 R>>>>/Annots 232 0 R>>endobj
+406 0 obj<</Length 407 0 R/Filter/FlateDecode>>stream
+xœMO0 >IJrdvڠ=p-4dEOe!UܠF'׈B^
+\le
+
+a | a@~
+(ŒNn^eeFhqY'ny3 P>+[mӬQ*
+endobj
+407 0 obj
+348
+endobj
+408 0 obj<</Count 8/First 409 0 R/Last 452 0 R>>endobj
+409 0 obj<</Parent 408 0 R/Title(Table of Contents)/Dest[402 0 R/XYZ null 756 null]/Next 410 0 R>>endobj
+410 0 obj<</Parent 408 0 R/Title(Introduction)/Dest[294 0 R/XYZ null 743 null]/Prev 409 0 R/Next 411 0 R>>endobj
+411 0 obj<</Parent 408 0 R/Count -5/First 412 0 R/Last 420 0 R/Title(Chapter 1, Basics of Serial Communications)/Dest[300 0 R/XYZ null 743 null]/Prev 410 0 R/Next 426 0 R>>endobj
+412 0 obj<</Parent 411 0 R/Title(What Are Serial Communications?)/Dest[300 0 R/XYZ null 371 null]/Next 413 0 R>>endobj
+413 0 obj<</Parent 411 0 R/Count -1/First 414 0 R/Last 414 0 R/Title(What Is RS-232?)/Dest[303 0 R/XYZ null 736 null]/Prev 412 0 R/Next 415 0 R>>endobj
+414 0 obj<</Parent 413 0 R/Title(Signal Definitions)/Dest[303 0 R/XYZ null 233 null]>>endobj
+415 0 obj<</Parent 411 0 R/Count -3/First 416 0 R/Last 418 0 R/Title(Asynchronous Communications)/Dest[306 0 R/XYZ null 260 null]/Prev 413 0 R/Next 419 0 R>>endobj
+416 0 obj<</Parent 415 0 R/Title(What Are Full Duplex and Half Duplex?)/Dest[309 0 R/XYZ null 466 null]/Next 417 0 R>>endobj
+417 0 obj<</Parent 415 0 R/Title(Flow Control)/Dest[309 0 R/XYZ null 329 null]/Prev 416 0 R/Next 418 0 R>>endobj
+418 0 obj<</Parent 415 0 R/Title(What Is a Break?)/Dest[312 0 R/XYZ null 729 null]/Prev 417 0 R>>endobj
+419 0 obj<</Parent 411 0 R/Title(Synchronous Communications)/Dest[312 0 R/XYZ null 627 null]/Prev 415 0 R/Next 420 0 R>>endobj
+420 0 obj<</Parent 411 0 R/Count -5/First 421 0 R/Last 425 0 R/Title(Accessing Serial Ports)/Dest[312 0 R/XYZ null 338 null]/Prev 419 0 R>>endobj
+421 0 obj<</Parent 420 0 R/Title(Serial Port Files)/Dest[312 0 R/XYZ null 255 null]/Next 422 0 R>>endobj
+422 0 obj<</Parent 420 0 R/Title(Opening a Serial Port)/Dest[315 0 R/XYZ null 686 null]/Prev 421 0 R/Next 423 0 R>>endobj
+423 0 obj<</Parent 420 0 R/Title(Writing Data to the Port)/Dest[318 0 R/XYZ null 599 null]/Prev 422 0 R/Next 424 0 R>>endobj
+424 0 obj<</Parent 420 0 R/Title(Reading Data from the Port)/Dest[318 0 R/XYZ null 442 null]/Prev 423 0 R/Next 425 0 R>>endobj
+425 0 obj<</Parent 420 0 R/Title(Closing a Serial Port)/Dest[318 0 R/XYZ null 230 null]/Prev 424 0 R>>endobj
+426 0 obj<</Parent 408 0 R/Count -1/First 427 0 R/Last 427 0 R/Title(Chapter 2, Configuring the Serial Port)/Dest[324 0 R/XYZ null 743 null]/Prev 411 0 R/Next 433 0 R>>endobj
+427 0 obj<</Parent 426 0 R/Count -5/First 428 0 R/Last 432 0 R/Title(The POSIX Terminal Interface)/Dest[324 0 R/XYZ null 384 null]>>endobj
+428 0 obj<</Parent 427 0 R/Title(Control Options)/Dest[327 0 R/XYZ null 686 null]/Next 429 0 R>>endobj
+429 0 obj<</Parent 427 0 R/Title(Local Options)/Dest[336 0 R/XYZ null 241 null]/Prev 428 0 R/Next 430 0 R>>endobj
+430 0 obj<</Parent 427 0 R/Title(Input Options)/Dest[342 0 R/XYZ null 729 null]/Prev 429 0 R/Next 431 0 R>>endobj
+431 0 obj<</Parent 427 0 R/Title(Output Options)/Dest[345 0 R/XYZ null 588 null]/Prev 430 0 R/Next 432 0 R>>endobj
+432 0 obj<</Parent 427 0 R/Title(Control Characters)/Dest[348 0 R/XYZ null 204 null]/Prev 431 0 R>>endobj
+433 0 obj<</Parent 408 0 R/Count -2/First 434 0 R/Last 435 0 R/Title(Chapter 3, MODEM Communications)/Dest[354 0 R/XYZ null 743 null]/Prev 426 0 R/Next 438 0 R>>endobj
+434 0 obj<</Parent 433 0 R/Title(What Is a MODEM?)/Dest[354 0 R/XYZ null 371 null]/Next 435 0 R>>endobj
+435 0 obj<</Parent 433 0 R/Count -2/First 436 0 R/Last 437 0 R/Title(Communicating With a MODEM)/Dest[354 0 R/XYZ null 214 null]/Prev 434 0 R>>endobj
+436 0 obj<</Parent 435 0 R/Title(Standard MODEM Commands)/Dest[360 0 R/XYZ null 729 null]/Next 437 0 R>>endobj
+437 0 obj<</Parent 435 0 R/Title(Common MODEM Communication Problems)/Dest[360 0 R/XYZ null 243 null]/Prev 436 0 R>>endobj
+438 0 obj<</Parent 408 0 R/Count -2/First 439 0 R/Last 443 0 R/Title(Chapter 4, Advanced Serial Programming)/Dest[366 0 R/XYZ null 743 null]/Prev 433 0 R/Next 447 0 R>>endobj
+439 0 obj<</Parent 438 0 R/Count -3/First 440 0 R/Last 442 0 R/Title(Serial Port IOCTLs)/Dest[366 0 R/XYZ null 384 null]/Next 443 0 R>>endobj
+440 0 obj<</Parent 439 0 R/Title(Getting the Control Signals)/Dest[369 0 R/XYZ null 357 null]/Next 441 0 R>>endobj
+441 0 obj<</Parent 439 0 R/Title(Setting the Control Signals)/Dest[372 0 R/XYZ null 525 null]/Prev 440 0 R/Next 442 0 R>>endobj
+442 0 obj<</Parent 439 0 R/Title(Getting the Number of Bytes Available)/Dest[372 0 R/XYZ null 268 null]/Prev 441 0 R>>endobj
+443 0 obj<</Parent 438 0 R/Count -3/First 444 0 R/Last 446 0 R/Title(Selecting Input from a Serial Port)/Dest[375 0 R/XYZ null 722 null]/Prev 439 0 R>>endobj
+444 0 obj<</Parent 443 0 R/Title(The SELECT System Call)/Dest[375 0 R/XYZ null 520 null]/Next 445 0 R>>endobj
+445 0 obj<</Parent 443 0 R/Title(Using the SELECT System Call)/Dest[375 0 R/XYZ null 182 null]/Prev 444 0 R/Next 446 0 R>>endobj
+446 0 obj<</Parent 443 0 R/Title(Using SELECT with the X Intrinsics Library)/Dest[378 0 R/XYZ null 170 null]/Prev 445 0 R>>endobj
+447 0 obj<</Parent 408 0 R/Count -4/First 448 0 R/Last 451 0 R/Title(Appendix A, Pinouts)/Dest[384 0 R/XYZ null 743 null]/Prev 438 0 R/Next 452 0 R>>endobj
+448 0 obj<</Parent 447 0 R/Title(RS-232 Pinouts)/Dest[384 0 R/XYZ null 384 null]/Next 449 0 R>>endobj
+449 0 obj<</Parent 447 0 R/Title(RS-422 Pinouts)/Dest[387 0 R/XYZ null 571 null]/Prev 448 0 R/Next 450 0 R>>endobj
+450 0 obj<</Parent 447 0 R/Title(RS-574 \(IBM PC/AT\) Pinouts)/Dest[390 0 R/XYZ null 736 null]/Prev 449 0 R/Next 451 0 R>>endobj
+451 0 obj<</Parent 447 0 R/Title(SGI Pinouts)/Dest[390 0 R/XYZ null 431 null]/Prev 450 0 R>>endobj
+452 0 obj<</Parent 408 0 R/Count -1/First 453 0 R/Last 453 0 R/Title(Appendix B, ASCII Control Codes)/Dest[396 0 R/XYZ null 743 null]/Prev 447 0 R>>endobj
+453 0 obj<</Parent 452 0 R/Title(Control Codes)/Dest[396 0 R/XYZ null 384 null]>>endobj
+454 0 obj<</Type/Catalog/Pages 287 0 R/Names 233 0 R/PageLayout/SinglePage/Outlines 408 0 R/OpenAction[294 0 R/XYZ null null null]/PageMode/UseOutlines/PageLabels<</Nums[0<</P(title)>>1<</P(eltit)>>2<</S/r>>4<</S/D>>]>>>>endobj
+xref
+0 455
+0000000000 65535 f
+0000000015 00000 n
+0000000239 00000 n
+0000001796 00000 n
+0000001870 00000 n
+0000001952 00000 n
+0000002030 00000 n
+0000002107 00000 n
+0000002186 00000 n
+0000002269 00000 n
+0000002350 00000 n
+0000002435 00000 n
+0000002494 00000 n
+0000002599 00000 n
+0000002704 00000 n
+0000002809 00000 n
+0000002914 00000 n
+0000003019 00000 n
+0000003124 00000 n
+0000003229 00000 n
+0000003334 00000 n
+0000003439 00000 n
+0000003544 00000 n
+0000003649 00000 n
+0000003754 00000 n
+0000003859 00000 n
+0000003964 00000 n
+0000004069 00000 n
+0000004174 00000 n
+0000004279 00000 n
+0000004384 00000 n
+0000004489 00000 n
+0000004594 00000 n
+0000004699 00000 n
+0000004804 00000 n
+0000004909 00000 n
+0000005014 00000 n
+0000005119 00000 n
+0000005224 00000 n
+0000005423 00000 n
+0000005472 00000 n
+0000005557 00000 n
+0000005606 00000 n
+0000005691 00000 n
+0000005740 00000 n
+0000005823 00000 n
+0000005872 00000 n
+0000005956 00000 n
+0000006001 00000 n
+0000006106 00000 n
+0000006209 00000 n
+0000006313 00000 n
+0000006418 00000 n
+0000006523 00000 n
+0000006628 00000 n
+0000006733 00000 n
+0000006799 00000 n
+0000006904 00000 n
+0000007009 00000 n
+0000007114 00000 n
+0000007219 00000 n
+0000007324 00000 n
+0000007376 00000 n
+0000007481 00000 n
+0000007505 00000 n
+0000007609 00000 n
+0000007714 00000 n
+0000007819 00000 n
+0000007924 00000 n
+0000008029 00000 n
+0000008134 00000 n
+0000008193 00000 n
+0000008297 00000 n
+0000008401 00000 n
+0000008506 00000 n
+0000008611 00000 n
+0000008716 00000 n
+0000008821 00000 n
+0000008926 00000 n
+0000009031 00000 n
+0000009136 00000 n
+0000009241 00000 n
+0000009346 00000 n
+0000009451 00000 n
+0000009556 00000 n
+0000009661 00000 n
+0000009766 00000 n
+0000009871 00000 n
+0000009976 00000 n
+0000010081 00000 n
+0000010186 00000 n
+0000010291 00000 n
+0000010396 00000 n
+0000010501 00000 n
+0000010606 00000 n
+0000010711 00000 n
+0000010816 00000 n
+0000010921 00000 n
+0000011026 00000 n
+0000011131 00000 n
+0000011236 00000 n
+0000011342 00000 n
+0000011448 00000 n
+0000011554 00000 n
+0000011660 00000 n
+0000011766 00000 n
+0000011872 00000 n
+0000011978 00000 n
+0000012084 00000 n
+0000012190 00000 n
+0000012296 00000 n
+0000012402 00000 n
+0000012508 00000 n
+0000012614 00000 n
+0000012720 00000 n
+0000012826 00000 n
+0000012932 00000 n
+0000013038 00000 n
+0000013144 00000 n
+0000013250 00000 n
+0000013356 00000 n
+0000013462 00000 n
+0000013568 00000 n
+0000013674 00000 n
+0000013780 00000 n
+0000013886 00000 n
+0000013992 00000 n
+0000014098 00000 n
+0000014204 00000 n
+0000014309 00000 n
+0000014415 00000 n
+0000014521 00000 n
+0000014627 00000 n
+0000014733 00000 n
+0000014839 00000 n
+0000014945 00000 n
+0000015051 00000 n
+0000015157 00000 n
+0000015263 00000 n
+0000015369 00000 n
+0000015475 00000 n
+0000015581 00000 n
+0000015687 00000 n
+0000015793 00000 n
+0000015899 00000 n
+0000016005 00000 n
+0000016111 00000 n
+0000016217 00000 n
+0000016323 00000 n
+0000016428 00000 n
+0000016534 00000 n
+0000016640 00000 n
+0000016746 00000 n
+0000016852 00000 n
+0000016958 00000 n
+0000017064 00000 n
+0000017170 00000 n
+0000017276 00000 n
+0000017382 00000 n
+0000017488 00000 n
+0000017594 00000 n
+0000017700 00000 n
+0000017806 00000 n
+0000017912 00000 n
+0000018018 00000 n
+0000018124 00000 n
+0000018230 00000 n
+0000018336 00000 n
+0000018441 00000 n
+0000018547 00000 n
+0000018653 00000 n
+0000018759 00000 n
+0000018865 00000 n
+0000018971 00000 n
+0000019077 00000 n
+0000019183 00000 n
+0000019289 00000 n
+0000019395 00000 n
+0000019501 00000 n
+0000019607 00000 n
+0000019713 00000 n
+0000019819 00000 n
+0000019925 00000 n
+0000020031 00000 n
+0000020137 00000 n
+0000020243 00000 n
+0000020349 00000 n
+0000020455 00000 n
+0000020561 00000 n
+0000020667 00000 n
+0000020773 00000 n
+0000020879 00000 n
+0000020985 00000 n
+0000021091 00000 n
+0000021197 00000 n
+0000021303 00000 n
+0000021409 00000 n
+0000021515 00000 n
+0000021621 00000 n
+0000021727 00000 n
+0000021833 00000 n
+0000021939 00000 n
+0000022045 00000 n
+0000022151 00000 n
+0000022257 00000 n
+0000022363 00000 n
+0000022469 00000 n
+0000022575 00000 n
+0000022681 00000 n
+0000022787 00000 n
+0000022893 00000 n
+0000022999 00000 n
+0000023104 00000 n
+0000023210 00000 n
+0000023316 00000 n
+0000023422 00000 n
+0000023528 00000 n
+0000023633 00000 n
+0000023738 00000 n
+0000023842 00000 n
+0000023946 00000 n
+0000024050 00000 n
+0000024154 00000 n
+0000024258 00000 n
+0000024362 00000 n
+0000025575 00000 n
+0000025679 00000 n
+0000025783 00000 n
+0000025888 00000 n
+0000025994 00000 n
+0000026100 00000 n
+0000026205 00000 n
+0000026311 00000 n
+0000026385 00000 n
+0000026419 00000 n
+0000026453 00000 n
+0000027256 00000 n
+0000027305 00000 n
+0000027354 00000 n
+0000027403 00000 n
+0000027451 00000 n
+0000027500 00000 n
+0000027549 00000 n
+0000027598 00000 n
+0000027647 00000 n
+0000027696 00000 n
+0000027745 00000 n
+0000027794 00000 n
+0000027843 00000 n
+0000027892 00000 n
+0000027941 00000 n
+0000027990 00000 n
+0000028039 00000 n
+0000028088 00000 n
+0000028137 00000 n
+0000028186 00000 n
+0000028235 00000 n
+0000028284 00000 n
+0000028333 00000 n
+0000028382 00000 n
+0000028431 00000 n
+0000028480 00000 n
+0000028528 00000 n
+0000028577 00000 n
+0000028626 00000 n
+0000028675 00000 n
+0000028724 00000 n
+0000028773 00000 n
+0000028822 00000 n
+0000028871 00000 n
+0000028920 00000 n
+0000028969 00000 n
+0000029018 00000 n
+0000029067 00000 n
+0000029116 00000 n
+0000029165 00000 n
+0000029214 00000 n
+0000029263 00000 n
+0000029312 00000 n
+0000029361 00000 n
+0000029410 00000 n
+0000029459 00000 n
+0000029508 00000 n
+0000029557 00000 n
+0000029606 00000 n
+0000029655 00000 n
+0000029704 00000 n
+0000029753 00000 n
+0000030142 00000 n
+0000030295 00000 n
+0000031091 00000 n
+0000031112 00000 n
+0000031207 00000 n
+0000031309 00000 n
+0000031329 00000 n
+0000031485 00000 n
+0000032569 00000 n
+0000032591 00000 n
+0000032705 00000 n
+0000032914 00000 n
+0000032935 00000 n
+0000033076 00000 n
+0000034216 00000 n
+0000034238 00000 n
+0000034402 00000 n
+0000036500 00000 n
+0000036522 00000 n
+0000036663 00000 n
+0000037912 00000 n
+0000037934 00000 n
+0000038110 00000 n
+0000044227 00000 n
+0000044249 00000 n
+0000044422 00000 n
+0000046081 00000 n
+0000046103 00000 n
+0000046253 00000 n
+0000047480 00000 n
+0000047502 00000 n
+0000047652 00000 n
+0000049062 00000 n
+0000049084 00000 n
+0000049198 00000 n
+0000049407 00000 n
+0000049428 00000 n
+0000049587 00000 n
+0000050471 00000 n
+0000050492 00000 n
+0000050642 00000 n
+0000051772 00000 n
+0000051794 00000 n
+0000051953 00000 n
+0000053579 00000 n
+0000053601 00000 n
+0000053760 00000 n
+0000055100 00000 n
+0000055122 00000 n
+0000055291 00000 n
+0000056329 00000 n
+0000056350 00000 n
+0000056509 00000 n
+0000057874 00000 n
+0000057896 00000 n
+0000058055 00000 n
+0000059625 00000 n
+0000059647 00000 n
+0000059806 00000 n
+0000061142 00000 n
+0000061164 00000 n
+0000061323 00000 n
+0000062638 00000 n
+0000062660 00000 n
+0000062833 00000 n
+0000064559 00000 n
+0000064581 00000 n
+0000064731 00000 n
+0000065565 00000 n
+0000065586 00000 n
+0000065718 00000 n
+0000066892 00000 n
+0000066914 00000 n
+0000067073 00000 n
+0000068393 00000 n
+0000068415 00000 n
+0000068529 00000 n
+0000068744 00000 n
+0000068765 00000 n
+0000068938 00000 n
+0000069980 00000 n
+0000070001 00000 n
+0000070160 00000 n
+0000071520 00000 n
+0000071542 00000 n
+0000071692 00000 n
+0000072640 00000 n
+0000072661 00000 n
+0000072811 00000 n
+0000074261 00000 n
+0000074283 00000 n
+0000074433 00000 n
+0000075576 00000 n
+0000075598 00000 n
+0000075739 00000 n
+0000076413 00000 n
+0000076434 00000 n
+0000076596 00000 n
+0000078373 00000 n
+0000078395 00000 n
+0000078557 00000 n
+0000081025 00000 n
+0000081047 00000 n
+0000081209 00000 n
+0000084804 00000 n
+0000084826 00000 n
+0000084979 00000 n
+0000086560 00000 n
+0000086582 00000 n
+0000086723 00000 n
+0000087617 00000 n
+0000087638 00000 n
+0000087761 00000 n
+0000089013 00000 n
+0000089035 00000 n
+0000089191 00000 n
+0000092602 00000 n
+0000092624 00000 n
+0000092780 00000 n
+0000093199 00000 n
+0000093220 00000 n
+0000093275 00000 n
+0000093380 00000 n
+0000093493 00000 n
+0000093672 00000 n
+0000093791 00000 n
+0000093943 00000 n
+0000094036 00000 n
+0000094200 00000 n
+0000094325 00000 n
+0000094438 00000 n
+0000094542 00000 n
+0000094669 00000 n
+0000094815 00000 n
+0000094920 00000 n
+0000095042 00000 n
+0000095167 00000 n
+0000095294 00000 n
+0000095403 00000 n
+0000095578 00000 n
+0000095717 00000 n
+0000095820 00000 n
+0000095934 00000 n
+0000096048 00000 n
+0000096163 00000 n
+0000096269 00000 n
+0000096437 00000 n
+0000096541 00000 n
+0000096691 00000 n
+0000096802 00000 n
+0000096925 00000 n
+0000097100 00000 n
+0000097242 00000 n
+0000097357 00000 n
+0000097485 00000 n
+0000097610 00000 n
+0000097768 00000 n
+0000097878 00000 n
+0000098007 00000 n
+0000098137 00000 n
+0000098293 00000 n
+0000098395 00000 n
+0000098510 00000 n
+0000098639 00000 n
+0000098738 00000 n
+0000098893 00000 n
+0000098981 00000 n
+trailer
+<</Size 455/Root 454 0 R/Info 1 0 R>>
+startxref
+99209
+%%EOF
diff --git a/licence.txt b/licence.txt
new file mode 100644
index 0000000..ecd9d35
--- /dev/null
+++ b/licence.txt
@@ -0,0 +1,361 @@
+comport - PD External for the serial Ports
+
+
+
+Institute for Electronic Music and Acoustics
+Copyright (C) 1998-2005 Winfried Ritsch
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version. (see below)
+
+--------------------------- GPL.TXT -------------------------
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
diff --git a/makefile b/makefile
new file mode 100644
index 0000000..761d12e
--- /dev/null
+++ b/makefile
@@ -0,0 +1,104 @@
+# comport PD External Unix(Linux)/Windows
+#
+# IEM - Institute for Electronic Music and Acoustic, Graz
+#
+# Author: Winfried Ritsch
+# Maintainer: Win
+#
+# Licence: GPL - Gnu Public Licence
+
+
+current: pd_nt
+ echo make pd_linux, pd_nt, pd_irix5, or pd_irix6
+
+
+# ----------------------- NT -----------------------
+pd_nt: comport.dll bird.dll
+
+.SUFFIXES: .dll
+
+PDNTCFLAGS = /W3 /WX /DNT /DPD /nologo /DWIN2000
+
+VC="C:\Programme\Microsoft Visual Studio\Vc98"
+PDROOT="C:\Programme\pd"
+
+PDNTINCLUDE = /I. /I$(PDROOT)\tcl\include /I$(PDROOT)\src /I$(VC)\include
+
+PDNTLDIR = $(VC)\lib
+PDNTLIB = $(PDNTLDIR)\libc.lib \
+ $(PDNTLDIR)\oldnames.lib \
+ $(PDNTLDIR)\kernel32.lib \
+ $(PDROOT)\bin\pd.lib
+
+.c.dll:
+ cl $(PDNTCFLAGS) $(PDNTINCLUDE) /c $*.c
+ link /dll /export:$*_setup $*.obj $(PDNTLIB)
+
+# ----------------------- IRIX 5.x -----------------------
+
+pd_irix5: comport.pd_irix5 bird.pd_irix5
+
+.SUFFIXES: .pd_irix5
+
+SGICFLAGS5 = -o32 -DPD -DSGI -O2
+
+
+SGIINCLUDE = -I../../src
+
+.c.pd_irix5:
+ cc $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c
+ ld -elf -shared -rdata_shared -o $*.pd_irix5 $*.o
+ rm $*.o
+
+# ----------------------- IRIX 6.x -----------------------
+
+pd_irix6: comport.pd_irix6 bird.pd_irix6
+
+.SUFFIXES: .pd_irix6
+
+SGICFLAGS6 = -DPD -DSGI -n32 \
+ -OPT:roundoff=3 -OPT:IEEE_arithmetic=3 -OPT:cray_ivdep=true \
+ -Ofast=ip32
+
+SGICFLAGS5 = -DPD -O2 -DSGI
+
+SGIINCLUDE = -I/../../src
+
+.c.pd_irix6:
+ cc $(SGICFLAGS6) $(SGIINCLUDE) -o $*.o -c $*.c
+ ld -elf -shared -rdata_shared -o $*.pd_irix6 $*.o
+ rm $*.o
+
+# ----------------------- LINUX i386 -----------------------
+
+pd_linux: comport.pd_linux bird.pd_linux
+
+.SUFFIXES: .pd_linux
+
+LINUXCFLAGS = -DPD -O2 -funroll-loops -fomit-frame-pointer \
+ -Wall -W -Wshadow -Wstrict-prototypes -Werror \
+ -Wno-unused -Wno-parentheses -Wno-switch
+
+LINUXINCLUDE = -I../../src
+
+.c.pd_linux:
+ cc $(LINUXCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c
+ ld -export_dynamic -shared -o $*.pd_linux $*.o -lc -lm
+ strip --strip-unneeded $*.pd_linux
+ rm $*.o
+
+
+# ---------- TEST ----------
+
+TESTCFLAGS = $(LINUXCFLAGS)
+LIBS = -lc -lm
+
+
+test: testser.o bird.o
+ gcc -o test testser.o bird.o $(LIBS)
+
+tester.o: testser.c
+ gcc -c -o testser.o testser.c $(TESTCFLAGS)
+
+bird.o: bird.c
+ gcc -c -o bird.o bird.c $(TESTCFLAGS)
diff --git a/pd_bird.bat b/pd_bird.bat
new file mode 100644
index 0000000..3c95436
--- /dev/null
+++ b/pd_bird.bat
@@ -0,0 +1,5 @@
+echo Hallo starte nun pd
+
+C:\data\pd\bin\pd -verbose -nomidi testbird.pd
+
+echo bye... \ No newline at end of file
diff --git a/pd_comport.bat b/pd_comport.bat
new file mode 100644
index 0000000..497fbee
--- /dev/null
+++ b/pd_comport.bat
@@ -0,0 +1,5 @@
+echo Hallo starte nun pd
+
+C:\Programme\pd\bin\pd -verbose -nomidi testcomport.pd
+
+echo bye... \ No newline at end of file
diff --git a/testbird.pd b/testbird.pd
new file mode 100644
index 0000000..03b18fb
--- /dev/null
+++ b/testbird.pd
@@ -0,0 +1,96 @@
+#N canvas 231 237 720 492 10;
+#X obj 134 195 bird;
+#X floatatom 203 248 4 0 0;
+#X msg 117 58 set POINT;
+#X msg 19 191 bang;
+#X obj 188 197 comport 1 9600;
+#X msg 28 58 set STREAM;
+#X floatatom 51 329 7 0 0;
+#X floatatom 71 360 7 0 0;
+#X floatatom 92 394 7 0 0;
+#X floatatom 113 333 7 0 0;
+#X floatatom 133 362 7 0 0;
+#X floatatom 155 395 7 0 0;
+#X text 406 121 comment;
+#X text 63 37 operationg mode;
+#X floatatom 177 331 7 0 0;
+#X floatatom 197 362 7 0 0;
+#X floatatom 218 396 7 0 0;
+#X floatatom 239 335 7 0 0;
+#X floatatom 259 364 7 0 0;
+#X floatatom 281 397 7 0 0;
+#X msg 29 90 set RUN;
+#X msg 97 92 set SLEEP;
+#X text 11 171 data point;
+#X obj 349 227 s birdctl;
+#X obj 193 130 r birdctl;
+#X obj 51 147 s birdctl;
+#X obj 51 292 unpack 1 2 3 4 5 6 7 8 9 10 11 12;
+#X text 479 38 3 floats;
+#X text 479 65 9 floats;
+#X text 480 89 3 floats;
+#X text 483 115 4 floats;
+#X text 481 137 6 floats;
+#X text 480 167 12 floats;
+#X text 488 192 7 floats;
+#X text 353 16 DATA MODES;
+#X text 350 254 SETTINGS;
+#X msg 418 259 set AngleAlign1 0 0 0 0 0 0;
+#X msg 417 288 set AngleAlign2 0 0 0;
+#X msg 381 42 set ANGLES;
+#X msg 381 64 set MATRIX;
+#X msg 381 87 set POSITION;
+#X msg 381 110 set QUARTER;
+#X msg 384 139 set POSANG;
+#X msg 380 165 set POSMAT;
+#X msg 382 190 set POSQUARTER;
+#X msg 420 314 set Hemisphere 0 0;
+#X msg 420 337 set RefFrame1 0 0 0 0 0 0;
+#X msg 423 362 set RefFrame2 0 0 0;
+#X msg 420 386 set RepRate1;
+#X msg 420 407 set RepRate2;
+#X msg 420 429 set RepRate8;
+#X msg 420 451 set RepRate32;
+#X obj 341 451 s birdctl;
+#X msg 195 154 verbose 1;
+#X msg 196 175 verbose 0;
+#X connect 0 0 26 0;
+#X connect 0 1 1 0;
+#X connect 0 1 4 0;
+#X connect 2 0 25 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 25 0;
+#X connect 20 0 25 0;
+#X connect 21 0 25 0;
+#X connect 24 0 0 0;
+#X connect 26 0 6 0;
+#X connect 26 1 7 0;
+#X connect 26 2 8 0;
+#X connect 26 3 9 0;
+#X connect 26 4 10 0;
+#X connect 26 5 11 0;
+#X connect 26 6 14 0;
+#X connect 26 7 15 0;
+#X connect 26 8 16 0;
+#X connect 26 9 17 0;
+#X connect 26 10 18 0;
+#X connect 26 11 19 0;
+#X connect 36 0 52 0;
+#X connect 37 0 52 0;
+#X connect 38 0 23 0;
+#X connect 39 0 23 0;
+#X connect 40 0 23 0;
+#X connect 41 0 23 0;
+#X connect 42 0 23 0;
+#X connect 43 0 23 0;
+#X connect 44 0 23 0;
+#X connect 45 0 52 0;
+#X connect 46 0 52 0;
+#X connect 47 0 52 0;
+#X connect 48 0 52 0;
+#X connect 49 0 52 0;
+#X connect 50 0 52 0;
+#X connect 51 0 52 0;
+#X connect 53 0 0 0;
+#X connect 54 0 0 0;
diff --git a/testbird.sh b/testbird.sh
new file mode 100644
index 0000000..bfc65cf
--- /dev/null
+++ b/testbird.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+pd -alsa -alsadev hw:1,1 -inchannels 8 -outchannels 8 -frags 20 testbird.pd
diff --git a/testcomport.pd b/testcomport.pd
new file mode 100644
index 0000000..bd3db6d
--- /dev/null
+++ b/testcomport.pd
@@ -0,0 +1,78 @@
+#N canvas 199 244 690 400 10;
+#X obj 89 121 comport 1 9600;
+#X msg 5 103 66;
+#X obj 80 251 print;
+#X floatatom 187 80 4 0 0;
+#X msg 4 61 64;
+#X text 4 81 point;
+#X text 3 40 stream;
+#X msg 5 153 86;
+#X text 5 128 position;
+#X msg 8 197 70;
+#X msg 6 237 71;
+#X text 7 180 run;
+#X text 6 215 sleep;
+#X floatatom 113 159 4 0 0;
+#X obj 82 215 spigot;
+#X msg 101 188 1;
+#X msg 135 189 0;
+#X msg 353 37 bits 8;
+#X msg 352 61 stopbit 0;
+#X msg 351 89 parity 0;
+#X msg 352 118 xonxoff 1;
+#X msg 352 144 rtscts 0;
+#X text 431 92 parity 1=even \, -1=odd \, 0=off;
+#X text 431 63 extra stopbit 1=on \, 0=off;
+#X text 433 38 databits 5 \, 6 \, 7 \, 8;
+#X text 432 9 use exact or higher baudrate;
+#X obj 112 96 r comctl;
+#X obj 335 169 s comctl;
+#X text 433 117 use handshake xon/off 1=on 0=off;
+#X text 431 143 cts/rts hardwarehandshake 1=on 0=off;
+#X msg 345 210 pollintervall 1;
+#X text 461 211 set pollintervall for read in ms;
+#X text 461 225 (default is 1 tick 1ms);
+#X msg 246 264 close;
+#X msg 251 288 open 1;
+#X msg 353 12 baud 10000;
+#X text 312 261 Close Serial port;
+#X text 315 292 Open seriel board Nr (0=COM1 \, 1=COM2 \, ...);
+#X msg 238 342 devicename /dev/ttyS1;
+#X text 232 363 Danger !!! you can open every file in your system and
+maybe if suid is root damage the system.;
+#X text 233 324 set devicename for actuell port \, then close and open
+again;
+#X obj 240 78 spigot;
+#X msg 259 51 1;
+#X msg 293 52 0;
+#X obj 235 25 key;
+#X text 2 22 eg. for flock of bird:;
+#X text 235 312 never should be needed except for sys admins (only
+unix);
+#X msg 269 10 baud 300;
+#X connect 0 0 13 0;
+#X connect 0 0 14 0;
+#X connect 1 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 7 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 14 0 2 0;
+#X connect 15 0 14 1;
+#X connect 16 0 14 1;
+#X connect 17 0 27 0;
+#X connect 18 0 27 0;
+#X connect 19 0 27 0;
+#X connect 20 0 27 0;
+#X connect 21 0 27 0;
+#X connect 26 0 0 0;
+#X connect 30 0 27 0;
+#X connect 33 0 27 0;
+#X connect 34 0 27 0;
+#X connect 35 0 27 0;
+#X connect 41 0 3 0;
+#X connect 42 0 41 1;
+#X connect 43 0 41 1;
+#X connect 44 0 41 0;
+#X connect 47 0 27 0;
diff --git a/testcomport.sh b/testcomport.sh
new file mode 100644
index 0000000..c7ad1e9
--- /dev/null
+++ b/testcomport.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+pd -alsa -alsadev hw:1,1 -inchannels 8 -outchannels 8 -frags 15 testcomport.pd
diff --git a/vcmakefile.dsp b/vcmakefile.dsp
new file mode 100644
index 0000000..c3af30f
--- /dev/null
+++ b/vcmakefile.dsp
@@ -0,0 +1,85 @@
+# Microsoft Developer Studio Project File - Name="vcmakefile" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** NICHT BEARBEITEN **
+
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+
+CFG=vcmakefile - Win32 Debug
+!MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
+!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl
+!MESSAGE
+!MESSAGE NMAKE /f "vcmakefile.mak".
+!MESSAGE
+!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben
+!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
+!MESSAGE
+!MESSAGE NMAKE /f "vcmakefile.mak" CFG="vcmakefile - Win32 Debug"
+!MESSAGE
+!MESSAGE Fr die Konfiguration stehen zur Auswahl:
+!MESSAGE
+!MESSAGE "vcmakefile - Win32 Release" (basierend auf "Win32 (x86) External Target")
+!MESSAGE "vcmakefile - Win32 Debug" (basierend auf "Win32 (x86) External Target")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+
+!IF "$(CFG)" == "vcmakefile - Win32 Release"
+
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Cmd_Line "NMAKE /f makefile"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "makefile.exe"
+# PROP BASE Bsc_Name "makefile.bsc"
+# PROP BASE Target_Dir ""
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Cmd_Line "NMAKE /f makefile"
+# PROP Rebuild_Opt "/a"
+# PROP Target_File "vcmakefile.exe"
+# PROP Bsc_Name "vcmakefile.bsc"
+# PROP Target_Dir ""
+
+!ELSEIF "$(CFG)" == "vcmakefile - Win32 Debug"
+
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Cmd_Line "NMAKE /f makefile"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "makefile.exe"
+# PROP BASE Bsc_Name "makefile.bsc"
+# PROP BASE Target_Dir ""
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Cmd_Line "NMAKE /f makefile"
+# PROP Rebuild_Opt "/a"
+# PROP Target_File "vcmakefile.exe"
+# PROP Bsc_Name "vcmakefile.bsc"
+# PROP Target_Dir ""
+
+!ENDIF
+
+# Begin Target
+
+# Name "vcmakefile - Win32 Release"
+# Name "vcmakefile - Win32 Debug"
+
+!IF "$(CFG)" == "vcmakefile - Win32 Release"
+
+!ELSEIF "$(CFG)" == "vcmakefile - Win32 Debug"
+
+!ENDIF
+
+# Begin Source File
+
+SOURCE=.\makefile
+# End Source File
+# End Target
+# End Project
diff --git a/vcmakefile.dsw b/vcmakefile.dsw
new file mode 100644
index 0000000..0a9cda0
--- /dev/null
+++ b/vcmakefile.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN!
+
+###############################################################################
+
+Project: "vcmakefile"=.\vcmakefile.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/vcmakefile.ncb b/vcmakefile.ncb
new file mode 100644
index 0000000..bde6bd9
--- /dev/null
+++ b/vcmakefile.ncb
Binary files differ
diff --git a/vcmakefile.opt b/vcmakefile.opt
new file mode 100644
index 0000000..5771755
--- /dev/null
+++ b/vcmakefile.opt
Binary files differ
diff --git a/vcmakefile.plg b/vcmakefile.plg
new file mode 100644
index 0000000..82ea7aa
--- /dev/null
+++ b/vcmakefile.plg
@@ -0,0 +1,29 @@
+<html>
+<body>
+<pre>
+<h1>Erstellungsprotokoll</h1>
+<h3>
+--------------------Konfiguration: vcmakefile - Win32 Debug--------------------
+</h3>
+
+
+Microsoft (R) Program Maintenance-Dienstprogramm: Version 6.00.8168.0
+Copyright (C) Microsoft Corp 1988-1998. Alle Rechte vorbehalten.
+
+ cl /W3 /WX /DNT /DPD /nologo /DWIN2000 /I. /I"C:\Programme\pd"\tcl\include /I"C:\Programme\pd"\src /I"C:\Programme\Microsoft Visual Studio\Vc98"\include /c comport.c
+comport.c
+ link /dll /export:comport_setup comport.obj "C:\Programme\Microsoft Visual Studio\Vc98"\lib\libc.lib "C:\Programme\Microsoft Visual Studio\Vc98"\lib\oldnames.lib "C:\Programme\Microsoft Visual Studio\Vc98"\lib\kernel32.lib "C:\Programme\pd"\bin\pd.lib
+Microsoft (R) Incremental Linker Version 6.00.8168
+Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
+
+ Bibliothek comport.lib und Objekt comport.exp wird erstellt
+ echo make pd_linux, pd_nt, pd_irix5, or pd_irix6
+make pd_linux, pd_nt, pd_irix5, or pd_irix6
+
+
+
+<h3>Ergebnisse</h3>
+vcmakefile.exe - 0 Fehler, 0 Warnung(en)
+</pre>
+</body>
+</html>