pax_global_header00006660000000000000000000000064143177626040014524gustar00rootroot0000000000000052 comment=1a00ed5b2c8c9b18f4ad7799c0191c6ad8e56fe6 pconsole-1.2.0/000077500000000000000000000000001431776260400133465ustar00rootroot00000000000000pconsole-1.2.0/.gitignore000066400000000000000000000001461431776260400153370ustar00rootroot00000000000000.depend .vscode *.o *~ .swp *.swp pconsole pconsole.sh config.cache config.h config.log config.status pconsole-1.2.0/ChangeLog000066400000000000000000000007631431776260400151260ustar00rootroot00000000000000Oct 7th 2022 - improved error checking and handling - release version 1.2.0 Sept 4th 2010 - fix for build on Solaris - fix for systems that do not have TIOCSTI Changes as of April 9th 2001 - release of version 1.0 on freshmeat.net Changes as of April 7th 2001 - compiled final distribution package for version 1.0 Changes as of April 6th 2001 - rewrote everything and also wrote scripts to make life easier Changes as of April 5th 2001 - first simple prototype with fixed number of connections pconsole-1.2.0/Conn.c000066400000000000000000000050261431776260400144120ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* Conn.c WJ101 */ #include "config.h" #include "Conn.h" #include "cstring.h" #include #include #include Conn *AllConns = NULL; Conn *new_Conn(void) { Conn *c; if ((c = (Conn *)malloc(sizeof(Conn))) == NULL) return NULL; memset(c, 0, sizeof(Conn)); return c; } void destroy_Conn(Conn *c) { if (c == NULL) return; if (c->fd > 0) close(c->fd); if (c->dev != NULL) free(c->dev); if (c->hostname != NULL) free(c->hostname); free(c); } Conn *prepend_Conn(Conn *c) { return (Conn *)prepend_List(&AllConns, c); } Conn *add_Conn(Conn *c) { return (Conn *)add_List(&AllConns, c); } void remove_Conn(Conn *c) { remove_List(&AllConns, c); } Conn *find_Conn_by_fd(int fd) { Conn *c; for(c = AllConns; c != NULL; c = c->next) if (c->fd == fd) return c; return NULL; } Conn *find_Conn_by_dev(char *name) { Conn *c; if (name == NULL) return NULL; for(c = AllConns; c != NULL; c = c->next) if (c->dev != NULL && !strcmp(c->dev, name)) return c; return NULL; } Conn *find_Conn_by_hostname(char *name) { Conn *c; if (name == NULL) return NULL; for(c = AllConns; c != NULL; c = c->next) if (c->hostname != NULL && !strcmp(c->hostname, name)) return c; return NULL; } #ifdef HAVE_ST_RDEV Conn *find_Conn_by_rdev(dev_t rdev) { Conn *c; for(c = AllConns; c != NULL; c = c->next) if (c->rdev == rdev) return c; return NULL; } #endif int write_Conn(Conn *c, void *buf, size_t len) { ssize_t n; if (c == NULL) { /* ignore (not a hard error) */ return 0; } if (c->fd <= 0) { /* ignore (not a hard error) */ return 0; } while (len > 0) { n = write(c->fd, buf, len); if (n == -1) { /* write() error (silent) */ return -1; } len -= n; buf += n; } return 0; } /* EOB */ pconsole-1.2.0/GPL000066400000000000000000000431271431776260400137220ustar00rootroot00000000000000 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. Copyright (C) 19yy 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. , 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. pconsole-1.2.0/List.c000066400000000000000000000103001431776260400144170ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* List.c WJ98 */ #include "config.h" #include "List.h" #include #ifndef NULL #define NULL 0 #endif void *prepend_List(void *v1, void *v2) { ListType **root, *l; if (v1 == NULL) return NULL; root = (ListType **)v1; l = (ListType *)v2; if (l == NULL) return (void *)*root; l->prev = NULL; l->next = *root; if (l->next != NULL) l->next->prev = l; *root = l; return l; } void *add_List(void *v1, void *v2) { ListType **root, *l; if (v1 == NULL) return NULL; root = (ListType **)v1; l = (ListType *)v2; if (l == NULL) return (void *)*root; l->prev = l->next = NULL; if (*root == NULL) *root = l; else { ListType *lp; /* Link in at the end of the list */ for(lp = *root; lp->next != NULL; lp = lp->next); lp->next = l; l->prev = lp; } return (void *)l; } /* Note: listdestroy_List() now auto-rewinds the list (!) */ void listdestroy_List(void *v1, void *v2) { ListType *l, *l2; void (*destroy_func)(ListType *); if (v1 == NULL || v2 == NULL) return; l = (ListType *)v1; destroy_func = (void (*)(ListType *))v2; while(l->prev != NULL) /* auto-rewind */ l = l->prev; while(l != NULL) { l2 = l->next; destroy_func(l); l = l2; } } void *concat_List(void *v1, void *v2) { ListType **root, *l; if (v1 == NULL) return NULL; root = (ListType **)v1; l = (ListType *)v2; if (l == NULL) return (void *)*root; if (*root == NULL) *root = l; else { ListType *p; for(p = *root; p->next != NULL; p = p->next); p->next = l; l->prev = p; } return (void *)l; } void remove_List(void *v1, void *v2) { ListType **root, *l; if (v1 == NULL || v2 == NULL) return; root = (ListType **)v1; l = (ListType *)v2; if (*root == NULL) return; if (l->prev == NULL) /* must be in root node */ *root = l->next; else l->prev->next = l->next; if (l->next != NULL) l->next->prev = l->prev; l->next = l->prev = NULL; } int list_Count(void *v) { ListType *l; int c = 0; for(l = (ListType *)v; l != NULL; l = l->next) c++; return c; } void *rewind_List(void *v) { ListType *root; if (v == NULL) return NULL; root = (ListType *)v; while(root->prev != NULL) root = root->prev; return root; } void *unwind_List(void *v) { ListType *root; if (v == NULL) return NULL; root = (ListType *)v; while(root->next != NULL) root = root->next; return root; } /* sort a list using qsort() */ void *sort_List(void *v, int (*sort_func)(void *, void *)) { ListType *root, *p, **arr; int count, i; if (v == NULL) return NULL; root = (ListType *)v; if (sort_func == NULL) return root; count = 0; for(p = root; p != NULL; p = p->next) /* count # of elements */ count++; if (count <= 1) /* nothing to be sorted */ return root; if ((arr = (ListType **)malloc(count * sizeof(ListType *))) == NULL) return root; /* malloc() failed, return root */ /* fill the array of pointers */ p = root; for(i = 0; i < count; i++) { arr[i] = p; p = p->next; } /* do the sorting (we include a nasty typecast here for convenience) */ qsort(arr, count, sizeof(ListType *), (int (*)(const void *, const void *))sort_func); /* rearrange the prev and next pointers */ arr[0]->prev = NULL; arr[0]->next = arr[1]; for(i = 1; i < count-1; i++) { arr[i]->prev = arr[i-1]; arr[i]->next = arr[i+1]; } arr[i]->prev = arr[i-1]; arr[i]->next = NULL; /* free the array and return new root */ root = arr[0]; free(arr); return root; } /* EOB */ pconsole-1.2.0/Makefile000066400000000000000000000046211431776260400150110ustar00rootroot00000000000000# Generated automatically from Makefile.in by configure. # # pconsole WJ101 # Copyright (C) 2001 Walter de Jong # # 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 # # pconsole Makefile.in WJ101 # prefix = /home/walter/.local exec_prefix = ${prefix} bindir = ${exec_prefix}/bin CC = gcc CFLAGS = -O2 -Wall -Wstrict-prototypes -fomit-frame-pointer LFLAGS = LIBS = INCLUDE = include INSTALL = /usr/bin/install -c INSTALL_PROGRAM = /usr/bin/install -c -m 0750 INSTALL_SCRIPT = /usr/bin/install -c -m 0750 INSTALL_DATA = /usr/bin/install -c -m 0640 .c.o: $(CC) -I$(INCLUDE) -I. $(CFLAGS) -c $< OBJS = List.o Conn.o cstring.o terminal.o commands.o pconsole.o CFILES = $(OBJS:.o=.c) TARGETS = pconsole all: config.status config.log $(TARGETS) include .depend # # Targets # config.status config.log: @( \ echo "Not yet configured. Type './configure' to configure." ; \ echo \ ) ; \ exit 1 pconsole: $(OBJS) $(CC) $(LFLAGS) $(OBJS) -o pconsole $(LIBS) neat: rm -f core *~ clean: rm -f core *.o $(TARGETS) *~ mrproper: clean rm -f .depend config.status config.cache config.log config.h pconsole.sh touch .depend depend dep .depend: $(CC) -I$(INCLUDE) -I. -M $(CFILES) > .depend install: all @( \ echo "installing pconsole ..."; \ mkdir -p $(bindir) 2>/dev/null ; \ ${INSTALL} pconsole $(bindir) ; \ ${INSTALL_PROGRAM} pconsole.sh $(bindir) ; \ ${INSTALL_PROGRAM} ssh.sh $(bindir) ; \ echo ; \ echo "Note: You may want to make pconsole setuid root with the following commands:"; \ echo ; \ echo " sudo chown root $(bindir)/pconsole && sudo chmod 4110 $(bindir)/pconsole" ; \ echo \ ) uninstall: rm -f $(bindir)/pconsole $(bindir)/pconsole.sh $(bindir)/ssh.sh ; \ rmdir $(bindir) 2>/dev/null # EOB pconsole-1.2.0/Makefile.in000066400000000000000000000043711431776260400154200ustar00rootroot00000000000000# # pconsole WJ101 # Copyright (C) 2001 Walter de Jong # # 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 # # pconsole Makefile.in WJ101 # prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ CC = @CC@ CFLAGS = @CFLAGS@ LFLAGS = LIBS = INCLUDE = include INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL@ -m 0750 INSTALL_SCRIPT = @INSTALL@ -m 0750 INSTALL_DATA = @INSTALL@ -m 0640 .c.o: $(CC) -I$(INCLUDE) -I. $(CFLAGS) -c $< OBJS = List.o Conn.o cstring.o terminal.o commands.o pconsole.o CFILES = $(OBJS:.o=.c) TARGETS = pconsole all: config.status config.log $(TARGETS) include .depend # # Targets # config.status config.log: @( \ echo "Not yet configured. Type './configure' to configure." ; \ echo \ ) ; \ exit 1 pconsole: $(OBJS) $(CC) $(LFLAGS) $(OBJS) -o pconsole $(LIBS) neat: rm -f core *~ clean: rm -f core *.o $(TARGETS) *~ mrproper: clean rm -f .depend config.status config.cache config.log config.h pconsole.sh touch .depend depend dep .depend: $(CC) -I$(INCLUDE) -I. -M $(CFILES) > .depend install: all @( \ echo "installing pconsole ..."; \ mkdir -p $(bindir) 2>/dev/null ; \ @INSTALL_PROGRAM@ pconsole $(bindir) ; \ @INSTALL_SCRIPT@ pconsole.sh $(bindir) ; \ @INSTALL_SCRIPT@ ssh.sh $(bindir) ; \ echo ; \ echo "Note: You may want to make pconsole setuid root with the following commands:"; \ echo ; \ echo " sudo chown root $(bindir)/pconsole && sudo chmod 4110 $(bindir)/pconsole" ; \ echo \ ) uninstall: rm -f $(bindir)/pconsole $(bindir)/pconsole.sh $(bindir)/ssh.sh ; \ rmdir $(bindir) 2>/dev/null # EOB pconsole-1.2.0/README.md000066400000000000000000000146121431776260400146310ustar00rootroot00000000000000pconsole ======== by Walter de Jong (C) 2001 pconsole COMES WITH NO WARRANTY. pconsole IS FREE SOFTWARE. pconsole is distributed under terms described in the GNU General Public License. This is pconsole, the parallel console tool. pconsole was meant as an interactive administrative shell tool for clusters. pconsole allows you to connect to each node of your cluster simultaneously, and you can type your administrative commands in a specialized window that 'multiplies' the input to each of the connections you have opened. pconsole is best run from within X Windows, although it is possible to employ it without X (in console mode) as well. You need to install pconsole on only 1 machine in the cluster, this would usually be your central administrative node. MAKE AND INSTALL ---------------- Do a `./configure` and `make install` as root. If you first only want to try pconsole, I suggest you do a `./configure --prefix=.` and `make install` instead of just configure and make. Try running `bin/pconsole.sh`. Or `bin/pconsole.sh machine1 machine2 machine2`. pconsole was made to compile and run on any Unix-like platform. If you encounter problems, check the list of possible problems at the end of this README. To reconfigure, do a `make mrproper` and `./configure` before typing `make` again. If you decide to make pconsole setuid root (as suggested), mind to restrict access via a special group (such as 'admin' or 'operator') or put it in a directory which the normal user doesn't have access to. pconsole is a very powerful tool that should not fall into the wrong hands. So, as root, execute: ``` # chown root.admin pconsole # chmod 4110 pconsole ``` pconsole drops its root privileges when they're not needed, so the program maintains maximum security. HOW DOES IT WORK? ----------------- pconsole does not work through daemons. The pconsole.sh script opens up a number of connections to each node of your cluster of workstations. Then, the pconsole binary attaches to the tty devices that these windows are using, and it copies the input you type to all open connections. TWEAKING AND TUNING ------------------- pconsole.sh requires the `xterm` command. If you do not like xterm, you can either edit the script or put the environment variable `P_TERM` in your environment. Example: ``` $ P_TERM=rxvt ; export P_TERM # for sh > setenv P_TERM rxvt # for csh ``` By default, the window geometry is 40x12 with font size 5x7. This is very small. To change, either edit the script or use `P_TERM_OPTIONS` in your environment. `P_TERM_OPTIONS` can have any options to the `P_TERM` command you like. Example: ``` $ P_TERM_OPTIONS="-geometry 80x25 -fn 10x20 -rv +sb" $ export P_TERM_OPTIONS ``` There is also a `P_CONSOLE_OPTIONS` environment variable, which specifies the geometry of the main pconsole window. By default, pconsole tries to use SSH to make connections. If you do not have `ssh`, it will try to use `telnet`. If you do have ssh but pconsole fails to find it, you should edit the script `ssh.sh` and adjust the line containing `PATH`. pconsole.sh uses the `P_CONNECT_CMD` environment variable (by default set to 'ssh.sh'). Example of changing it: ``` $ P_CONNECT_CMD=rlogin ; export P_CONNECT_CMD ``` If you want to use pconsole to connect your serial console lines, you should probably set `P_CONNECT_CMD` to 'telnet', because serial console lines usually do not support the SSH protocol. USING PCONSOLE -------------- Fire up pconsole.sh. Everything you type can and will be used against you. Hit to enter command mode. Type 'help' (or just 'h') for help. Type 'c' to reconnect and leave command mode. Hit to re-enter command mode and type 'l' to list all connections. You can use 'detach' to detach from a particular tty or host. If you have multiple windows open to a particular host and enter 'detach ', it will detach all ttys for that host. Open up a new window on your local machine (same machine where you started pconsole in the first place). Type the 'tty' command. It gives you the name of the tty that the window is using. In the pconsole main window, type 'attach ' or 'attach yourmachine#'. Now type 'list' to see if the connection shows up. Type 'quit' or 'exit' to quit pconsole. If you own a serial port multiplexer that allows you to telnet to specific port numbers on the IP of the multiplexer, you can have pconsole connect to ':'. TIPS & TRICKS: TYPING PASSWORDS ------------------------------- When logging in, you may need to enter a password. The pconsole main window echoes everything you type, as it cannot 'know' that you are at a password prompt. To keep the password from being visible, you should turn off the echo. You can do this by typing 'echo off' in command mode, or you can use the handy short-cut when not in command mode. With echo turned off, you can safely enter your password and hit again to toggle echoing back on. TIPS & TRICKS: PCONSOLE FOR MANY MACHINES ----------------------------------------- In theory, pconsole can work with an infinite number of connections, but it's just not very practical to have more than 16 open windows on your screen. If you want to run pconsole on many machines, try adding the '-iconic' option to xterm: ``` $ P_TERM_OPTIONS="-iconic" ; export P_TERM_OPTIONS ``` This will start all xterms in iconized mode, now just click one open and let the others iconized, and you can work nice and easy. IF IT DOESN'T WORK ------------------ - pconsole needs root privs. So, are you root? Or, is the pconsole binary setuid root? - The pconsole.sh script uses 'ps' to find out on which tty the terminal processes are. You may need to edit this script and change the line containing 'ps'. If you don't know how to write shell scripts, ask a friend. - Check the PATH variables in the top of the scripts pconsole.sh and ssh.sh. Most common paths are listed, but you may have your stuff in unusual directories. - Read this README for more hints (see above). - If all else fails, throw this package in the dumpster..! LAST NOTES ---------- - You can get OpenSSH from http://www.openssh.org/ - The GNU General Public License is at http://www.fsf.org/copyleft/gpl.html - The pconsole main distribution page is at https://walterdejong.github.io/pconsole/ I hope you'll enjoy using pconsole. ![Screenshot](/images/screenshot.jpg?raw=true "Screenshot") pconsole-1.2.0/_config.yml000066400000000000000000000000331431776260400154710ustar00rootroot00000000000000theme: jekyll-theme-minimalpconsole-1.2.0/commands.c000066400000000000000000000221471431776260400153210ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* command.c WJ101 */ #include "config.h" #include "commands.h" #include "pconsole.h" #include "cstring.h" #include "terminal.h" #include "Conn.h" #include #include #include #include #include #include #ifdef HAVE_FCNTL_H #include "fcntl.h" #endif Command commands[] = { { "help", cmd_help, "Give help about the available commands", }, { "?", cmd_help, "short-cut for 'help'", }, { "version", cmd_version, "Display version information", }, { "echo", cmd_echo, "Turn echo on or off", }, { "attach", cmd_attach, "Attach to a tty device", }, { "detach", cmd_detach, "Detach from a tty device", }, { "list", cmd_list, "Show devices currently attached to", }, { "connect", cmd_connect, "Leave command mode", }, { "quit", cmd_exit, "Exit pconsole", }, { "exit", cmd_exit, "Exit pconsole", }, { NULL, NULL, NULL, }, }; int pcommand(char *buf) { char cmd[4096], **arr, *cmd_str; int i, len; strcpy(cmd, buf); cstrip_line(cmd); if (!*cmd) return 0; if ((arr = cstrsplit(cmd, ' ')) == NULL) { fprintf(stderr, "pconsole: out of memory (?)\n"); return 0; } len = strlen(arr[0]); for(i = 0; commands[i].cmd != NULL; i++) { cmd_str = commands[i].cmd; if (*cmd_str == '|') cmd_str++; if (!strncmp(cmd_str, arr[0], len)) { if (commands[i].func == NULL) printf("pconsole: not yet implemented\n"); else commands[i].func(&arr[1]); break; } } if (commands[i].cmd == NULL) printf("pconsole: unknown command '%s'\n", arr[0]); free(arr); return 0; } int cmd_help(char **argv) { int i; if (argv == NULL || argv[0] == NULL) { for(i = 0; commands[i].cmd != NULL; i++) if (commands[i].cmd[0] == '|') printf("\n %-14s %s\n", commands[i].cmd+1, commands[i].help); else printf(" %-14s %s\n", commands[i].cmd, commands[i].help); } else { int j, len; char *cmd; for(j = 0; argv[j] != NULL; j++) { /* Special command 'help warranty' to satisfy the GNU people It is formatted at 60 chars because the pconsole.sh script opens the window by default at only 60 chars. The message is too long so it still scrolls off the screen, but oh well... */ if (!strcmp(argv[j], "warranty")) { printf( "Copyright (C) 2001 Walter de Jong \n" "\n"); printf( "This program is free software; you can redistribute it\n" "and/or modify it under the terms of the GNU General Public\n" "License as published by the Free Software Foundation;\n" "either version 2 of the License, or (at your option)\n" "any later version.\n" "\n"); printf( "This program is distributed in the hope that it will be\n" "useful, but WITHOUT ANY WARRANTY; without even the\n" "implied warranty of MERCHANTABILITY or FITNESS FOR A\n" "PARTICULAR PURPOSE. See the GNU General Public License\n" "for more details.\n" "\n"); printf( "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the\n" "Free Software Foundation, Inc., 59 Temple Place,\n" "Suite 330, Boston, MA 02111-1307 USA\n"); continue; } /* give help on specified commands */ len = strlen(argv[j]); for(i = 0; commands[i].cmd != NULL; i++) { cmd = commands[i].cmd; if (*cmd == '|') cmd++; if (!strncmp(argv[j], cmd, len)) { printf(" %-14s %s\n", cmd, commands[i].help); break; } } if (commands[i].cmd == NULL) printf("pconsole: unknown command '%s'\n", argv[j]); } } return 0; } int cmd_version(char **argv) { printf("pconsole " VERSION " WJ101\n" "Copyright (C) 2001 Walter de Jong \n" "\n" "This is free software with ABSOLUTELY NO WARRANTY.\n" "For details type 'help warranty'.\n" "\n" "The distribution page is at https://walterdejong.github.io/pconsole/\n" ); return 0; } int cmd_echo(char **argv) { if (argv == NULL || argv[0] == NULL) flags ^= FLAGS_ECHO; else if (!strcmp(argv[0], "on")) flags |= FLAGS_ECHO; else if (!strcmp(argv[0], "off")) flags &= ~FLAGS_ECHO; else { printf("usage: echo [on|off]\n"); return 1; } printf("pconsole: echo is now toggled %s\n", (flags & FLAGS_ECHO) ? "on" : "off"); return 0; } int cmd_exit(char **argv) { Conn *c, *c_next; char *arr[2]; /* exit: detach from all attached terminals abuse the cmd_detach() command to do this */ arr[1] = NULL; for(c = AllConns; c != NULL; c = c_next) { c_next = c->next; arr[0] = c->dev; cmd_detach(arr); } terminal_mode(TERMINAL_COOKED); exit(0); return -1; } int cmd_connect(char **argv) { if (AllConns == NULL) { printf("pconsole: currently not attached to any terminal device\n"); return 0; } flags &= ~FLAGS_CMD_MODE; /* drop out of command mode */ return 0; } int cmd_attach(char **argv) { int i; size_t len; char *tty, *devname, buf[256]; struct stat ttystat, ttystat2; Conn *c; if (argv == NULL || argv[0] == NULL) { printf("usage: attach [hostname#] [...]\n"); return 1; } if ((tty = ttyname(fileno(stdin))) == NULL) { printf("pconsole: not on a tty\n"); cmd_exit(NULL); return -1; } if (stat(tty, &ttystat)) { printf("failed to stat my tty %s: %s\n", tty, strerror(errno)); cmd_exit(NULL); return -1; } sprintf(buf, "\r\n[pconsole attached from tty %s]\r\n", tty); len = strlen(buf); for(i = 0; argv[i] != NULL; i++) { printf("attaching %s : ", argv[i]); if ((devname = strchr(argv[i], '#')) != NULL) { *devname = 0; devname++; if (!*devname) { printf("invalid terminal device name '%s:'\n", argv[i]); continue; } } else devname = argv[i]; /* do a couple of safety checks the given name should be a character device, and it should not be the same as the controlling tty */ if (stat(devname, &ttystat2)) { printf("%s\n", strerror(errno)); continue; } if (((ttystat2.st_mode & S_IFMT) & S_IFCHR) != S_IFCHR) { printf("not a character device\n"); continue; } #ifdef HAVE_ST_RDEV if (ttystat2.st_rdev == ttystat.st_rdev) { printf("cannot create a pconsole loop\n"); continue; } if (find_Conn_by_rdev(ttystat2.st_rdev) != NULL) { printf("already attached\n"); continue; } #else if (find_Conn_by_name(devname) != NULL) { printf("already attached\n"); continue; } #endif /* allocate connection object */ if ((c = new_Conn()) == NULL) { printf("out of memory (?)\n"); return -1; } c->dev = strdup(devname); if (devname != argv[i]) c->hostname = strdup(argv[i]); #ifdef HAVE_ST_RDEV c->rdev = ttystat2.st_rdev; #endif /* open the device */ if ((c->fd = open(devname, O_RDWR)) == -1) { fprintf(stderr, "open %s: %s\n", devname, strerror(errno)); destroy_Conn(c); continue; } add_Conn(c); printf("Ok\n"); /* tell target we're attached */ if (write_Conn(c, buf, len) == -1) { destroy_Conn(c); continue; } } return 0; } int cmd_detach(char **argv) { int i; size_t len; char *tty, buf[256]; Conn *c; if (argv == NULL || argv[0] == NULL) { printf("usage: detach [hostname#] [...]\n"); return 1; } tty = ttyname(fileno(stdin)); sprintf(buf, "\r\n[pconsole detached from tty %s]\r\n", (tty == NULL) ? "(unknown)" : tty); len = strlen(buf); for(i = 0; argv[i] != NULL; i++) { if ((c = find_Conn_by_dev(argv[i])) == NULL && (c = find_Conn_by_hostname(argv[i])) == NULL) { printf("not attached to %s\n", argv[i]); continue; } do { if (c->hostname != NULL) printf("detaching from %s#%s : ", c->hostname, c->dev); else printf("detaching from %s : ", c->dev); write_Conn(c, buf, len); remove_Conn(c); destroy_Conn(c); printf("Ok\n"); } while((c = find_Conn_by_hostname(argv[i])) != NULL || (c = find_Conn_by_dev(argv[i])) != NULL); } return 0; } int cmd_list(char **argv) { Conn *c; if (AllConns == NULL) { printf("pconsole: currently not attached to any terminal device\n"); return 0; } printf("Currently attached to:\n"); for(c = AllConns; c != NULL; c = c->next) { #ifdef HAVE_ST_RDEV if (c->hostname != NULL) printf(" %-16s %-20s (device no %d, %d)\n", c->dev, c->hostname, ((int)c->rdev >> 8) & 0xff, (int)c->rdev & 0xff); else printf(" %-16s %-20s (device no %d, %d)\n", c->dev, " ", ((int)c->rdev >> 8) & 0xff, (int)c->rdev & 0xff); #else if (c->hostname != NULL) printf(" %-16s %s\n", c->dev, c->hostname); else printf(" %-16s\n", c->dev); #endif } return 0; } /* EOB */ pconsole-1.2.0/config.h.in000066400000000000000000000015531431776260400153750ustar00rootroot00000000000000/* config.h.in. Generated automatically from configure.in by autoheader. */ /* Define to empty if the keyword does not work. */ #undef const /* Define if your struct stat has st_rdev. */ #undef HAVE_ST_RDEV /* Define as the return type of signal handlers (int or void). */ #undef RETSIGTYPE /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if you have the memset function. */ #undef HAVE_MEMSET /* Define if you have the strchr function. */ #undef HAVE_STRCHR /* Define if you have the strdup function. */ #undef HAVE_STRDUP /* Define if you have the strerror function. */ #undef HAVE_STRERROR /* Define if you have the header file. */ #undef HAVE_FCNTL_H /* Define if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define if you have the header file. */ #undef HAVE_UNISTD_H pconsole-1.2.0/configure000077500000000000000000001472001431776260400152610ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=pconsole.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi for ac_prog in mawk gawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:531: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_AWK="$ac_prog" break fi done IFS="$ac_save_ifs" fi fi AWK="$ac_cv_prog_AWK" if test -n "$AWK"; then echo "$ac_t""$AWK" 1>&6 else echo "$ac_t""no" 1>&6 fi test -n "$AWK" && break done # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:563: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:593: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:644: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:676: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 687 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:692: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:718: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:723: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:751: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break fi done if test -z "$ac_aux_dir"; then { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:813: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then INSTALL="$ac_cv_path_install" else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL="$ac_install_sh" fi fi echo "$ac_t""$INSTALL" 1>&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:867: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:888: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:905: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:922: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:947: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:960: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:1027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi for ac_hdr in fcntl.h sys/ioctl.h unistd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:1054: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1064: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done echo $ac_n "checking for working const""... $ac_c" 1>&6 echo "configure:1092: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } ; return 0; } EOF if { (eval echo configure:1146: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_c_const=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_c_const" 1>&6 if test $ac_cv_c_const = no; then cat >> confdefs.h <<\EOF #define const EOF fi echo $ac_n "checking for st_rdev in struct stat""... $ac_c" 1>&6 echo "configure:1167: checking for st_rdev in struct stat" >&5 if eval "test \"`echo '$''{'ac_cv_struct_st_rdev'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include int main() { struct stat s; s.st_rdev; ; return 0; } EOF if { (eval echo configure:1180: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_st_rdev=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_struct_st_rdev=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_struct_st_rdev" 1>&6 if test $ac_cv_struct_st_rdev = yes; then cat >> confdefs.h <<\EOF #define HAVE_ST_RDEV 1 EOF fi if test $ac_cv_prog_gcc = yes; then echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6 echo "configure:1203: checking whether ${CC-cc} needs -traditional" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_pattern="Autoconf.*'x'" cat > conftest.$ac_ext < Autoconf TIOCGETP EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "$ac_pattern" >/dev/null 2>&1; then rm -rf conftest* ac_cv_prog_gcc_traditional=yes else rm -rf conftest* ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat > conftest.$ac_ext < Autoconf TCGETA EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "$ac_pattern" >/dev/null 2>&1; then rm -rf conftest* ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6 if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 echo "configure:1249: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #ifdef signal #undef signal #endif #ifdef __cplusplus extern "C" void (*signal (int, void (*)(int)))(int); #else void (*signal ()) (); #endif int main() { int i; ; return 0; } EOF if { (eval echo configure:1271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_type_signal=int fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_signal" 1>&6 cat >> confdefs.h <&6 echo "configure:1292: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:1320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done if test "$GCC" = "yes" ; then CCOPTS='-O2 -Wall -Wstrict-prototypes -fomit-frame-pointer' else CCOPTS='-O' fi CFLAGS="$CCOPTS" trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 DEFS=-DHAVE_CONFIG_H # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" trap 'rm -fr `echo "Makefile pconsole.sh config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@AWK@%$AWK%g s%@CC@%$CC%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g s%@CPP@%$CPP%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac case "$ac_given_INSTALL" in [/$]*) INSTALL="$ac_given_INSTALL" ;; *) INSTALL="$ac_dots$ac_given_INSTALL" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g s%@INSTALL@%$INSTALL%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' ac_dC='\3' ac_dD='%g' # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='\([ ]\)%\1#\2define\3' ac_uC=' ' ac_uD='\4%g' # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_eB='$%\1#\2define\3' ac_eC=' ' ac_eD='%g' if test "${CONFIG_HEADERS+set}" != set; then EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF fi for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac echo creating $ac_file rm -f conftest.frag conftest.in conftest.out ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` cat $ac_file_inputs > conftest.in EOF # Transform confdefs.h into a sed script conftest.vals that substitutes # the proper values into config.h.in to produce config.h. And first: # Protect against being on the right side of a sed subst in config.status. # Protect against being in an unquoted here document in config.status. rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF sed -n -f conftest.hdr confdefs.h > conftest.vals rm -f conftest.hdr # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >> conftest.vals <<\EOF s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% EOF # Break up conftest.vals because some shells have a limit on # the size of here documents, and old seds have small limits too. rm -f conftest.tail while : do ac_lines=`grep -c . conftest.vals` # grep -c gives empty output for an empty file on some AIX systems. if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi # Write a limited-size here document to conftest.frag. echo ' cat > conftest.frag <> $CONFIG_STATUS sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS echo 'CEOF sed -f conftest.frag conftest.in > conftest.out rm -f conftest.in mv conftest.out conftest.in ' >> $CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail rm -f conftest.vals mv conftest.tail conftest.vals done rm -f conftest.vals cat >> $CONFIG_STATUS <<\EOF rm -f conftest.frag conftest.h echo "/* $ac_file. Generated automatically by configure. */" > conftest.h cat conftest.in >> conftest.h rm -f conftest.in if cmp -s $ac_file conftest.h 2>/dev/null; then echo "$ac_file is unchanged" rm -f conftest.h else # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" fi rm -f $ac_file mv conftest.h $ac_file fi fi; done EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 pconsole-1.2.0/configure.in000066400000000000000000000014651431776260400156650ustar00rootroot00000000000000dnl Process this file with autoconf to produce a configure script. dnl dnl pconsole configure.in WJ101 dnl (mostly created with autoscan, modifications by Walter de Jong ) dnl AC_INIT(pconsole.c) dnl Checks for programs AC_PROG_AWK AC_PROG_CC AC_PROG_INSTALL dnl Checks for header files AC_HEADER_STDC AC_CHECK_HEADERS(fcntl.h sys/ioctl.h unistd.h) dnl Checks for typedefs, structures, and compiler characteristics AC_C_CONST AC_STRUCT_ST_RDEV dnl Checks for library functions. AC_PROG_GCC_TRADITIONAL AC_TYPE_SIGNAL AC_CHECK_FUNCS(strchr strdup strerror memset) dnl special compiler options for gcc if test "$GCC" = "yes" ; then CCOPTS='-O2 -Wall -Wstrict-prototypes -fomit-frame-pointer' else CCOPTS='-O' fi CFLAGS="$CCOPTS" AC_CONFIG_HEADER(config.h) AC_OUTPUT(Makefile pconsole.sh) dnl EOB pconsole-1.2.0/cstring.c000066400000000000000000000047501431776260400151710ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* cstring.c WJ101 */ #include "config.h" #include "cstring.h" #include #include #include #ifndef HAVE_MEMSET void *memset(void *s, int c, size_t n) { while(n > 0) { *((char *)s) = (char)c; n--; } return s; } #endif #ifndef HAVE_STRDUP char *strdup(char *s) { char *str; int len; if (s == NULL) return NULL; if ((str = (char *)malloc(strlen(s)+1)) == NULL) return NULL; strcpy(str, s); return str; } #endif #ifndef HAVE_STRERROR char *strerror(int err) { static char buf[64]; sprintf(buf, "error #%d\n", err); return buf; } #endif void cstrip_line(char *msg) { char *p; int i; if (msg == NULL || !*msg) return; while((p = strchr(msg, 27)) != NULL) /* filter escape characters */ memmove(p, p+1, strlen(p)+1); while((p = strchr(msg, '\t')) != NULL) /* tab2space */ *p = ' '; i = strlen(msg); while(i && *msg == ' ') memmove(msg, msg+1, i--); i--; while(i >= 0 && (msg[i] == ' ' || msg[i] == '\r' || msg[i] == '\n')) msg[i--] = 0; return; } /* Splits a line into an array Just like Perl's split() function The substrings are not copied into the array; the string that is passed as parameter to split() is chopped in pieces The return value is allocated, it must be free()d */ char **cstrsplit(char *line, char token) { char **args, *p, *startp; int num = 2; if (!line || !*line) return NULL; p = line; while((p = strchr(p, token)) != NULL) { num++; p++; } if ((args = (char **)malloc(num * sizeof(char *))) == NULL) return NULL; startp = p = line; num = 0; while((p = strchr(p, token)) != NULL) { args[num++] = startp; *p = 0; p++; startp = p; } args[num++] = startp; args[num] = NULL; return args; } /* EOB */ pconsole-1.2.0/images/000077500000000000000000000000001431776260400146135ustar00rootroot00000000000000pconsole-1.2.0/images/screenshot.jpg000066400000000000000000005505531431776260400175070ustar00rootroot00000000000000JFIFXCREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?go^ qswkIxS Xl^;=GuO _xލy u&vNi ;$@9ڤP:zcިqڍAna9 [ o(41NzdT77ť%Up$[8:E6Y.@ǿTddyMB6>oZ$OpMfQ暤v$IkG)'Vnq-VțLQkG*)\-䉼otf?g¡7}LT4Qp&5?y .Df?g3[3?Z%L 5#iE7w;0֑cc\znF1~Sگ0Tߑy lUdw䲂G; >]M+qg|*MV3 9h=2JLy=qIu;@FdA@Rȵ_R+gn:J U!㞃ߟcba8a'ݲ%AcdT)#vB[[#8=3>`ش_tcV9ySӃj!b$,\|g29}qF1yD xq's;t%]_ ,K.v<`)[c(r=s8x@I )`!!;Ozӯ#=G+z_ր rO9Lg״;1. #N{LK3w8n1ӃOd(-u#8>#zu1TN{ 6t#H0ON)WCV=8x$w? 9le:Ĝr:=io/A8ӥ!F+цrQg_rC)~͵y?=s T䑁rc^8POnGOLd}WRXm}9ͅA ' 0Gctci&>8g0y#稧y{ ?玃Qgz_cԩnx#3}Iz@SJ py}{{aJ?7$؜pzɤJ/$(>LYw_zv~_^\R ?w61qRI^\s^;q9r 81ACqws9E*qr:$t};+988==@DZ OI9g8@vZ0Np})§,?cv(Fw`y*xv`O18ws@<{tsJ$yP@mϦq:dГƶ63w1;z<O`|Bς/٬ \|'9G\{uc!9ŒcO'?]W#0Ŕ`Ϸ+c+n8t; I pqӡ1;qd8Xۇ qq\";srB g c]$8?1bv ?9rpSp 9Ϩ ˧$hB\M,>89499\Hx=Oǧ靖IPɎ#q=@tRfl1#ؓ9L@o`98``_I1s܂#98ltdt.ͱ^߈¤~_3I#ڞO2o9$ǸNJty`1?MP `vpF:`ҕa  *`cv{cN@w ctzr1[; rN:s׷BH~f^$ %_El@\d^9qp ^O`x<~/!c#HG9ޤt[\qOQ?0AI8{?Ϡ>4zӜsӠ=נ!\8W8=r 'B)P 28mp졁eq{g2zNsz~>ߠ_]EvߘN0O<ppd ʜ2IF~qJ8vzG=B ]~@g.!]-rGx'9s3h1ǷIriHbX\ק~33"A ㌎=y=4y',rrG;daV#<,33A8}Gb *:?ґ 9lpr6B69s{ hק9J@7.N6c8ctCe`pz9G^'I8^ c-q#84Ӆ@}9pӀ<$` ~\dÌcUY\y# F8U$OʗXHqeO>@#5iYY~RDDqW ` dӜv+<% ?/jc&XJQq6{gXY/ $:&{|KSǨ[cd RlnK Z&ѵY5FCXD^6D3XOo;s WfWՠyĒ5N>UxwnsO|zǚ]Y53ORpD% [.i!ms-x+q3F |kl/=:O2$F` FAjX}^Kww۝ }p;ca)EBKéDL( l&OZ=-"``!xo#fKŌ˩D'ݻ99?{ukg|mDxH&!7Ga(cHmkMQkJ%uCo+H 1@\?L>/KkjLuH˨'5pgfYL rG׮G- \]#~N&Q!DعGlU`_xFItKG"1RUH2+1X}^IoM+/v,$ =^/c iP-HJ0)ؐg;u>żqXg!p+np\s+$-?U3S>x-?U3S>x-?U3S>x-?U3S>u%H+CG3xUkDPy7 9/Z>03@|qBOCQC־>LǍ2 :tWJt"h|ɝ*At+翊}A"(ՔOjQMwc/\X?a^*ww +l f?g3[3?[3vMy<fhaKK2̪<8Q#yr}vd<}FoI8Fp;3=k1\nl}dfm:kG*- i( u~wq mAzpj5m%pzׯ:[m=8!}1]\8Xɷ7!91su ں+;BH7'uGoQC^acO_J: ܄:䜌dOXH OR㟭8^0ʪs#?PxIr6TcgB61 s7sg9)[=\t\g n >J`rqN>[ 8c'J=Hyϯ3x,SgL8 sUY# Ay<3{GB0H@y\qN<-yBݎ9 c4G3m/=2}GN0A@U. ’A?.=x,AsǾ-%NGq:tEBH. 13s36j%OQs u=bRp|tn .BNW8Ќsy<g?Cn)9l;O4ӸcQ׶:H *}'ߏ#.A0IvO<1ߧ#߷Nrd'EFCFr7qEi&޺wNO'gqLǀxGe ^d^>w0qD5kCs" z藐]i~"=;ˆ+XomE啢\y9jiE IY( O$`[xm`I5Zݝ ;i*L "dlfJ4WX/tv#"+?7s3& :McVr隢hu]k~^DY$9Tvv 6vK]˼LQ@ *ԜI\u [iAwZj!T~Tl[t`#bF2 ( ( ()l:ZL .$9ã2 FEey3?7B2>ɱ1**?g9g-cv-ŴK aI'J, `Tmͯ&񯗣I=/51(?924+}DsR|Pg9S8s-`;?d8d7ep#V'lbiʰ&xk:jgUMVrlӹP*.0CSuM#Bf};ʬFli>K$՟Q-ϔ7y#E hxo+K{;K]OR$LEn$FXC! $w> Žݾ6ilRV0)SWAxQ׶kZ٣`(A$$@? +յ)'I+Fo$fd*NCM?;oYڥ[QV#,K+ D9 >c-(?5Z+ؤqܢ ; lln?K}6K>:խͼ+vFgb$p#Sk2+(< -DK&T]$iS8 W&$Ᲊ"`H *U\p,x _u}DNmu͜3d+U*ۛk6@Msmj<jޑ5!mĐME%VeHq`FEXn&iCDG# F =. [Lͅ, NX2q\xQD}[m𻳆J2y5Ǔ 3d|0;_4u~?77o6KeH]Mv êh@Pu HWԠGy;J.C2# *NrXѴ?QZjA>5Ī`e#17nPnijKgçI3X *DyoTV"0VIа~j<ׇeȝ;ZPw.m@gԎD䡊(UL4m,NXQzTU$Gp 6{q5ƹB5܇m:PTp!A J'rt5O_&wkXiQPeV$;VE$4鵁(u$fo! |%95b ( ( ( ( ( |A_P舫J|A_P舫 ?Fs~*SP7g mg#}=8Z㞼{t0Gמx^Aoq;{~|Ga Ͷo:Xʠ!@b98ۚ'$nbq-y=N4W:闒}/<ɬU. G"]l![ReJ3vxUï\8o'z(Ϟ? =G >8o'z(Ϟ? =G >8o'z(Ϟ? =G >8o'z(Ϟ? =G >8o'z(Ϟ? =G >8o'z(Ϟ? =G >8o'z(ϟٖY<4(o';YmȟSp00 `q^E/LWv:]̊ʦMR6 0G֢Z6ffhzJPpH\WQW'>%%&vR.טja)smiױyd}kV8~Iy{#[Zksjq*6F@|* >8o'z)bah<z*@|qBOCWSjgзU=}fajgзU=}fajgзU=}fajgзU=}fajgзU=}fajgзU=}fajg?ut67 b@|qBOCWQթ['j۳22Gn= 941!lO=98J@RO\p8IvB=@9*'#F8v֐l*9y== ;0K`[\<=@BrF;,ONT x=G>rΡ@7ȧۭd:1[BH%Hx`wL~Cӧ/(^YCW̪Ó =3'@/׬!rV$TTm b= )ɿ<Ƃo6ġAw\Q5?#$ F-%+tH5 ~y%Xi^IX B7 p[ ܼ4[J֙-ձy/$/vDM\ATq /3h>YT.[U=5q9@dHܺcH| ( ( ( (#xmm常8` $Q@$|%a%}]_8'n}(6;{Ąvd! m݃8kɪAEch)mBy;O#5ɗX6h/̾c2vsB~7Smۼ/dQb6 H, -J N=rI;^r Hma䁿ɭ xf i7ɧlw\\ʾJVE3HLpjѴ[YNTSoru/64Rbv[Yȴ/D`da|ܢȼ>Q+]?S+y:[XM@W]R=o%66NIBu<5/ 2鶋w5aDE > r6[en&=uV# Hkb? Rm <2Dyl H]xpI`qY@Q@Q@L2323Kҳ57÷:ld,waS9x/9巕Xiek$̿hpRIru&CNMKQYXgG<1)2G*H ,@4;o}9|>jw {Ջ}bS]PEF#%r˻ Yw~pH"zƃ"V:}39ϼ߿e)vcZY.gLx"yQ( 1-8B=jOH|۶o@sg yxKI/;g0H]b U<1q2v(((((*w*w0g>'^+qjAo<@Jv9886;$N#R18s=3U~nx8H48 O\s#{w~q1WmKw{oq%es3(X :噉<]x7bw:_Ou|=B^̣h;ȘC/0/Vt6mڭr]J[ 2ȭA?3HZ_}-NfRzzēIYc Y xndu IEy~3z$3 elcіX2qpY MUm-'k[4zG,Z6 FLJW*pP7zwp]ɝA G\|:'^jfXi"94DH27ߐmR0XZ//⹿7HFJe)"&Y*'n.%"BI#TP2I'5%x5ۯk^"[D^&΅>D%LۗdǨkW>4_Ai,/HJ`rhBt5+jKѼS]j;yZ hcܢ\pJ) { _\_K<١2!H ' b((((((!&ا8P8O#=?o!&|!O w:<U^?5?1H,`>=By8`ANN}{NBrG:q;`͸wq 'מyybp$6Ic?q7sm?xI$N0qT 8P!F0+83N=:g}Ey3Ք.AN{x-cHqߏQҒ2[ p ~= 7#QO'% x=I>gP 1~0={c[{מQ(^qg s};9?Ql; &08#Ẑ#98ps2yTncu9zzT1򁍧8۩]cn\Jd>'=Uc%L㯮{%6 ߒ9zvHG%IQn`8=x @9,0:o_LgzH|6u `w Ts{編9O]C`}":`g4U LzOq݃JH 6#;㞽H$Goq%=p|C֊~HUf >Y~Йr ʷkۧAӾ/׬!FTc=Fsz_P#^膭g_O hfyJ3M0Dx;湽9uM/zu]R_:̒86WGwmq:hz4jGOT6tU`ev+`{bƃ>Ym,&W6ՙ_y.*q9NIƺWk g{ G|6@xRTH%2/[zI]jBtM-dͲ@Yv}b&עA a3]G2`G l!y\sV3Yڛ?Z} \dml00Cp( 4~8bF=쌻e3#c6j4Y菉UVHIIC娮?/h\E\Ͽf߈18`V4ռ sEpRiT>%l*$@QEQEQEgZFn>t,VF[hi%cM̓ dO.MwZKm4hV&d[1(95?8 _rQ?2 1R + `@! >ͺD#GGgLwӥӇ0!Pa"\c>mH 4yIp.HMp4[c䆸P`K1eIyEs_*cDml#?xр 4/+1ʬDH U?+}?56YRBќ..ڸ7.!/mΕe[Kwufu \.r4M:_n⽗oh׌y18;y':QE VmI]w3ŽqI)KK2D `@xW\_oj'O̶ꨐ9+(\y lxD:OuǗ5ż,EdS o%Vbpi򽡌1(hJpJH,['Jmn['yEBơ `<OOkx9/èAϚr`ve𶌷gy[ fHB*Hؘ#jo hggjlsei;`%pb1 @v+ԯ =&ѵ P_2Aѫ pҪxІYѸUW;I.SЧ$}FLaWh"ݣ;É0F.#t9tqDGUeUpS==ݵihf ɕr"!67̀ jjڵ宣iP]_\-7&8j2ٕ06l|C<~lMSFR=_+x7I$5Nɂ_KxʙQ)(_pUC:Ȱ^q`8$gʧc,hs{壪1ӧ*QEQEQEQEQEOWЕOWF~+PC"A@>frH''@, ’1u2=9<*J=3xsl ߗ=wrNeٝn?b>Su~vwnYp3eFr8s?mvsh_t٧4n (/+7JNN>PJ/Wi:q.__r^_ik7<4\X2HgUucJ FPV;2x5>˻ZuٹHgƒ)"*\+vϹu'ZIMB[ԎWWIP߿f,vnetlڤ\Zme2&r̼zx|K56[@tF@ʆFBvB RX.#˻K,n ْ!Rqۂ%kڞoh[˪\j-΀2l' '+yc Pp6`F zR.៾S sz};sӨ]g-I-A88PTmFqn?N,7^~f?ǦV2@R Goǿlq;g#;3=Tc0t 2c.6xϠĸy̨SŃL<x1akx7L\i]̖3a" pIɨ:zf3HPY YeUyAF⋍˜NO{umM5gd̾jrBWF–c 橯^ZҢԒ}2 {¶F xc>K>6| -rŶW(EyTZAsPH$vڀ݆,TrVg%Ԟ\)HRĒ@UU,ĐI$ 4+:Oj>G3nqn>l&تzni[֏!$IbxS PEPEPEP?>/ؼl>w}O?fߛwcgϟbyoO/_W?8>UwuWRyp!KIUTd@ $$Yv-Q%ۻ'٣!@ ,a-|Rwբ4ؼ Z-OԖ'T*̻Nv<+iF}wфS(npCHHa\_ J9S"+ź@6(p밒rA?Þ.]xwZ}̾M4dV! yUFu© 3c>{ %ZfXvWp%2y"vE>`opc^,[/ _uMSGKm[$",6%tKOú5oK-RK.QqWI[qo,sA*H2AG9qgoD[Xwe&Gm& N-+Bi_8c.S,gbZߺRI5)<)]z KzMj6}YZ=qT*đdMʡծtSCVgysNpa1^|G^XƧO2OghԱdҶ+m%mU\w<2`]v!aaS-Ѽ-ɖ,K4`&7MlQ\_~&~n䶖?!ǹdRiUYFCuI|${;]{0hR{e[I2JȮvRW;^-|>;Eopk,$]eE^ZӴ0j%@!D{QA%Ag8IDnfwRE2Ckm?]~ǶyW/Yg?S׭OϞhb}gOnyg~۞6lmGF8}Vm4YCimYLQblo)I|G/[=:;[MK0QdF27yg3H^1s^k^zY~Dx, _-5^Z u :1$Yr][s՛ AFvq{ ޅ!]EHOo1pS;I`nh%/dzݼ7q?\7$9(#d`1JZgFp7 < !%U`%N[pn>c[_U[\|.'#`P\+ԭGm+ ;kvWIN-F%MCz]44jt!}`[D$ 7L%+& m2 +q/VI1[YXH $ HQ$ luKT\)bO,HvK9϶ C[K{w۴w(4c(FXem}g3 %Q"@ RgF;jh1_h'[y,~Gy yPq çhiv>cuI,jK o8cMҦҴK{\]\G,M$ /89=+Ʃj5æ >˼U9w&7 յKK]NkV;'2@vǽcب$/$P'-C-LkyxLhʑnmۃ"Ytoixr?ٖR۬,,ꨪ/ p)n`𯅦{7IK1.%5="!Jof'7 WRh-Sm-w$G\nuY 8@HBlmKB3i[gj!pCM/,9U@s)ﵛ{smN{X`:؏2Qр\x|gM6g- ֡E,knЛ>`Y.d4 j AcX򓷒qNFշ,.iqM#]d>THT5)m ֣LK<БOJñ0oFA'Хd;=M3\@!@X`AZǷ/P,Ăo dnb7/3*KaYJ : }3N˵!7'ZEaMմ%is{g'@Ѫ\x+U-qO;;-3UDZN$JFbA\ )$nG{1R«;0U%C1$R˹;.#iФ?akAvjM By/2c\ q(kU,n.[pgxAJȥQT#,Y<x-4#'NK̶"NtcA9!HoRuR/4Xdiqogczb G]|@YTB \RYwQCnԬ{=Z/Rxcbk2lc!(uěs#v*XfIi~6MnZYs{m׵?i lZvZ380lC!@*Dе?i++v6gp(߁aΕҖ9qpۦoIc$d.|9j]GMT@n%{qıtx_~+9Fk{؟RWHv`sr >o5#\mX}6#xk>_/WpSA?RXv6S!'^[g$T^bW9?VSw" m>xcZWwt**O$v?%t۫Fo0A<{\ %np5a}{g%;ƘȂH"ǯa^s<N ,5mBE+ d VVRrH;J:N϶b/(d|>fc*+7; Wc9yLhftbF+s *gլd/ RHee8*  4>%֭/紏OIJje1@wg ps<[5̫ .]c!>ݤHdD^]Kk$l.AE8IB'?(` +/4[[O.<,M僴ۀxelX~jqyuiq 9̆3 ~p ypQXtm+Q6]ijDŇ0Q9¯3%֥0h(* !r0V9{jQ\ޕBԑ{sg+iO$cˉK%c,@݀}F;Y<_ H pU A(7'YO\JF̑FU66W<5Mp@"IQQ>t8rT7iҗu 9D'QEQEQEQEQEQEQEQEQEQEQEQEQE=y`ddnmg u' s?!^{Cן FM^&I I 7u8t=O? ^? lE۽9AO7U mGRI<1%#ہS뜞_Spl*1#s>',H*0[>.]Ag>?؜f'Prp3R *^2pN2PsR >Ep@s-ǯC~F~`ˍnOSo#ӑ~] J}29930vܪpIG#.W s@=s=xdXU8$?>sמOep`x#Kǘ:nsu_zPjg9ۨ>FM5I c#<ԣ$'9>O<RI!Nr3:szLc!p\n:R$I GIs?$g (Ihk5ɺF[(\.bp]zOyCi~Ȓ%ʑ9;8˫d~CsB㼵JKH-0&noȴ>:4nga#->a`Cw2kZYRG{yK0G̤˔߆D͝ٸfD4(@]g$n'9ɠ 5Ko sLo AqKwqZ-gخIo&ַ$tٵHuItG!M]*eE|d;6&Q}enoȴ>:4nga#->a`Cw2k<Yڽ_ic4җh(ⴎјw iAEnxokxwT\^3Yv"hyY \.37vK]PFKRZ#*py@deo-V-.6Z#(4iVUaךmN𗄢bͤvpڙUbQ'X.7#k 4'ħV5ޑ]]\NшeW w@Am?x@=#d>Wo,y~^6n8LQcagYgaiy rI8Q$5~mW\NѴ1rcG@g*搗]Uy$DfXcPC6$ۙs ʷ otgFp9<88)ciZL.-gSh`-)=[~LJ+gv] r>9%2P\wQEG<[oqsA*92<G{#1Yi-ޑ9n YٵB]Hvݪv6&Q}Sދh!\Ӽ#9 f=X&?Sm6E˸6(tYY 2+jt,-$, #'2dv`t9 K> GHVUjp$j=.FӬRƨQȡ(I`pcj3E(3Y Hl75,K$jjfbT熐 mw-ͼS$D0g` b-F}PkwFyL;l`@dS'-t|[\:y*Ub)r zo+A)td{BlvyjPEPEPEPEPEP_=T?} _=T?ta'|O½Q@`CG'~g;X^w3<3yw%^玝*c>|ۯ+ɜӂ7l䚧}MKSkO Zt+X|ΑI/9ߏwuP7x^mN[[#nB(2.N 獿xM+Ll7qyw%̲ۜQq|if5ErqxNCMyof"m/}IRB;:U:49.KbM3-p: śnf9crtjzO[o7nЮdg2+B(((((((((((((((ž/z0ɫʼnDn6~|Ǵ^aѓW0b2\7N2=޷u9bo͸ߏ~s*H1ߌg' Es?#b7Ð88C_qAaHlc%y<N9sgsx'M#69l`'8N 㹧~C@I8=X쯴͜/r'zzpi8B0YA?F$ T0V `xiFҠ y#'9=xi an\!*%IO4U'RۯŸUm厪O y ?˧o?Bze '+/׬!c[:M?υmo`[Y NWYu&:FACKM6oIhqroѨ) ϸn*ؼw,[V=`XTx]Vƌ4[Ol̲Kܠ34?&$Uݺ8:+S6wm4T#tI-u*<0 oό|€+jV[\0=%<-@HUUY<x\YJmgºFpPH3bI85ύH~|O&"w(fBb#tq?)0@8xy v2z$(yᵷX$/$0UE$xs@QQ<7V\[J6 dGjJjP6 w2:Fi$w2@3*rH5y-MƑEwsqdɍ ܸO 4uk@]$I# 4r#GeYUA ˹Ӛ]wUi$'#j "I$efer cG𽶌Jwwpt),`idmP Q F8rNkƛgh#M>\飑%*go(/J ; SRIkG40 I#DAYW$3@ɣMmBݤTrҨe8`d`A*u2ot֯ύ G@`TeI._SMm>ݣWr=)f8`(TP u'$@.QEQEZA𖭫Z[}IU'-_u898g6>T1qmB(6: }ON̵7#OJ g]wU]J/0hnd}cFbU>TurX=;Ɩ:яNԮmWK((䍹!"U Jr\"z'Uڜ2622NczTRRmRݭΨTmՕ[1 nm$@$#<TRTpB@BE2HY,}$((((((*w*w0g>'^8$ do~S&9'## x#~#R''qbH$p1Mр݆ڣO^1܎G3߃I۫7[-@fa(u;+󇆿]-kxn/#:YĬ7lFF6_hF8}4/,;9, 1"6#*x8 «ˡh}Ҭdط[61/W>gW)Vx`xw3INqUN@mgFjH#Tܒs71zeͼ9$Qr20cR pAZo٥sg]񞂀4((((((((((((((((((((oL?2j"X>N'x@=OAyߋL?2jŰ/l)$뻢(?S1#n3OxiUv b( 9 uol!|r21}1>rG#;=s8ߌpm O? 0,2~NNc҇[o8$˿ 7Z 1d rϕ gq)78n9w2$ytzRiqc@^ vߡ2:(N!rA*2G#&IO8\:p0 *䝧`?@[$@#A9GviNd<#UFqG~ooPHsm G9;Zl0Bq1aPq^G=~읣v<oH/㎇>>5 1 c#'sgy3#Nx=  Ibz^rFpsǷ4;`uzpGcҒ}ǻr9\d3bnH qS ʸeQxn>X"A \21~BLx㜞#ϯ16(ʜ:p67瓏~ ?h86{~269(4TEmċ93E jNpZ\\0y a郎+/׬!ݸ?<% ?/js$ H y Ҧm͉̜lV$#.5 gE}P!g1Zn9J` xw:?|=bm#nǹ7a>s-*-.PnT\Cgpb" #,'#TQǧhX j!M=k1#i^jI*'h16YslP _!4Z])D^n,i|׊TI)7#kL7:51w%o07ET¸9#5rEƝqm'XRIDҢ/9b3XrErzdѭsYoo"ݮ*pi(T݌oSyᵷX$/$0UE$xsYiQivڅr0; eIe9ko?mnCLX-~ȱ-p걲@M# O3;@ ͫ\6ZipZ߼d1WIrgm6ݝ*DŽu [iAwZj!T~Tl[t`#bF2Cfm#lpY-9eAUJ((ugqZ.8`@!~@9xEgǤ?.IdSHo-#7 8>Eq~yyqyCgu Oϼa?89uܣJyS8v\v0Isc2=/Q)L2;ӓs=g7$kEϯᄃ_\X닦^I&To@-?w cl>/h?k[4S\J-pfQ#t;3ӈ>XkUHM*[ B.{OC1Ul5]r^Kceߛ['i']/UY_Q<[oqsA*92<G7VHV1 y&R;$l#!ݒat5 "+ a:yGz$Wa%{0 A!(| -*Ky@\*a U SW5/m //SB;E~KPCm7V2o M A~ܬ9;@Zp\C;M\dZ4`3/5rX[ckycLB ?'Ym Ql3ǶtZV]_;1L J|* ЃţQ*QԮn!xl W*JĠr[iih5}I[/[aMaP#Aey0lO]_ԡKo+ed%x8\(*\ILIڊ crwm'U /YA=!ewt>X8g.SӮl/#-nxfMnF0dұh5V{޻BA@IBNOʛ@2YR[4{b6 \HĀ@ \]ч5okQ-A5Ķ^O*iF1pG/,NÂr6s_Lڞ,.fPW3bg~0Tڢ]nbT3ɿ̑HP6^avX&-Q"Cina\%`#p$*mT䴻@ V`Ґ%busIM{CeȚ$nXr2:w>[ƭlDgUhەmM_j #Aeo%ċ dQXV͸u/h%GYw8Ta퐣,cVatk.X/m䷑ 0WR3k?R𽶡6.oBOBa12VRJJp#` m;;D񵍣\ ̦U;g* =q</<) 'ӎGEpqv^u'AF;Rzc=8X Iqǧ:Y@`u 0Ϡ<C<cm<7#=Qa`rnIF11au8SI9$A9נva ')ǘ :8Pp@:s;uFW8O}Fz Ua_^- W4:3M\8xS׌Wx J_9Ubx1t=:ֻBz)g=o@ho:hFNHnC;3xזɩEbhT$LH|Y e"|#~95nχ+ln'SYu&G! *EB@>ޚXyl'./dL$sֹ<7yi}od8_0&,pek;:X^Q)n7LҔE B*Ysp->%wb/cw*,EicHĄJwSpbW7km=֝SCx|&7<˅*ʇ+.+igjW(o)\G.LnVn[xRK(,F.RyB|FJQBdFS]W^$KMOBȒV 1( \ds2@iiZƎMB쑒U~X)#%LvJ/\AI\ژu2!e3ND nt ծtŎEX[(嶗2\+]@~9gxf r!; (/ڭƅ5̓nʦ >ݼSvW}rNJ( N-kU~MWQ{XIẘVPCH9^\iyqu]ݽF"D\$ ȬU2F9OAjoխ/>mnϙbv1cV\ڭZOS@]W%PJ((((((((+翊}A"+翊}A"7ωWH2*vr@: *C۴I緔$ GAe%H&;wG`ӯ5[{6\"I&v99 4(qlڤ\Zme2&r̼zx|K56[@tF@ʆFBvEgˮlcط\ Nq/;~#մٵI G!M,eELy# V8f/t H`^2P*ω4[G}R,?z%w pAK( J(KͥͪE鯧%[1#q>p̼z)Nl8[[]-pDĈr0N9ЏVf&-P7h)Y3>eր.QT]NF5 #q/*F s$H#/5m7O--}2L ր.QQ<6\K0DF dOjnc>źsy|ܽ3hQTմٵI G!M,eELy#3pյi7^Ϙx,dP:?=&.b$>ٵ79QPEe]d32T202#'+yc Ps'S)=\n83H9fp];@pՎW'ӡ5+]X>Q}/sǯ$; U zr1yF!} pzx= n% JX.H(Hw=n"o3rߙH>.9@ y=Foc 3pn'%VЋɴg_P݂pvӠc*U*sqgl+dF=y8< ]B̓**1q,`";Wis| ~TPEhmsO<|; mw>D5q60y`=H|BNdxV?gs޺G=_ mI/bܐjRA}p1gx(Lo,c\ZyEhI-|e,$T(U}.Fo?W_:WԮ8xm cXG L!TVۓ!bN\M6,w7:䶶f[-B>?&&\ݮ]F2 eN"Qtt;[}>l,R&.E #y#FTǖX'+i! JEV%,DH8ڧbP>R,ӞI<@R1HF]&цwGQ&Km*qdPéFQ:<ɓ}/hleXhZZ߬ J(H9S6SÿjU-mlG 7lMߔvv>v 'I =#&SB ǮY>-yw'0=IndyD @xc005QGig*ѬL [l1^iX-H+W;bYbK19$? dox;W? ߶_&W19e R \ ( qmo!)] % 2MT0FњvJc#kg!2;@A( 3ۤB;tv}:\1`8q# ŅE=H"#X&8^+ƥ{Ln{8$W(c@"„R%f"$~T >U5BB`2'uC*NpFF+Rjk~&EDy###mpI(<V垕c]\Z[GOf_9'suf&xoEBƗi| py(w+pzJGF#ԢÏI2-$Mq+ u 2߸D#4N=:[|vs$UKbIbd'$NQEQEQEQEQEQEQEQEQEW?;DE_BW$f>nN HU.09? Gn`O=Tt9z qO͌3zA֕v ~0Gz "\IA۷sU\N@;0Xt:lPԚ7x]IHe''(%:xhhnbWp5N^ArrYO%XRw(d+8#>fé۬r4I $@t$ VI?Đjj0*KH*IJʨ&Ɍ۷l`s,i`Gp$ 2Ig$\|)<0m_PKq}5\M$"|"р: džXIb-us,F[uh W2dCZ%57Wzy/H%TP185mMRz `tv19 ͒3mըu>[#txB8DK,d9rF; .9~EֹWW%F3@;Wu$8tHZ?Fx^I> Sߩ8&dKn|Tcm[Xe՗.7Kur.9c ,P6fcPwmˇƗy}sl[_< n؄p NAPmPiian.&NqqrWngj*rvN2I,ޱZ׊TK.U/tb}_W$v2xĚĶ:E ti&`dhcl Oa!#_ gaiwֺ#^]/?IBXFL R|'h>ԯ4KAi=_gFB{ rQ/j'5k}6# ֱ 8f~2N6^Cp OsiWziQ{ %kd:l!<0f?s*2vykZV$C}ۗF`H!P~\qte@[e,[J]!IHf_kBú:rONRu= _7叔nw4]O_LF&E[yc ,HѾF 0H沷G-2;d;ye{a;1 ~K~r\OY7q%妱s ^ύGz.%Kk80&5foIP I?>Omgɼvp:;g ZV?#S(cċD 8 6z\uKkxPDW*XF1Wjմ EޥKsqsCuKkԖ[ưTdGM.!qbe]6mgºnѬS[3PN85xZ?LV+VkdaF26 ta[caEyb R(KV}~W!r~Exw^4;e:lc\{~Y G'%x$\q*{?pAHݞ uO_8YoWp q3'QG@צz_Ҫlpzjp9)yzsPg sJpFF'8?ӟ=On 8 \~dtҾ1~pq R,?27Ǯ9>cA1< ߖg,s׎ 쫝$2FN^w< qs s}< T~Ip |?3ܞd_ėR܂.F}O;voV9vqj^,8lc={|pon:~#!|,zsjgw-\z2N힝9Ǧ=47C8rG8~M<,;Gc )%$s 's)*Zjǖ|BT!{qzcy"`DdlX(<qװ85 J_MZ9j@A zqoc-ZH&0>wlRX*GAiY^Kkm:MuEB#eW%]A\Ng9]K')[nGpX#;W V>wpo+bMtī+qy`|`6B$k`St*-&h9|loɸ+~dqmmCȷMO<2EΨ$BL:@ MJFӴGq}iYXɽBXoKm2(M6{a ZE< K7#%F2O:xoa)4FI#EFH`FN@pjޝwcqYK74^| ܑ%o52+[+-$K.L[YvNNF~;Fy`~gqZSpa'7;7gtMB3q%=( A$g HBSLhTD)f#!OZм ZeﺃOkRACJC E%s·%sї +kxL+yX4O>\꧐#)%O*jM[ROX@WHir_dQ{MՄZ]pA%ķ 3l| BEUKM3ƣI75ߕ||c_>7g袀1/6zyMehQyP\LSG7*V'7,d;P >!N!<*̼ѿmK pZtSa$p )R7Pm=-yl{D@H^Ħ:XxLԮ#OH?,E"a({$8# 湵$`6UiD:Xfco] FmV?GD%3n2 go۹JjYxúCky'ϓ TQ-W HwQ MSUlR擅Rr{ 9<|IH`mm$`(C,-7gLױ]\ۻ>L.duٌy@ϋqn.>p@'t d9e6zD\E}Gq0YL@0#\^No6h7vKfm6϶kggydjD&51gzխ߇ژ5Y.//f}Ndu_xc[4ۯ_YclU[4-%f9w\|: ( ( ( ( ( ( ( ( ( #] ߈:|A_P舫 ?Fs~.( ׹ES ޸AWp8x׵@k@%:33g4UX^n}!wO%k) 96[`9aUu/xVY&g#pב !%UP%N[pn>cn5kL3\H1ӟL#Ň9r.Nm )=Օ_>ľΚIP%DMe6)o.vQkP|  B&2s_>n./$!s?uQOw oqGyՇ5~R7kkp7 mỳUUTW >f9ľ;y|`{LIRAL0a4ip130'_N9)u@Noh g ?9GA|;KFgHimdO-c#)}[|\.ڸRs}f-e}Aa142#ΌI"V@ .-˹͟.9Џc rv :4Zv#3|=kɮd72A- S}Ni|=7"heVg߱%r%-#뺠B3q;>)`@`1t[sW쏤u>8Y&#'/#yN}MK m㷗Ζ'atdH%$J6< S8L$`x~.ܑ@9ێZv#Ʊ {tՙ-n$;AwȬ0 giH!hv%߇ج+y!Я.I)$xd%ŋd9&3U' w!9#=q2.qy/GjsW쏢/x_DiHۅ߱Ì8ɭX۟k.RǰuquLtvAjsW쏦c_n_q}_Ԙq{&s8Sꀑ g݇5~k?nX۟oT N=.^/_8-_>}?neǮO]魂qצ=sEwbM s7_3n[}=OL}?np5[ټ$++EmCS)GO8<="?v>j/??/tW>"ݗp3@8B:~{;M s7_3ny`/d$tJ́}.=29;L s7_3kTQ Z=9WKYkn4.<_0yIp %*3cӹ>v .%̎c?>3siV\T`(I[àH=BqԎ11u9#WT?%\cqϧnca;J`q<uNsc6}<90~{;H?+Tq8$t d8?ǿqMO͜|SC ڠ>>ޠ 9)_QI w3Jf5L 0q}LbzWH#:up+Ai'?nprg A![<@c,lNNp?Q~8Fð#?8 a@܌~L--GH$)c cq@_Jrg=F=?Ȍ9^x>{}=xl8On#Rf9H $JXzq:c;qFrdnNNIQHcsх (R9?ϿC6I {Wx\m$`c cNԻ%v's941?lQ{X9qh w< Ryz~?_glYQ^y9ä;#Fv Y[g$f%rHxӚi5ǖ'l&q;:O;{=8IkV!<ۄO8~$o&?t?tӿƤNc;;X4߰?NϿoFq;:O;'}u:wѺN@}IwGz,_p]v}4n:wӾä;#aދ>]nq}4?GtwϿoFq;:O;'}u:wѺN@}IwGz,_p]v}4n:wӾä;#Z4K˅~ʋ#FɹL1eHi; {}4n:wӾä;#8iaSՂπNp 8?g:wѺN@kP4>۵r"meu_{_yOtӿƍNwtw:O;ӳ}u:wѺW-M.l_Ѵne,#pYs:eƍ[k+V#*bw9җo+n:wѺN@}IwGzv}W]nq}5=ΓZ]Mm>h]uC08# _aޕ 7tӿƍNwtw:O;ӳ}u:wѺN@}IwGz,_p]v}4n:wӾä;#aދ>]nq}4?GtwϿoFqWmt^2qf\izL|_p]vKm#:pUR[,FL$5ݸ0=0GKqim, ʄdMkjY5;;NZ,][o#?t?񪺭kX^@sj~z|hpOck2 𽃤j摈Cs{u;g%_멌 sĆĨ힠Қ(v89:vc7$A=̌ב=@Y:G_;y瞾}PK39=xHn(*@>R Ӡa19d|3{q Uzӯ\2,WzsA2v9 sׯ96pp62ASߨQŀ2=:ӏ!-`|QyKB3׌c?DX^GS&)FXpl=~z,Cgԑ;c`+=,9-w 0IQ8ʕ>hPF0r2AG9?.Bd99OO^PEESٔ3:N~n rp :\`+qHN{g\*XձǞQ)cw:_>TI~g=rq wq_ql:E!rP8?giH$A# ;qӷzm` Rnc=B `9̜zQDswn$ pi .A ;q:<*+ÅQ܌c: IvN}dV)'c'וb9H}xϨNbs3'`*SH#i&0Ao?aI1rx8RA]%B69<:`O鍴 YFP(9ݻ"ƲT® cO֣N#%YN $>:jΠ @==_ƖlrR>7w}=UW_Sg9㩒e=F@ 3oqQ+9uuYGS! 'zz}&2z=sO#Q8 ㌞vǯZFppTt)$ V(pQ; '9?z`82]}Dlb{99"*Y.X0}*W`6LEw9cȦ.8x9`[?ߦ:'c2vp=>' 僷xArz\Bit8aݕ9瓎;ߑZBQo69PA +hUNq=:~}(PUbuFFI^c?O)enA1u=3ӡc9V'Pr7בn4(Uی`1sb8߂@O^3 dgG>{drAx-ߞ8_6+ddׯnx>G" H# 0qG @铞qrE JxAĻ QQ` Qc q:c=3C;C>e "G=E)QVS>vZxXr$oA}wct”?/Ln@>3hmKw#6aWȑq#rʱ/6Wm@\M}KRIQl"a_Mv4 A}wcuLѨr0kKjou!FY%f WiTpo͌ ],]j9S=ךFD{"Ll9 1A}wcu5 ’<ϲ%kv[ rv{ZbUN]R=ArQ[B>2 %>:*O}UT-b $r$agCsy5”?/LnR i:kiĭfA3s6*Upg?.+"Y/#:~[2q g.}A}wct”?/LnM6y4hTFcV` p5Msamu EIH -\Pp 䍹p+)_]4 d<ǍZ5E.j%$y D.`%?ym&^JjGI`ZU&Roj]n"դR"n]+Z=;czڇ]4ҳE LX#dp84  5ۮ1wV$)#f@%Xi" Xa(oA}wct”?/Ln֠Ofy%4 A}wct}jYIEz)M)_]Z}VgQ^ S@1?Jh&?7G֠Ue? Wq\ #) d躒O4k䟴F?  6xSky$oYbR=uM- 'W^e*ڶA C7} U\F` yt,TlK4VO$zvq]0N%~?3W”?/LnwM&{{hVG]+/$bn'I ey=91ߌr>^~zu8Vc1 }߹sp8S$v#r; ߻8 3q_a߷ rpU TߎAi(q*I9;QFx  ;+T8\A8#>*ᶠQp1=L rIA$9{ut/q<힝ؐ'wSЏswR 3ߧ88gcgnr<ש<Öʅ!>|WB%8Ls';OS0{9&@*9<?L6y@%[v3x\ wOWnb,{p}#x:tVRpH` Jvr#çq׎*_)q6Ny:݇\R:~8'?CXM @Rp319`apyqN~X#|r9=zĜsA^Xsh\lby=:v9ni צzC$p œG1x]{uaL?8UP@82;_^zedP'-~z]8s=q>P39GB=zӿ3U|um]30}0;~sl5A͂'$ALv<S9Ȣ0 qOFT9$sxa-ݑ9rgha'?nݮs~zivu0:zߏn͔=z?>\1|ǎm?==8/=pAj9`dFxsrc^  I =X9a'=F^rdA@pq#zP=!Hs'$Ac, 'q{ 1ۇ'h#>g]hh V$Hy5z/8^7)㑓کhMq y֜2gn2r8~UvlqR:g<8?SP6y8gqs+GPA@';#$~Gݪ0̈́I$|:zu5gbZJ7p v%x08=0 J3R9#뎃zOOD+:1ץϞA#>ӾvضN3F I>Q=q7*錎 "P e탌t~@ǿF9t j.1ʊy}z`U:ttL.{ۜ0XcwődwpîӀ{z}~c3 ,AnpFs_\7^G~2}@@''>\{RUUw Al!UUq.{2r7e'1~]P%=<u(ӧcӧLnH0lsIN ݉zq39zg!`nsG3t*X`rs`>Aӌg펜)8?1essq[ʎFyy}ߕ6c/=x)`leH$3ӌLHYOO8}1폢6遁{ gvv9ǧI\ '~=3(,]ķ=sy:b0GPxEI%#z=q_x)l)@s/DY$}HH^鏖Bl0@r 3hL9PNS׷s;~c''#sz4m\g ヌcxmI=p1s㞾_b͸('+sEN*zq'Obf*/K(62)Cp8ǧwz4]j/IIqfv;@I'W3A'vzϞW׼Cx\.FAEQ gWlKss_ yOuq:N,^(^G}swz}DeeF v-:4[-#6;I.ss%Čpfm,B2Nt(((f.kaICeʑn\ȱX|&VYht?I>DqmO`"LGvxzepZZǍO $< Utx~1hc[}8Ǘϝ?xz~/Fo\-܍E-6F5HP Y@psnmЗZܖ#!1ZϺ<4NA1>jl]u[o7~nٹwgdPtj+c2 7eg!ЏP(Y+XX4UHK"0LFmvBx(c-ljtƛ^۩hJKx㷻XQDmo3Ǡ6j#>WͿkm]w)mEhQ]ZO]\[`QdQ>9@09-=SQ|Cݝ֖exBYH?y^2d|@#Lk(nt8]JWi7 R LX~HJz%=:/ x#FAԗZݾhQlX Q@(( \?e!WcefʅdX9`w`rEc]\ҵxƟhPGQȷ.Ms2Ĺ x*Rմn5MBp%8'ƣ]nA_?>w/L@{wK,gmn(h?2iYNx_2%}Y:O:fE7 iry`2adiGp loV՜]ZDg<1 w\W9>guy&b.fk Q8VEp~%MF:bnGK+8+հ̪ V֋.f 00$22FG|V? }uzgZUoZLѢZE2XȲ F&[ J׮CFȤj~=Ιɬisf+̲ci<UN#$Ԍiz`mwV4|rnS7!wxgAgbJHו13lT(((((+ ^g:||᛻ky뢆9g8@`x:z߀c<~^LTv<?NzIeG8g=גks{pp@c81'n)B0$u<{~)sgSЂ;Oל' IS Žpװ1B6$!r\0GX6.#hŻ FWo>09#j:`zA{4bh8QA'}:WCx`8S\T[? LpiHBPǯd D$8Rsex烌{cXQXUyp{cA(9dc86;S;~=xBB2${Oznڙݷnzc@'('[Rݵ0FGq}Zz-FI 79>OІ}S+uϮy2ܓqᏕ__a22Apݧ {t_l 4 .H,p@BK<y8l`s.9O gO֓4yǡ?Ϡ TU$OG~GQ71n}0s`8oz *ZBd.;q㿧Fsu?ߏ)0 8'׺">H<`u=}9 Xl. {QF`0'ۓ֛2nw`g3ǯ1$ϿӓpA~?lvU '<׿L8lp c?O3ӌ4c@9o@ sҐtP?eny ?^MF]p8{5q#~|e2OEz+CUjl1Q uǿjR@;A9@ߞz}@֦v8Q'@>Xd1nqۏ㿵frQ 63<PqcϾN2W':B`۞@^ ŀrxz~H 7+ïӠ=;}.8B?H?6I8A^ycp}_/=Cdc? 0X c#*9l9sGcӧl`jpA7yHzd8}}#A=8!8Gv8G|v8}gs'Fs0((N8 ;u?L h;zg>ukn/n,=z~#i$ux1[ܦA&b>tBp+弅DcOnv䁠2s=~B@,čÁ;SK-'ssCnN_plF1x~yɫI# rAQP=x<<(QX! 6F@<[8}z=`j N\қ9>9Ӹ6n+1q?%gGӯ^1%yWc1:gN[Iq|g=݅ n?wѸ Aoc9{~%zRC`L]93îAG'#8{gc6}F}cʌ$1m9zt;v 8I pUp?8v)9m&a$c_؅0#'$szzQLp7Gyg8Ps:^\[ =HA3 dp{g9 <=ėIHAA^@3=z5 ȐIuVHn;oTVSVp 5 4G$WHd`nU]Ֆ?"hP`qۗl1L >saINu뷺&Af[NܸY=NOxSmM7SxmVSEXWt C]thM$w./5"J=ơu? -#+rNm+:֫6,,(B]±Q7$ \[*Ei,);8'9n[qasr]O_LF&E[yc ,HѾF 0H@Q@Q@Q@yve݀K:ܤ3cIs.J[;Nvs58JoO677x/;#-{3/IjiKh//>nbp%+c|aO8H<]}IFMښ EQ0JHBy|X(?6ԯ-O>VAgp^iwMc{\B.$i2 C.KyEHh[xkߡ-;ig1#, 2~6>jv .JɩDV'Q`IXʅ؀@#{"QҧsF r<k|ʽ`jk(HX,#L]B 2cP$|C' P}ߛcVԡѴkRdh,丑cTR 3(&663 6_rN+Ȋt%<=j>RX֕{1e׷y^<چi[ht'9U z"#vzg/5_͒ا0:X>vo.Wgi,W&wuYO.w"p9Kvb8Y,n5tֻg 3E: lhbi y$: (9WW:[Gjl44q/n.pKp^>/ jZdcmjvM۷*F4,@7\yl뀀; {VL l=ɁI)bcexSӴh _"i+)yq1$d<jZMޏإ˨][\ϾI.P"?0f'(jMF{>igomoh&>\ AʇBlz,&ң}= fDK$38tلCy@`~TdsJ/bo 3JZES'pbpH+qjK em5X?b9/;4&s-Ashj~Ե}Sım ]4YYFwn,w>5[$O]J#c&ܪpn1 `\jkW]gi<Vp4fڤK$d@_ mNUi,UcY|#T+˼F f4{}GKypO) A MgcWZڒIH6™ .e@ZYNt^;>SlU ;fA~nIP ( ( ( ( ( ( Ǽ^Z?oo3k1lWFizŐIyt遞3n88 ݸ%@#F;#U(TzoR$u9?st6Z(CeR@=p89k|1<)+߰OL5TrJx9]IP9 ~G=׾~gepFAN} Ā#%}O=FryZM9p9 u?F; nb.(<:ӎ0pT+e9~{ks~>y e #o:>nѰqǸ:[grۃL%FF@q=°)9mSAC|ls.{=:8%e|N0z)8nY|dۜy *C=#w<7P6P{5sP{i h[2y18A w''㎼~ng`8Ƿ ÒI N7dq 1c-xtFsӿN珽@Tgzcczg$99Q-\ HQqu p?L_"Ž2ې9~f1+׿s9H\/ILFM;I|s>3tԲ[ڬ[izӞ>9V61r}y1ۨ# 9=z=8r u0}bq2qG9LT%6p?Ob<H㓏O< _c ~=?;}cgϚԤ#3O]Ac''^+hkw0uu{p@$=\ȡdz`t=W0sqtsWَۜOLdrr{{ܸ>a^3y?$.Nr?^~A'$'О&o7A'>9AbGOwr?O`sN{{)<u۟TwsB=8LpЌ{_N=2@ rh cz`Q;"7Y9cP 0`zװǯ׌Qady'J KsǯIBVОdD`>xH8z9xR1<c^Wa㟧^=3tXy0DjnqsN?G=y_NzSn vNOÜs+'ua]Ly'ǯ9H+= cp5i,cN8ne,[ r$qs'H^Ѵe`dϩ <0 #Xܬ`v9U@80u-,ﶕSl{t_LNiH{]8?Vs98Oq AAsL-< +!n;s'׭mCRnc}|~Y"BZ"=^G%7FL8e.$DD@C~3*ByOBsjOK ߾~uuP^QPkϓU#hه'hG S׶F:f`>G$G1{ݿ{6o>IK*ZPaGtDz&ٶ[r4f|8< ?6Z;ix})93$3n$( 66uvpHI%I,I$I$Պ(((( zi[7i!xxFQІSA #"*Bi Hc\JK"|7frD]~,ag&`|'ʓn+|˺}SOȗ;wڷ͏y|mq͠=N-kob_3{u>t<'ºthۢZZ,RX a!* *$nHeXkKqipoX-.Ŗ7F"(兕IrPi3>&4x⍒o)BDW¸w3@%D>#i--ͱbxf`)˶U2>^k^%^vm?ʽi^X<3~x'#,7[ԦK]^Z%\Jm.]lxVWU 2CjxWR|[K[u(IeڹIv rhַu+7%5ۗp0?6A=ٹ{yߺ082AumY 1Kb18*0/6|?QjSImm,-lo#2X}+Cz:ZI#!bfBcgX-!c4HI* b=3;ߟJK$DyO$R(WcTCr+?˪so&>~?7?ټcgy25-N]F;pؘ'7a&&fiĤ%vCBT\Ohr(֒6:Ī.b'~g$I%ܜlydysͩ5Pp^ 2 A.%ޝe7y~ tTWo1l2y˩t{YḺ5duh9?lj\7I-$QɞK$y‰]I_fq: yn-!y1p1݉ԔwVy RZWzkJunnߴ\<5AXA:V9"zBEܩt \3y$R U(CaS؃ޫ꺥jW"Z[&]"y s8I$ pzuIam>Eq=M;ƪm#ͰI!EUp|׭1]>-J946;;ԔQEQEQEQEW> ]ޓ Vvz~aZvz衴zHـ2p8= ?z8LJ#㧮;)ܬH0ppqЎ<% |q?nݛ 2PSԞ߁=m T +09= s r t>:u_М\@!UVr ʟs;q۠M9XߍrOy95 *`?ޤwO,qG9;nqדӷlp7-p/ u SLc9>q[]P78pI^ucl|nA{nM"O 鑓`G0z38s&0qI=qz}sP[ 1П_^gs $` Ꮥft*@׌zp:zvʶ>Ra#;rx4X$0 ALwclFAq=}ysiNp 8N0*F!\uLvϧsi*w~QH#L ^G8 : b9\В1zKF2ޤCU#Fy<ݺ4=eͱ?7-]Ϸk8_Ӹm&ܑf<1׾ru;X9+h;Gc3URW`cϡS;O Wq Bs^pi IHq>&۲I۶sv ǟ)瞝sz_<敯!(':pRp%FןAONa2y^=><Ԃg''#$ry`G8 3ӧv͌rpS׿c(#^2G~avoetT v|c$0O=׏O_Ċ.Gl:g?:c~Qc' =,1&?O_g*AGB3:cf`66y;yr9jI،(w6p3p{8\w`ןˮx8ilpDf`so ȴKq0=x.HE#{?oÑNl7͖,z ~>WO$4rð{l[xIV,ϡ?c8#x>ݹ @;?9(R p+u:z5)oxTX{/\\FT`8y%'=r2O|z> 3o!|'ۻfE݌9Ey?Tu^P<%jvuei% .K 2@#994ץ_KM쬠ipM#JFa?1jcM/}nmh4A*䩝F'wJCQ}Ť6,!fY>>w9sgƚXxkO+nVHˑ>@%Pd62 I/o$ :l~UH]SbR ,BO hb4G/sm;ZO 3'hjIl&ۙvHq  `cu)54H1b[o$4e'cd~0Ķv=A}{ufm΢WqR>*ූْzƑ5旭XQr.4|&ٓjp dtZ;I +C2,`PHYEPEPEP=KTmkpQ2&M(cbƵM ).cE=7@XmPK&JXly/N Áy-p;bx@xWR|9d"GFFmy}#W~(gKu fdslw&$9LI1^u-1bn/Xߴu;:  ?b X`q\ k~Q:ʹZ)ɧ'k8R \wQs\.6]_TX{+)#Y*YdzckͽQ>qwb$64sntXg!U մ]kY}~}N4]CL6-2++60;>]ϛ 79FM"|m*8'V+OKqBW W9+X@b +ڣK&yklý"xf y>v:mԚ_h6q6"v14D'?v6!߃` ,SjXZy@t6k6*7خ~gL-VRU>NmG^sQEeZ )(wk+I.$|'bƬd>^Oq$.r7%-1RgWɷllG}&U~s=ٵk<'٧L"2+;6ѵ_B+'I!eʪH^yXY2Ws{#KT-KH&ݎK ponGw$]UR;y^IU@F :R$+mNMmV4gQjLr+}th e kͪ]-͡V5x`L!S2Ğ/H])"ovKyX[bυ n 88#&ĺեvV׉)S\̯1bNpq˹]rkzij/=16Q@O4_x^mOTd?VNh"+,jg$.A??wjiՖVdṶE8m*ӆU9^!4y H$H8oʏN0|'wH$Veݴff%GB}5o ^jiݩ~B|~鏝'-pQEPEPEPEPEPEP_0x Fxpz=}?_0xyzF3y[?z衴|F8rT~׿1+%tV;҂܃F[%NF:8cl,WnܠW2f*f`rr29<`瞣j-6H;qry$9=dՋb8'9~/@B?β;q;#=sS6,3v2:Sޝ)'dPvc~\m S<~è;'#?:z󂤞I2:z~_ sm<yNݞsz}sӯZA<ww-ێߗ##`!Tdr1<z+`ry|Ntq5JlR+r;=_Q0,8rze$`c?~tSv*\##.Wcrh#w>7_2f/#׊/ "v ^t\nrz t׻=cюy#۷N3߯\d6C8=9\j"ܘ,(9ڲE̲μpX8<w?s*Iu3rg<uہo8r}zc9 ?,X6=5mGr2e#qwr:yƪHix跑nq_f?Y&mD Hu>c [pBFUKJǟ9ְ,#ܫ> y`cއ$CI_ ]0o) s|?Laӏ<^̶C3|xr{Ȋ  |qӯoQ8\|:U]n0q#.A`ܷ%dA?luqNgP @Q9@lgs0}X N9bz{V"2öe99LJmZ@bP8;g{]"ZpO=N:/؈sF~S#r1K~7vd`Pp1=]q*؁2猜:uOzZ(6o=1=ֹB\.@=:#{qb]@zOnkݒWnst9<}ȧ?˕W<9UC:1t.v6;3 lE_ rӯ)bz| N9F}P?/Z'2X"3q`c懔)Gߏ^Ai=FzzOaR1e}q891zX| 3_֧JP=G<ժi5čxzN{SH]9NznQcr:ѓNUʉ$v?xrsn-=1Lw^qړq ti$$`cza85#vG~8>\=$A=jImC $s9=?S.1ÜzKOr?Qd~>RW9}@~Hěw%3y~x NJe9qsL'+lc?% L0ۈH'{uy5CnIF; }?=h ǪEiW+<ثs#9>iO/?ט! O~ #\qoo5X帇`25d,O 3џc]͏7ga~U,FQє $qMsTu"rL7`ëCGP>rʫ-q3;K<=4a0L5R\'=9Zx-]lgVIYr6Ŵˍz;>JS[+$3MnK-p+ /\itGH`."G[57 \[``1F{mBlO6kR`,Sm,`~UEW$%69Ez_\Պ(sK'HooG6I&S>CkB9khPf-CM(Z(ɖLNKF2޲Sjk3C.kCytWGme /toZ@ `Ht#1B^i:nqkq{\hvP9Pr=qzǍ57I#Kiu [kf%w ߇V6 y;~k ޖ-b͘$13b[|YR[hٵGдy/.$Ҭ^#n挀 ;c,`/47QIOIeq"@bH$ 3 %_^CY7x4+[Qpvj*䃀tZLm^Ҁ9? jZʶOu;HCySy?vɰ)u+Qqmeio{r4J ̒YÞ9R+ByYHR4.8؀3¨%%Q@Q@Q@Q@Q@|]:zz`~{ڷ-tP^=}qgh@'p2;s@3L߆bRssԞ\.(^6ußV8 cWn@x'=}0In тsw>eT}@v c!FO}N~yb2v{}?æBl@Q87z:u├\~yu@吱 0#?9u]|qP1;g珯pEo ߻n2Üq'O|@9<? #qߝ9J`l'39&Lt0ˊ۴19<{vǾpJr'#9G?NEZAFp2GgWFڊ6px=3187$.mÃۧ^<69<}r>h hȈF1z߆.W1R:N=Dt%`n 9s8oa(oOb9ϾqoϜqI?N2#c?09Gۜv^ f!6 cqz]Ý|=6vxc ~Nmksr;rs_OQzZM&@F$V'ϮO_C^o@˹$`r1&!𞜃S6In{ZzYY0*\J9 N~IN~>6b y9whJW$tLqմaQH##=8(畸:3GW0< .` x@{DM>oL@ē!={|kLRR-Hx?9@8OӂrXq8>k+Cg'#0qӏnj bS1A'#Ĝg8JMDaw@, 8ӟ^pWry:{fiv"Y یӠOP0FNLp=d?yl8,8,qg>54P0=yLdrXPUOUcOs-+nIg=}3d];F8c2AqnOC>YAs>FMf'9b@pscnKR[g9=03T\ ǿ>{}C%K|n>#dС&&“v;$=~ZӌcvAc2sӻcr\yRI9?$zD?Nx争3a1`ps<[rwtQ >@ylGn<*u{_c1NCjK- ~zl$^zG?)=g8}kX(U'ؓ@jF3M;cte9ҋr1H({m ֙y0;8}1ȩE*m. x҂Ƞ2@=?#  |:uzbQccqq<jQbO=:Ͼp:ZF9y=+OU1ӿ_>V"w zx'56$??JoӁ@?L~Uy.<BO1MȾO#r ?Ϲ5JYbOhqH$yvpĩԎ=x'yvcepC >}>"]ɚC mǯ>Gdr@ぜzg0$1v})W;}Ԝ3H8KBP`=hV|< I t;}qjz,.3s ) BIkI# N@}N3_U]կnfiSx??_|-|Z4V]d`B"VQI`(ѮGM]yXb4m؜A[36F>2nu/XZZ3Ƈ{Oq۹d rM6Lj+9d }s`pQ<,]Cs%#A?{4Aq DbZ>>rXˑ1m۾S^֗X-9E֑tг^B,h@foh>BT"h3x}$$g DoMGoÛO=ݴ/f{( I ߼r@'n4+{"&(0ۅ$kb]wkԑs{-Pi %:S}!7BY Fb;1uÙWdU;x'r(((YKZĿN 6OڣPd!4o |0on`am?Gسw;@qor<TPOuqs/omrvUDv} ˺񕵢3ɦ@[1:31KLR^ KIƠr[rg)s5xRञtRD֓\ܘF+UGRەw Rqqh od&Ts'`UJm7~*{%h_Oͻ1 `PA_x2!|jwPu7sip<ЪpY8cH./5MWF]`^bpЗB0>` xG)-.K[qw{,!6@KbG܇C+t7F:]j"l|ssr+Փn5+[mI'H@b;&Ípc:ivgnN\Zx/e7!|ǛX c*D1ڌzMCVNo5 +5iV;tX@`̬GTO푑* (nO_lXGwэK Ѳ3o,Ce $RXhv1ͯE>PF[$f6  vn-}#UuK]g=Qۭͳ[ܖ2!1BQ@O&_W2Me-!q. Q"0 ׬QEq=|ͱԷ~a';2>S:KI[=e KtDҥ3L#WdHT bE_m;H dA瑕{('eAϺ񕵥ōnw0d!!Wk!FC`O\ykk_TtE:owv \_'t5QҧH+G0 yg ?!I`fƵ52MNV'x昬Kщǝvߑ[m-G8L+" p?y &BN, njZ~{x,ffEA:#ku YR[4{b6 \HĀ@ \]ч5PV~FAeHlyd]+C.[,~T c5ֱˠ<Y&`"kff2C[8}+~ g6-h.m$7M?4njMi|7׭7ŭBY1XI]k7iEp~!޷qjH/B4Ŗd ⛖a^5|v8'<íTʅFH'sӜyqAc^un݂U7)q_ T6r^?$+NaCdprsnt,* Cd`qu4Ҹ82`wg~g48lq=}瑻 O<瓞2yO'at0PXǷRO vUQ''ӟ^sDI$Wz|s ~Q՜3dy?^yёعFp@9[ s) 3 =}: \p{./>N=xמl$rABG>HvE[ B1=z{z<0o.3<@.zu?/M 6')=;~^cz/ ݳ$#q:kXx&ag' AϮP9{qDpюhCƕ# ;N2z`9rH^3ֽ> ;98c1zwb*';sۦztSW8"CH72np0߿zu 疐?^jhIHON3ۯ}ۊOBߡ㖞-#FĐYr9O=zֵ'-=X8z+(':wz;&#5mT[Z~ L9+0}Wl>"?q'3ӷ>ufSxxGAaw 8 ?wɂZȵŅ## 7=Ӝ.@;nz ׃)pX2}=^E(EW]j ##ӓ!:T_gx?\"(ny88p=GJ\7ssǧ8=M/B#>NwC]C foayF1cw$ uzcWrq}}zv>Ӹic2pJlc#?u3$M`+{™:~N?W4K*K i?<#?y2NqV,K'rOq=6ӸG_\y<֊}7ǬxabPzqǿۡ61>cNCr\d|[G= ŀF1 Olrsd⹟3fiYX718bG<P3:w=9< agcy8$[s{f~1ӯ~yɢ?2dr%:!מ~+gyc@l1a'ӮyV<sϢwzpzӷ:gQJ-A,6O}0Odmgz?~EH1# kEdIn"gqO<ۻI88gv8'Ў9p=9>Η2jOb6rŻQgO Oaӎ :ZPp~ϯ#Ȱ6VO=F;mL"ʀW99gqQp?O3^Du1mYpxIr)Hbzx>ƘӀV@c=}Li;gk~OJl ycc?:E1 Tqzug> H'9v*m< Nx?qU?i\/#< #ӃYQc-H2Fr$c'dO^ye9uc͜8caʬ 1p}3q͖F-Ã<P֨:o G=G9:OלAb!HP08߰疪nbWIo}9_魡nCs g*;s0N{=;- moޫ)rF>ϡ\-޴@7c}~]+XSX:%Pq8?OO!>b=@`28?Ny'\<|0`8#=XyvN=zgOӊ;$j61*c'$qSxw$nww1b&I'$'!۬JlMO-8w7n,b>E:"5J]d3/@@U'4jz}ڟbZJ[D^{Xʹe)|yk27yۗa'?c.5Ù&{uy3X} @ved[D8`H1W/^6th 6k0l~JE pIomdG .U$n5m%5XI_: }r) \cK(o,yYTq<&6.@lB"7~jpieUkF982r$Y ΌgV^ּ1^kٶuBh:#Jy[ž@;|7gض9qG7> 59{w&n.%Wٍd31 aFPFH*G5m;UŎ_,'-YYHeVxUGVI7 \x_"үJ3z[= G#T(` c=ߕ}.)޹X)@Pbg ,rvBeb8GboO,-MFb};" G#0l˴apuq=q]Y7ۼMC< n߻7Ō.q +GSᗈM'Yx /=|ʣS Vp#65_:43BU8ErnH˜%\V^wwQEQEQEQEQEQEA7 k=||}##VlӇW^G6!ەK> N/R}>ޔ)cѳxNy\]gg#-Ա_iݞ=XQ>{N X*{`qۨǶ0z iI&|'OӏG@mw qQ=1ӊaR\ #s?*ECGzurm?18Î*|2:s˵ZM)2scgVWݵ O,ût'߂0YA=?׮qiM6.rGz'xj7<"*eɈ'1OϰZ*LWoMl<VhA1x:s.^sԫr{)#9]n#)Ϟ>[V^2 lzylW cOOlN7<z$9w 0qp1{֥m|y1j@WgNz}:p*TJT^I9ۑ]B =ٟ~Ey㎟^?OjDWc=G$zvj2đ'=0Ͼ8gxqslP"1I#3G 0s@Is0 nxfXd e~Nx-¼3}px:w)c9۞ǮE<#:z $٢H$<'ӓ+=ʨ8#A9}0x#{g= tsE W5lO?z<ҐOq~wy#[s{sӞ⦌Šǘ g961#gnF$ {Aȸ$ $O`s`<0r0s?|r9M3,oA?Q~#j_3)yJaqW9~>2wmdsrO~3^H"9bI<Qӯ|Rs݋On;_Ёe7& tN#~2zd sqǮ8 1FO d`ש9ݝ>6E Tq'z}yzD|h 8^CןL}:O!'h\_xįX1O:Ǿ8G #?i)H%9 sG犩pA6`y}xi .H0r;sӔɑ1^nj "y@g08?O|ռ8bF2q?3}x/ D-+;u9lO=8׿~$fUoI'9~}=;bo`㯱88nSO:E$ lg9:%'2ù {ߜ}8?b:^?(zcӏU'o 7=%dwWgZPÂ[qpO?^^O_g\\^NF 2<0:z?mb ǿ'm$ #q{3}y^è#ϿU`0[so>-YPF~`9=3Q^sW΅AR<$a:Cv8;8z-tp=9~>xǻUAbqӑ= mc~pz><ܺ@^>` w>}V|i.:(ӾyQ _DuaX3ïO<`V]Dr cL=?˪U@< sӠlW~^t{:h$CRG[.8's}jcpr}2O^__ϝ3"Uӑ߯NH^F~~18M8D9Kuk Pu=c0#̒Rq䁝p}OseI$~߯|3&9qF11Y$D^LAӧz)9ٝ/LN1ur99OrO*p#< =:q8A[M6FI䓎r3SSypq#'_ј18*>o|Np}G^@M=CXr*%y@?ˠB%c%$"0ǧ^>" 8`2Iap::{l>T5+6 , ?}#<;}F)\83={'w|?=ϕn881 Qׯ~q^6mg%5×񴄅 N2} xԿ/SxXџE:@pO'vY]NH.Q65 ĶlpdKKr2!B?Sd|6NhjPuѤh@q,Fd(@ SZݞf :iDӭ-l5 T$0>IcS&ך4YxoK<%]c$!5I?MηK#‹%ԲZgK`sJbiFx7^^ƛoլr`l|`l}ޫ#Dڇ#4k5x/XylF%sV̚cu^j$jjF"ưd>S|@'9y޵KU{iƝƟg[5(ncدv,өc)mcz%G !H"$.U(,YII5%PEPEP{=2K--cFIӜc韼=j]w` N7) \$EKbӝ9z[ ZhK22yrIjGgY#R#9222|/o/k$})]+΃j#;RI8+Ҭ]JISBJ0"4bX2"mE°=wzepZZǍO $< B}P?"1\8du {mNM4Ni[1Ma]l%w}ӝ!7 ZE;$vDj [r\\((/^uKK՝~gp>{TӜc韼=j?ijOnщ㸷HHWhfIB*8pq^5׻[I^,MF(^Vm9; |:lDʆ3hgVVRO"Zj]\A8TEU*q`d|=x/]҄6?o%gb,Pͷ;r*8 wJ-;V3NŔݢ]尭­x; [MPy4HU@9%8ӎm6mRm.-BS|2Qx9^H=k<-yo@ْgYv:ıok{5ɝѴRF|+* XP/4S9Awu@HȎw2d'w<[M-mu KiesL6@r,~755MZEͤ vey@f( ]lN6=VTz|6W ?~ay9P((((((j] ͮ\38|鬜x?Quaw~9.ܾv] ]{zsϸ=N:;oHǛ{ws=H~y֐8^_N+rlO_Lp||r8}=iGm8\2#? zNXp29~?jsRŬh@cG9$:Rдt>3Fbv}xt qz8US^IGeD gs˕wOp=\_,9A-}~9xxe ܑgLqwrz}w0x9\qji}qpG y_[#)8ǹY Q 8 >@rSקy<2*ў1DadbI >p1v^8 +R^21GqH;@?\Ƴ(@xxq^0x|E;6 b[G?xLuN r!>,0x'Ld=~w+mazǰUНG|cלi3tLX#c=T|ۉԎs{y銮GmHI㟛z.rHy%UӐzay-BGێ? Fwwm6sp n!p4,@s9B-;d V-mRJs*q_SYRS@%t\2yr:\qT^y8뎃#p2,mpL`Iq4v-KS6WSczIrk~}>o.Y0x2S͘`3'3{#Z]+(+pNyw9=N8nlE3ݴ^=?N`q;z9VFvb@ /'#ϡIox1 };uqYh$*;2G=>/x=I dߘc1?4/d1*Vl9OI$1~N?O_k3zL.?JjKȴzg H~Cמ=ϿGE0zk#p\|3:{x*30EmקQYRjeux~}zw#7v߷Ӂ56fH~c2:ϷdgJmC?>:z0fY n08?)0nPx 0IuQ)DїWwϠ_^Ȯ`CcNz80j2Y|ttT(-=O#>UmJN+aWwʠ {9]Xzq?_wdNGzl` 99E6ĺƕboKܪ# {ucd%Ԍ$sP} [" ǧ#8e+.9 cg-XmHnr9}_,fC3zt#=(ԣ"0b[(ORG?eP2c8ǿ[ 8Iw7p  s~ǞuT7d}Aנޞ]XAJzBNH H;vEuJh#qFA9$1<hww#S du le<|<~ߨc_)K0qLgcE-,D#g{zd3~A 烎ǰ @.OpwsS?vF98'Oj\YNP{F=JY6vNr88?S*ݍ̇#Axc_4+)*G~QS=xt/0cU*ʣ)ΊӞ=9WoҸ㓞?N~z`z<ֺ-$lU#A5Nvy+׼! lw&}ҼZŸ?t3My-͜V#M5U}-b/mt)+g`PMpky.sZ5iݧ,R0l03܃FNZzj~d#^lbX\\c/gyj4wb3+d;Ks s'ISԣ.]c!pU T%|ZJ-}HkVzP7RR7(T;e b;E36,yIUKu h V}'Wp.4rJ )O(s Uv$wqT'Xq㹬-u-*8Kk,vbѲ*+o&0璣#b i>Ρ3fVHĸSǤ;GVn.k@G4!% pv@f-[E/.;|$; 22ɂr2oMt:]]j}9n"crf)1<#wv/{*g.dP8°wّ|--娳Aɖ,NK4wMexm:U["Hy Oƛ2:rHê;iW^+;SҍIHȐ,l< 1NHד\gA,eY> 'sf6],wr|;wDYP/ˢk#N.n5a~n3y@z֫6,,(B]±Q7$Cڦ-R;Z|K7),<wTl9S*3;@m.%R)`H#,9gٯYdfd8'%I'M|뇱y T;-GIUr,J֫6,,(B]±Q7$4]O_LF&E[yc ,HѾF 0Ha 5E)Ԙy1;ɆI *7nv-Xq™ ,I$fcI$$I$@((cfB@ Yt'D#;n x1aʀshڌVC-#KEmˀ`͘g-l䵺̅H T*X`A"*Bi Hc\JK"|7frD]\2c}_:~#[4;vyxK8To7Þ$&Iy% Do=w! ds*u iϣi-o?ϋ{|s3Ir2]*煴k5eA+waK!l}9xHucҾkWw&؉2<p0dks)#gubbqȤ,GͷROi[4JKapdFi P)b㻒xJk qT$LP p1ba6Tȗq!W9F6翠Ty>_^=@"GN1z999ߧ[׷^3[2Jqyk* tpk2[w=}<[sN2z{9܎W4-B Nۨ]UsuR6q߿Y?0v'p>y8ɥ `Crrz{? >} ry0㒿zz@?:#qU#3ӟpY?8㑌g=+{YjdX2ǿ?OFcq׸˿5]{ᱎ=j/1A'z>v,9#H@y3`>8 8?qmڤqq8i#Q`0G~?#'Fv,Qs9)Z5Fv?ۡD%{]3 נ9v{_i<UO\g>=*EG9 s9 ;G;R qԋ {cz})$#=Gݕ 8sKp9N`89$s !``39'dYؼ'qrJ81:{|ڮQsePQ8$ ?7gmVFUW ~P8qk|KKdFnG?Ӯmii Tu+*:n⑜@G~㊯fٷ_loˊ8;.Ob&c9'`_cs~jI _1ׅPA{aF F8:lm*Ya1ׯz lJ9_.Y+N{~9R%~r;3tOJhI* )?jE=C?L_3p!A׷O\O]/p*r['?''6FJ`fEOxugYS$2  q^RwoMc}8}x8,2zp=?nvu!q޾~XDAc^˕9o :?\QLL8 O=̉o! wsNzdQE ~\{is2|c6G݆͜T~^Qק\pB<xOztx]UXq <?ǚ22H#w}1VveH9akb <2IO\cmFHp*p:t֐) ́5"'1gۯO[5$fyr^PݮۈSbo<{}x<$ &QK8 =9mn _a׃lO}Ng[;s۷#2 mz߶?<*6T)'i<ۯOAEycß_?2Fz#=?{/;pNc8S1\ydaԞqϾ}s7@] .!tG!s;@{ߚ ep#wPF018$NJnK e^88=}5+ds'_}spds\qr86J6 BvO&LgB Uh\da3rӣC>\ G\Dqč)Z'۾G7<;_7۞~\con5OOYDС`InXf<117p o߱{?{?sU{Z~wuޥ/漏Stџ+nq\C{H%i&6GR*Ic|cۼ WUTWmh.Qr y޲r=fa-/Fkv5($mBW7VŬ/ ["[eKeU9b-S]d/H])"ovKyX[bυ n 88#&ĺեvV׉)S\̯1bNpqiiO%F㋋"'cMT "*‚bIԬ1 m{J==jhM0SqN+fVJzNpsC;i9!$(z_j #Aeo%ċ dQTNmFKԡ/f-S Uw)ԜaVw@ +O4_=I}(BѷI7$V6 `Ѩn<ȗɕ'n.%"BI#TP2I'4%i&xmi⸚_% wd)X`F+BP̍ev72P+.7:u. 6qZQEQEQEQEQEQEQEQEWΚ6ۜG.1>Zu?cJ[ֺ9g=`݁=^C<+O~&-tg{u=DF^ Tn|w _7NsׯUԌ<8N:D&'H'@d<ǿװ;M-K8rH$g{<ԃ3ӎ5<'>  ~:' 1'y}7 e|uӯϪqׯjV..2q?׾~f6pĒ8מ;q}_prryF9wӱT7@cH~Q~849x{@%a1ױzc\<#OM.̉q᷷oP8<9$v$ӿ_ׯj*:}1؇= Lzy檱c88:g'FSI}pyKm{ѐH*{S?B.0۴dϵJ'<`;hG{~s<R=JsT98:c={o8zIjj"9$83ێjA OL`}zJnNPwco̼`ӷI Ǩqm/0߹?7PqܬWHs*@\c{#܋F1#;H:q߁uEn1$}1ɢΧ(pI1,Vs[:t، IPK1##u94e}#n>;z&cҭ0߻1+r45[yկ`@ۀ=9ŮFsFwgwen+c9r?zW4 3U5t(x9=0}3R'NϿ$=FڼҞT7̇Ag"ٕdVcdWBo@y@^Iӟ~HTSn[N?{ǩHg$u5ڛ{2=,>մcP>cs|z~b)npy;99哌CK9V^ǦI$d0~}H냁f߭W" Pq_ƬeNTG?*t`Bl~`#{qSЅ3sx?ustRIf.%FNw `z#apˑϷ_o).3;= 5.frkeqK 8<}352S8*F Ay1ߎ; 4oH;cӯȧGD[?xI'<ө<ᏧFo H<6r?Ƿjè qیdCR[Jj2p%lځjs~\$Ym$c'ާc^3cyx$t?~v}Bm wsC8T{ yoέ% 9'<z( ӟYsj,:~uE+"quuԭl(d_ܐ6{mqQEEgGÂN6;@|zJ[FG^+t#Hg>q\%v: )sWO2G}OG,CI5 64ihRBd;cm8r/ K6[;timbC0yk9WL/-os-zmciҠG m{GrWWcqcmt-mV5u8926񱉿x9o2ρX^j&OڋMp9QH$ >^ {jѵ ;=.HJ ` 6}c֖5o-2Y݈sL4Lg12IKdiI>lmPW"ާXPHߓm ͭuzw-3Z;ys/-iZl7 oiwcp8/K9x 8$QyʆRx^zU} Lwm"v߱N3&kP钝_Sn>8Y؊F~eS鍤b+qq\guK"tyNA O r5oXH-8㷽p) OׅU[B.kk%/3~ *CF$eOIEq> [co[=tE2<&< 0HI ͩwgbVeW'}1ڜGG%˦ig8$ff%0X״mcS˫ R; MG=ZC>]1WAEaiZjͤX% w HRTi aqqyuy%落â-N9gl]P7o XV+(Z)ban,$7LxkybI ,72:8OYj66jO1S߸K|+E][nwq;O"*fyy 25((((((((((ssQM}_8x"_ L󏴰]8m؟0ztb$I#'#=?!R@\9;RCsvtǭu#VIqi|x*;Owb03zǥInKm$9#׮yNz桴TPq란fUYq''?N}?h`O`>? JGF#q㜒1d9*p3 ~C;Ul8}ԁSNC sz ' ZI=q IV\̮W<ʓ߿?'"䌓ߩ W uc(Tesc{ +=:uԎϻ'#'${g 1NCנ$߯r r#Kqd>'E9]AǦO&T>O^}%ԫy8qӧ99upYxۂg~=fNdiʮ{@+FOu>Wey&/[t8E8z+,be.Qx|d\n:ʜt?{I#1鬹adcUZI35©CG'__J'=HU;k،`Q%9v8ǥOyÎunExSL'p?*玥Py'}>ǒ|zuyHlc=OZ 888|!0ANJw:P)>fYxەMN4b p6]E`rpr?ϭrK9 nV N9ǯrzѴ-/SNiK02},\X1$s~99"[9V鎽/zb=5 ?w?7N?zcP!s\<0Ha{Jþן2 ~~O91<zahnec{uppH8<?K6A꾣nzGF6slzoا]A$Nz%(+ 9gH5mH a1gp0U:s{r;?>B3ݫi,Asp9^'=2:uQQyg O: |>Ar v= t U 7$`OLc/>8(G L eA>BvK}Zc+B}R8#n;G9횒^T`sxlgz {'瞕uQzd\t=ߒ?^y0\L{~gFrnuhb/ˁ\B95uۼ?@yyǠ\R$:S,jG#'?9-qI y~^ ./fiYG1Ӟ8{gywo<vv<:9F\<=\O cnQ Npp39dsfANHYpp@H#מz16 ı3q#Z̠mIyP6hMXz}+23>jԳI |X-0=G1$?+ m=y?np:ѰҲ"crJ@=DOc$I(z{ h8"ad` qmokk/-B-,yK@F0 0xH;7?Q^J[FG^{Ғ:ܔFgv^4w,OD-M Uc@8 U,tM4%QjbcAnv|խ${Kr _0bL}@ 6":e O,V70Gd"0ہVh䑇v:l:ڤZ}j&n>2GʼzTmhI6b2-`U\0p _oj}q[E YVAyorLyRv :[Kc>KN|R\f ,*Gb) `[KhDI;s%F܁f^Z??:ywo^Wi[/tf672 FL^yK@&K_\ykk_TtE:owv \_'@;].šæYn}'Ji$dQv !Ym% i /#txfMuC =(;Xꉧ "xLqdOP̜m/okҴi7RVT)~*n'2zI$ӹMGNq\iqcde]sb@*kOfˍv4z(ţHhnط`!?^FJc>{mg qYIhЙT-(Awnq@[y,EpW4GO˼mn[\Hn5Ֆh;ݸljO˝)m85 _٧L0ܥ KMxWW-6k@JD,; \[h!rbw01/%< m~)5tmn?Dm˂d1e#`d,5_ZizwՕµ<+g1: +t}o:UKfev5PEPEPEPEPEPEPEPEPEP_:jx|G i``gz.t@>5 \KWNz؏zUpI#Њ7rRЎ>S7HAߝdӜsP0wtӾ~i5%x0rGA+j=Ȕ'L':%K=Oz*Np02GNlm 3~uAvQIf%q?}`e2O6P& =zzޔfs3yHHz=/\@ xyA~?cS**(~i,1^CFFnݞ? 2 FݢL/zOQrI眯hg?{es|p1T8'!dq?/ӥt pv6vNsۿǧbV#p@@`z㑎xsO.E-KI:zXc)$}n}toY8鞞;sq{Csrx|ssre8  py< `~cqڹ3}rm q# dn.XJmiyn1_NGU%8 `8c"p`tzQXNђR898۳K G9Lۑٳ)I.oͬvc_ǃ F[U$y3_Ús $zsJ#eڛx?_qDU%bi L^3 QrArH\=ˠ^4q>=8 ˳KcӮy8U] ʁx׾~fnb ey@_áډ1o0Jgy?9s$\!]<OoFwe'ϩ랽Ƕw,2O}}0;~lQaʻ1e BsϽy$ x9>Sxgvl ;'=zԲZv%duOˊ*<>]QQu?N_ iIb㎝ g둿ixo\jV  8+OR t\8gZDzUw{vjZ oƫ RA:M2ZF2tMEA d${8_shG-MW[Te;5\ߙ 9:4d??Əgawe;5G-MW[UMS瓟֏:/IY/S׽=>3{vjZ oƫ^Y/ gFx9Ge0?jj2C-~ҙF/F%={/y΋C-?jj2x݆,[Ineϭ;pog!KׯZ={/>3C-?jj2{c:i|Ptd9K4{8_sh5_oQ SU`}f9֝ 9ֳ(q/i.F-MW[Te;5X_r?[zԧT?[#ǟ7OgawsC-?jj2A\+n:oQq6zj:X7Ge1G{vjZ oƫ^9>&}P50,o3T{8_p{G{vjZ oƫj˦3T?AJDz{G{vjZ oƫ#v}=Gڧܽ~ U=%{vjZ oƫn}5On]3T{8_sh5_oQ SUd vNEr.xzާq]ލZ oƨ{vjιzq]STWx5tfqle;5G-MW[Uurm5O훬cz8t.{8_si.F-MW[Te;5XWy5?7)?n3T{8_p{G{vjZ oƫ$韴װYzF17Ge0me;5G-MW[Uu˘Qdu0zxo@oKDzj[WXا]%T[L\R-ea5ךcVq?<志$*Z|dsRůߋh9cn Ďq{5} Z oƫ-^ Kz1YnUIE Y]?$?{-j}F5P"HP0*XqGrds&]nG8ǯ&$@ǎc)\)T v< g;jӐy>+;_t[lpvnݗ4sS=rzcӁZ`'^1gJs:*x9, zpAp=0)V5$dzcIvw=1\TM3a3vgrsu.b0g?u69=y?'ATd|_\A;O=?yV$8f' :^RNyO!DZ)c^:s{OI9;z}9= Ke2S9ߎTHSs|ђ;F:gПl Qx~;oӾ8jPAߦ:E.Jy?Lv`-Gcn- sx{G> s8~|~ޢb `=?Lq`!|v9u84rq9tdWn00Nv׎8; g=??8%88?{y=dr}8MaÜ0az eP8p1ds.;^Ӟ݀$@9co_Z_)W\6ؑzg9&@ISXt =}zWMw?%p[qO^W'w?Ɯ{~u OE"Bn >ܵEI^`4'p#\LX sV1!z`9C{z Tu>|cQ+b0 .>A1 P zׯ]`Gq=2IAu{tgN4[33'm= pN#)9Wor3$6UP끜~X*n8€#r=;UPo,d`,3r9mwH z\6?jm'q sǯ9 +̇*Hpc8L `W'n@xE 8qAYPd7r=@yҜ%RТ,њ)QI׫dӟ+[GqYW dǦ+nbϘ ܒ 'y{u|OG\*ӮGoЁӚ&&,2u5Z_Ln1 9b@у<A" 2(ݷs?U܍cCF:s >`p0x'SӃYJ@sGW{ƅNҸq:R\93En%.a =s;~zeq'Oۂq98otň=18=~WiBXh9߃=*,mr>CnqAgG,o[nw8$}>o#' Nap${`_spUSsR[EǑ~unj1#iQgsj鸌p۞G'H#ta9^c<i[qQl{]3&|\ d \9#iq=8ԗ:@3]9(8~@'GOӎ{~Zn]LΛy;ێp[ \w53.v $dznn'z:B}39Bzx''\$z2l$chi>9==wcvݤnԎ@H8&é=,z17~m`1RB2GN;9rc  ubpFX\8Ƕ:ud%]n==l86\F= ={*M 1ЎqNH9/qn3=yp _zcZ*d>24qS=F9{Bme <`ltx`9, mm?cgv9l\#ڃz <hRF=8?5e=jotr>Ƈ'FO=gjotڶ_?G:紟ѣi?Yڶ_?GOQλ#ti73ӛqr+1zm.N I[iQ ,[nܰ Hbנ$QW As^(XUYT r94dW}| 6.Хs$vAop|a G4G#I3t9m =VK2 ܠb|x8~4_vS&޳ .ͨ6ykq4s˸rGoYcWdU(>fN gG&{&TE%9a8CTVqEZ\< V fBcch!Xnf?29TQLM&{6Tu!9Q?9Jyub]rn❄JYbϷ5fNuky̲ƣs)2Ĩ,A 9[Vú뱷m+k3YFPr|8rx<0AimynG!?};QF3$t^/[H&4 "$RG0zdfvܾXctcY nJ%LG3D8 3O޳uɉ[~ _Qy|1 ʃex"- {09y95>*(RK4r[A s1ip5do#gQ6mW.c1\&x=F oY]]\ݹ`@H}̏~ˍO~Xp5+HgX6bTGBA|.H4]T-VihKl<1sL#8h{I}ZuB8mm-v0˖ rx|bOUzjɔ5h{I}>?5e=jot>uܞGDO紟Ѭ[/V{(]Ñ4>?4}'k?V{(ղ 9p}O=h{I}ղ ?l:Žu9aҾ2?+b7Ή3 ?x>\n{)#]qڴo{y6ːAr`AiGNIp~\ZZ|[8ZZRΧI:®>ky4cS=:t)d^ȭ ZLoJG8O @zЁBaaa>wD|1j2j'</|\ӽqMYu3|`G?_>N,R~\Q~i7c!q=H^N:>HsOg7l9:c#Q@W}>*lRc$sbyC7qԂN1$l?p <Oynp=YFss=?߆jq,1#{gt%`tq%y\ѥ XI`ݜtc=J+p?ӄ`/1[O3UA'9}}ꤴw 7:D9\w`8r}xzB;>oCX;#9? ?{o`x;׸E.rxKu_>{6 1,Xa7>sߟz;hX\csI ݂p:ǧמZ{c=ۀ=4 !tsz珧mm*398'sߚanWduqtztv@QOP<<.ï <9֌0~`z힣Z6#8G@2O2A#FF89xNK=u"`O u^{p8s*rXd-\Ǡij O#hiFq?_:0wdǦ{P7 ֵe %H':C|OeXzty3waSֻ UmnɖSrLz䁜j:BW0ڧp9@ǿu w U#T^Sc4|p΍\sߑԽdU/6'oN8ǯ@ xuE!@NIEr '=1~O1n׸>kxc89qǯ‘P6=;=.i c rp}GOˌ~] >rǮI8? VG/=91>zsj$1dz`~zrzZF=HVP7H=-::##M$lo;<#ׁA\δ@ĹgjwD}8P!׾QUnd]G cqOn**rdEHWkdg\d}VH@gb]Ȝ<8sXܪvd#193d>VB# ܪJyidVS.Czumfd9ݞ8`OéSf9P>cg9)* ,XJr ׌ǃ(d=~_F*lJs `T, Qۜ{axwe`U%NA~}sxt*냞?zصdm \D?u#ihQ˶5S.qQYk}-pژ#ylU^GuB{[ k<]@ҼR|cn= CgߌV}3pwy{ym85weMAҢӮŽ]H.b&1l#8&8!sbom*kX$M5Λx@yy*8t:szl-%`I*s=#I}gYywx4r@c ~5xRk'ӝE<:rɐeYS.he &o4}SMUcl&Pw92qA<7V\[J6 dGjJ5VNcyc78((((g%|#Ee$yui1r_^.LIu]y i.b"±\ KgiqPuQiQmFec$ca%/s&x߅]u[o7~nٹwgdPtj+c2 7eg!ЏP+~jW 姟tc |IdcV/U&H]]Z4^Lљc nc!%ƀ:tu>V}3pwy{ym85N:m +I rl ]윜|9='aN,EOcny'0g;.'-BHgBo koaiRij}ü'yoo)P8?{n4[MmK-/W(Z̲lTq(մ>P[G4ʍ3d ',r`zZlӜc韼=k/vӜc韼=j;]ViKi2Fkooq)c"d\2Hhl+%i1}UU9K ̹w45?ZX6itS;h߷GƧ j6j(yV6 T2HHƗV uhGʱG(=<Qp_ mNUi,UcY|#T+˼F f4{}GKypO) A MhQEQEQEQEQEQEW̒/ K/b_DΚƶ\KWNۛī8O^10$EV,*OV~#=9SG;FqR10=?\պdJ l`z\tbw]߈1r ţcXd?q{Xa'VM"/NNsBA-8y*Cr ?'y)"l])s}~ p 'Oөz^q۟_Oҏ6,qs&AH}12ߗ0GnO_Oä+w8 2zH8|c#$v?>}*i[1[g͜8~Oq.pA<01z&Ո{$;x#CS^Ey P1cN{s4pU#OϯBHT{ذ'##<=ױW)#Qثag<{r{@S8#8y(_}9קLP*g89tEsCcӮp:g(,AaonP7#$ m#9}yv4<T2y80(Z X\6J'?/ @z #!G~nzwG7!sߎǥW玙99RMGC ps>Yrx'ȁct=s\%yOe3?ZWwj M8i߷?\O<3 9&NN@<~xz]9nn COO>i#M  q}q^ׯ&"~l.gz4Q#^r3b3z`= }>\b$[$ H8ӜnI8rӯ~æ}sM ВÌn="5xO8 0FFpr{Or7Z#zmMc# q#GEy W< Fܖy:#q;9vH9 q18==(#ohU>:MX\:c>a~y8pܜ'Iyûۺ^x>\͢޼,B0qęG8}8s?Q 20PO^3q:{t01^hce%K:9;g1蔵5vA N_ӷj2rH9w0EF@.qӀ:`Cn x#=U;ovZy!Tf_|pN?R}G$.p9zg?1O0HTF;ۯ9AWbyw8۟O@TrI8q9`c`q0Ǯx^l$k|LdttfЛ;s8Ў3TFБۜu}m<H}2WG=(ە+IrNzޠs9&R'ECǐ9ݕ$pzӾOT& (FIlaG0?TD N2:@LBN'>8H$YVqp\ʬ=q;gAl2O={i4{dsy۞~meƷ;9u.ps8JGot#".ao0Fbp2 >aI`Ȅ?yu4'о{%vAVcd.pG#׌>^OHZ&`^ t̮ROAcNG<8Osߏ=;ch|s玞wTfB=8=:-\g&пyܴjsqinP`1Fz`rGAV"W!T+g$B0 `9@ #=qcs37u===݊7-:>Gjt?.:ܴԥu3szQ$9kB 6VR}ˎޣTU$' se im3ێ:>`[vs}=3޴x?6ͽ,Ϟ%w2qўxGWdkIhc>%L*_3ʰ<98͹USlz?{>kvszz-Kn;~d6l:{QTdG$qu*FO .2{?>'3!pI8s8W]APOcP%aہ@9cV i$$6{9Ϸҹd4LCS8'_^NISv#99n0DdA~3eIYxЩg\/l|+acZzCxг07۷s\gHi,`}+w֛h,&l8 ;qkZh;돳ۤ#y w FS$DӢ6|}[ؾvfyϝ'01g&Gm05/Yo3G#RPӆamĖb. "-Hhk`ew#` $Ъ66uvpHI%I,I$I$Պ(((ֵYe wgIe1GF0$c.ѣS M^"(B%$A! gi,ԴMZaIG+$m22 d1 '49RkIFRU X~ 3$ݒNw@3aw54 g?vHյ;o~%dԍ{"^]LJ+|q(0$eBl@I=z&ٶ[r4f|8< xOuo \ϷDXS4j BUT H W ܑ^DEae6XIRa#8bܝ_j #Aeo%ċ dQ\|೚KGKslE%#ᙘ2JF2Ciך׉uOcW"0ߺ >5WKPҭ#ދmrN$*!2UVbD`nOL涫A{_؃'ۭ %1ݻKJ˙0c_h)pYɏ;H7,vɸ|Ɖ]jS˧GȜ=+4r7\ոTqtWi99T=z߷*5LGo93zcsV" w8۲ 88=_W?U~}.qSnD.#W9|ҍnAz8P78obsNsOzc֥~a;qNqg;"KmNx<?•Tz)P 9b9<폯߶FFz֟)<ȴ(%8> "0HAAj]㎽:AQ6KЩbs_M#C$>~Pq:҃T1Ԟ9$qV Aˎx~a|Z΍Cu~v[.-Dmk[ H ey;tn|cÅgB]TO=qSQA;Ԩ?ntmWNHvr1ө?[_J r@,ׯ<'jb89LNF8olsWA<͆{t3ݱ֪KJA O8=A_ӎy&mHbܝn{v5lS#) Q:s?B >$`66=FO֦R&:sɧ9|#}8NI\c #}h<v:_ơeTӾzgmM28 W;{TU zd}_B@- o;H=;}ln P7<=x{~þֶR=`#0{Tq6N3}x$cdP(\0#a 9,9$;zBzWTiW|ç|#MBܸ=pN:ޞƛvp{~Az vNpʌ]}:>|z|sq;cٓČq"{ q<>bFnr0~{pq4Nqȗ1G^=zߗccebaOH$cEOq>#L#r9{{L`I_Z$IQHޝzd3ybs\  gQWooϺpK wx Fo a)*B1.yq'=xGZӵf@ @#=crIy,p8;1YDA#8^86A[H#d=~`q2xQ&*I$n}xA㐮%Oy SMkzg\n#\z sΛ8;[!NxcqgR3W5\98Jr@q'HfSL[p 8:J, 9ύRln0U0#:-";-N{3oO5].GCz둎.pp6sOqU蟜1I% +\oC~P6w{s5ک 20yT2]q<(%v3 8\{3 sŤRNŖML:+ A_Պ_9mNGl~˶N=37 8˫ nsУ'GZ2J˞\}{v}@ jSh(.n^dd(q+8;ї&ŏ;Bmcľ ~oux/Nx't% A\s_ab]IooqO͛ϻR(ʫ1Qt+/4 jڝ]YZIrxˣlRH xy 9u|+(.Zh-HҮOD|pvIQ^v|i5aּ?$Jj/nmDU ;C`c ԒIBc[dOL%;:-V% ,@=:W$^yl緒Xa|2󓂱v2cspM?\[;IѠKH6BgQ+˸mjRrp[lvQEQEQEs,ag&`|'ʓn+|˺}SOȗ;wڷ͏y|mqͮR-4u$iO,6 "p |/H])"ovKyX[bυ n 8857yjboiXrʹ(BxKMvYR<~DqFqo7"A \wd;/h\O QG,#$H uͷ97o5xx*lnl̎m)  &5  VjS%/-e.%o6t.<++m!-ͥZ$m\dr*60͑u `߆lγmVgi Z)T~R[}:K2i wJG|An|Hf#j FHcǰֵ=3JSQ-DV\InNōY$}j/H])"ovKyX[bυ n 88a~Oo'X&%֭/紏OIJje1@wg ps7jSxkC5}JU-bIU_N ^cǗvƸ?5;G_Ӫ$^OHRHە7N+aН4jWENEIo"6[i*/My<R $XPʤD7G^iRx[k\Oe$NHalyQUx";5o xORM2DMr%Q#s䭮3}2 )HDH3ʰO%PEPEPEPEP_8ЮHGoMgڜ*9y1Ӈ^6#Ǧ*q>hBo 0V=c_oMR# ;h}>XrGLNNfK@i9I #=jAF/@Ng}W q9߂{b p=fTqB1Gn-߯ڕܗ.1|q@VVqc~8.1%bPA [߿91Fw'yk\ʎHװ[IlF=P6=GZ-۱֔hfON v랝:YY@{rm_ˏp:)#_՞?$; u_.4G} =~aqQIZBrfw䏭y̒d=\қXryc׮;=w7>&=`< ~xX^%q"vcos$W=,wHQן)v06>r"I-YnKrF:q~;^-aT1@P8}MSRONO`@/R:֬pEiB8z{C%̌y$=}ʔYLI!z}^u(měCc8^\w {J@qv?N?Zu"R%*08'GJm̙$Fy߶A0OSr}3mB ێ^|H[ʬ ~ӏOnjV"h0r8c>ߵba\>`6Zcv/<9㎙}Hd>S$1}0GWuc rzUnsA9-g[Uc>w+|Pp) PS07rwsHS; + q3N;B5p:w1\+_Lɕlq2ǿR}zAv$3nQӊͤPh#+G^ǩmg*yǿ5W$HaGlu㊑c ]9cvB6;q1ӓۜ_FC 9Ԏ:c>kpH\C};~GG\U]g`1x~;c*lX`䍼;}Nf2:G#?ǡəéA;y{q'ׂ ]G$.s|q6l Bl 992 sAcvʲON~{捊7s: |_Ľ,W*xctӏlhq89zϳzHJ7$\ 0~8sqbq-"X؂x鷷='_smpcߎ8l eJdA=o DFX10dGnssGO\AvI'+^I2 #syG8noLӦx IXզ6y*X1뎧OϘpRz p=1ҹ8z/jC/`3o+HK e;ןOCMH`.t!;#c %R2Nlv*2 qۯ42  鏯Rذ.I+I p=F;{w#簣CUX''j''NO_L#bKn'>ӞL,A{qpjly|bF>˜:v=.Z4#1  u|ہU!ir3$05_ 㓀sp3;W$| :CJ엩j@TaKc R; qA TY|:psg,hqG?.qSrG@3=퍧SH"> SdGdm6s/jǐT ȃ zJ r1nA01Iȷ+- a1ـyFqRR2ss35oNNO$zFDO;Ä$ dcùgkJ3m+m B3֢{~({!/yp?7Sׯ 3o!|'ۻfE݌9Ey{1 9 #^?TKY2~Z??]CD׵ jM64kXrTۉS#IqꍨW[{ːЂ,wO]\+[x{{)fReIRA~$5M7Ql,Mw$ !|:1y%,y<'I/Ո5|Gi?28jgy%Knf!"H*R1 _@ԗ>"PmOȴ12(Tc! Thk4}&{C>zkq"9]X &7. v^44j$ u<睙6̛TÀq&çxZIX$yd87p>N&$#;v 3i>x-]lgVIYr6Ŵˍz;>JS[+$3MnK-p+ .[cٿ雾Ū_걿G׍hvt㠢(O:خg6Ms$4$VSu_~xEx'q46VE{$i$>l#9UI +&J2x^BK1jngQBDLgbrZ5Q.ecSYtX-H̳8o>h (?0\&cM={e)2w߇AHP~Xּ,ڭuom[^-!yXR59#*pknwF/j KX;ɿmOHv/Wwtl|rH<ޘ:Ӝ*?)GB?;;r0 c-M%e ei8\ty!ypGfm|!Ӂoju-<~NzgEj[_x=P;#z}{O"G!H yY}ľ%JƘ?w#ˑdͪ]\UcN=9ڇ ]8{ U6S2GQۿZS'M`\3-%cxFC&rHiG@R8 1Ўj]۵<?W62Fy=FI䎘>69UuӟjT=u'5ԛ$(;u5b;ބ6I8nT3wH-JA#avSN1Mlb꾅 {TY1s9q^Kqm@qA%^;r2?s[DW(6ǟcǷ'SV[[#, ?_s;9D!X#0cwO>qey<.Ic^j7n|d 0>_瞤Ma&y##׌q ;|7휟v]zWTm ZS9~hj4ٻ(r!pGsORAh%#@ۯ§s*Tr:}{`ԌHy,qo89Rl.,KOR{9=GKN-A[}$.>!.Ńv<~УknRF>nzy<*U69Frnͧw=A88'##dcC=D鵶בg'Fb);Ad:TR]N@HglQԑI89z(qʷq?zpTBÿ9"+CBq  Rߗ߱lʟ>c8G9}%uf^B`);zbXq~m<:cU8̯I` A~䓌 +=x1>=8(-qۖ'T#=xưmdr6C>to4FIxt>®w?^1ʻx {nZK22=@+ן^qK 21? VrJx|;ƻ'|d3̬XeU ?3㊩SW@JU{9I~85^I8:v]=2$m0O9qϯ{4dh݁'ʤgӟ8b,Hzg gqROps3;03]bG qN;{()A,J[qRxS08ʑ` v|@Np܅xק8hi9Rq2A=}3y08Ɲ[yYA0B8;c4wIݴqݽ*Azd`9S1?V=a$zߨ="=qޣ,׎xxdg=x=;r6ݑq=OngzW,K IדUDUh?3FkASh#E]Ek~w9=zO=|!ugcj6hqdjYv@#^\| n{?^O_U~e׆na7hQ#ejR~UGΝĞRTsz&Ys.A t-oUt?f1cj&6 _%֍oj|lmArF*4kcQoAy%زM[v',$%D͸d1[.XRŔ8UGë`dSZiqy{S]iM 5*Ƅo-L1%Ka vA VG  HB(q/cqh1[䰖g 4E@،%F) [QEQEQE^S Y1#`2*7|*O}uc1zcJf.ka;H.۽??jʑB퐄lHѾd|Uøi#I|rbϾb% \INH af^HʕGݹǣoSXvW."}Cr"H-65G \q!4?d+A#+/7E:B R0vj6ŷI<>4u)&m1*Wڪ*3t uK=<ۋImJ,ABƑ'D{t6 .${e_*I]r% j^-.n-&(Mʕ;˘6]|> 1udbkRIR?gɾ0ap񎃭j]2[,M_1ǖ9ʑ'vD$%69Ez_\Պn|_ma65C1l؀d,fBmۆ-cW_//|=wQGn6;yor[to ȇkHp| 铤7A#|m$suv)!5^O&_W2Me-!q. Q"0 ׬P;6:V=),b,76njrЗN\Z^3>i&]l$eNTA\ߏl'lu-_dť錏N,xRhCYCnb4L9UEY!E/ػQh} GM*0\^h2ˀ Iu/K&YW*1d V$zH;<'^ZZ3E7>N[H cem4&6B^YOR|470bvZ i,ɺ7,YPx?.㵰Z((((+MhƖ$E7#Ij.tH_ZN嫧?S}Ccn1R{hĂy+'F3{=rDsQO̯_Ur839^zsPd{H8'%qVa 񎣎sԙd î>Sى0Az 9'X)eI'#\ƛ;@n>q{z}HÑ1;'n0i ;zFI'XѭpTmbt.?AbyG'>g{ *S۷;sNY(  Ѓ9kx~!U0~2~е,j:q}j#ElpNFq<*ϧW kb [d98ir&$SDs5 #d؏SOHef2#>`=s^5w$9?}ye#ap:n=Xv!7g=1Q CUB# (9=᧖ ܜl919 sg0ͱ611s'#s([k) w& Hx91ۍ09pqׂqǷE Q$æiJ|B#\ 8 D,3lؚbȸ aB={{ԍ&A%9;AG};SgGrJ$d>spE !$ sj9ecgu\ PӑF #=:*&KW&m(N8x>pK*w(duPgnyۗsORmO$g̸JOl **N[#nTyM+܃; ,l#/?rx#y1<<`12S QIqe;3{w=)R>\8vx1做,HcqӷTDV#a48jtIbMJmHLgi#kVe )-ŶI B3+G;ddq ƛ-&G6Qtcw4l~h|¤M[IMV(?gηnk! :~FW>};bVU;\O0 P0Q@Q@zm-G8L+" G zѨfKt9O==s!pK uި[M9PHcNFc1$izH~R]D.b!g9{X4̇z׷D }~JJkGIf @9Bs?~j8F̀q 35x+>p?Ӷ01wN8g4dxyv?SjrHEy2le;r=1z^}IzF$c9'ۓo>e 29׷w˯ RPcsӿ֦J Eд Y͵l?3=D.0F=У*݀@g'VT@ =NjuNWԐCUW<`N}83a7`9@^s$6r9 PO܌?oOӟlsV]@TwuVU:s? z?Ŝȥ瓜OpI8 cϧNG4;Z;#L8ݒy _)p_Ln)z m(n4ZNHoPE2[pH'u+t#-${ 5E}9A}?(5U3/>)m,62;ߜc*[/NxB{vHDWiی1#Vn#-'1/Դu x ʑ{#<8,gϮ920U*Nݺ bW01I8>LvH~n~ia?( 2TЏCere}3߷^(@w ^}q<(Z 4*?!~3vŅev'9$9 }0:*@lUN08zgN^<,6X{E,n._8#c88='דx%\9,xLP-Ayd+߯.;7^:sϿ$sޫ zu1J7?~J7r8qӧj|ʺ9D< }`ЃG8p cǿ=}1֥w8Gݹɨw )Ezv`r>Z@.~^>U)957M- z=Ld(I:v<zp R$v|~H|ssHwל.89a$r=*9;OQOsnۿc#m3ge9?3k Zk\ZX7B8Sμ($U"EqV HZsĚ.uu[Kx fY+Gо[ ]ENj5mN [,aPj/; dwnEَTriPKioOD,\3" T( #;NSsuOM~$lD`cn+m6c >\@Q~hbA)u,̽>aTƧMe4h ޖyKCv)H,Cq>jn=+C㼖GKd@Η.&9O# NҌ(Ljm7cOiSgo9q2 sFGqYz6KKaMM\G/pX{P8xCMCN:/55#wcXIy)V€8xJ>xTuG yˑ 10` >`oSUCkq_ZcO4(uX#([&䌹b\<ewq !H"$.U(,YII5%QEQEs,el?ai=ߕw|R0m4>|9}S׶J-'Ȏ?[]Iٻܸ=L KXi2ǁ@j|V? }uzgZM}-&mZ7~iA%PFi >w7n,b>E:"5J]d3/@@U'5ZxAլSYat: K$ Jw-*K>i$.NV5 (򙙂r1%os^] ,m>;2ꏲ-0h$r+/j:~4j5n_6?%Y8o$62#v 7 kvb]?׭C2YBZ#մٵI G!M,eELy#O"4\k:]yp%r3!I#."*])] >b/)^ VG;nfTMP8UFfF/9//വA.H,x$Ƅ~EcLp7)ѽՈ4zӵ =Rgl&HVe|>{ Q:}*JbX2(^$ YN]AEQEs1?6SMc*\4Q"nt`~:z_ʹC̒USk!|5asIq?1Uj]wG>nc>źsy|ܽ3yNyLq-Hgs=zsL |̽{qۀ:FO5pX p3ϯu 2xry:χ/ӊ˳~9O׷o8M]BEFͤ$sXsFY#ႀ09=;sSӯ>Q7bʱe0PF:ַVM6?޸WrrTdw^Ǽi9=l3'UD?N= >&$#zs:v1Z]>A<{C5M~p 9E5a`c?VԒIA@ =>\gj־V>\gyu IճxdD{c8i#?Zqzk+9r=xЪM$ǝ`~8k0$\緧O󚈂ۿ#ڟ!߸4V.}?zp:7̱s?*0Ivl7^=2F{~+J)A[r0zzz/'’g0Hu:Rw"IBVyP `Qzs~b,|*3 8'2@9TAQ3c0:⻎Ez3s'ޤkB+X?,p$g#*Vg#coN۰6$э܌ pG_\24fE9+Iu/3_@Dk JpΤ N~AF)'jv[fA$98<篯S_$cy<`4S:a@=pOF s$x븴a{cporz=4-z=1=LG&B,Bpt~]B#Q19z׏wgJvٌ7C2^xXF\OW8z6@~xsY|@H0Wv=K't\d#H@2O??1I܌~`9!I`a,3ul %TRH#scbx riܐp9N=1ȡO,1#0su;r2oM) d}\znn9c8c~y$Ӂ p#3daCt@s?x;V=)L >c~eұm9? A!>׮9TX\ F 2'8nq s߃89886(ulq! WlC} v:?#҈p0^c84&̃av48 ~=Y=m$Pr 81 RG`Kf,r9$wĐpr9CTsӜ'CI7 #$89F@2qzW%YaHb<H^+#b9yOnb9`-Б?N)Z摂y N"Ұ$/Iϸ(Hۍ}idsxJ'/Q=>a zpӻ$3P3sϨ??Ÿq{p0FA}'#CZً*?QJ|*o(qEU9#rXIQ<积Nzg4ٵxKh{\[3PN853IswCѧW}żC<^x䍊0Ar<湩KhSu- w,Zyi)Dh/ (  T%ַgN}4K[ Ft'Cqlj#14גok4_U[GV"̖O!2v e /[Y:^,^ru(# 8P9Dd: ׃uqi]\]Zȷ.FX?Mx;]3FWq/wn2Z89!<ntI=J9 ݲ8P` I^_e-'tiPG y%#x…CXSZVNcOo-CqƷ1W;GԀ6=Vkđ6nyPJ9b #W//氷QԴ-[ ًFȪÞJҊu1omu.yp ߖs!'HXYLٖ?"hP`qۗl1L >2Dk*UIځ؅㌓Yk]j[ {uKQ<0$,T5sX5/ kzG&{@BLaI9me I]*-kc~ⱊS\oLN̕oe~/l`n}:Dhıe*E/8ڊ7az@ْgYv:ıok{5ɝѴRF|+* XUsŗF]7OR76LW),>/E&Y{x/!L;.E!dv *>mxFfXik_hn٢s,( #|˸I&gJOO]ag6/!#wcxyByi_b]ʊ ,p$M\_,AY.~pce1(F>!(>QEQEQEQEQEQEW Ű* ]  jO}_8Hq=*bRz?΢pߏs=}y =F#kDFIs^8> =qNcA!SߞݪJߖ!Y("MU'-=~jqwǧ$CLxNO=}낐B *,rO'ӋLVcňy}N,A3]#<3ynʖ1c9;{ۏ.W5bnzU3=y0Hq'4#!O^zQj0 7dw㿧'Бx2rN2sqQMcD~Ry3ۃ+7 F?ߎ:Î?4a列`0?/'ڸ#w7ZibOD27{!jsr:V64䴘03s9fNh-Y"eXw(c'&o$zaf$]4-/ A6Ɋ@+>9ͨ+qR}קk4:Ξ𺯜d'⼢k;-#hzؼE7 N҇YǶ>ZD/'3Th>/=%`̵xF1J>׳ۧIp3 ut5R]X38s=lG ^6Nv:\zz/81^UV_7W/u}a5rDUvA8xl綆^ yg<cs<}xrp{qUpsmnxqz5J8w4ᰴBjK+>Ƴ5 tL _OqWZ"]&dJL.[({;cƹcHI울E('nY>q=?Gn?:+y[VW+2Ǿ{㎮ BVs{> b)*i>q=?Gn?:*\ٵ]B+HU`3{V'ݔͧa)RK 鷺⻶,a^O4E{vR0#6~ѴT3HΙ$x8Ǟ#Z{Hro|/JxyME+r%j r)d%A`vӧ@Lִ՛Vkp,Ѭc>+\ &{t3LѵimAnUqsquJPFstqTjY{ɫ}V$lvWm΋4>ln421ӎkmaE)Uz0:{Ż;qߩYUtz 5[Tz=6<ϛzh}[id3Sڢ;ϲXz ]A}ȓϛzj̈́V1C~UI8՝؀$ -annU?'Rs粎(NiXt防FyW>{f= h ztq*l2s*/7$`B_N^䕈p,0a1|g8ېgj}W=3{cJ~r ӿ^$[|';K~O'}ycW8 y8 s<`zwqz8>f}8>޾vFL#DkA$ׯs?Jan{g3'q}_|KH# 9Lcܐ>?_]Olp#q3~~Jۇl߯ϧ;'O$NxbwՔI$c>(r=zƲE8K c}WC;k3Mwϥyiȍ@;x~'C4]j/IIqfv;@I'W,u?_2Z>{NTGkı,;h 49=$_ "hm>pgWvf--9?#z}oݙ3cJ[ۍsSQ-(n"DwF MԽ#^Ρ3fVHĸSǤ;GVn.k@G4!% pvAQ@c:8xwniwRrE3+qm2Z?}\b̄l3HKq.I$|-52YnK+!abcV`ϹwIٍ#{Kܰ_ 澝pVr9o6>flQ@^omeBM!$Jya 8`:.:K hڜ3^Yu2!h8%<7s(?>3>m6|mr>W_YH8 kF!۟k߹Onֳt}>-XmA5b$h%k[wȥS;=TԒOk$YcY b@C|=IS_x=z^H%y4Fp~x\cxk\YkKѦZ.quJ-vPa1ձk.cB}VȖYl-'uDGi~X$ pAa 5E)Ԙy1;ɆI *7nv-Xq™ ,I$fcI$$I$T-6m>hSqq$Di*UEU8P[,I:QEQE^Q?2 1R + `@! ˓ 5#Mq*,X߿nw';;P{hsK[?sc3GNzgߧ5&Rps'ノ< ze r3d?0,A='; }}:w8(<߯R~nO8u!*x$d+kt ?_!*g]=pF>Lqt`)aSwI?0h`~`X+n^9 6s~^6A:)! `conqPͩΈK ܀9?&F,puyf+?κoxmo tO?%|:zSpі,if{}r/u;"cӻ?9Q}M>n&={MuUՁb<!W46mWPl ^~jWͮ b0m;sbK} &}B~R@\I=i>m3*Qt5_5J C*JL}{c;43;%I'4ډϝX\2 ^//ۃ?˷V%z?JPv0Nnc$zt+ ƽ_>KFȮȲF̎e8 ׫x{[MsOJO*w#fiFCv܇MS5y%}6cXZ|KoFȪVWD}P3 F+8n9U 9CTAkiw% J7ygaXvVFعkrѯ^\ooI, w2mId1A뎜3Fӭ56/YO'8Q=a郞;QnuKǺ}:(+~7O=U_ËϷ+43;%I'5NO ig]̂Vͽu%spC|FӌGQJm67v%YU& ec Aojl&%2TÁٱv2Ⱥ O>ɑ5/^z3L5yc%(=3Qh3 ] pHV@m$ `l,gҴAJM[g5s{qߞgq~98-X ɒE}3߹5_($z#?xǧM%._o$='°!y?{1twS{dԮː0 =jĤFN}@ۃ?bC0r_6INzp*j瑏Q i g tFNO8{~?SR= &[p$Ͽ[dCrxoI1G׷~7 ?(Fe9Pc<`_u!H$ 23; =pqzG{!^mIWNݐ`m`96A=pz؄e>9s}:u8?|n Rr" 6/ ^KZkzJkC mEpZG!tUG$\I ܅$Mo+ u T2mG!q:93huIJw[*H+c_\o@!3\< `Q}z8E`_ o[i{q[@-ȔM7|d,pwW xt^RFn͞,c3E<.%.䕌vc,I/ ֿڙSzur9G! *AV;kǧWmjs02Y!i p \v&a,{`!#^rN'K~*մ˛8m;I w 68 89$UlkZ"c7mPLqp$Q* aNF mֱ.c%In`8Vyn'n8 Q֖:67VR wB0ݔmH@54]O_LF&E[yc ,HѾF 0H^/|})kcJ<[ARR29Iw^Kalw䐂H]ff 0+ !nҤj2QT q"ĒiP KTmkpQ,ח w$?LLJ=},zs9b $gvq'bN2x<8jg={3z>P@'y0׵G,`X3gׯ5Fy10 @nֱ YW',~\ [B[6Z`ڀ'#'O\Ru:y= a򥱞3ۜ w֤`#;sqV&fn;A8cR*6^I}g(ߩǧKgrvB>:q~bՌo̠W9sx硭RD@p͞鎃"K.N>^=:¹r0,A8ۋ.+'CCo+.E<˝`1`gdWDP) A^?j?$bxo^?\)>%|:>%|:z/V~ =Kms5w4rr;Wɠé<=8"_ x"}S0ۏNgTlw:E]a![i d{mFNyS)GURίKEu. aIp-\K̒`ٞzc<^{m7[ȲE ʰTugOx]WPL2ΥH҃ݒ:O%ݽcӘn #cHg'zܶGuUͤR=ێ9⹿14-(vٌgL3s7|}%n?Dö9턢sT*Μ6oQ#Cź#z 7jq9c5A<[?c=|4lw+GUִ YִĿ Fs?@:u"U՞{px+2אw =OuxcuHȔ@;#wUki.cCQ޻OIln9ǧ9 5NSW7k.54qSy08*Xu=^h֦52/n1WiZΕ}Oϑ(s ''9u60[Gqo"*ývQ]>o0Tr|=UhCkvw?\sYUΓs ?u6YoqG,g rץ=4e-̧y7ͿiiҬ*aB qwmfH4{@3\Ǩݗu?V=,e t8>2$uNO'L0q| Ke0*N_>nUL18}qtq64/ݬM,D%# ':~UK玠` ?sN69qtı4V L%F3T'~o_"ζۀ(x:vO2i_mǿn:ᵹkb۾s߷4 ߸%sGJ@>nr' ?_ӥ9g {p0 ߧI֗$ gmGݻa. o\ `M*]x%N~&,vaذ8;u=usD 7-NG~cvbAy%W=p9秱8B] 9q}xۂE `0'Ǧs܃Ը!|*v_uNS8SpAʃϮ1$}1J: ?Owhc uc_rr9xʌLө{Jm2OS8ێuȃ6# "di7wڪF}oH9~gRIp8䏯g:\%v: )sW vcP{}~ҽsὭ 6ȲE.I`8!)|zvNt۽EᶱҴiPI#Ɇ6뽣9++1q]6MC˛x߼u_g4˻/xj;A"HqH&t}1 GAX_ h*H&٨L[`Kr1skK7mdK, n VC&&H$46U{Kr+ Y\oS,( o6AG\zl_KY+?Gٽa4p]I@zhhͤ xL{`i$Hиg Agt60sԢ[u]O4ϴ8zU=+\V-<zm[eEM.B'1׹÷ԺŦ-eWS2;s){ ܢ(((((((((ChHeb󏴷8⾍?C ]8sb>ϩX g={{8ȧqI->#OdRN3x E,LqМm20(6~C(0 'SW;!\=>|pNsc<݅d[ p1ϯ#Fn[n{c˾*` ^ g|=yvޝg)i'=H'q᎞]$xs#oN~}a;IwsN9'po;apߩ l?9(oQݏn1AnzzsN.f(S1  z~>(2G;{V FH'<=zzc^hcZnBL?y$pA~h%@yd&brU~kO\rG ɪZ4LݑOh4֤~iQG=OU{{-XZ[2#5[|'fYB.69;n&={Mtxyb)_0~۬x|/Yqq꽾nm#|vS 1 0h<jpN:{<օ|Kc$8sLպA|L` s:\ A %UT$〽:W_Iv_ ðڝQIyQ^ynfFYYzoW/O>ȲF̎e8 hTkiiiUI;e@{>s֫IG"Xd{^Ajrwq r7OP ;Ẁ9T0d{w z4*=ύ/ S 菡Pfx$r;zޠV 4>h }9iȵ}6KIN(A(áMyXe"Xd v2lCЪT1km#?9t'+_ZmA3`P<zuڛ"A^N: h>`<a?-ˡs1qQFGYwvعZEMByjy!~gkdNaUsYYgfT dcj=O Vey&Ur+u+E]sp=:y*!'ttb(B7N{3~kuvpy=12Ozs fr&@.tBkGݫy<&x%J;~Ըŕ>v篩q2jh^>PNPv=ڰ%IZEﶻ?sSiD䭩b1aw;22}+~@[ҭIrDcH8P@ }4R$ɧݒnܹ28zՏGs7D+uvrwٙF jѫ6p]Ả^sW{SˡZC4-C G+/BqNrruC*,nB5#9 /$U}"]g3!TTMaTn\sjo&+OޱZKmCvQFbQ nzi Fb[Xo`̡aC3@pl/sEd 4 21Ӛn9<[i̐Ȭ, c#Df"+hn u})d÷YNHP}r{ǩC ߞ:th*)Xd|tzSM%z `~\dc1:z6e_rss۾ARu9=6ǸZ ,ҜJIr8yy$ϩ'{u=zhXǀH8ny۷4۴=O9:qס`RD`qH {` C+ݻ={یv2`0v9u#,W` AF0<*+9 u xBx9ϯܥ%_'FR^ߠ#+mU1ӏT+qt?aJVS# |@ﴛ:FXXNG=<灜#H=chy=;֔£PTc_G"k;@{QR'zh%7`<~_1? +QK@0svn=Ev6'Fƥaop}|0 Aۯ54NI=V|#/S3VOxmdҧ|?|[M,D\lɗiG#]~pMVYu˫XIlIyF*mxAA*jj2Ȉ2h H$j~.Ygσ5EӞM./WZ^  "=^m >i7v "[泈[-.'X"$|ഄԞ_C-?jj2{?/|\(·NKI-j}+4 =VQ6Vσ5EӞM./WZ^  "=^m C-?jj2{?5? "Ӽ/>`qu@֛G(/müM8Nm=FMo;۟M0P $Jʻv@-MW[Te;5Gե}q%-MW[Te;5Gե}q;r|aڊkKH!r@N7n/渷Ӯf]q;oMDž?Z oƨ{vjK1_O 1+jj2C->.dz_\j GQŦF]2Թ:ym A'A4-NK;M#L/.$6X説| Z oƨ{vjK1㼰Տ4%/ZigAVX6a!| a%Uwg It%W %dYxۜýu*jj2C->.dz[/l-:8c_QbNy}^iѴOo_d4ɭ-a\͑K4L;l >{{vjZ oƨ>>{{vjZ oƨ>>{{vjZ oƨ>>{{vjZ oƨ>>{{vjZ oƨ>>{{vjZ oƨ>>{{vjZ oƨ>>{{vjZ oƨ>>yⶮO^J>OZk4Ƭ;Kr#$1Z]O$ScUZ oƫZS״.YmMfBgszZӤv2UTq{XzgӁϷ5.n01a3юFqA:sN}iNۜds1Ӿ18S1`ぎOOˊ]nN9,OOӵhz,B N=Wd sT_qtPB$ p}?7ቐy#П|K$ urIb3܃NGMa$\8on~FT`1;`+,ɹH={;F`0qN;v<8Lcqx LmOfsTГhm6r3n~HCPn~UA;xGB8a^~yJJAk: Gkd܃A'sm׷s3q^FhNe^\w^=1Ӧyצ1ne/.dId9f7 h>/1cQLb ',<9h6y_ngw͜}zsW<&Z5K4R|Ж=>e/V_L%^@Jԋk m+,1 l@; kz2)K3m`1D? '~1qQvNUFo/&\OhX\'pwU@V6s mKm4/eFɴx^ F`w (T9Q,*/O<̞{u?Dj$³n+|6~t˟j[xIdAS/?s6eFX6Gc2FFq#=E:HwMG470RIu  ;?&w_{VAL'c$!ea$Q7Y3jhT"Fq8 ,ik{^Hp10=گr꺕vሄ5 H<99N1RZ*JI=_b+qwRɴvp*ؤJm+a-OuO-If@)3 cMTfV;ۃ:#z rM{,;7$LIA}O 䨮O oymaqb(J|H’@'ohջ& g܄ _"?~1~'TV}iQv^$hY~Ƭ3냜U q}WrIw4!Sc*<*{UP2y sMRPDOI?+܋?«GwyI:u9ne]>[b42F2v,2Aк-4Z+"XYv㑑8n>3sYu8[K{6񎇎2チfX@rK\ۺy<Ǟ> [ N[[+ʴsSb~bvU)ÉE7q`O>e?kg.ZWywʲ ɴ0E d7Rx4*MS{hUݝӌgڤbs_G,S81W2}-!rL+tyer|FUF 4w~C[ȲΈP*Fݵ 0 g RWkG--cdUGR w} ZIakiU$,X NJMIF׬uh.vv91vgн$UeIفwu)IkFkr:qN$0L|~}T:R+xZa%?B(23Lsl `{ぞ>Jɫ+ao ?>\c3s9qX[ 1<n2s߿ZDU\?z㾽:/|?(=}GJn R0`#qҞrX|ߏH3scst= |R \Ϡ89#s{bbTNprz=Wvo;.;z w ʭ {Rg sӿ# Xs;t?L8j 9ϯ*2Ht}HϰG_'p`A#o#{i5tԐ6ʸ g0;`9Hmw0cI~"-!}@8Rq33NݽsPЋoqhrYwОxJ9A 8A<ߜ$`y@ۜ O`ٴңl1B1zǠ=J+pGn0; 㞽YN\>ORA}1}BVp L1W{;{v nX㿲d=6Ĝ|]XE'M9$tݳt#9^=i*Iz=~??16f *Nt}3ǧqs}Iu<8p NcCօ_Շ~vC3ӿ?*XnI#XN?^1g-_րb@-o1'NE $m- ={{*RIǮG~ M8N;t98 K @=:I_p7a 6 ׾zsS7(9;wH3L6qǨp:42N@u z9>(ڬ 7Ls񎣊) 9''zv {?"qS*ۻ< ޔ#FFP068ޜX1i#'ӨK;VP14ރr2Frx<Ӹ /$0zd0O^eI92?*0/qMn$gUr1c'~J2'qL $g_|#H s9zwy2q=;w׭irq#ddqH(r~>,@8=}Jq?pT`rH2:cɌ>AF}s~MIc C=2}ϽNpzq3Jfw,NG?~}x<[?@6};zu5j3#oZܴj(gp:qՆ"T;FqNz x̴ %I9yi[WA+^r2Z=2v#s:ȟ)B 's#{3ۓ@:GGʧ?^xiŎ ]$=xg<[*T$=}ARU!s=xss0-X7m8o>Ѩcp89#~׽t1rzTp?灀杀FGS}\'faU1M.IP *6?CWT1An1;c>_pWqWv 6O8sGB~iڭGJGNq ~E ㎝'#QOl T_ 6$c^r^[{`#PrW=n.wyaz;!hgqۜgϷsM8~`|ӧLM ':p`PX|Ǣ&q%`m*q>8r9L}>A9;8# p6. `}~zrA?3$c۞ܐ;c~=osOՠ}tg=9I[pԟ8⮠.c<`s?JOʱH[)r;`);;<Y[ǧ}f6)3 <A(pۗۖsJ<І!XT`\(cw8^<;nl?艜#9gؚvjy}p8^8(|aoE\$;ԣbU]Y2[=O5ֶV 28kܗJ,#~ *28s@Rwhn3mc~?Թ#~IŪpOnUdO6i0;.w ci]l[\8֑``?x9>jVi4IDYuyma3 |d zObi˩B&.ZȩjFQ v*\ˌd+ks忄}{5ݞUk5l#Y3rw`Զ'pBc|ͻN+伔@AW~exN{{&D5C3f(ips2!NXj0,лH .ьdt&퀦;FA.1?^MejP<WsAOks_x`6Q0ޥ IG!px:γly,c8>rrkQ!v0c*N9g;TH xi{ƂRdsٹH˷jaqNO@kɴY.%yX,%>6,m8r3k$T`9{B*)j%)nVimtl3j}K_'E YA$23W^S9=4s>Gah)[j~ p\X1!Iݴ`'zӭI4K$wKNX}}$)NQ~=?_ן]ǡU5CcXZeV siF˸69^~~qן]CmAzN>>$8GeFn '=$`0yFWh=[ dxϧ.4v%B2wcU(N@׸'#ךA|vTc cW*%3(Cp8َ჏O\`РO{R"r{c9L + f!OF>l^4<usNϡ{*6z((x{ a$p_O^<@ݕzǿoss޾܌OvG Hdg=wc8өlz zT cis(Z-Q:da3׮OPO80}<1㟯qϘA+A<`s(BIo l،$aHON`qx FN קryRKINx~;o8$9=?>~H3İ^ N#$(rF `8%ӃG#ҫ:7Cӧ~֩;؝Ifd 9rqɣo9<^y$`?_gss9?$A0B?A^SLmc`v= xQ,`ݴ^x׊4js#9On3ީ&v9 )$g z:~{U[iegU q {"G*O+>{8|pzɬ+ȃOӀM >2I^A*n?$1HQ $v6t/0X9|Me&|ɜ<*8 OԶpc]A7CҊ)WLwCz?_SH#eT>"HrO oF?Š*w`WwB%$6- >HFy֊*d.FPu\2P>GP!J#֊*~UtՓ8c/Q<שNV=Ycy4QI|OSIB)JF93'۵9MI# OQM%I9F c8}c<u^h_n ho/ЙI;= ~Wm^=hm?{.;0}R=qۗ?~B*vۿYY~Wbrc9>j@XQE:^ת2c磴cFp}G:bI~=? (fPGK) 2f0vq9xΊ)w/F8䀧'@L3NhI*3^Ê  VuLLlJ$5 $?֊((Io?^=͞)Kl8va2:'[B_gtcQEkCZ{X(zZUaAE2{ٚqX?.?om6tQY-|C,UObg>fUa؂Ҋ*Č]Cܰg (ᑗ+`zqZ([?U˻>IUlS~QNnI]] ,w&OqݏN*<lӎ?Z([}o[|0n@R@?J#93LhM5zmA!<f^h{*d*x?緥RTON~[UaN[~c8x88s/{#~B7;˟mu=cSDK:7cP vIgz+h$ B6$f<_y OBc sIE _"O_;5lzRe$e7stoUJ^mr.\guY=*<(08;qxE1% F8?!Y({@^刔=D)1[ e~=zQEc=!OԊmpe8†%JNHr *4~8}Zz(!A{(]'Uȧ]&mxv?M|j*Bxϯ ȃo{QECno8v+3W‘ajy  zOEOA)d(EpG?ɥ<+C A:(Goam`t цb2IEWVU6SM7pconsole-1.2.0/include/000077500000000000000000000000001431776260400147715ustar00rootroot00000000000000pconsole-1.2.0/include/Conn.h000066400000000000000000000031361431776260400160420ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* Conn.h WJ101 */ #ifndef CONN_H_WJ101 #define CONN_H_WJ101 1 #include "config.h" #include "List.h" #ifdef HAVE_ST_RDEV #include #endif #include typedef struct Conn_tag Conn; struct Conn_tag { Conn *prev, *next; int fd; /* file descriptor */ #ifdef HAVE_ST_RDEV dev_t rdev; /* used for checking for duplicate connections */ #endif char *dev; /* ttyname */ char *hostname; /* hostname */ }; extern Conn *AllConns; Conn *new_Conn(void); void destroy_Conn(Conn *); Conn *prepend_Conn(Conn *); Conn *add_Conn(Conn *); void remove_Conn(Conn *); Conn *find_Conn_by_fd(int); Conn *find_Conn_by_dev(char *); Conn *find_Conn_by_hostname(char *); #ifdef HAVE_ST_RDEV Conn *find_Conn_by_rdev(dev_t); #endif int write_Conn(Conn *, void *, size_t); #endif /* CONN_H_WJ101 */ /* EOB */ pconsole-1.2.0/include/List.h000066400000000000000000000024461431776260400160630ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* List.h WJ99 */ #ifndef _LIST_H_WJ99 #define _LIST_H_WJ99 1 #define List(x) x *prev, *next typedef struct List_tag ListType; struct List_tag { List(ListType); }; void *prepend_List(void *, void *); void *add_List(void *, void *); void listdestroy_List(void *, void *); void *concat_List(void *, void *); void remove_List(void *, void *); int list_Count(void *); void *rewind_List(void *); void *unwind_List(void *); void *sort_List(void *, int (*)(void *, void *)); #endif /* _LIST_H_WJ99 */ /* EOB */ pconsole-1.2.0/include/commands.h000066400000000000000000000022761431776260400167520ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* command.h WJ101 */ #ifndef COMMAND_H_WJ101 #define COMMAND_H_WJ101 1 typedef struct { char *cmd; int (*func)(char **); char *help; } Command; int pcommand(char *); int cmd_help(char **); int cmd_version(char **); int cmd_echo(char **); int cmd_connect(char **); int cmd_exit(char **); int cmd_attach(char **); int cmd_detach(char **); int cmd_list(char **); #endif /* COMMAND_H_WJ101 */ /* EOB */ pconsole-1.2.0/include/cstring.h000066400000000000000000000024461431776260400166210ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* cstring.h WJ101 */ #ifndef CSTRING_H_WJ101 #define CSTRING_H_WJ101 1 #include "config.h" #include #ifdef HAVE_STRINGS_H #include #endif #ifndef HAVE_STRCHR #define strchr(x,y) index((x),(y)) #endif #ifndef HAVE_MEMSET #include void *memset(void *, int, size_t); #endif #ifndef HAVE_STRDUP char *strdup(char *); #endif #ifndef HAVE_STRERROR char *strerror(int); #endif void cstrip_line(char *); char **cstrsplit(char *, char); #endif /* CSTRING_H_WJ101 */ /* EOB */ pconsole-1.2.0/include/pconsole.h000066400000000000000000000021001431776260400167550ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* pconsole.h WJ101 */ #ifndef PCONSOLE_H_WJ101 #define PCONSOLE_H_WJ101 1 #define VERSION "1.2.0" #define FLAGS_ECHO 1 #define FLAGS_CMD_MODE 2 extern int flags; void command_mode(void); void pconsole(void); int main(int, char **); #endif /* PCONSOLE_H_WJ101 */ /* EOB */ pconsole-1.2.0/include/terminal.h000066400000000000000000000017511431776260400167610ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* terminal.h WJ101 */ #ifndef TERMINAL_H_WJ101 #define TERMINAL_H_WJ101 1 #define TERMINAL_RAW 0 #define TERMINAL_COOKED 1 void terminal_mode(int); #endif /* TERMINAL_H_WJ101 */ /* EOB */ pconsole-1.2.0/index.html000066400000000000000000000042031431776260400153420ustar00rootroot00000000000000 pconsole distribution page


pconsole

This is the pconsole distribution page. pconsole is a administrative tool for working with clusters of machines.
pconsole allows you to connect to each node of your cluster simultaneously, and you can type your administrative commands in a specialized window that 'multiplies' the input to each to the connections you have opened.
pconsole is best run from within X Windows, although it is possible to employ it without X (in console mode) as well.
You need to install pconsole on only 1 machine in the cluster, this would usually be your central administrative node.
pconsole was developed by Walter de Jong in 2001.

pconsole COMES WITH NO WARRANTY.
pconsole is free software.
pconsole is distributed under terms described in the GNU General Public License.

pconsole features:

  • parallel access to each machine in your cluster
  • unlimited number of simultaneous connections
  • secure access (tries to use SSH by default)
  • easy installation -- no need to install it on each node in the cluster
  • easy user interface
  • secure program even though it needs root privileges to run

Download the latest version at the GitHub pconsole releases page

Please see the README for more information.
See the ChangeLog for a (short) history in development.
View a screenshot of pconsole in action.

If you don't have SSH, I recommend OpenSSH, which you can get at OpenSSH.org

The main distribution site is at https://walterdejong.github.io/pconsole/.


If you really must, you can contact the author at walter@heiho.net pconsole-1.2.0/install-sh000077500000000000000000000127201431776260400153540ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 pconsole-1.2.0/pconsole.c000066400000000000000000000116711431776260400153420ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* pconsole.c WJ101 */ #include "config.h" #include "pconsole.h" #include "commands.h" #include "cstring.h" #include "terminal.h" #include "Conn.h" #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #ifndef TIOCSTI #define TIOCSTI 0x5412 #endif #define KEY_CTRL(x) ((x) - 'A' + 1) int flags = FLAGS_ECHO; void command_mode(void) { char buf[256], *p; terminal_mode(TERMINAL_COOKED); printf("\n" "pconsole command mode\n" ">>> "); fflush(stdout); flags |= FLAGS_CMD_MODE; while((p = fgets(buf, 256, stdin)) != NULL) { cstrip_line(buf); if (*buf) pcommand(buf); if (flags & FLAGS_CMD_MODE) { if (*buf) printf("\n"); printf(">>> "); fflush(stdout); } else break; } if (p == NULL) { clearerr(stdin); if (AllConns == NULL) { printf("\n\n"); terminal_mode(TERMINAL_COOKED); exit(0); } else printf("\n"); } flags &= ~FLAGS_CMD_MODE; printf("\n" "Press for command mode\n" "> "); fflush(stdout); terminal_mode(TERMINAL_RAW); } int put_conn(Conn *c, char kar) { int err, saved_errno; errno = 0; if (c == NULL) { errno = EINVAL; return -1; } /* regain root privs */ if (seteuid(0)) { fprintf(stderr, "failed to regain root privs: %s\n", strerror(errno)); cmd_exit(NULL); /* unreached */ } /* simulate terminal input */ err = ioctl(c->fd, TIOCSTI, &kar); saved_errno = errno; /* drop root privs again */ if (seteuid(getuid())) { fprintf(stderr, "failed to drop root privs: %s\n", strerror(errno)); cmd_exit(NULL); /* unreached */ } if (err == -1) { fprintf(stderr, "\nioctl() : %s\n", strerror(saved_errno)); errno = saved_errno; return -1; } return 0; } void pconsole(void) { int key, typed = 0; char kar; Conn *c, *c_next; if (AllConns == NULL) command_mode(); /* start in command mode */ else { printf("\n" "Press for command mode\n" "> "); fflush(stdout); terminal_mode(TERMINAL_RAW); } while(read(fileno(stdin), &kar, 1) > 0) { key = kar & 0xff; if (key == 1) { /* Ctrl-A => command mode */ printf("\n"); command_mode(); continue; } if (key == KEY_CTRL('S')) { /* Ctrl-S => toggle echo */ printf(" "); cmd_echo(NULL); printf("> "); fflush(stdout); typed = 0; continue; } if (key == '\r' || key == '\n') { /* return */ printf("\n> "); fflush(stdout); typed = 0; } else { if (flags & FLAGS_ECHO) { if (key == 0x7f || key == '\b') { /* backspace */ if (typed) { printf("\b \b"); fflush(stdout); typed--; } } else { if (key >= ' ' && key <= '~') { fputc(key, stdout); typed++; } else { switch(key) { case 0x1b: printf(""); break; case '\t': printf(""); break; default: printf("", key - 1 + 'A'); } printf("\n> "); typed = 0; } fflush(stdout); } } } /* put character in everyones input buffer */ for(c = AllConns; c != NULL; c = c_next) { c_next = c->next; if (c->fd > 0) { if (put_conn(c, kar) == -1) { if (c->hostname != NULL) printf("detaching from %s#%s\n", c->hostname, c->dev); else printf("detaching from %s\n", c->dev); remove_Conn(c); destroy_Conn(c); } } } if (AllConns == NULL) command_mode(); } } RETSIGTYPE sig_exit(int sig) { cmd_exit(NULL); exit(127 + sig); /* never reached... but hey */ } int main(int argc, char **argv) { if (geteuid()) { fprintf(stderr, "You must be root to run this program or this program should be setuid root.\n"); return -1; } if (seteuid(getuid())) { /* drop root privs */ fprintf(stderr, "failed to drop root privileges\n"); exit(-1); } if (!isatty(fileno(stdin))) { fprintf(stderr, "pconsole: not a tty\n"); return -1; } printf("pconsole WJ101\n"); signal(SIGTERM, sig_exit); signal(SIGINT, sig_exit); if (argc > 1) cmd_attach(&argv[1]); pconsole(); cmd_exit(NULL); return 0; } /* EOB */ pconsole-1.2.0/pconsole.sh.in000066400000000000000000000067671431776260400161510ustar00rootroot00000000000000#! /bin/sh # # pconsole WJ101 # Copyright (C) 2001 Walter de Jong # # 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 # # pconsole.sh WJ101 # # Open windows and have pconsole attach to them # NOTE: ssh is weird and it doesn't work without the ssh.sh wrapper script # # Change to "1" or "yes" to enable debugging DEBUG="" if [ ! -z "${DEBUG}" ] then set -x fi PATH=/bin:/usr/bin:/usr/bin/X11:/usr/openwin/bin:/usr/local/bin:/usr/bsd:/usr/share/bin:/opt/bin:/etc:/usr/etc prefix=@prefix@ exec_prefix=@exec_prefix@ bindir=@bindir@ # # options: you can overrule these by setting them in your environment # if [ -z "${P_TERM}" ] then P_TERM=xterm fi if [ -z "${P_TERM_OPTIONS}" ] then P_TERM_OPTIONS="-geometry 40x12 -fn 5x7" fi if [ -z "${P_CONNECT_CMD}" ] then P_CONNECT_CMD="${bindir}/ssh.sh" fi if [ -z "${P_CONSOLE_OPTIONS}" ] then P_CONSOLE_OPTIONS="-geometry 60x12" fi # # get tty # Mind that ps output may be platform dependent # If so, you have to adjust this function # # What it does is get the tty that has the parent pid equal to the pid of # the xterm we launched # get_tty() { if [ ! -z "${DEBUG}" ] then set -x fi PS_PERSONALITY=posix # may be needed for GNU ps :P ps -ef 2>/dev/null | awk '{ print $3 " " $6 }' | egrep "^$1" | awk '{ print $2 }' } # # main # if [ -z "$1" ] then PROG=`basename $0` echo "usage: ${PROG}" '[:port] [...]' exit 1 fi THIS_TTY=`tty` # # run this in a sub-shell so the user gets the prompt back # We start all windows, give them some time to initialize, and then get all # ttys that have those (parent) pids # Then we combine the host#tty pairs, and give that to the pconsole binary # ( if [ ! -z "${DEBUG}" ] then set -x fi HOSTLIST="$*" for HOST in ${HOSTLIST} do # get optional port number PORT=`echo "${HOST}" | cut -d: -f2` HOSTNAME=`echo "${HOST}" | cut -d: -f1` if [ "${PORT}" = "${HOSTNAME}" ]; then PORT='' fi # open windows ${P_TERM} ${P_TERM_OPTIONS} -title "pconsole: ${HOST}" -name "pconsole: ${HOST}" -e ${P_CONNECT_CMD} ${HOSTNAME} ${PORT} & PID=$! PIDLIST="${PIDLIST} ${PID}" done for PID in ${PIDLIST} do TTY='' while [ -z "${TTY}" ] do TTY=`get_tty "${PID}"` # sometimes xterm is too slow forking off, and get_tty will give the same # tty as we started from. This would be incorrect, and if so, we try again if [ "/dev/${TTY}" = "${THIS_TTY}" ]; then TTY='' sleep 1 fi done HOST=`echo ${HOSTLIST} | cut -d\ -f1` HOSTLIST=`echo ${HOSTLIST} | cut -d\ -f2-999` if [ ! -z "${HOST}" ] then TTYS="${TTYS} ${HOST}#/dev/${TTY}" else TTYS="${TTYS} /dev/${TTY}" fi done # start pconsole ${P_TERM} ${P_CONSOLE_OPTIONS} -title pconsole -name pconsole -e "${bindir}/pconsole" ${TTYS} # terminate all open windows if [ ! -z "${PIDLIST}" ] then kill ${PIDLIST} >/dev/null 2>&1 fi exit 0 ) & exit 0 # EOB pconsole-1.2.0/ssh.sh000066400000000000000000000025051431776260400145010ustar00rootroot00000000000000#! /bin/sh # # pconsole WJ101 # Copyright (C) 2001 Walter de Jong # # 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 # # pconsole ssh.sh WJ101 # # This is a wrapper script for ssh # Without it, pconsole can't work correctly with ssh # # list all possible paths where ssh could be PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/ssh:/usr/local/ssh/bin:/usr/ssh:/usr/ssh/bin:/etc:/usr/bsd:/etc/ssh:/etc/ssh/bin:/usr/share/bin:/usr/share/ssh:/opt/bin:/opt/ssh:/opt/ssh/bin:/usr/etc SSH=`type ssh 2>/dev/null` if [ -z "${SSH}" ] then telnet $* else if [ -z "$2" ] then ssh $* else ssh $1 -p $2 fi fi # EOB pconsole-1.2.0/stamp-h.in000066400000000000000000000000001431776260400152350ustar00rootroot00000000000000pconsole-1.2.0/terminal.c000066400000000000000000000033041431776260400153250ustar00rootroot00000000000000/* pconsole WJ101 Copyright (C) 2001 Walter de Jong 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 */ /* terminal.c WJ101 */ #include "config.h" #include "terminal.h" #include "cstring.h" #include #include #include #include #include void terminal_mode(int mode) { static struct termios ori_term; static int saved = 0; struct termios term; if (!isatty(fileno(stdin))) { fprintf(stderr, "pconsole: not on a tty\n"); return; } tcgetattr(fileno(stdin), &term); if (mode == TERMINAL_RAW) { if (!saved) { memcpy(&ori_term, &term, sizeof(struct termios)); saved = 1; } term.c_iflag |= IGNBRK; term.c_iflag &= ~(INLCR | ICRNL | IXON | IXOFF); term.c_lflag &= ~(ICANON | ECHO | ECHOK | ECHOE | ECHONL | ISIG | IEXTEN); term.c_cc[VMIN] = 1; term.c_cc[VTIME] = 0; tcsetattr(fileno(stdin), TCSANOW, &term); } else { if (saved) { memcpy(&term, &ori_term, sizeof(struct termios)); tcsetattr(fileno(stdin), TCSANOW, &term); } } } /* EOB */