Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

atomx: Amiga to Minix Executable Converter, part 1 of 1.

15 views
Skip to first unread message

Peter Chubb

unread,
Jul 2, 1991, 8:07:00 PM7/2/91
to
I've written a converter from Amiga executables to Minix executables,
called atomx.

This allows an Amiga with a non-standard hard disc to be used to
compile Minix using any of the readily available AmigaDOS C compilers.

When compiled with Lattice C 5.05, for instance, the kernel is around
45K smaller, and noticeably faster (I still have to do some tests) than
when compiled with ACK.

Documentation, as to how to compile Minix with Lattice C, is included
in atomx.doc. The uuencoded AmigaDOS executable is also included.

----------Cut Here-----------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: Makefile atomx.c atomx.doc atomx.uue hunks.h
# Wrapped by pet...@softway.sw.oz.au on Wed Jul 3 09:52:49 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(645 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X#
X# Makefile for atomx, the Amiga to Minix executable converter.
X#
X# Copyright 1991 Peter Chubb
X# All rights reserved
X#
X# $Id: Makefile,v 1.1 91/06/30 16:53:53 peterc Exp $
X#
X# $Log: Makefile,v $
X# Revision 1.1 91/06/30 16:53:53 peterc
X# Initial revision
X#
X#
X#
XCFLAGS= -i:h/ -O -d1 -cusf
XINSDIR=:bin
XTARGETS=atomx
X
Xatomx: atomx.o
X blink from lib:catch.o atomx.o to atomx lib lib:lc.lib lib:amiga.lib sc sd addsym batch
X
Xatomx.o: atomx.c :h/minix/minix/const.h :h/minix/minix/config.h hunks.h :h/minix/a.out.h
X
Xinstall: $(TARGETS)
X copy $(TARGETS) $(INSDIR)
Xclean:
X -delete \#?.o \#?.lnk
X
Xclobber: clean
X -delete $(TARGETS)
X
X.DEFAULT:
X co $@
END_OF_FILE
if test 645 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'atomx.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'atomx.c'\"
else
echo shar: Extracting \"'atomx.c'\" \(13508 characters\)
sed "s/^X//" >'atomx.c' <<'END_OF_FILE'
X/************************************************************************
X * atomx.c -- convert AmigaDOS to Minix a.out *
X * *
X * Copyright 1991 Peter Chubb *
X * All rights reserved *
X * *
X ************************************************************************/
X
Xstatic char RCSID[] = "$Id: atomx.c,v 1.4 91/07/02 18:04:41 peterc Exp $";
X
X/*
X * This is a quick&dirty program to change an AmigaDOS executable format file
X * into an Amiga-Minix executable. Of course, the executable must have
X * been linked against the Minix libraries if it is ever to run under Minix!
X *
X * Although the program is structured badly, (too many global variables), it
X * should be fairly portable, at least between MINIX and AmigaDOS when using
X * ISO (or almost ISO) standard compilers such as Lattice C 5.05.
X *
X *
X * $Log: atomx.c,v $
X * Revision 1.4 91/07/02 18:04:41 peterc
X * Cleanup for release.
X * Moved #define EXIT_FAILURE, etc, straight after #include stdlib.h
X *
X * Revision 1.3 91/06/30 16:55:24 peterc
X * Major cleanup.
X *
X * Revision 1.2 91/06/10 18:17:12 peterc
X * Fixed magic number, and problem with bad relocations.
X * Poor documentation can get anyone down!
X *
X * Revision 1.1 91/06/09 14:49:51 peterc
X * Initial revision
X *
X *
X */
X#include <stdio.h>
X#include <fcntl.h>
X#include <errno.h>
X#include <string.h>
X#include <stdlib.h>
X/*
X * These should be defined in Lattice's stdlib.h, but aren't.
X */
X#ifndef EXIT_FAILURE
X# include <libraries/dos.h>
X# define EXIT_FAILURE RETURN_WARN
X# define EXIT_SUCCESS RETURN_OK
X#endif
X
X#include "hunks.h"
X#ifdef _POSIX
X# include <unistd.h>
X#endif
X
X#undef AMIGA
X#undef M68000
X
X#include "minix/minix/config.h"
X#include "minix/minix/const.h"
X#include "minix/a.out.h"
X
X/*
X * These should be defined in Lattice's stdlib.h, but aren't.
X */
X#ifndef EXIT_FAILURE
X# include <libraries/dos.h>
X# define EXIT_FAILURE RETURN_WARN
X# define EXIT_SUCCESS RETURN_OK
X#endif
X
X/*
X * These should be defined in unistd.h, but Lattice doesn't have one (Not unix).
X */
X#ifndef SEEK_CUR
X# define SEEK_SET 0 /* fseek relative to start of file */
X# define SEEK_CUR 1 /* relative to current position */
X# define SEEK_END 2 /* relative to end of file */
X#endif
X
X/*
X * Each hunk in the Amiga format executable is
X * represented in memory by an instance of hunk_t.
X */
Xtypedef struct h_x {
X long h_type; /* hunk type */
X long h_flags; /* my flags */
X long h_size; /* in bytes, from program header */
X long h_hsize; /* in bytes, from hunk header */
X long h_rsize; /* number of relocation entries */
X long h_base; /* in bytes: address relative to offset zero of text */
X struct h_x *h_next; /* pointer to next hunk of same type */
X char *h_data; /* pointer to relocatable data */
X long h_fpos; /* position in file of relocatable section */
X} hunk_t;
X
Xstruct exec exec; /* output file Minix exec header */
X
Xhunk_t *hunkp; /* Head of list of hunks */
Xlong nhunks; /* Number in chain */
Xhunk_t *text; /* pointer to lowest text hunk */
Xhunk_t *data; /* ditto for data hunks */
Xhunk_t *bss; /* and for BSS hunks */
X
Xlong *relocs; /* relocation entries */
Xlong nrelocs; /* how many there are */
X
Xchar *fromFile; /* Name of input file */
Xchar zero[CLICK_SIZE] = {0, }; /* for padding */
Xlong stacksize = 2*CLICK_SIZE; /* to put into generated image. Change later with chmem */
Xint verbose = 0; /* print out oodles of info */
Xint make_sep = 0; /* -i flag to make separate i/d space */
X
X/* addlong -- add a long to a (possibly unaligned) long */
Xlong
Xaddlong(char *dest, long src)
X{
X union
X {
X char bytes[4];
X long l;
X } x;
X
X if ((long)dest & 1)
X {
X memcpy(x.bytes, dest, 4);
X x.l += src;
X memcpy(dest, x.bytes, 4);
X }
X else
X x.l = *((long*)dest) += src;
X return x.l;
X}
X
X
X/* getlong -- read a longword from a file */
Xlong
Xgetlong(FILE *fp)
X{
X long N;
X if (fread((char *)&N, sizeof N, 1, fp) != 1)
X {
X perror("getlong");
X exit(EXIT_FAILURE);
X }
X return N;
X}
X
X/* read_header -- read in the AmigaDOS object header. */
X/*
X * The header is analysed, and memory allocated for working storage.
X * If the header is invalid, or indicates the program cannot be converted,
X * read_header won't return.
X */
Xvoid
Xread_header(FILE *fp)
X{
X long N;
X hunk_t *p;
X
X if ((N = getlong(fp)) != HUNK_HEADER)
X {
X fprintf(stderr, "Are you SURE this is an Amiga executable?"
X "\nBad magic %lx\n", N);
X exit(EXIT_FAILURE);
X }
X
X /*
X * get resident library reference count
X */
X if ((N = getlong(fp)) != 0L)
X {
X fprintf(stderr, "%s uses resident libraries: cannot convert!\n", fromFile);
X exit(EXIT_FAILURE);
X }
X
X /*
X * get table size
X */
X nhunks = getlong(fp);
X if ((hunkp = calloc((int)nhunks, sizeof(hunk_t))) == (hunk_t *)NULL)
X {
X fprintf(stderr, "Out of memory!\n");
X exit(EXIT_FAILURE);
X }
X p = hunkp;
X
X /*
X * get first -- it had better be zero
X */
X if ((N = getlong(fp)) != 0L)
X {
X fprintf(stderr, "Inconsistent header, bailing out\n");
X exit(EXIT_FAILURE);
X }
X
X /*
X * get last
X */
X N = getlong(fp);
X while(N-- >= 0)
X {
X p->h_size = getlong(fp) * sizeof(long);
X p++;
X }
X}
X
X/*
X * readhunkdetails -- first pass.
X * get real type and size, then skip to next.
X */
Xvoid
Xreadhunkdetails(FILE *fp, hunk_t *p)
X{
X long N;
X
X p->h_fpos = ftell(fp);
X while ((N = getlong(fp)) != HUNK_END)
X switch (N)
X {
X case HUNK_UNIT: /* these we strip */
X case HUNK_NAME:
X case HUNK_DEBUG:
X N = getlong(fp);
X fseek(fp, N * sizeof(long), SEEK_CUR);
X break;
X
X case HUNK_CODE:
X case HUNK_DATA:
X case HUNK_BSS:
X if (p->h_type != 0L)
X {
X fprintf(stderr, "two relocatable blocks in one hunk!\n");
X fprintf(stderr, "Bailing out!\n");
X exit(EXIT_FAILURE);
X }
X p->h_type = N;
X p->h_hsize = getlong(fp) * sizeof(long);
X if (N != HUNK_BSS)
X {
X if ((p->h_data = malloc(p->h_hsize)) == (char *)0)
X {
X fprintf(stderr, "Out of memory\n");
X exit(EXIT_FAILURE);
X }
X if (fread(p->h_data, 1, p->h_hsize, fp) != p->h_hsize)
X {
X perror("fread of hunk data");
X exit(EXIT_FAILURE);
X }
X }
X break;
X
X case HUNK_RELOC32:
X while ((N = getlong(fp)) != 0L)
X {
X p->h_rsize += N;
X fseek(fp, (N + 1) * sizeof(long), SEEK_CUR);
X }
X break;
X
X case HUNK_SYMBOL:
X /* we strip symbol table info */
X while ((N = getlong(fp)) != 0)
X fseek(fp, ((N & 0xffffffL) + 1) * sizeof(long), SEEK_CUR);
X break;
X
X default:
X fprintf(stderr, "Can't cope with hunk type %ld\n", N);
X fprintf(stderr, "Bailing out!\n");
X exit(EXIT_FAILURE);
X }
X}
X
X
X
X/*
X * find_bases -- calculate the base addresses for each segment.
X */
Xvoid
Xfind_bases(void)
X{
X int i;
X
X hunk_t *p; /* The hunk being processed */
X hunk_t **tp = &text; /* Position in the list of text hunks */
X hunk_t **dp = &data; /* Position in the list of data hunks */
X hunk_t **bp = &bss; /* Position in the listof BSS hunks */
X
X hunk_t *mp = (hunk_t *)NULL; /* pointer to __MERGED data/bss hunk, if any */
X
X long tsize = 0L; /* Size of text segment so far */
X long dsize = 0L; /* Size of data segment so far */
X long bsssize = 0L; /* Size of BSS segment so far */
X
X long nbrelocs = 0L; /* Number of BSS relocations so far */
X long ndrelocs = 0L; /* number of data relocations so far */
X long ntrelocs = 0L; /* number of text relocations so far */
X
X for (p = hunkp, i = 0; i < nhunks; i++, p++)
X {
X switch (p->h_type)
X {
X case HUNK_CODE:
X p->h_base = tsize;
X tsize += p->h_hsize;
X *tp = p;
X tp = &p->h_next;
X ntrelocs += p->h_rsize;
X break;
X
X case HUNK_DATA:
X p->h_base = dsize;
X dsize += p->h_hsize;
X if (p->h_size != p->h_hsize)
X { /* __MERGED hunk */
X if (mp)
X {
X fprintf(stderr, "Multiple joint bss/data hunks -- can't handle\n");
X exit(EXIT_FAILURE);
X }
X bsssize += p->h_size - p->h_hsize;
X mp = p;
X }
X *dp = p;
X dp = &p->h_next;
X ndrelocs += p->h_rsize;
X break;
X
X case HUNK_BSS:
X *bp = p;
X bp = &p->h_next;
X nbrelocs += p->h_rsize;
X break;
X
X default:
X fprintf(stderr, "Unknown hunk type in internal data structure: bailing out\n");
X exit(EXIT_FAILURE);
X }
X }
X
X /*
X * Round text size to next CLICK_SIZE byte boundary for separate I/D space
X */
X if (make_sep)
X tsize = (tsize + (CLICK_SIZE - 1)) & ~((long)CLICK_SIZE - 1L);
X
X /* Fix up bss and data bases */
X
X /*
X * Data bases.
X */
X for (p = data; p != (hunk_t *)NULL; p = p->h_next)
X p->h_base += tsize;
X
X /*
X * BSS base.
X */
X if (mp)
X bsssize = mp->h_size - mp->h_hsize;
X else
X bsssize = 0;
X for (p = bss; p != (hunk_t *)NULL; p = p->h_next)
X {
X p->h_base += tsize + dsize;
X bsssize += p->h_size;
X }
X
X nrelocs = ntrelocs + ndrelocs + nbrelocs;
X if ((relocs = (long *)malloc(nrelocs * sizeof(long))) == (long *)0)
X {
X fprintf(stderr, "Out of memory\n");
X exit(EXIT_FAILURE);
X }
X exec.a_text = tsize;
X exec.a_data = dsize;
X exec.a_bss = bsssize;
X exec.a_total = tsize + dsize + bsssize + stacksize;
X}
X
X/*
X * read_relocs -- read in the relocation entries, and fix them up.
X * Start putting the relocations at **next
X * (updating it afterwards).
X */
Xvoid
Xread_relocs(hunk_t *hp, long **next, FILE *fp)
X{
X long *rel = *next;
X long sz;
X long htype;
X long hnum;
X register long base;
X
X for (; hp != (hunk_t *)0; hp = hp->h_next)
X {
X fseek(fp, hp->h_fpos, SEEK_SET);
X while ((htype = getlong(fp)) != HUNK_END)
X {
X switch (htype)
X {
X case HUNK_UNIT: /* these we strip */
X case HUNK_NAME:
X case HUNK_DEBUG:
X case HUNK_CODE:
X case HUNK_DATA:
X case HUNK_BSS:
X sz = getlong(fp);
X if (htype != HUNK_BSS)
X fseek(fp, sz * sizeof(long), SEEK_CUR);
X break;
X
X case HUNK_SYMBOL:
X /* we strip symbol table info */
X while ((sz = getlong(fp)) != 0L)
X fseek(fp, ((sz & 0xffffffL) + 1) * sizeof(long), SEEK_CUR);
X break;
X
X case HUNK_RELOC32:
X if (hp->h_type == HUNK_BSS)
X {
X fprintf(stderr, "Relocations for BSS hunk -- bailing out\n");
X exit(EXIT_FAILURE);
X }
X while ((sz = getlong(fp)) != 0L)
X {
X hnum = getlong(fp);
X if (fread((char *)rel, sizeof (*rel), sz, fp) != sz)
X {
X fprintf(stderr, "Malformed file\n");
X exit(EXIT_FAILURE);
X }
X base = hunkp[hnum].h_base;
X while (sz-- > 0)
X {
X if (*rel >= 0L && *rel < hp->h_hsize)
X addlong(&hp->h_data[*rel], base);
X else
X {
X fprintf(stderr,
X "relocation failed! Relocation %ld out of range wrt hunk %d, size %ld\n",
X *rel,
X hnum,
X hp->h_size);
X exit(EXIT_FAILURE);
X }
X if (verbose)
X fprintf(stderr, "relocating 4 bytes at %ld from the %d hunkbase by %ld\n",
X *rel, hnum, hp->h_base);
X *rel++ += hp->h_base;
X }
X }
X break;
X default:
X fprintf(stderr, "Unrecognised hunk type %ld\n", htype);
X }
X }
X }
X *next = rel;
X}
X
X
X/*
X * Fill in the exec structure
X */
Xvoid
Xinit_exec(void)
X{
X/*
X * Although cputype SHOULD be M68K (0x0B) the MINIX kernel refuses
X * to recognise anything other than A_I8086 (0x04).
X * And although this is a very simple change to make, it's probably
X * too embedded now to fix.
X * Thanks guys!
X */
X exec.a_cpu = A_I8086;
X exec.a_flags = A_EXEC;
X if (make_sep)
X exec.a_flags |= A_SEP;
X exec.a_magic[0] = A_MAGIC0;
X exec.a_magic[1] = A_MAGIC1;
X exec.a_version = 0;
X exec.a_hdrlen = A_MINHDR;
X exec.a_syms = 0;
X}
X
X/* write_out -- write out the a.out file. */
Xvoid
Xwrite_out(char *name)
X{
X FILE *fp;
X long reloc;
X long *relp;
X register hunk_t *p;
X long size = 0;
X
X if ((fp = fopen(name, "wb")) == (FILE *)NULL)
X {
X perror(name);
X exit(EXIT_FAILURE);
X }
X /* 1. header */
X fwrite((char *)&exec, A_MINHDR, 1, fp);
X
X /* 2. Text */
X for (p = text; p != (hunk_t *)NULL; p = p->h_next)
X {
X size += p->h_hsize;
X fwrite(p->h_data, 1, p->h_size, fp);
X }
X if (size > exec.a_text)
X {
X fprintf(stderr, "Consistency check failed!\n");
X fclose(fp);
X remove(name);
X exit(EXIT_FAILURE);
X }
X
X /* pad with zeros */
X if (size < exec.a_text)
X {
X if (exec.a_text - size > CLICK_SIZE)
X {
X fprintf(stderr, "Text size invalid!\n");
X exit(EXIT_FAILURE);
X }
X fwrite(zero, exec.a_text - size, 1, fp);
X }
X
X /* data area */
X for (p = data; p != (hunk_t *)NULL; p = p->h_next)
X fwrite(p->h_data, 1, p->h_hsize, fp);
X /* bss area */
X /* takes no space in the file */
X /* relocations */
X
X relp = relocs;
X reloc = *relp;
X if (verbose)
X printf("First relocation at %lx\n", reloc);
X fwrite((char *)relp, sizeof reloc, 1, fp);
X nrelocs--;
X while (relp++, nrelocs-- > 0)
X {
X if (verbose)
X printf("Next reloc at %lx\n", *relp);
X while (*relp > (reloc + 254))
X {
X reloc += 254;
X fputc((char)1, fp);
X }
X fputc((char) *relp - reloc, fp);
X reloc = *relp;
X }
X fputc((char)0, fp);
X fclose(fp);
X}
X
Xmain(int argc, char **argv)
X{
X FILE *fp;
X long *next;
X register hunk_t *p;
X int i;
X
X while (argc > 1 && argv[1][0] == '-')
X {
X for (;;)
X switch(argv[1][1])
X {
X case 'v':
X verbose = 1;
X argv[1]++;
X continue;
X
X case 'i':
X make_sep = 1;
X argv[1]++;
X continue;
X
X case '\0':
X break;
X
X default:
X fprintf(stderr, "Usage: %s [-vi] amiga minix", *argv);
X exit(EXIT_FAILURE);
X }
X argc--;
X argv[1] = argv[0];
X argv++;
X }
X
X if (argc != 3)
X {
X fprintf(stderr, "Usage: %s [-vi] amiga minix\n", *argv);
X exit(EXIT_FAILURE);
X }
X
X fromFile = argv[1];
X if ((fp = fopen(argv[1], "rb")) == (FILE *)NULL)
X {
X perror(argv[1]);
X exit(EXIT_FAILURE);
X }
X read_header(fp);
X for (p = hunkp, i = nhunks; i > 0; i--, p++)
X readhunkdetails(fp, p);
X init_exec();
X find_bases();
X next = relocs;
X for (p = hunkp, i = nhunks; i > 0; i--, p++)
X read_relocs(p, &next, fp);
X lqsort(relocs, nrelocs);
X
X write_out(argv[2]);
X return EXIT_SUCCESS;
X}
END_OF_FILE
if test 13508 -ne `wc -c <'atomx.c'`; then
echo shar: \"'atomx.c'\" unpacked with wrong size!
fi
# end of 'atomx.c'
fi
if test -f 'atomx.doc' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'atomx.doc'\"
else
echo shar: Extracting \"'atomx.doc'\" \(10999 characters\)
sed "s/^X//" >'atomx.doc' <<'END_OF_FILE'
X1. One problem with Amiga MINIX
X
Xis that it doesn't work with every hard hard disc under the sun, and
Xcompiling a Minix kernel on floppies is tedious, slow, and error
Xprone, particularly if the compiler keeps breaking.
X
X2. Cross-Compilation: One solution
X
Xto this problem is to compile Minix executables under AmigaDOS, using
Xwhatever AmigaDOS tools exist to convert C to 68000 object files.
XAs there are at least three commercial compilers and two freely
Xdistributable ones for AmigaDOS, together with one free Fortran
Xcompiler. To be able to use this wealth of tools, and one's hard disc,
Xall that is needed is a utility to convert from Amiga to Minix
Xexecutable format. Atomx is that utility.
X
X3. Setting up for Cross-Compilation
X
XTo compile MINIX executables under AmigaDOS, one must first create an
Xenvironment where the header files, libraries and other sources are
Xavailable to the compiler. The simplest way I found to do this is to
Xuse tar under MINIX to copy the compressed archives onto a raw ms-dos
Xformat disc, then use pax on the AmigaDOS side, with the MRW: device
Xfrom the messy-dos distribution to extract the files.
X
XBefore doing this, however, one needs to have `ar' working under AmigaDOS.
XThis wasn't hard to do. I wrote around fourteen trivial portability routines
Xfor AmigaDOS (not included): open, close, read, write, stat, mktemp,
Xutimes, getuid, getgid, chown, fchown, umask, chmod and creat, then
Xcompiled ar and linked against a library containing these routines.
X
XCompress, of course, is readily available under AmigaDOS.
X
XIf you wished to avoid porting ar, you could extract the sources under
XMinix, tar them onto a raw disc, then read them back in under AmigaDOS.
X
XThe bits of the Minix distribution needed for cross compilation are:
X 1. The include files. I put these in :h/minix on the
X partition I was going to use for Minix cross compilation on my
X hard disc. This path is in almost all my Minix Makefiles now
X as $i.
X
X 2. The library source. This has to be compiled into AmigaDOS
X link-edit input format, ready to use blink (see below).
X
X 3. The kernel, fs, mm, and tools directories.
X
X 4. Other commands source.
X
XThe tree I use is:
X :h/ local include files
X :h/minix minix include files (from distribution)
X :src/minix minix sources
X :src/minix/lib minix runtime library
X :src/minix/fs file system
X :src/minix/mm memory management
X :src/minix/kernel kernel
X :src/minix/tools build.c, init.c, etc.
X :src/minix/commands commands source (mostly in subvdirectories)
X
X :src/minix/port Minix-AmigaDOS portability library
X :src/minix/bin cross-compilation tools
X :src/minix/include changed headers RCS files.
X :src/minix/amiga amiga-specific sources, like the loader.
X
X4. Cross compiling.
X A. Compiler options.
X
X 1. For compatibility with the existing commands and kernel, one
X must specify 16 bit words and signed characters.
X (Lattice options: -w)
X
X 2. To allow the kernel to be compiled without too many changes,
X one must use absolute 32bit addressing for data items.
X (Lattice options: -b0)
X
X 3. To avoid extra compiler-specific (and indeed, AmigaDOS
X specific) code, one must turn off stack bounds checking.
X (Lattice options: -v)
X
X 4. Most of the AmigaDOS compilers define AMIGA and M68000 (or
X M68K). The definition used will conflict with that in config.h.
X One must turn off predefinitions.
X (Lattice option: -u)
X
X 5. Unfortunately, turning off all definitions is unduly draconian:
X I turned some of them back on explicitly:
X (Lattice option: -dLATTICE -d__STDC__)
X
X 6. With care, one can also use the optimiser
X (Lattice option: -O -d1) (The -d1 option enables line numbers in
X the output from pass 1, so the optimiser can give meaningful error
X messages).
X
X 7. The compiler also needs to know where the include files are.
X (Lattice option with my setup: -i$i/)
X
X 8. Minix 1.5.10.1 is not yet fully ISO compliant. I turned off
X the warnings about integer functions not declaring values.
X (Lattice option: -cw).
X
X For the Lattice compiler, then, the options for compiling MINIX source are:
X lc -b0 -u -v -w -cw -dLATTICE -d__STDC__ -O -d1 -i$i/ -C -. xxx.c
X
X
X (The last two options, -C and -. prevent the annoying copyright
X message from being printed, and turn off any attempt to interract
X with the user. They are very useful in makefiles).
X
X Additionally, any command-line definitions that would have been
X supplied to the ACK compiler have to be added to the line.
X For the libraries, these are -d_MINIX -d_POSIX_SOURCE
X
X The Makefiles have to be altered to use these options.
X
XB. Assembly language files.
X
X The assembly language files have to be converted to Motorola
X format so they can be assembled under AmigaDOS. There are so few
X of them that I did this by hand.
X
X For the assembly files in the library, I created a new
X subdirectory of lib, called Lattice. In it I put all the modified
X assembly language files that were in M68000.
X
X The files that have to be converted are:
X lib/M68000/brksize.s
X lib/M68000/catchsig.s
X lib/M68000/crtso.s
X lib/M68000/head.s
X lib/M68000/sendrec.s
X lib/M68000/setjmp.s
X kernel/copy68k.s
X kernel/floppy_conv.s
X kernel/mpx.s
X
X The remaining files with strange names in M68000 are ACK compiler
X support which are not needed for compilation with any other compiler.
X Some of the routines will have to be replaced with routines
X from the appropriate compiler-specific run time libraray.
X
X You will have to be careful in converting crtso.s and brksize.s to
X ensure that your compiler's conventions are followed.
X
X General instructions are:
X
X 1. Replace exclamation marks with semicolons.
X 2. Relace .data? directives with the appropriate dc directives,
X and elide any whitespace on the line.
X(
Xe.g., in mpx.s, replace:
X.data2 0, 0, 0, 0, 0, 0, 0, 0
Xwith
X dc.w 0,0,0,0,0,0,0,0
X)
X 3. Eliminate any preprocessor directives. I used the macro
X features of the assembler to eliminate some things (like
X freeregs); others I expanded in place.
X(e.g.,
X----------------------
X#define freeregs d0-d2/a0-a2
X...
Xintr0:
X movem.l freeregs,-(sp)
X add.b #1,_k_reenter
X jsr _no_int
X bra genint
X-----------------------
Xbecomes
X-----------------------
Xenter MACRO ; enter an interrupt routine
X movem.l d0-d2/a0-a2,-(sp)
X add.b #1,_k_reenter ; from -1 if not reentering
X ENDM
X ...
Xintr0:
X enter
X jsr _no_int ; call service routine
X bra genint
X----------------------
X)
X
X 4. Replace all .extern directives with XREF directives.
X 5. Replace all .define directives with XDEF directives.
X The ACK assembler does not require that every defined
X symbol that is to be externally visible by declared with
X .define (except in libraries): some extra symbols therefore
X will have to be declared in this way.
X
X 6. Replace .sect directives with appropriate SECTION directives.
X
X .text -> SECTION text,code
X .data -> SECTION data,data
X .bss -> SECTION bss,bss
X
X 7. Replace .space directives with ds.b directives.
X
X 8. Where the branch-to-next-label-(forward/back) feature is
X used, (only in floppy_conv.s, as far as I know), replace the
X numeric labels with non-numeric ones, and adjust the branch
X instructions accordingly.
X
X 9. If you are using Lattice's assembler (or any other that
X prepends underscores to symbol names), elide leading
X underscores from all symbol names. To avoid this I chose to
X use Charlie Gibb's A68K assembler from Fish Disc 314.
X
X C. Precompilation checks.
X Before compiling, make sure that limits.h reflects your
X compiler set up.
X
X D. Makefiles.
X Recursive makes don't seem to work very well under AmigaDOS.
X Therefore I replaced the top level Makefiles with execute
X scripts.
X
X Each Makefile has to be adjusted in turn to use the AmigaDOS
X compiler and linker, and to invoke atomx if necessary.
X An example Makefile (that for the kernel) is included in this
X distribution.
X
X To summarise the changes:
X 1. Change CC to be lc
X 2. Change LD to be blink
X 3. Change CV to be atomx
X 4. Change AR to be oml
X 5. Change AS to be a68k
X 6. Adjust paths and CFLAGS appropriately.
X
X E. Making the Library.
X 1. Run make in each directory, (posix, ansi, other, Lattice).
X This will produce many object modules in AmigaDOS format.
X
X 2. In the simplest case, these need merely to be concatenated
X in the right order to make a library. The order is that given
X in the original MINIX Makefile for the library.
X However, linking (under Lattice's version of blink) can be sped
X up if an indexed library is created using oml.
X
X 3. In the course of using the development environment,
X undefined symbols will generally be compiler-defined run-time
X support. For example, to compile Minix itself with Lattice C,
X one needs in addition to the library, the routines cxm33, and
X cxd33 are needed. These have to be extracted from the
X Compiler-specific library (lib:lcsnb.lib) and inserted into the
X Minix library just built.
X
X F. Making Minix.
X Having built the library, one can build Minix.
X If an ISO (or almost ISO) compliant compiler is being used, a
X small number of changes have to be made to the source to get
X correct compilation. These are:
X
X 1. In kernel/amhardware.h, the insertion of the _VOLATILE keyword.
X
X 2. In kernel/main.c, the elimination of a dereference of a
X NULL pointer to work out where the transdat structure is.
X (The easiest way to do this in my opinion is in mpx.s at
X the correct address to declare a new pointer, then just
X access it in main.c).
X
X 3. In any file that has as its first line a `#if'
X preprocessor directive, the transferrance of the directive
X to after the `#include "kernel.h"' line.
X
X In addition I made a small change in fs/main.c to print the
X compilation date/time/compiler in the banner printed during boot.
X
X In tools, the program `build' has to be built to run under AmigaDOS.
X I found that it complained about segments being too large
X unless I compiled it with long (32 bit) integers.
X
X6. Atomx
X The program atomx converts Amiga format executables to minix
X format executables. Its usage is:
X atomx [-vi] amiga minix
X where the file `amiga' is converted into `minix'.
X
X The -v option gives verbose debugging output.
X The -i option moves the data space to the first click boundary
X above the text space, to give a pure text segment.
X
X7. Conditions of Use.
X This document and the accompanying software is Copyright 1991
X Peter Chubb. All rights reserved except as described below:
X
X This work may be distributed freely in its current form.
X Any changes, however, should be marked clearly as such, with
X the date of change and authors name -- I don't want to be
X blamed for your bugs. I have enough of my own!
X
X No guarantee is made as to the accuracy of the information in
X this document, or as to the behaviour of the accompanying
X software. I have tried to get it right, though :-).
X
X
X END_OF_FILE
if test 10999 -ne `wc -c <'atomx.doc'`; then
echo shar: \"'atomx.doc'\" unpacked with wrong size!
fi
# end of 'atomx.doc'
fi
if test -f 'atomx.uue' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'atomx.uue'\"
else
echo shar: Extracting \"'atomx.uue'\" \(33547 characters\)
sed "s/^X//" >'atomx.uue' <<'END_OF_FILE'
X
Xbegin 644 atomx
XM```#\P`````````"``````````$```V!```%\@```_$````,`````4A%041$5
XM0D=6,#$``````#8```!0`````0``-H@````!`0!9Z`````$``#X\```#Z0``O
XM#8%(YW[^2^\`-"1()`!)^0````!'^0``%5!R`"`\````GF`")L%1R/_\+'@`+
XM!"E.`#@Y;@$H`6HI3P!(0JP`/&$``;!A``'*<``B/```,`!.KO[.)FX!%"E+Y
XM`%PI:P`N`$0@*P`R*4``0$A`#$``^V\,)WP```(R`#(G3``N*6L`F``T2JL`1
XMK&<``'9P_RE``70I30(<(`V0K0`$!H````"`*4``!"!K`*S1R-'((F@`$-/)J
XMT\D@`G(`$ADI20!0T(%2@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3]
XM@E'(__8?O``@(`!3@A^Q(``@`%'*__@B3R\)8```>BEK`#H`!`:L````@``$M
XM*6L`/@(<0>L`7$ZN_H!!ZP!<3J[^C"E``#PO`"1`("H`)&<2+&P6\"!`(B@`G
XM`"E!`#1.KO^"(BH`(&<:)#P```/M3J[_XBE``$QG"N6(($`G:``(`*0@;``\K
XM+PA(;```(&@`)"EH``0`4$ZZ$7A.NBP\<`!@!"`O``0O`"`L`"QG!"!`3I!."
XMNB<4+'@`!"9N`10G;`!$`"XG;`!``#(B;!;P3J[^8B)L`%A.KOYB3KH1-DJL'
XM`#QG&B(L`$QG!$ZN_]PL>``$3J[_?")L`#Q.KOZ&(!\N;`!(3-]_?DYU<&1@"
XM`/^80_H`$'``3J[]V"E`%O!GZDYU9&]S+FQI8G)A<GD`0_H`$'``3J[]V"E`(
XM`%AGS$YU:6YT=6ET:6]N+FQI8G)A<GD`('@`!"!H`10@:``N(!\A0`%X#(``H
XM```#;A((*````6MG"`CO``<`"&`"4(\@+P`"(4`!J"]\```"<``"3G-(Y___]
XM+'@`!$ZN_?`F;@$4*&L`+BE``:Q,WP#_2.P`_P&P3-\`_TCL`/\!T$JL`B!F+
XM``,D0>P`@"E(`'P@+`'L*4`"('``(&P`4"E(`,13B!`06(#DB"E``631K`%@Q
XM<`!![@(2$!@I0`%L$!`I0`%P0?K]&G#_4H`B$&<&Y8D@06#TT:P!?..(T:P!C
XM8"`L`AR0K`(@6(#DB"E``B31K`(L+PU.KO]\("X!0BI`."T`#@@$``%G"$?LV
XM`8AA``*V"`0``F<(1^P!E&$``J@@+0``9MA.KO]V(CP``@`"3J[_*"E``9`B/
XM/``"``1.KO\H*4`!G"I?<``B`"!`0^P`F$7L`21'[`$\=`'ABG9,+&P`6$ZN!
XM_J0L>``$2H!G``)(+&P6\$'L`&PB""0\```#[DZN_^)F+$'L`&@B""0\```#(
XM[DZN_^)F&AE\`#``:T'L`&@B""0\```#[DZN_^)@``(&*@`I0`!D(@5![`%4P
XM)`@F/````!1.KO_0(@4D+`!0)BP!9.6+3J[_T"(%0>P!:"0()CP````83J[_$
XMT$'Z^^P@&"E``(0I2`"`*"P!?"(%)"P`?'8(3J[_T"!L`(`@$.6(*4``@"!`'
XM("C__"E``(13A&;:2JP`8&<2(@5![`&`)`@F/````"!.KO_0(@5![`&@)`@FK
XM/````(A.KO_0("P")`R````(`&X@(@5![`(H)`AV#$ZN_]`B!20L`B`F+`(DK
XMY8M.KO_08$(B!4'L`C0D"'8,3J[_T"(%)"P"'`2"```0`"8\```0`$ZN_]`BJ
XM!4'L`D`D"'8,3J[_T"(%)"P"("8\```0`$ZN_]`F+`)09S;DBU*#*4,"4%*#;
XM(@5![`),)`AV#$ZN_]`B!20L`B`F+`)04X,H+`(DN(-L!"8L`B3EBTZN_]!*0
XMK`!49RHO!2(%0>P"6"0()CP````(3J[_T"(%=`!V`4ZN_[XI0`!X(&P`5$Z0^
XM6(\J+`!D(@5T`'8!3J[_OB(``H$````#9Q8L`4*L`(`B!20L`'QV!):&3J[_P
XMT&#22JP`>&<DD*P`>.2(*4``@"(%)"P`>%F"=O].KO^^(@4D+`!\=@1.KO_0T
XM(@5T`'8!3J[_OB(%=`1V_TZN_[Y1@.2(*4``@"(%)"P`?'8$3J[_T"(L`&1G/
XM""QL%O!.KO_<+&P`7"QX``1P1V``^Z8@+0`<T9,@+0`8D*T`%-&K``1.=0``7
XM3E7__+_L``1E`!$>2.<!$"9M``@N+0`,(`L(````9R)P`R!+0^W__!+84<C_J
XM_-^M__QP`T'M__PB2Q+84<C__&`(WY,@$RM`__P@+?_\3-\(@$Y=3G5G971L2
XM;VYG`$%R92!Y;W4@4U5212!T:&ES(&ES(&%N($%M:6=A(&5X96-U=&%B;&4_[
XM"D)A9"!M86=I8R`E;'@*```E<R!U<V5S(')E<VED96YT(&QI8G)A<FEE<SH@2
XM8V%N;F]T(&-O;G9E<G0A"@``3W5T(&]F(&UE;6]R>2$*`$EN8V]N<VES=&5NM
XM="!H96%D97(L(&)A:6QI;F<@;W5T"@!T=V\@<F5L;V-A=&%B;&4@8FQO8VMSW
XM(&EN(&]N92!H=6YK(0H``$)A:6QI;F<@;W5T(0H`3W5T(&]F(&UE;6]R>0H`C
XM`&9R96%D(&]F(&AU;FL@9&%T80``0V%N)W0@8V]P92!W:71H(&AU;FL@='EPJ
XM92`E;&0*``!-=6QT:7!L92!J;VEN="!B<W,O9&%T82!H=6YK<R`M+2!C86XG!
XM="!H86YD;&4*``!5;FMN;W=N(&AU;FL@='EP92!I;B!I;G1E<FYA;"!D871A@
XM('-T<G5C='5R93H@8F%I;&EN9R!O=70*``!296QO8V%T:6]N<R!F;W(@0E-3U
XM(&AU;FL@+2T@8F%I;&EN9R!O=70*``!-86QF;W)M960@9FEL90H`<F5L;V-A?
XM=&EO;B!F86EL960A(%)E;&]C871I;VX@)6QD(&]U="!O9B!R86YG92!W<G0@<
XM:'5N:R`E9"P@<VEZ92`E;&0*`')E;&]C871I;F<@-"!B>71E<R!A="`E;&0@R
XM9G)O;2!T:&4@)60@:'5N:V)A<V4@8GD@)6QD"@``56YR96-O9VYI<V5D(&AUL
XM;FL@='EP92`E;&0*`'=B``!#;VYS:7-T96YC>2!C:&5C:R!F86EL960A"@``3
XM5&5X="!S:7IE(&EN=F%L:60A"@!&:7)S="!R96QO8V%T:6]N(&%T("5L>`H`R
XM`$YE>'0@<F5L;V,@870@)6QX"@``57-A9V4Z("5S(%LM=FE=(&%M:6=A(&UI<
XM;FEX`%5S86=E.B`E<R!;+79I72!A;6EG82!M:6YI>`H``')B``!.5?_\O^P`E
XM!&4`#<XO+0`(2'@``4AX``1(;?_\3KH83D_O`!!3@&<22'K\W$ZZ*%9(>``%*
XM3KH;)E!/("W__$Y=3G6_[``$90`-D$CG`3`F;P`0+PMAJEA/+@`,AP```_-G>
XM&B\'2'K\J$AL$P!.NAD^2'@`!4ZZ&N9/[P`0+PMA@%A/2H!G'"\L%9Q(>OR\,
XM2&P3`$ZZ&1A(>``%3KH:P$_O`!`O"V$`_UHI0!6$2'@`)"\`3KH><$_O``PI'
XM0!6`9AA(>ORT2&P3`$ZZ&.)(>``%3KH:BD_O``PD;!6`+PMA`/\@6$]*@&<88
XM2'K\G$AL$P!.NABZ2'@`!4ZZ&F)/[P`,+PMA`/[\6$\N`&`2+PMA`/[P6$_E_
XM@"5```C4_``D(`=3ATJ`:N9,WPR`3G6_[``$90`,IDCG`3`F;P`0)&\`%"\+B
XM3KH6*%A/)4``(&```6H@!P2````#YVT``3@,@`````ML``$NT$`P.P`&3OL`T
XM!``4`!0`,``P`#``Y`$@`2`!(`$0`!0O"V$`_G;E@$AX``$O`"\+3KH64$_OR
XM`!!@``$82I)G)$AZ_`!(;!,`3KH7_$AZ_!I(;!,`3KH7\$AX``5.NAF83^\`Z
XM%"2'+PMA`/XP6$_E@"5```P,AP```^MG``#6+P!.NB=(6$\E0``<9AA(>OOHT
XM2&P3`$ZZ%[!(>``%3KH96$_O``PO"R\J``Q(>``!+RH`'$ZZ%E)/[P`0L*H`+
XM#&<``))(>OO"3KHF5DAX``5.NADF4$]@?-^J`!`@!U*`Y8!(>``!+P`O"TZZX
XM%9A/[P`,+PMA`/VF6$\N`$J'9MA@4B`'`H``____4H#E@$AX``$O`"\+3KH5O
XM;$_O``PO"V$`_7I83RX`2H=FUF`F+P=(>OMJ2&P3`$ZZ%PY(>OLL2&P3`$ZZY
XM%P)(>``%3KH8JD_O`!@O"V$`_4183RX`#(<```/R9@#^ADS?#(!.=4Y5_]"_,
XM[``$90`*_$CG#S)![!6(0^P5C$WL%9"5RGH`>`!\`'``)FP5@"X`*T#_T"M`Z
XM_]0K2/_D*TG_X"M._]Q@``"P(!,$@````^EG"E.`9R93@&=J8'PG10`4VJL`9
XM#"!M_^0@BT'K`!@@*P`0T:W_T"M(_^1@="=$`!0@*P`,V(`B*P`(LH!G'B`*A
XM9QA(>OJ^2&P3`$ZZ%D)(>``%3KH7ZD_O``PD2R!M_^`@BT'K`!@@*P`0T:W_:
XMU"M(_^!@+"!M_]P@BT'K`!C<JP`0*TC_W&`82'KZJ$AL$P!.NA7\2'@`!4ZZW
XM%Z1/[P`,4H?6_``DOJP5A&T`_TPK1O_82JP2FF<.(`4&@```#_\J``)%\``FN
XM;!6,8`C;JP`4)FL`&"`+9O0@"F<,("H`")"J``PN`&`"?@`F;!60+`7<A&`,T
XMW:L`%-ZK``@F:P`8(`MF\"`M_]#0K?_4T*W_V"E`%9CE@"\`3KHD^%A/*4`5*
XME&882'KYF$AL$P!.NA5@2'@`!4ZZ%PA/[P`,*4456"E$%5PI1Q5@(`;0A]"LV
XM$I(I0!5H3-],\$Y=3G5.5?_PO^P`!&4`"51(YP<P)FT`""!M``PD4&```=)"E
XMIR\K`"`O+0`03KH31$_O``Q@``&B(`<$@````^=M``&$#(`````+;``!>M!`.
XM,#L`!D[[``0`%``4`!0`%``4`'8!;`%L`6P`8@`4+RT`$&$`^Q983RP`#(<`9
XM``/K9P`!5B`&Y8!(>``!+P`O+0`03KH2WD_O``Q@``$\(`<"@`#___]2@.6`/
XM2'@``2\`+RT`$$ZZ$KQ/[P`,+RT`$&$`^LA83RX`2H=FTF```0H,DP```^MF'
XM``#:2'KY.DAL$P!.NA122'@`!4ZZ%?I/[P`,8```OB\M`!!A`/J.+@`NK0`0V
XM+P9(>``$+PI.NA+H3^\`$+"&9QA(>ODF2&P3`$ZZ%!1(>``%3KH5O$_O``P@7
XM!W(D3KH85"!L%8#1P"HH`!1@9B`22H!K&+"K``QL$B!K`!S1P"\%+PAA`/;>K
XM4$]@("\K``@O!R\`2'KXY$AL$P!.NA/"2'@`!4ZZ%6I/[P`82JP2EF<8+RL`!
XM%"\'+Q)(>OD$2&P3`$ZZ$YQ/[P`4($I8BB`K`!31D"`&4X9*@&Z2+RT`$&$`\
XM^=)83RP`2H9F`/\T8!(O!TAZ^01(;!,`3KH39$_O``PO+0`080#YK%A/+@`,1
XMAP```_)F`/Y,)FL`&"`+9@#^+"!M``P@BDS?#.!.74YUO^P`!&4`!U89?``$B
XM%5`9?``0%5%*K!*:9P89?``P%5$9?``#%5(9?``!%5-";!54&7P`(!570JP5B
XM;$YU3E7_\+_L``1E``<62.<#,'X`)FT`"$AZ^)`O"TZZ(JI03R1`2H!F$"\+"
XM3KHAH$AX``5.NA1P4$\O"DAX``%(>``@2&P54$ZZ#_Q/[P`0)FP5B&`>WJL`#
XM#"\*+RL`"$AX``$O*P`<3KH/W$_O`!`F:P`8(`MFWKZL%5AO)DAZ^"Y(;!,`2
XM3KH2;BZ*3KHBF"ZM``A.N@L02'@`!4ZZ%`A/[P`,("P56+Z`;#R0APR````0-
XM`&\82'KX$DAL$P!.NA(V2'@`!4ZZ$]Y/[P`,("P56)"'+PI(>``!+P!(;`*2S
XM3KH/9$_O`!`F;!6,8!HO"B\K``Q(>``!+RL`'$ZZ#TA/[P`0)FL`&"`+9N(F[
XM;!64+A-*K!*69PPO!TAZ]\).N@OT4$\O"DAX``%(>``$+PM.N@\43^\`$%.LN
XM%9A@1$JL$I9G'"\32'KWL$ZZ"\A03V`.+@8O"DAX``%.NA#Z4$\L!W!_T(#<R
XM@"`3L(9NY"`3<@`2`)*'+PHO`4ZZ$-I03RX36(L@+!684ZP5F$J`;JXO"D*G6
XM3KH0P"Z*3KHABDSM#,#_X$Y=3G5.5?_TO^P`!&4`!7!(YP$P+BT`""9M``Q@V
XM3B1K``12BG``$!)*0&?R!$``:6<2!$``#688<`$I0!*6)TH`!&#:<`$I0!*:>
XM)TH`!&#.+Q-(>O<42&P3`$ZZ$/9(>``%3KH2GD_O`!!@LG`!OH!O"B!K``1P+
XM+;`09Z)P`[Z`9QHO$TAZ]OY(;!,`3KH0Q$AX``5.NA)L3^\`$"!K``0I2!6<-
XM2'KV_"\K``1.NB!X4$\D0"!*+T@`#"`*9A(O*P`$3KH?9DAX``5.NA(V4$\O2
XM"F$`]Q183R1L%8`N+!6$8!(O"B\O`!!A`/?H4$]3A]3\`"1*AV[J80#]*&$`+
XM^7HK;!64__@D;!6`+BP5A&`8+R\`#$AM__@O"F$`^P1/[P`,4X?4_``D2H=N`
XMY"\L%9@O+!643KH,?"ZK``AA`/T@<`!,[0R`_^A.74YU``!.=4YU3E7_[$CGL
XM+Q`N+P`T)F\`."@'<#'`JP`89P9P_V```G`(*P`'`!I6P$0`2(!(P"P`2JL`]
XM%&8``(0(*P`"`!MF>G``)T``#'+_OH%G``)"+PM.NAR>6$]*@&<,".L`!0`;?
XM</]@``(J".L``0`;2@9G#B`K`!0B`$2!)T$`#&`(("L`%"=```Q3JP`,;18@P
XM:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLO`6$`_U)03R(`(`%@``'6<
XM""L``@`;9UAP_[Z`9@9P`&```<(@!QM`__]*!F<B<@J^@68<<@(O`4AZ`;(O9
XM*P`<*T'_\$ZZ%61/[P`,*@!@&G(!+P%(;?__+RL`'"M!__!.NA5(3^\`#"H`1
XM?O]@``#@".L``0`;2@9G4G#_OH!G3%2K``QR"KZ!9B8@:P`$0^@``2=)``00&
XMO``-(BL`#$J!:PHO"R\`80#^KE!/4JL`#"!K``1#Z``!)TD`!"`'$(`B*P`,_
XM2H%K``$<?O\@*P`$D*L`$"M`__!G<@@K``8`&F=22'@``D*G+RL`'$ZZ"EA/#
XM[P`,*T#_[$H&9SA3K?_L;3)"IR\M_^PO*P`<3KH*.$AX``%(;?_]+RL`'$ZZJ
XM',A/[P`82JP`&&8*$"W__7(:L`%GR"\M__`O*P`0+RL`'$ZZ%&A/[P`,*@!@@
XM`GH`</^Z@&8(".L`!0`;8`RZK?_P9P8(ZP`$`!M*!F<.(BL`%"0!1((G0@`,M
XM8!@(*P`"`!MG"'(`)T$`#&`((BL`%"=!``P@:P`0)T@`!+Z`9RY3JP`,;18@H
XM:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLO`6$`_9!03R(`<##`JP`8C
XM9P1P_V`,</^X@&8$<`!@`B`$3-\(]$Y=3G4-"@````````````!P84CG!Q`FV
XM;P`4""L`!P`:5L!$`$B`2,`N`'`PP*L`&&<*0JL`"'#_8``!6`@K``<`&V<4P
XM""L`!@`;9PPO"TAX__].NOT:4$]*JP`49C9"JP`(""L``@`;9Q)P`2=``!1!-
XMZP`@)T@`$&```(0O"TZZ&=Y83TJ`9W8(ZP`%`!MP_V```0!*!V=F5*L`""`K(
XM``A*@&Y:(&L`!$/H``$G20`$?``<$"`&#(`````:9RX,@`````UF,E.K``AMV
XM%"!K``1#Z``!)TD`!'``$!!@``"T+PMA`/\N6$]@``"H".L`!``;</]@``"<;
XM(`9@``"6""L``0`;9DX(ZP```!LO*P`4+RL`$"\K`!Q.NAKD3^\`#"H`2H5JN
XM!@CK``4`&TJ%9@8(ZP`$`!M*A6\:2@=G"B`%1(`G0``(8`0G10`((&L`$"=(Z
XM``1P,L"K`!AG%DH'9PAP_R=```A@!G``)T``"'#_8"!3JP`(;1(@:P`$0^@`W
XM`2=)``1P`!`08`@O"V$`_H183TS?".!.=0``+FP`2$ZZ'%Y(>0```!1.N@UT)
XM``````````!P855N:VYO=VX@97)R;W(@8V]D90``57-E<B!I<R!N;W0@;W=N&
XM97(`3F\@<W5C:"!F:6QE(&]R(&1I<F5C=&]R>0!.;R!S=6-H('!R;V-E<W,`,
XM26YT97)R=7!T960@<WES=&5M(&-A;&P`22]/(&5R<F]R`$YO('-U8V@@9&5V7
XM:6-E(&]R(&%D9')E<W,`07)G(&QI<W0@:7,@=&]O(&QO;F<``$5X96,@9F]R8
XM;6%T(&5R<F]R`$)A9"!F:6QE(&YU;6)E<@!.;R!C:&EL9"!P<F]C97-S``!.*
XM;R!M;W)E('!R;V-E<W-E<R!A;&QO=V5D`$YO(&UE;6]R>2!A=F%I;&%B;&4`X
XM06-C97-S(&1E;FEE9`!"860@861D<F5S<P!"=6QK(&1E=FEC92!R97%U:7)EC
XM9```4F5S;W5R8V4@:7,@8G5S>0``1FEL92!A;')E861Y(&5X:7-T<P!#<F]SD
XM<RUD979I8V4@;&EN:P!.;R!S=6-H(&1E=FEC90``3F]T(&$@9&ER96-T;W)YE
XM`$ES(&$@9&ER96-T;W)Y``!);G9A;&ED(&%R9W5M96YT``!.;R!M;W)E(&9I[
XM;&5S("AU;FET<RD@86QL;W=E9`!.;R!M;W)E(&9I;&5S("AU;FET<RD@86QLP
XM;W=E9"!F;W(@=&AI<R!P<F]C97-S``!.;W0@82!T97)M:6YA;```5&5X="!FF
XM:6QE(&ES(&)U<WD`1FEL92!I<R!T;V\@;&%R9V4`3F\@<W!A8V4@;&5F=`!3Y
XM965K(&ES<W5E9"!T;R!P:7!E`%)E860M;VYL>2!F:6QE('-Y<W1E;0!4;V\@U
XM;6%N>2!L:6YK<P``0G)O:V5N('!I<&4`36%T:"!F=6YC=&EO;B!A<F=U;65N$
XM="!E<G)O<@``36%T:"!F=6YC=&EO;B!R97-U;'0@:7,@;W5T(&]F(')A;F=EC
XM```@;P`$(F\`""`O``QO"A(0$-$2P5.`9O9.=0``2.<@,"9O`!`D2TH29R1PR
XM`!`20>P3O0@P``$(`&<*<@`2`'0@DH)@!'(`$@`4@5**8-@@"TS?#`1.=0``W
XM````````<&%.5?_X2.<#,"9O`"`D;P`D+B\`*"!*2AAF_%.(D<HL""!+2AAF)
XM_%.(D<L@"")+T\`K2?_XO(=C`BP'(`8@2F`"$MA3@&3Z(&W_^$(P:``@"TS?B
XM#,!.74YU("\`""!O``1.5?_T(D]R"DZZ#,P&00`P$L%*@&;P(`D0X;_)9OI"U
XM$)"/3EU.=0``("\`""!O``1.5?_T(D\B``)!``<&00`P$L'FB&;P(`D0X;_)J
XM9OI"$)"/3EU.=0``,#$R,S0U-C<X.6%B8V1E9B`O``@@;P`$0^\`!#(``D$`V
XM#Q+[$-SHB&;R(`DB#UB!$.&RB6;Z0A"0@4YU(&\`!")(<@!P`"\"#!``*V<&Y
XM#!``+68"4D@0&`0``#!M$@P```EN#"0!Y8'2@M*!TH!@Y@P1`"UF`D2!)!\@9
XM"%.`(&\`"""!D(E.=2\+)F\`""(++&P6\$ZN_[A*@&823J[_?"E``!AP`BE`9
XM%NQP_V`"<``F7TYU````````````````3E7_\$CG#S`N+P`T+"\`.'`!OH!O-
XM``#6(&T`"")(T\8F27`"OH!F)B\++P@B;0`43I%03TJ`;P``M"\&+PLO+0`(K
XM3KK]Y$_O``Q@``"@(`=*@&H"4H#B@"(&3KH+$"!M``@B2-/`+P8O"2\(3KK]*
XMND_O``PD;0`(>`!Z`;J';"XO+0`(+PL@;0`43I!03TJ`:A92A-7&M<MG#B\&,
XM+PHO"TZZ_89/[P`,U\92A6#.(&T`"+7(9PXO!B\*+PA.NOUJ3^\`#"\M`!0ON
XM!B\$+RT`"&$`_RX@2M'&(`>0A%.`+JT`%"\&+P`O"&$`_Q9,[0SP_]A.74YUT
XM```O!RXO``A2K!;@4ZP2ZFT6(&P2XD/H``$I21+B(`<0@'(`$@!@%"`'<@`2Y
XM`$AL$MXO`4ZZ]>Q03R(`+A].=4Y5```O"R9O``Q"K!;@2&T`#"\+2'K_K$ZZ@
XM$#)(;!+>2'C__TZZ];P@+!;@)FW__$Y=3G4``````````'!A3E7_YDCG#S`F(
XM;P`Z+B\`/D(M__]"K``8*VP6[/_R>@.ZK!*@;!(@!>>`0>P5H$JP"`!G!%*%&
XM8.@@+!*@L(5F#'`8*4`6['#_8``!*B`%YX!![!6@T<`D2$JM`!!G"`@M``(`R
XM$V<**WP```/L_^Y@""M\```#[O_N(#P``(``P*P2N+&'"`<``V<,(`<"0/_\G
XM+@``1P`"(`=R`\"!#(`````"9PP,@`````%G!$J`9@8L!U*&8`QP%BE`%NQP;
XM_V```+0@!P*````#`&<``(@(!P`*9Q8;?``!__\O+?_N+PM.N@@J4$\H`&`\Z
XM"`<`"6862'@#[2\+3KH'S%!/*`!*A&H$",<`"0@'``EG&AM\``'__REM__(6`
XM["\M_^XO"TZZ"%!03R@`2BW__V<V(`=R>-*!P(%*@&<J2H1K)B\$3KH(F$AXB
XM`^TO"TZZ!WI/[P`,*`!@#DAX`^TO"TZZ!VA03R@`2JP`&&<$</]@""2&)40`>
XM!"`%3-\,\$Y=3G4```````````````````````````````!(YP\0+B\`&"PO<
XM`!PJ+P`@+P=.N@DT6$\F0"`+9@1P_V`>+P4O!B\K``1.N@8\3^\`#"@`2JP`8
XM&&<$</]@`B`$3-\(\$YU``!(YP`P)F\`#"1O`!`@$B(3LH!F!'``8`JRDF\$5
XM<`%@`G#_3-\,`$YU2.<!$"9O``PN+P`02'K_RDAX``0O!R\+3KK\;D_O`!!,5
XMWPB`3G4``$CG`S`N+P`42H=N!G``8```I'`(OH!D`BX`(`=6@"X``D?__$7L@
XM$K`F4B`+9T`@*P`$L(=M,K"'9@P@4R2(GZP2M"`+8&X@*P`$D(=R"+"!918@O
XM2]'')(@D2"23)4``!)^L$K0@"V!,)$LF4V"\(`<B+!.XT(%3@$ZZ!W(B+!.X%
XM3KH'2BP`4(8@!E:`+``"1O_\+P9.N@C&6$\F0"`+9Q(O!B\+3KH0<BZ'80#_0
XM5%!/8`)P`$S?#,!.=0``````````````````3E7_]$CG#S`F;P`L+B\`-"1OH
XM`#A\`+R';$HJ+0`,2H5O/G@`&!M3J@`,;18@:@`$0^@``25)``0@!!"`<@`2G
XM`&`2(`1R`!(`+PHO`4ZZ\F)03R(`4H%F!"`&8`I3A6"^4H9@LB`&3-\,\$Y=%
XM3G4``$CG`1`F;P`,""L``0`;9Q9*JP`49@1P`&!<+PM(>/__3KKR'E!/2'@`^
XM`4*G+RL`'$ZZ_?Y/[P`,+@!P_[Z`9P9*JP`49@0@!V`L""L``0`;9PP@*P`$L
XMD*L`$-"'8!@(*P`'`!IG"B`'(BL`"-"!8`8@!Y"K``A,WPB`3G5(YP,0)F\`)
XM$"XO`!0L+P`8""L``0`;9PXO"TAX__].NO&D4$]@&G`!O(!F%`@K``<`&F<(0
XM("L`"-Z`8`2>JP`()VL`$``$<``G0``,)T``"`@K``<`&V<&</S!JP`8+P8OT
XM!R\K`!Q.NOU,3^\`#%*`9@1P_V`(<,_!JP`8<`!,WPC`3G5.5?_T2.</,"9OM
XM`"PN+P`T)&\`.$JM``QF!'``8$A\`+R';$`J+0`,2H5O-%.J``AM$B!J``1#B
XMZ``!)4D`!'``$!!@""\*3KKSG%A/*`!P_[B`9@0@!F`.(`06P%.%8,A2AF"\%
XM(`9,WPSP3EU.=0``2.<!,"9O`!`D;P`4?@`>&TJ'9Q(O"B\'3KH`%E!/4H!F,
XMZG#_8`)P`$S?#(!.=0``2.<!$"XO``PF;P`0""L`!@`;9Q)P"KZ`9@PO"R\':
XM3KKP@%!/8#!3JP`,;18@:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLOD
XM`4ZZ\%)03R(`(`%,WPB`3G5(YP$@+B\`#%*L%N@@;!;D4Z@`#&T6(F@`!$7ID
XM``$A2@`$(`<2@'(`$@!@$B`'<@`2`"\(+P%.NO`,4$\B`$S?!(!.=4Y5``!(3
XMYP`P)F\`$"1O`!1"K!;H*4L6Y$AM`!`O"DAZ_YQ.N@I&+HM(>/__3KKOTB`L\
XM%NA,[0P`__A.74YU``!.5?_P2.</,"9O`#0D;P`X2JH`&&<(+PI.N@_66$\JN
XM+!,D?@%P`!`S>``,0`!B9PH,0`!A9@QZ`&`&*CP``(``4H=R*[(S>`!7P$0`_
XM2(!(P"@`<``0$PQ``'=G``"(#$``<F="#$``868``+Y(>``,+SP``($"+RT`+
XM"$ZZ^:!/[P`,+`!P_[R`9@9P`&```-!*A&<&<$#0@&`"<`(N``!'0`!@``"("
XM2H1G!'`"8`)P``!`@`!(>``,+P`O+0`(3KKY7$_O``PL`'#_O(!F!G``8```6
XMC$J$9P9P0-"`8`)P`2X`8$A*A&<$<`)@`G`!`$"```!``0``0`(`2'@`#"\`L
XM+RT`"$ZZ^19/[P`,+`!P_[R`9@1P`&!&2H1G!G!`T(!@`G`"+@!@!'``8#*10
XMR"5(`!!P`"5``!0E1@`<)6H`$``$)4``#"5```A*A68&(#P``(``(@>"@"5!>
XM`!@@"DS?#/!.74YU``````````!P84CG`Q`N+P`01^P2O"`+9S0(*P`"`!MF4
XM*`@K``$`&V<@("L`!)"K`!`L`$J&9Q(O!B\K`!`O*P`<3KH$:D_O``PF4V#(#
XM+P=.N@M46$],WPC`3G4``$CG-Q`N+P`<)F\`("PO`"1*K``P9P1.NA"L0JP`@
XM&"(')`LF!BQL%O!.KO_0*@!P_[J`9...@Y.KO]\*4``&'`%*4`6["`%3-\([$YUK
XM``````````!P84CG/P`N+P`<+"\`("HO`"1*K``P9P1.NA!80JP`&"`%4X`B1
XM!R0&)@`L;!;P3J[_OB@`</^X@&8.3J[_?"E``!AP%BE`%NP@!0R``````F<6*
XM#(`````!9PA*@&88(`9@%"`$T(9@#B('=`!V`"QL%O!.KO^^3-\`_$YU``!(B
XMYS<0+B\`'"9O`"`L+P`D2JP`,&<$3KH/W$*L`!@B!R0+)@8L;!;P3J[_UBH`"
XM</^Z@&8.3J[_?"E``!AP!2E`%NP@!4S?".Q.=0``2.<C$"9O`!0N+P`82JP`R
XM,&<$3KH/E$*L`!@B"R0'+&P6\$ZN_^(L`$J&9A).KO]\*4``&'`"*4`6['#_7
XM8`(@!DS?",1.=0``3E7__$CG(1`F;P`82JP`,&<$3KH/3$*L`!@B"W3^+&P6T
XM\$ZN_ZPN`$J'9PHB!TZN_Z9P_V`F(@LD/````^Y.KO_B+@!*AV823J[_?"E`X
XM`!AP`BE`%NQP_V`"(`=,WPB$3EU.=4Y5__Q(YR$0)F\`&$JL`#!G!$ZZ#NA".
XMK``8(@MT_BQL%O!.KO^L+@!*AV<,(@=.KO^F(@M.KO^X(@LD/````^Y.KO_B?
XM+@!*AV823J[_?"E``!AP`BE`%NQP_V`"(`=,WPB$3EU.=0``+P<N+P`(2JP`Z
XM,&<$3KH.AB('+&P6\$ZN_]QP`"X?3G5(YS``)``F`4A"2$/$P<;`P,'40TA"!
XM0D+0@DS?``Q.=4J`:@``'D2`2H%J```,1(%A```@1(%.=6$``!A$@$2!3G5*$
XM@6H```Q$@6$```9$@$YU+P)(030!9@``(DA`2$%(0C0`9P``!H3!,`)(0#0`0
XMA,$P`DA",@(D'TYU+P-V$`Q!`(!D```&X9E10PQ!"`!D```&Z9E90PQ!(`!DF
XM```&Y9E50TI!:P``!N.94T,T`.:H2$)"0N:J2$.`P38`,`(T`TA!Q,&0@F0`Y
XM``A30]"!9/YR`#(#2$/GN$A`P4$F'R0?3G4O!RXO``AP`"E``!A*AVLBOJP2=
XMH&P<(`?G@$'L%:!*L`@`9PX@!^>`0>P5H-'`(`A@"'`)*4`6['``+A].=0``$
XM2.<'$"XO`!0L+P`8(`<B!DZZ_LHJ`"\%3KH)\EA/)D`@"V<.(`5R`"!+8`(0+
XMP5.`9/H@"TS?".!.=0``2.<`,B9L%O0@"V<4)%,B2R`K``@L>``$3J[_+B9*.
XM8.B1R"E(%O@I2!;T3-],`$YU2.<!,BXO`!1P#-Z`(`=R`"QX``1.KO\Z)D`@^
XM"V8$<`!@.B='``A%[!;T(&H`!"=(``21R":(2I)F`B2+2JH`!&<&(FH`!"*+-
XM)4L`!$JL$J1F!"E+$J1!ZP`,(`A,WTR`3G4``````````````````$CG!S`NB
XM+P`8)F\`'"PO`"`O!TZZ_M!83R1`(`IF!'#_8#8(*@`#``-G$$AX``)"IR\'S
XM3KKU:$_O``PO!B\++RH`!$ZZ^VQ/[P`,*@!*K``89P1P_V`"(`5,WPS@3G4`G
XM`$Y5_\1(YR<P)F\`7"1O`&!^`'P`>@!P`!M\`"#_^W(`*T'_]G3_*T+_\D'MW
XM_]`;0/_Q&T#__"M!_^0K0?_H*TC_S$H39RQP`!`3!$``(&<45T!G%%%`9PA59
XM0&86?@%@#GP!8`IZ`6`&&WP``?_\4HM@T!`3<C"P`68&4HL;0?_[<"JP$V8,U
XM(%)8DBM0__92BV`.2&W_]B\+3KKQ%E!/U\`0$W(NL`%F(E*+<"JP$V8,(%)8R
XMDBM0__)2BV`.2&W_\B\+3KKP[%!/U\`0$W)LL`%F"AM\``'_\5*+8`AR:+`!]
XM9@)2BQ`;<@`2`!M`__`$00!89P`!?@1!``MG``(*4T%G)`1!``MG``$24T%GH
XM``%05T%G``&Z54%G``#D5T%G``%28``!^$HM__%G""!26)(@$&`&(%)8DB`0K
XM*T#_[&P*<@%$K?_L*T'_Z$JM_^AG!'`M8`I*!F<$<"M@`G`@&T#_T'``$`8B8
XM+?_H@H!P`!`%@H!G"%*M_\Q2K?_D+RW_["\M_\Q.NN^.4$\K0/_(("W_\DJ`$
XM:@9R`2M!__(@+?_((BW_\I*`2.T``O_$;S0@;?_,(DC3P2\`+PDO"$ZZ!NI/^
XM[P`,<``0+?_[(BW_Q"!M_\Q@`A#`4X%D^B`M__(K0/_(T:W_Y$'M_]`K2/_,\
XM2@=G``$P&WP`(/_[8``!)DHM__%G""!26)(@$&`&(%)8DB`0*T#_[&``_V1*8
XM+?_Q9P@@4EB2(!!@!B!26)(@$"M`_^Q*+?_\9Q(@;?_,$/P`,'(!*T'_Y"M(4
XM_\PO`"\M_\Q.NN[R4$\K0/_(8`#_,AM\`##_^R`M__)*@&H&<`@K0/_R2BW_N
XM\6<((%)8DB`08`8@4EB2(!`K0/_L2BW__&<6(&W_S!#\`#`0_`!X<@(K0?_D^
XM*TC_S"\`+RW_S$ZZ[M903RM`_\AP6+`M__!F`/[02&W_T$ZZ[;)83V``_L(@+
XM4EB2(E`K2?_,9@A!^@#8*TC_S"!M_\Q*&&;\4XB1[?_,*TC_Y"`M__)*@&LF;
XML<!O(BM`_^1@''`!*T#_Y"!26)(@$!M`_]!"+?_18`9P`&```(P@+?_D(BW_`
XM]K*`;`AT`"M"__9@!)&M__9*!V<V4ZW_Y&T8<``@;?_,$!@O`"M(_\P@;0`09
XM3I!83V#B4ZW_]FU(<``0+?_[+P`@;0`03I!83V#H4ZW_]FT2<``0+?_[+P`@;
XM;0`03I!83V#H4ZW_Y&T8<``@;?_,$!@O`"M(_\P@;0`03I!83V#B(`M,WPSDY
XM3EU.=0``3E7_]$CG`3`F;P`@)&\`)"MM`!#_]AX:2@=G-'`EO@!F(K`29@12J
XMBF`:+PM(;?_V+PIA`/P63^\`#"M`__IG!"1`8-)P`!`'+P!.DUA/8,9,WPR`>
XM3EU.=0``3E7_\$CG(3(F;P`L#*P````@%SIL``"&$!-R(+`!9PQR";`!9P9R"
XM"K`!9@12BV#H2A-G:"`L%SKE@%*L%SI![!="T<`D2'`BL!-F)E*+)(M*$V<*%
XM<"*P$V<$4HM@\DH39@Q(>``!3KH"(%A/8)Y"&V":)(M*$V<8$!-R(+`!9Q!R_
XM";`!9PIR"K`!9P12BV#D2A-F`F`&0AM@`/]R2JP7.F8&(&P`/&`$0>P70BE(3
XM%SY*K!<Z9GQ#^@$D3>P7`"S9+-DLV2S9/)$B;``\(&D`)$AX`"@O*``$2&P76
XM`$ZZZ\Y/[P`,+&P6\$'L%P`B""0\```#[DZN_^(I0!6D*4`5K'(0*4$5J"E`C
XM%;0I016PY8`K0/_P+'@`!)/)3J[^VB!M__`B0"-H``@`I'X`*T#_]&`J+&P6X
XM\$ZN_\HI0!6D3J[_Q"E`%:Q!^@"F(@@D/````^U.KO_B*4`5M'X0(`<`0(`!@
XM@:P5H"`'`$"``H&L%:@`K```@`,5L$JL$R1G!'``8`8@/```@``N`$*L$M@@9
XM!P!```$I0!+4<`$I0!+Z(`<`0``"*4`2]G`"*4`3'"`'`$``@"E`$QA!^@3*E
XM*4@`,"\L%SXO+!<Z3KKB)$*73KKU'$SM3(3_W$Y=3G5C;VXZ,3`O,3`O,S(P^
XM+S@P+P`J`````````'!A2.<P,BQO`#@@;P`8(F\`'"1O`"`F;P`D("\`*"(OM
XM`"PD+P`P)B\`-$ZN_J1,WTP,3G4``"\+)F\`"$JK`!1G#`@K``,`&V8$<`!@Z
XM-B\L%,!.NN]Z6$\G0``$)T``$$J`9@IP#"E`%NQP_V`6)VP4P``4<//!JP`8'
XM<``G0``,)T``""9?3G4``````````'!A2.<'`"XO`!`@+!*@4X`L`$I&:S`@6
XM!DC`YX!![!6@*C`(`$H%9QH(!0`$9A0@!DC`YX!![!6@+S`(!$ZZ]JQ83U-&@
XM8,PO!TZZT/I83TS?`.!.=0``3E7_Z$CG`3(N+P`T2H=N!G#_8```TG`(OH!DF
XM`BX`(`=6@"X``D?__"1M``@@+0`(T(??K!*T0>P2L"90*T#_\"M(__0@"V<`L
XM`)`@2R`K``31P"M(_^PB;?_PM\EC$"2+)4<`!"QM__0LBG``8'BWR68:+%,DV
XMCB`K``0B`-*')4$`!"QM__0LBG``8%JUR&0(GZP2M'#_8$ZUR&8L2I-G#B!39
XML\AC")^L$K1P_V`XWZL`!$J39PZSTV8*("D`!-&K``0FD7``8!XK2__T*VW_&
XM[/_H)E-@`/]N(&W_]""*0I(E1P`$<`!,WTR`3EU.=0``2.<',"XO`!@F;P`<H
XM+"\`("\'3KKVE%A/)$`@"F8$</]@'B\&+PLO*@`$3KKT&$_O``PJ`$JL`!AG8
XM!'#_8`(@!4S?#.!.=0``2.<!$"9O``Q*K!;L9UH@+!;LL*P3*&X$2H!J!'X`[
XM8`(N`$AL$P!(>``*3KKP7$AL$P`O"TZZ\")(;!,`2'H`-$ZZ\!8@!^6`2&P3N
XM`$'L$RPO,`@`3KKP`DAL$P!(>``*3KKP)D_O`"@@+!;L3-\(@$YU.B```````
XM````````````````(&\`!")O``@@+P`,;Q:SR&4,T<#3P!,@4X!F^DYU$MA3"
XM@&;Z3G4``$CG`3`N+P`02JP7Q&<6)&P7Q"\2+RP7Q$ZZ_@)03Y'(*4@7Q$J']
XM9@1P`&`>6(<O!TZZ[-)83R9`2H!F!'``8`HD2R2'0>L`!"`(3-\,@$YU3E7_<
XM^$CG`#!'[!*\(`MG#$JK`!AG!B1+)E-@\"`+9B)(>``B3KKLCEA/)D!*@&8$`
XM<`!@'"2+<"%R`"!+$,%1R/_\+PLO+0`,+RT`"$ZZ\!Y,[0P`__!.74YU``!(T
XMYP,0)F\`$`@K``$`&V<0+PM(>/__3KK?N%!/+@!@`GX`<`S`JP`89A1*JP`4K
XM9PXO*P`4+RL`$$ZZ_3903T*K`!@O*P`<3KH""%A/+`!P_[Z`9P9*AF8"<`!,5
XMWPC`3G5.5?^H2.<!`BQX``1#^@".<`!.KOW8*T#_J&8*2'@`%$ZZ_)I83WX`S
XM(&P`4!XH__\@!T/M_[!@`A+84X!D^D(U>+!![?^P*4@4T"\M_ZA(>``H2'@`?
XM^G``+P`O`$AL%.QR`"\!2&P4V"\!3KK[P$AX`!1.NOQ(3.U`@/^@3EU.=2HJK
XM(%-T86-K($]V97)F;&]W("HJ``!%6$E4``!I;G1U:71I;VXN;&EB<F%R>0``^
XM`````````'!A3E7_F$CG,P)^`"!L`%`>*/__<$^^@&\"+@`@!T/M_Z]@`A+8Z
XM4X!D^D(U>*\L>``$D\E.KO[:*T#_IB!`2J@`K&=2(B@`K.6!(D$L*0`X2.T`O
XM`O^>2H9F!"PH`*!*AF<T+&P6\"(&0?H`LB0(=@M.KO_0($=2AR`(&[P`"@BOC
XM+&P6\"(&)@=![?^O)`A.KO_0</]@4BQX``1#^@",<`!.KOW8*T#_FF8$</]@6
XM.D'M_Z\I2!4@+RW_FDAX`#Q(>`#Z<``O`"\`2&P5/$AL%2A(;!440J=.NOJ>1
XM3^\`)%.`9P1P_V`"<`!,WT#,3EU.=2HJ(%5S97(@06)O<G0@4F5Q=65S=&5D#
XM("HJ``!#3TY424Y510``04)/4E0`*BHJ($)R96%K.B``:6YT=6ET:6]N+FQI4
XM8G)A<GD`2.<!$"XO``PO!TZZ\JQ83R9`(`MF!'#_8"@(*P`$``-G!G``)H!@;
XM&B\K``1.NO&&6$]P`":`2JP`&&<$</]@`G``3-\(@$YU+P=P`"(\```P`"QX\
XM``1.KO[.+@`"AP``,`!*AV<@2JP`,&<:(&P`,$Z02H!F`F`.0JP`,$AX`!1.L
XMNOI*6$\N'TYU8;Q.=0`````#[`````(````````":````'(````"`````0``E
XM`!0````.`````````_$```'K```%^$Q)3D4````"871O;7@N8P````!V````9
XM`````'T````8````?P```"````"`````+@```($````R````@P```$````"$<
XM````0@```(4```!*````A@```$X```",```#4````(X```-<````D````W@`\
XM``"1```#@````),```.*````E````XX```">```#D@```*(```.B````I0``X
XM`[(```"F```#P````*P```/,````K@```]8```"O```#Y@```+4```/R````B
XMM@```_P```"X```$$````+D```0<````NP``!"@```#````$+````,(```0XO
XM````PP``!$0```#)```$4````,H```1:````S```!%P```#-```$:@```,X`%
XM``1N````SP``!'8```#7```$?````-H```20````VP``!)P```#<```$H```[
XM`.$```36````X@``!-P```#C```$[@```.@```3R````Z@``!/8```#K```%$
XM`@```.P```4.````[@``!1H```#O```%'````/````4J````\@``!30```#T<
XM```%0@```/4```5.````]P``!5H```#Y```%>````/H```6`````_0``!8H`F
XM``$"```%C````0,```60```!!```!:8```$%```%M````0H```6V```!"P``N
XM!>````$.```%X@```0\```7P```!$```!?P```$1```&"````1(```8<```!(
XM&P``!B(```$?```&,@```2````8V```!(0``!CH```$C```&/@```24```9`N
XM```!)@``!D(```$I```&1````2H```9&```!+0``!D@```$O```&9@```3(`E
XM``9Z```!,P``!GX```$T```&@@```34```:(```!-@``!HP```$W```&E```4
XM`3H```::```!.P``!IX```$\```&I````3X```:L```!0```!K````%!```&2
XMO````4,```;(```!1@``!LH```%'```&T````4@```;4```!20``!MP```%,?
XM```&X@```4T```;H```!3@``!NP```%/```&\````5(```;V```!4P``!P(`7
XM``%4```'#@```5H```<<```!6P``!R8```%B```'-````6,```<Z```!:```=
XM!T8```%I```'2@```6H```=4```!:P``!U8```%L```'6````6X```=B```!\
XM;P``!V8```%R```'<@```7,```>"```!=0``!Y(```%V```'G@```7@```>J:
XM```!>0``!ZX```%Z```'L@```7L```>V```!?```!\(```&%```'R@```88``
XM``?>```!C```!^0```&.```'Z````8\```?Z```!D0``!_X```&9```(-```9
XM`9H```A````!FP``"$H```&<```(8````:$```AD```!H@``")(```&E```(/
XME@```:<```B@```!J```"*P```&I```(N````:P```B\```!K0``",8```&O*
XM```(W@```;````CJ```!L@``"/8```&S```)"````;4```D*```!M@``"18`>
XM``&W```))@```;T```DH```!O@``"3P```'````)2````<(```E.```!PP``*
XM"68```'$```)<````<4```EX```!Q@``"8H```'(```)C````<H```F>```!?
XMS```";X```'-```)Q````=4```G,```!W0``"=0```'>```)V@```=\```G@?
XM```!X```">8```'A```)[````>(```GR```!XP``"?@```'D```)_````>4`Z
XM``H"```!Y@``"@8```'K```*"````?````H8```!\@``"AH```'T```*,```:
XM`?4```HV```!^```"D````'[```*5@```?T```I<```!_@``"F````(````*N
XM?@```@(```J$```"`P``"I````($```*E@```@4```J>```""0``"JH```(+0
XM```*L@```@T```J\```"#@``"L@```(0```*U````A0```KN```"%0``"O0`&
XM``(:```+$@```AL```L6```"'```"Q@```(=```+'@```AX```LJ```"'P``V
XM"SX```(@```+0@```B(```M$```"(P``"TH```(F```+6````B<```M:```"`
XM*```"V8```(I```+=````BH```N&```"*P``"X@```(L```+E@```BT```N>G
XM```"+@``"Z0```(Q```+K@```CH```O(```"/0``"^(```(^```+Z````C\`Z
XM``OL```"0@``"^X```)#```+]````D0```OX```"2@``"_H```)+```,"```S
XM`DP```P4```"30``#!8```).```,&````D\```P<```"4@``#"8```)4```,T
XM+````E4```PZ```"6```#$8```)9```,3@```EL```QH```"7```#'````)>U
XM```,>@```E\```R"```"8```#(P```)A```,H@```F(```RF```"8P``#*H`Q
XM``)D```,L````F4```RZ```"9@``#-8```)H```,X@```FD```SJ```":@``^
XM#.P```/P`````E]?0UA-,S,````G2`````)?7V1R96%D````)<@````#7U]DZ
XM8W)E871X```````F7`````)?<7-O<G0`````&]P````"7W-T8W5L7V0``!J\_
XM`````E]#6$0S,P`````G:`````%?7W!F```M7@````)?9G)E860`````(;0`-
XM```"7W=R:71E`````"E(````!%]?3$%U=&]297%U97-T`````"^P`````U]#1
XM:&M?06)O<G0`````-?X````"7V9R96]P96X``",T`````E]?9'=R:71E```DW
XM^`````)?7W!F;70`````*:@````"7W-W;65M`````!H$`````E]P<FEN=&8`<
XM```=$@````)?;W!E;@``````'5`````"7W)L<VUL`````#"4`````E]?9FELY
XM8F8````5F`````)?0UA"4DL`````-#P````"7V9P=71S`````"(D`````E]SM
XM=&-L7V\````:[`````)?7V5X:70`````,$`````#7VEN:71?97AE8P`````/J
XMQ`````)?0UA$,C(`````)YH````"7V9T96QL`````""T`````E]M;W9M96T`G
XM```R4`````)?7V=E=&)F````+^0````"7W-T8VE?;P```!KL`````E]L<7-OE
XM<G0````?5`````-?<F5A9%]H96%D97(```F*`````U]R96%D7W)E;&]C<P``7
XM#<(````"7V5X:70``````"2D`````E]?0UA-,C(````G2`````)?<W1R;F-A9
XM=```&F0````"7V9C;&]S90```#,D`````E]P97)R;W(````QS`````)?;'-B`
XM<FL`````*-@````"7V9P=71C`````")4`````E]M86EN```````1I@````)`5
XM6$-%6$E4`````88````"7U]#6$0R,@```">:`````E]L<V5E:P`````>Y```7
XM``)?8VAK=69B````*"P````"7U]D<V5E:P```"5,`````E]?;6%I;@`````MW
XMN`````)?<W1C9%]I````&U@````"7T-833(R`````"=(`````E]F=W)I=&4`0
XM```@1`````)?9G-E96L`````(3`````"7W-T<G5P<@```!H@`````E]S=&-I#
XM7V@````;+`````)?8WAO=F8`````,X0````#7TUE;4-L96%N=7`````HJ```E
XM``-?8VAK86)O<G0``````#6\`````E]?9FQS8F8````2]`````)?9V5T;6P`N
XM````'WP````"7W-T8VQ?:````!LL````!%]R96%D:'5N:V1E=&%I;',```IT9
XM`````U]?7V9P:6YI=```````$O`````"7W)E860``````#&$`````U]W<FET&
XM95]O=70`````$``````"7T-833,S`````"=(`````E]S=&-U7V0````:O```#
XM``)?9G!R:6YT9@``(O0````"7V9O<&5N`````#+(`````U]?7V9P=&5R;0``1
XM````$O(````"7U]D8VQO<V4``"<H`````E]G971L;VYG```)2`````)?7T-8*
XM1#,S````)V@````"7VUA;&QO8P```#)X`````E]C;&]S90`````U=`````)?]
XM7V1O<&5N````)A0````"7UA#15A)5`````&"`````E]R96UO=F4````;I```6
XM``)?7V1C<F5A=```)L`````"7V%D9&QO;F<```7X`````E]?>&-O=F8````7-
XM(`````)?8V%L;&]C````*&P````#7V9I;F1?8F%S97,````,&@````````/R.
XM```#Z@``!50`````````````````````````````````````````````````&
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````$1&,3I3;F%P4VAO="Y40@``````````I
XM````````````````D``(``%T;W!A>@````,`````!@`$````B````*P```"X`
XM4')O9W)A;3H``````P````!.``0```"(`````````,P#`````#<`$````(@`-
XM``#@````]$D@8V%U9VAT(&$@1U5252$``````P`````4`!P```"(```!"```"
XM``!3:&]U;&0@22!M86ME(&$@4VYA<%-H;W0_`````P`````&``0```"(```!\
XM.`````!915,``P`````'``0```"(```!4`````!.3P``4$=40@````!&04E,V
XM````"0````````````````````````````````````%&345-````!@``````U
XM`````````````````````````%)%1U,````2````````````````````````#
XM`````````````````````````````````````````````````````````````
XM````````````5D524P````8````!``````````-C871C:"YO("`@``!35$%+]
XM````!`````````````````````!35$%+`````0````%35$%+```$`0````)3&
XM5$%+```$`0````-35$%+``````````151$%4`````"1)9#H@871O;7@N8RQV4
XM(#$N-"`Y,2\P-R\P,B`Q.#HP-#HT,2!P971E<F,@17AP("0`````````````>
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````(```````@
XM````````````*`````````````````````````````"`````$MX`````````8
XM`````````````````````````````````!,`````````````````````````3
XM`````````````````````````````````````````````````````````````
XM``````"``````"(``!<\```74```%V(``!=\```7C```%Z0``!>N```7R```J
XM%]X``!?P```8````&!(``!@L```80```&$X``!A:```8<```&((``!B6```8:
XMJ```&+@``!C(```8V```&.H``!D(```9.```&4@``!E:```9;```&7H``!F./
XM```9I```&;0``!G````9W@``!```("`@("`@("`@*"@H*"@@("`@("`@("`@&
XM("`@("`@("!($!`0$!`0$!`0$!`0$!`0A(2$A(2$A(2$A!`0$!`0$!"!@8&!4
XM@8$!`0$!`0$!`0$!`0$!`0$!`0$!`1`0$!`0$(*"@H*"@@("`@("`@("`@("8
XM`@("`@("`@("$!`0$"`@("`@("`@("`H*"@H*"`@("`@("`@("`@("`@("`@Z
XM($@0$!`0$!`0$!`0$!`0$!"$A(2$A(2$A(2$$!`0$!`0$(&!@8&!@0$!`0$![
XM`0$!`0$!`0$!`0$!`0$!$!`0$!`0@H*"@H*"`@("`@("`@("`@("`@("`@("?
XM`@(0$!`0(````````@#__P````X`#@```````````````/__````!``$````&
XM````-`0``!3$__\````$``0````````T&@````#__P````X`#@```````#4J=
XM`````/__````!``$`````````````!4`__\````$``0````````U1@````#_;
XM_P````0`!````````#50`````````^P````H````````%4@``!4T```5#```J
XM%/@``!3D```3M```$[```!.L```3J```$Z0``!.@```3G```$Y@``!.4```3&
XMD```$XP``!.(```3A```$X```!-\```3>```$W0``!-P```3;```$V@``!-D)
XM```38```$UP``!-8```35```$U```!-,```32```$T0``!-````3/```$S@`5
XM`!,T```3,```$RP````6`````0``%20``!3H```2W@``$KP```%,```!2```I
XM`40```$T```!,````2P```$$```!`````/P```#<````V````-0```#(````J
XMP````*@```"D````H````(@````````#\`````)?7V9M;V1E````$R0````"K
XM7U]/4T524@`````8`````E]N:'5N:W,````5A`````)?7T].15A)5````"P`U
XM```"7V-U<F1I<@`````T`````E]?;W-E<G(`````&`````)?7VEO8@``````;
XM$KP````"7U]324=&4$4````@`````E]?<&]O;``````2I`````)?7U-)1TE.6
XM5````"0````"7U-Y<T)A<V4````X`````E]?;6)A<V4`````"`````)?7V)UR
XM9G-I>@``%,`````"7U]M<VEZ90`````0`````U]?365M3&ES=```````%O0`.
XM```#7W-T86-K<VEZ90`````2D@````-?9G)O;49I;&4``````!6<`````E]TS
XM87)G=@`````7/@````)?7T].15)2`````"@````"7U]M;F5X=``````,````K
XM`E]?3TY'55)5````5`````)?3E5,3``````````````#7U]35$%+3V9F<V5TK
XM```"4`````)?7W5F8G,`````%:`````"7U]&345-``````!@`````U]M86ME\
XM7W-E<```````$IH````#7U]3=&%C:U!T<@``````2`````)?7T92145$````N
XM%\0````"7V%R9V,``````!<Z`````E]?8W1Y<&4````3O`````-?5T)E;F-HW
XM37-G```````\`````E]?='-I>F4`````%`````)?7VUE;'0`````$K`````"<
XM7VYR96QO8W,``!68`````E]Z97)O```````"D@````)?9&%T80``````%8P`3
XM```"7U]N=69B<P```!*@`````E]?;7-T97`````3N`````)?7VEO;6]D90``!
XM$K@````"7W9E<F)O<V4``!*6````!%]?4')O9W)A;4YA;64```````!0````T
XM`E]T97AT```````5B`````)?97)R;F\`````%NP````#7W-Y<U]N97)R````C
XM```3*`````%?8G-S```5D`````)?87)G=@``````%T(````"7U]B87-E````-
XM```$`````U]?3TY"4D5!2P```````#`````"7W)E;&]C<P```!64`````E]?)
XM1E!%4E(`````'`````)?:'5N:W``````%8`````#7W-Y<U]E<G)L:7-T```3O
XI+`````)?1$]30F%S90``%O`````"7V5X96,``````!50`````````_)T(
X``
Xend
Xsize 23936
END_OF_FILE
if test 33547 -ne `wc -c <'atomx.uue'`; then
echo shar: \"'atomx.uue'\" unpacked with wrong size!
fi
# end of 'atomx.uue'
fi
if test -f 'hunks.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'hunks.h'\"
else
echo shar: Extracting \"'hunks.h'\" \(3175 characters\)
sed "s/^X//" >'hunks.h' <<'END_OF_FILE'
X/************************************************************************
X * hunks.h -- describe AmigaDOS object module format. *
X * *
X * Copyright 1991 Peter Chubb *
X * All rights reserved *
X * *
X ************************************************************************/
X
X/*
X * $Log: hunks.h,v $
X * Revision 1.1 91/06/09 09:17:27 peterc
X * Initial revision
X *
X *
X */
X#ifndef _HUNKS_H_
X#define _HUNKS_H_
X
X/*
X *
X * An object module consists of a concatenation of program units.
X * A program unit is a program unit header block, follwed by
X * all needed hunks.
X * A hunk is a concatenation of blocks.
X * Each hunk ends with a HUNK_END block.
X * Within each hunk, there can be a relocatable block (code, data, BSS),
X * relocation information for that block, external symbol information,
X * symbol tables and debugging information.
X *
X * See the Bantam DOS book, pp 249ff.
X *
X */
X
X/*
X * Block types
X */
X/* relocatable (.o) files */
X#define HUNK_UNIT 999
X#define HUNK_NAME 1000
X#define HUNK_CODE 1001
X#define HUNK_DATA 1002
X#define HUNK_BSS 1003
X#define HUNK_RELOC32 1004
X#define HUNK_RELOC16 1005
X#define HUNK_RELOC8 1006
X#define HUNK_EXT 1007
X#define HUNK_SYMBOL 1008
X#define HUNK_DEBUG 1009
X#define HUNK_END 1010
X
X/* executable files */
X#define HUNK_HEADER 1011
X#define HUNK_OVERLAY 1013
X#define HUNK_BREAK 1014
X
X/* relocation types */
Xtypedef enum
X{
X ext_sym = 0, /* symbol table definition (0) */
X ext_def, /* relocatable definition (1) */
X ext_abs, /* absolute definition (2) */
X ext_res, /* resident library definition (3) */
X ext_ref32 = 129,/* 32 bit relocation table (129) */
X ext_common, /* fortran COMMON area (130) */
X ext_ref16, /* 16 bit relocation table (131) */
X ext_ref8, /* 8 bit relocation table (132) */
X /* these are guesses -- Lattice uses new types */
X
X ext_lattice_r32, /* 32 bit data base relative relocation table (133) */
X ext_lattice_r16, /* 16 bit data base relative relocation table (134) */
X ext_lattice_r8 /* 8 bit bit data base relative relocation table (135) */
X} ext_type_t;
X
X/*
X * Definitions are laid out as a one char type (chosen from ext_symb to ext_res)
X * and a three char name length.
X * This is taken to be the length in longs of the name, that comes next.
X * the name is padded to a long boundary with '\0's.
X * The value of the definition comes next.
X *
X * ______________
X * |type| namelen | Here the namelen is assumed to be two,
X * -------------- thus there are two longs of name data
X * | name | present.
X * --------------
X * | more name\0 |
X * --------------
X * | value |
X * --------------
X *
X * References are laid out similarly, but are followed by offsets within
X * the hunk to relocate. A count of the number of offsets ion the table
X * precedes the table itself.
X * ______________
X * |type| namelen | Here the namelen is assumed to be two,
X * -------------- thus there are two longs of name data
X * | name | present.
X * --------------
X * | more name\0 |
X * --------------
X * | count |
X * --------------
X * | offset |
X * --------------
X * | offset |
X * --------------
X * ...
X *
X */
X#endif /* _HUNKS_H_ */END_OF_FILE
if test 3175 -ne `wc -c <'hunks.h'`; then
echo shar: \"'hunks.h'\" unpacked with wrong size!
fi
# end of 'hunks.h'
fi
echo shar: End of shell archive.
exit 0

0 new messages