#include <perms.h>
const int No = 0;
const int Yes = 1;
const int Setup = 1;
const int Instream = 2;
const int Outstream = 3;
const int Ssdatafiletype = 4;
const int Marker = 'LISP';
const int Defaultlinelength = 80;
const int Maxlevel = 15;
const int Longbase = 256;
const int Longtail = 511;
const int Namebase = 512;
const int Nametail = 2047;
const int Stackbase = 1024;
const int Stacktail = 2047;
const int Shortbase = 2048;
const int Shorttail = 4095;
const int Listbase = 4096;
const int Listtail = 0x7fff;
const int Atombase = 256;
const int Charbase = 1919;
const int Zerobase = 3072;
const int Pnamemax = 8191;
const int T = 2003;
const int Percent = 1956;
const int Nil = 512;
const int Quote = 513;
const int Label = 514;
const int Lambda = 515;
const int Apval = 516;
const int Subr = 517;
const int Fsubr = 518;
const int Expr = 519;
const int Fexpr = 520;
const int Exit = 521;
const int Evln = 0x8000 | 522;
const int Stars = 523;
const int Error = 0;
const int Error1 = 1;
const int Error2 = 2;
const int Error3 = 3;
const int Escape = 0x88;
const int Eof = 0x89;
const unsigned char Mask[5 /*516:520*/] = {3, 6, 2, 5, 1};
const unsigned char Code[128 /*0:127*/] = {
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    0x80, 0x89, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x21, 0x22, 0x23,
    0x88, 0x25, 0x26, 0x84, 0x81, 0x83, 0x2a, 0x2b, 0x2c, 0x2d, 0x82, 0x88,
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
    0x3c, 0x3d, 0x3e, 0x3f, 0x84, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
    0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x85, 0x5c, 0x87, 0x5e, 0x5f,
    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
    0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f};
const _imp_string Snl = _imp_str_literal("\n");
const _imp_string Charx[8 /*0:7*/] = {
    _imp_str_literal(" "), _imp_str_literal("("), _imp_str_literal("."),
    _imp_str_literal(")"), _imp_str_literal("'"), _imp_str_literal("["),
    _imp_str_literal(" "), _imp_str_literal("]")};
typedef struct Atomcell {
  unsigned short Bind;
  unsigned short Prop;
  unsigned short Func;
  unsigned char Form;
  _imp_string *Pname;
} Atomcell;
typedef struct Lispcell {
  unsigned short Car;
  unsigned short Cdr;
} Lispcell;
typedef struct Lispinfo {
  int Dataend;
  int Datastart;
  int Filesize;
  int Filetype;
  int Sum;
  int Datetime;
  int Format;
  int Records;
  int Marker;
  int Const;
  int Longhead;
  int Pnamespace;
  int Pnamebase;
  int Pnamehead;
  int Name;
  int Namehead;
  int Stack;
  int Global;
  int List;
  int Listhead;
  int Listcount;
  int Linelength;
} Lispinfo;
typedef struct Rf {
  int Conad;
  int Filetype;
  int Datastart;
  int Dataend;
} Rf;
typedef struct Stackframe {
  unsigned short Back;
  unsigned short Bind;
  unsigned short Link;
} Stackframe;
static int Constf[256 /*256:511*/];
static Stackframe Stackf[1024 /*1024:2047*/];
static Lispcell Listf[32768 /*0:32767*/];
static Atomcell Namef[1536 /*512:2047*/];
static unsigned char Pnamef[8192 /*0:8191*/];
extern void Connect(_imp_string File, int Mode, int Hole, int Prot, Rf *R,
                    int *Flag);
extern void Define(int Chan, _imp_string Iden, int *Afd, int *Flag);
extern _imp_string Failuremessage(int Mess);
extern _imp_string Itos(int N);
extern void Outfile(_imp_string File, int Size, int Hole, int Prot, int *Conad,
                    int *Flag);
void Prompt(_imp_string S);
extern void Setfname(_imp_string S);
void Setreturncode(int I);
static int Auxp;
static int Errval;
static int Infile;
static int Outf;
static int Char;
static int Reset;
static int Front;
static int Pnametail;
static int Progflag;
static int Local;
static int Nillist;
static int *Listcount;
static int *Listhead;
static int *Longhead;
static int *Pnamehead;
static int *Global;
static int *Namehead;
static int *Linelength;
static _imp_string Pmpt;
static _imp_string Plabel;
static _imp_string Line;
static _imp_string Clause;
static _imp_string Pspaces;
static int Const;
static Lispinfo *Lispfile;
static Atomcell Name;
static Lispcell List;
static Stackframe Stack;
static int Auxs[1024 /*0:1023*/];
static unsigned char Blanks[256 /*0:255*/] = {[0 ... 255] = ' '};
static _imp_string Errors = _imp_str_literal("Error");
static int Eval(int Form);
static int Func(Atomcell *Atom, int Args);
static void Loop(_imp_string Pmpt, int Term);
static int Push(int Index) {
  Auxs[Auxp] = Index;
  Auxp++;
  return (Index);
}
static int Pop(int Index) {
  Auxp--;
  return (Index);
}
static _imp_string Pname(int Index) {
  if (Index >= Longbase)
    if (Index >= Namebase) {
      if (Index >= Shortbase) return (Itos(Index - Zerobase));
      if (Index >= Charbase) return (Tostring(Index - Charbase));
      return (Name(Index));
    } else
      return (Itos(Const(Index)));
  else
    return (Errors);
}
static _imp_string Pack(int Index) {
  int Car;
  _imp_string Packed;
  Packed = _imp_str_literal("");
  while (Index >= Listbase) {
    Car = List(Index);
    Index = List(Index);
    if (Car >= Listbase)
      Packed = _imp_join(Packed, Pack(Car));
    else
      Packed = _imp_join(Packed, Pname(Car));
  }
  if (Index != Nil) Packed = _imp_join(Packed, Pname(Index));
  return (Packed);
}
static int Numberp(int *Value) {
  if (Longbase <= Value && Value <= Longtail) {
    Value = Const(Value);
    return (T);
  }
  if (Shortbase <= Value && Value <= Shorttail) {
    Value -= Zerobase;
    return (T);
  }
  return (Nil);
}
static int Equal(int Arg1, int Arg2) {
  if (Arg1 == Arg2 ||
      (Numberp(Arg1) == T && T == Numberp(Arg2) && Arg1 == Arg2) ||
      (Arg1 >= Listbase && Arg2 >= Listbase &&
       Equal(List(Arg1), List(Arg2)) == T &&
       Equal(List(Arg1), List(Arg2)) == T))
    return (T);
  return (Nil);
}
static int Mnumb(int Value) {
  int Index;
  if (-1024 <= Value && Value <= 1023) return (Value + Zerobase);
  if (Longbase > *Longhead || *Longhead > Longtail) {
    Printstring(_imp_join(
        Snl, _imp_join(_imp_str_literal(
                           "Atom error:   No more room for long constants"),
                       Snl)));
    return (Error);
  }
  Index = Longbase;
  while (Index != *Longhead) {
    if (Const(Index) == Value) return (Index);
    Index++;
  }
  *Longhead = *Longhead + 1;
  Const(Index) = Value;
  return (Index);
}
static int Matom(_imp_string Pname) {
  int Index;
  Atomcell *Atom;
  if (*Length(Pname) == 1) return (Charbase + (*Charno(Pname, 1) & 0x7f));
  for (Index = Namebase; Index <= *Namehead - 1; Index++)
    if (Pname == Name(Index)) return (Index);
  if (*Namehead >= Charbase || *Pnamehead + *Length(Pname) + 1 >= Pnametail) {
    Printstring(_imp_join(
        Snl,
        _imp_join(_imp_str_literal("Atom error:   No more space for names"),
                  Snl)));
    return (Error);
  }
  Atom = Name;
  Atom = String(*Pnamehead);
  *Pnamehead = *Pnamehead + *Length(Pname) + 1;
  Atom = Pname;
  Index = *Namehead;
  *Namehead = *Namehead + 1;
  return (Index);
}
static int Ratom(void) {
  int Type;
  int Sign;
  int Value;
  int Tsign;
  _imp_string Pname;
  Type = 0;
  Value = 0;
  Sign = +1;
  Tsign = +1;
  Pname = _imp_str_literal("");
  for (;;) {
    if (Char & 0x80) {
      if (Pname != _imp_str_literal("")) {
        if (Type < 2) return (Matom(Pname));
        return (Mnumb(Value));
      }
      Value = Char & 0x7f;
      if (Char != 0x80) {
        Char = 0x80;
        return (Value);
      }
    } else {
      if (0 <= Type && Type <= 2)
        if ('0' <= Char && Char <= '9') {
          Type = 2;
          if (Sign == -1) {
            Value = -Value;
            Sign = +1;
          }
          Value = Value * 10 + (Char - '0') * Tsign;
        } else {
          if (Type == 0 && (Char == '+' || Char == '-')) {
            Type = 1;
            if (Char == '-') {
              Sign = -1;
              Tsign = -1;
            }
          } else
            Type = -1;
        }
      Pname = _imp_join(Pname, Tostring(Char));
    }
    do {
      Readch(Char);
      Char = Code[Char & 0x7f];
      if (Char == Eof) Selectinput(0);
    } while (Char != Eof);
    if (Char == Escape) {
      Readch(Char);
      Type = -1;
    }
  }
}
static void Printchars(_imp_string Phrase) {
  int Adjustment;
  if (Plabel != _imp_str_literal("")) {
    Phrase = _imp_join(Plabel, Phrase);
    Plabel = _imp_str_literal("");
  }
  if (Phrase == _imp_str_literal("")) {
    if (*Length(Line) + *Length(Clause) < *Linelength)
      Printstring(_imp_join(Line, _imp_join(Clause, Snl)));
    else
      Printstring(_imp_join(
          Line, _imp_join(Snl, _imp_join(Pspaces, _imp_join(Clause, Snl)))));
    Line = _imp_str_literal("");
    Clause = _imp_str_literal("");
  }
  if (*Length(Pspaces) + *Length(Clause) + *Length(Phrase) >= *Linelength) {
    Adjustment = *Length(Pspaces) - *Length(Phrase);
    if (Adjustment < 0) {
      if (Line != _imp_str_literal("")) Printstring(_imp_join(Line, Snl));
      Printstring(_imp_join(Pspaces, _imp_join(Clause, Snl)));
      Line = _imp_str_literal("");
      Clause = _imp_str_literal("");
    } else
      *Length(Pspaces) = Adjustment;
  }
  Clause = _imp_join(Clause, Phrase);
}
static void Print(int Index) {
  int Level;
  int Clevel;
  int Adjustment;
  int I;
  unsigned char Rflag;
  unsigned char Ccount;
  unsigned char Rcount;
  unsigned char Line1;
  int Linepos[16 /*0:15*/];
  _imp_string Padding(void) {
    int Index;
    int Count;
    if (Level < Maxlevel + 1)
      Index = Level;
    else
      Index = Maxlevel;
    Count = Linepos[Index] - *Length(Plabel);
    if (Count > *Linelength) Count = *Linelength;
    if (Count < 0) Count = 0;
    Blanks[0] = Count;
    return (*String(Addr(Blanks[0])));
  }
  void Lparen(void) {
    int I;
    if (Level <= Maxlevel && Linepos[Level] == 0)
      Linepos[Level] = *Length(Line) + *Length(Clause);
    if (50 < *Length(Line) && *Length(Line) > Linepos[Level] ||
        *Length(Clause) > 30 || (*Length(Clause) > 20 && *Length(Line) > 20))
      Ccount = 10;
    if (Rflag > 0 || Ccount >= 10) {
      if (*Length(Line) + *Length(Clause) > *Linelength ||
          *Length(Line) - *Length(Pspaces) > 25 || Ccount >= 2) {
        if (Level > Clevel) {
          Adjustment = *Length(Line) - *Length(Pspaces);
          for (I = Clevel + 1; I <= Level; I++)
            Linepos[I] = Linepos[I] - Adjustment;
        }
        if (Line != _imp_str_literal("")) Printstring(_imp_join(Line, Snl));
        Line = _imp_join(Pspaces, Clause);
        Line1 = 0;
      } else
        Line = _imp_join(Line, Clause);
      Ccount = Rcount;
      Clause = _imp_str_literal("");
      Clevel = Level;
      Pspaces = Padding();
    }
    if (!Line1) Level++;
    Rflag = 0;
    Rcount = 0;
    Printchars(_imp_str_literal("("));
  }
  void Rparen(void) {
    Printchars(_imp_str_literal(")"));
    if (0 < Level && Level <= Maxlevel) Linepos[Level] = 0;
    if (Level > 0) Level--;
    Rflag = 1;
    Rcount++;
  }
  void Printsexp(int Index) {
    int Car;
    int Cdr;
    Lispcell *Cell;
    if (Index >= Listbase) {
      Cell = List;
      Car = Cell;
      Cdr = Cell;
      Lparen();
      Printsexp(Car);
      if (Cdr >= Listbase) {
        for (;;) {
          Index = Cdr;
          Cell = List;
          Car = Cell;
          Cdr = Cell;
          if (Plabel == _imp_str_literal("")) Printchars(_imp_str_literal(" "));
          if (Cdr < Listbase) break;
          if (Car == Nil) {
            Lparen();
            Printchars(_imp_str_literal(" "));
            Rparen();
          } else
            Printsexp(Car);
        }
        Printsexp(Car);
      }
      if (Cdr != Nil) {
        Printchars(_imp_str_literal(" . "));
        Printchars(Pname(Cdr));
        Rflag = 0;
      }
      Rparen();
    } else if (Rflag == 1) {
      Rflag = 2;
      Plabel = _imp_join(Pname(Index), _imp_str_literal(" "));
    } else {
      Printchars(Pname(Index));
      Rflag = 0;
    }
  }
  Line1 = 1;
  Rflag = 0;
  Ccount = 0;
  Rcount = 0;
  Pspaces = _imp_str_literal("");
  Level = 0;
  Clevel = 0;
  Linepos[0] = 4;
  for (I = 1; I <= Maxlevel; I++) Linepos[I] = 0;
  Printsexp(Index);
}
static void Mark(int Index) {
  unsigned short *Car;
  while (Index >= Listbase && List(Index) >= 0) {
    Car = List;
    Index = List(Index);
    *Car = *Car | 0x8000;
    if ((*Car & 0x7fff) >= Listbase) Mark(*Car & 0x7fff);
  }
}
static void Garbagecollect(void) {
  Lispcell *Cell;
  int I;
  for (I = Namebase; I <= *Namehead - 1; I++) Mark(Name(I));
  for (I = Charbase; I <= Nametail; I++) Mark(Name(I));
  for (I = Stackbase; I <= Front; I++) Mark(Stack(I));
  for (I = *Global; I <= Stacktail; I++) Mark(Stack(I));
  if (Auxp > 0)
    for (I = 0; I <= Auxp - 1; I++) Mark(Auxs[I]);
  *Listcount = 0;
  *Listhead = 0;
  for (I = Listbase; I <= Listtail; I++) {
    Cell = List;
    if (Cell < 0)
      Cell = Cell & 0x7fff;
    else {
      *Listcount = *Listcount + 1;
      Cell = *Listhead;
      *Listhead = I;
    }
  }
}
static int Cons(int Car, int Cdr) {
  int Index;
  int Dummy;
  Lispcell *Cell;
  if (*Listcount <= 100 || *Listhead < Listbase) {
    Dummy = Push(Car);
    Dummy = Push(Cdr);
    Auxp += 2;
    Garbagecollect();
    Auxp -= 2;
    if (*Listcount <= 1000) {
      Printstring(_imp_join(
          Snl, _imp_join(_imp_str_literal("Lisp  note:   Less than 1000 free "
                                          "cells remaining - free something"),
                         Snl)));
      Loop(_imp_str_literal("Free:"), Percent);
    }
  }
  if (*Listhead < Listbase) {
    Printstring(_imp_join(
        Snl,
        _imp_join(_imp_str_literal("Lisp error:   No more free space left"),
                  Snl)));
    return (Error);
  }
  *Listcount = *Listcount - 1;
  Index = *Listhead;
  Cell = List;
  *Listhead = Cell;
  Cell = Car;
  Cell = Cdr;
  return (Index);
}
static int Reverse(int Curr) {
  int Last;
  Lispcell *Cell;
  Last = Nil;
  while (Curr >= Listbase) {
    Cell = List;
    Last = Cons(Cell, Last);
    Curr = Cell;
  }
  return (Last);
}
static int Readsexp(_imp_string Pmpt) {
  auto int Cell(int Car);
  auto int Head(void);
  auto int Tail(void);
  int Colapse;
  int Cell(int Car) {
    int Cdr;
    if (Car >= Atombase) {
      Auxs[Auxp] = Car;
      Auxp++;
      Cdr = Tail();
      Auxp--;
      if (Cdr >= Atombase) return (Cons(Car, Cdr));
    }
    return (Error);
  }
  int Head(void) {
    int Temp;
    int Res;
    static int Sw_sw;
    static void *Sw[4 /*0:3*/] = {
        &&Sw_0,
        &&Sw_1,
        &&Sw_2,
        &&Sw_3,
    };
    Temp = Ratom();
    if (Temp >= Atombase) return (Temp);
    goto *Sw[Sw_sw = Temp & 3];
  Sw_0:;
    return (Cons(Quote, Cons(Head(), Nil)));
  Sw_1:;
    Res = Tail();
    if (Temp >= 4) Colapse = No;
    return (Res);
  Sw_2:;
  Sw_3:;
    Printstring(_imp_join(
        Snl,
        _imp_join(_imp_str_literal("Read error:   S-expression begins with a "),
                  _imp_join(Charx[Temp], Snl))));
    return (Error);
  }
  int Tail(void) {
    int Temp;
    int Res;
    static int Sw_sw;
    static void *Sw[4 /*0:3*/] = {
        &&Sw_0,
        &&Sw_1,
        &&Sw_2,
        &&Sw_3,
    };
    if (Colapse == Yes) return (Nil);
    Temp = Ratom();
    if (Temp >= Atombase) return (Cell(Temp));
    goto *Sw[Sw_sw = Temp & 3];
  Sw_0:;
    return (Cell(Cons(Quote, Cons(Head(), Nil))));
  Sw_1:;
    Res = Tail();
    if (Temp >= 4) Colapse = No;
    return (Cell(Res));
  Sw_2:;
    Temp = Head();
    if (Tail() == Nil) return (Temp);
    Printstring(_imp_join(
        Snl,
        _imp_join(_imp_str_literal(
                      "Read error:   Dotted pair not enclosed in brackets"),
                  Snl)));
    return (Error);
  Sw_3:;
    if (Temp >= 4) Colapse = Yes;
    return (Nil);
  }
  Colapse = No;
  Prompt(Pmpt);
  return (Head());
}
static void Loop(_imp_string Pmpt, int Term) {
  int Value;
  for (;;) {
    Reset = 0;
    Value = Eval(Readsexp(Pmpt));
    if (Value == Term) break;
    if (!Reset) {
      Print(Value);
      Printchars(_imp_str_literal(""));
    }
  }
}
static int Pcons(int Car, int Cdr) {
  Auxp--;
  return (Cons(Car, Cdr));
}
static void Xprint(_imp_string Mess, int Form) {
  _imp_string Save;
  Save = Line;
  Line = Mess;
  Print(Form);
  Printchars(_imp_str_literal(""));
  Line = Save;
}
static void Bind(int Symb, int Entry, int Bind) {
  Atomcell *Atom;
  Stackframe *Frame;
  if (Namebase > Symb || Symb >= Listbase) {
    Printstring(_imp_join(
        Snl,
        _imp_str_literal(
            "Bind error:   Element of name list not an atom, element = ")));
    Xprint(_imp_str_literal(""), Symb);
    return;
  }
  if (Name(Symb) == 3) {
    Xprint(
        _imp_join(
            Snl,
            _imp_str_literal(
                "Bind error:   Name list entry has constant binding, name=")),
        Symb);
    return;
  }
  if (*Global <= Front) {
    Printstring(_imp_join(
        Snl, _imp_join(_imp_str_literal("Bind error:  Stack overflow"), Snl)));
    return;
  }
  Frame = Stack;
  Atom = Name;
  if (Bind < Atombase) {
    Printstring(
        _imp_join(Snl, _imp_str_literal("Bind error:   Unassigned argument ")));
    Xprint(_imp_str_literal(""), Symb);
    Bind = Error;
  }
  Frame = Bind;
  Frame = Symb;
  Frame = Atom;
  Atom = Entry;
}
static void Bindlist(int *Names, int *Args) {
  Lispcell *Cell;
  Lispcell *Argc;
  Stack(Front) = Local;
  Stack(Front) = 0;
  Local = Front;
  Front++;
  while (Names >= Listbase) {
    Cell = List;
    Argc = List;
    Bind(Cell, Front, Argc);
    Front++;
    Names = Cell;
    Args = Argc;
  }
}
static int Unbind(int Result) {
  Stackframe *Frame;
  while (Front > Local) {
    Front--;
    Frame = Stack;
    if (Frame > 0) Name(Frame) = Frame;
  }
  Front = Local;
  Local = Stack(Front);
  return (Result);
}
static int Prog(int Names, int Body) {
  int Proglist;
  int Result;
  Lispcell *Cell;
  Bindlist(Names, Nillist);
  Progflag += 4;
  Proglist = Body;
  while (Body >= Listbase) {
    Cell = List;
    if (Cell >= Listbase) {
      Result = Eval(Cell);
      if (Progflag & 3) {
        if (Progflag & 1) {
          Progflag = (Progflag & (~3)) - 4;
          return (Unbind(Result));
        }
        Cell = List;
        Progflag = Progflag & (~3);
        while (Cell != Result) {
          if (Cell < Listbase) {
            Progflag -= 4;
            return (Unbind(Error));
          }
          Cell = List;
        }
      }
    }
    Body = Cell;
  }
  Progflag -= 4;
  return (Unbind(Result));
}
static int Evlist(int Args) {
  Lispcell *Cell;
  if (Args < Listbase) return (Args);
  Cell = List;
  return (Pcons(Push(Eval(Cell)), Evlist(Cell)));
}
static int Apply(int Function, int Args) {
  int Car;
  int Cadr;
  int Caddr;
  Lispcell *Cell;
  if (Function >= Listbase) {
    Cell = List;
    Car = Cell;
    Cell = List;
    Cadr = Cell;
    Cell = List;
    Caddr = Cell;
    if (Car == Label) {
      Bind(Cadr, Front, Caddr);
      Front++;
      return (Apply(Caddr, Args));
    }
    if (Car == Lambda) {
      Bindlist(Cadr, Args);
      if (Cadr != Nil) {
        Bind(Cadr, Front, Args);
        Front++;
      }
      return (Unbind(Eval(Caddr)));
    }
    return (Apply(Eval(Function), Args));
  }
  if (Namebase <= Function && Function <= Nametail)
    return (Func(Name(Function), Args));
  return (Error);
}
static int Put(int Atom, int Bind, int Prop) {
  int Id;
  unsigned short *Hole;
  Lispcell *Propcell;
  Lispcell *Bindcell;
  if (Namebase > Atom || Atom > Nametail || Namebase > Prop || Prop > Nametail)
    return (Error3);
  Hole = Name;
  for (;;) {
    if (*Hole < Listbase) {
      *Hole = Cons(Prop, Cons(Bind, Nil));
      break;
    }
    Propcell = List;
    Bindcell = List;
    if (Propcell == Prop) {
      Bindcell = Bind;
      break;
    }
    Hole = Bindcell;
  }
  if (Apval <= Prop && Prop <= Fexpr) {
    Name(Atom) = Mask[Prop];
    if (Subr <= Prop && Prop <= Fsubr) {
      Id = Bind;
      if (Numberp(Id) != T) return (Error3);
      Name(Atom) = Id;
    } else
      Name(Atom) = Bind;
  }
  return (Bind);
}
static int Func(Atomcell *Atom, int Args) {
  int Arg1;
  int Arg2;
  int Arg3;
  int Symb;
  int Afd;
  int Flag;
  _imp_string Line;
  unsigned short *Hole;
  Lispcell *Cell;
  Stackframe *Frame;
  static int Type_sw;
  static void *Type[4 /*0:3*/] = {
      &&Type_0,
      &&Type_1,
      &&Type_2,
      &&Type_3,
  };
  static int Func_sw;
  static void *Func[87 /*0:86*/] = {
      &&Func_0,  &&Func_1,  &&Func_2,       &&Func_3,       &&Func_4,
      &&Func_5,  &&Func_6,  &&Func_7,       &&Func_8,       &&Func_9,
      &&Func_10, &&Func_11, &&Func_12,      &&Func_13,      &&Func_14,
      &&Func_15, &&Func_16, &&Func_17,      &&Func_18,      &&Func_19,
      &&Func_20, &&Func_21, &&Func_22,      &&Func_23,      &&Func_24,
      &&Func_25, &&Func_26, &&Func_27,      &&Func_28,      &&Func_29,
      &&Func_30, &&Func_31, &&Func_32,      &&Func_33,      &&Func_34,
      &&Func_35, &&Func_36, &&Func_37,      &&Func_38,      &&Func_39,
      &&Func_40, &&Func_41, &&Func_42,      &&Func_43,      &&Func_44,
      &&Func_45, &&Func_46, &&Func_47,      &&Func_48,      &&Func_49,
      &&Func_50, &&Func_51, &&Func_52,      &&Func_53,      &&Func_54,
      &&Func_55, &&Func_56, &&Func_default, &&Func_default, &&Func_default,
      &&Func_60, &&Func_61, &&Func_62,      &&Func_63,      &&Func_64,
      &&Func_65, &&Func_66, &&Func_67,      &&Func_68,      &&Func_69,
      &&Func_70, &&Func_71, &&Func_72,      &&Func_73,      &&Func_74,
      &&Func_75, &&Func_76, &&Func_77,      &&Func_78,      &&Func_79,
      &&Func_80, &&Func_81, &&Func_82,      &&Func_83,      &&Func_84,
      &&Func_85, &&Func_86,
  };
  goto *Type[Type_sw = Atom & 3];
Type_3:;
Type_0:;
  if (Atom >= *Global) return (Error2);
  Front++;
  Args = Evlist(Args);
  Front--;
  return (Apply(Stack(Atom), Args));
Type_1:;
  return (Apply(Atom, Args));
Type_2:;
  Cell = List;
  Arg1 = Cell;
  Cell = List;
  Arg2 = Cell;
  Cell = List;
  Arg3 = Cell;
  goto *Func[Func_sw = Atom];
Func_0:;
  return (Arg1);
Func_1:;
  return (List(Arg1));
Func_2:;
  return (List(Arg1));
Func_3:;
  return (List(List(Arg1)));
Func_4:;
  return (List(List(Arg1)));
Func_5:;
  return (List(List(Arg1)));
Func_6:;
  return (List(List(Arg1)));
Func_7:;
  return (Cons(Arg1, Arg2));
Func_8:;
  return (Args);
Func_9:;
  while (Args >= Listbase) {
    Cell = List;
    Arg1 = Eval(Cell);
    if (Arg1 != Nil) {
      while (Cell >= Listbase) {
        Cell = List;
        Arg1 = Eval(Cell);
      }
      return (Arg1);
    }
    Args = List(Args);
  }
  return (Nil);
Func_10:;
  while (Args >= Listbase) {
    Cell = List;
    if (Eval(Cell) == Nil) return (Nil);
    Args = Cell;
  }
  return (T);
Func_11:;
  while (Args >= Listbase) {
    Cell = List;
    if (Eval(Cell) != Nil) return (T);
    Args = Cell;
  }
  return (Nil);
Func_12:;
  if (Arg1 == Nil)
    return (T);
  else
    return (Nil);
Func_13:;
  if (Atombase <= Arg1 && Arg1 < Listbase)
    return (T);
  else
    return (Nil);
Func_14:;
  return (Numberp(Arg1));
Func_56:;
  if (Numberp(Arg1) == T && (Arg1 & 1) == 0) return (T);
  return (Nil);
Func_55:;
  Arg1--;
Func_15:;
  if (Arg1 == Zerobase)
    return (T);
  else
    return (Nil);
Func_16:;
  if (Arg1 == Arg2)
    return (T);
  else
    return (Nil);
Func_17:;
  return (Equal(Arg1, Arg2));
Func_18:;
  if (Numberp(Arg1) == T && T == Numberp(Arg2) && Arg1 < Arg2)
    return (T);
  else
    return (Nil);
Func_19:;
  if (Numberp(Arg1) == T && T == Numberp(Arg2) && Arg1 > Arg2)
    return (T);
  else
    return (Nil);
Func_20:;
  while (Arg2 >= Listbase) {
    Cell = List;
    if (Arg1 == Cell) return (T);
    Arg2 = Cell;
  }
  return (Nil);
Func_21:;
  while (Arg2 >= Listbase) {
    Cell = List;
    if (Equal(Arg1, Cell) == T) return (T);
    Arg2 = Cell;
  }
  return (Nil);
Func_22:;
  while (Arg2 >= Listbase) {
    Cell = List;
    if (Equal(Arg1, List(Cell)) == T) return (Cell);
    Arg2 = Cell;
  }
  return (Nil);
Func_23:;
  Arg1 = 0;
  while (Args >= Listbase) {
    Cell = List;
    Arg2 = Cell;
    if (Numberp(Arg2) == T)
      Arg1 += Arg2;
    else
      return (Error3);
    Args = Cell;
  }
  return (Mnumb(Arg1));
Func_24:;
  if (Numberp(Arg1) != T) return (Error3);
  while (Args >= Listbase) {
    Cell = List;
    Arg2 = Cell;
    if (Numberp(Arg2) == T)
      Arg1 -= Arg2;
    else
      return (Error3);
    Args = Cell;
  }
  return (Mnumb(Arg1));
Func_25:;
  Arg1 = 1;
  while (Args >= Listbase) {
    Cell = List;
    Arg2 = Cell;
    if (Numberp(Arg2) == T)
      Arg1 = Arg1 * Arg2;
    else
      return (Error3);
    Args = Cell;
  }
  return (Mnumb(Arg1));
Func_26:;
  if (Numberp(Arg1) != T) return (Error3);
  while (Args >= Listbase) {
    Cell = List;
    Arg2 = Cell;
    if (Numberp(Arg2) == T)
      Arg1 = Arg1 / Arg2;
    else
      return (Error3);
    Args = Cell;
  }
  return (Mnumb(Arg1));
Func_27:;
  if (Numberp(Arg1) == T) return (Mnumb(Arg1 + 1));
  return (Error3);
Func_28:;
  if (Numberp(Arg1) == T) return (Mnumb(Arg1 - 1));
  return (Error3);
Func_29:;
  if (Numberp(Arg1) == T) return (Mnumb(Imod(Arg1)));
  return (Error3);
Func_30:;
  Arg1 = Eval(Arg1);
  Args = List(Args);
  for (;;) {
    Arg3 = Args;
    Args = List(Arg3);
    if (Args < Listbase) break;
    Cell = List;
    Arg2 = Cell;
    Arg3 = Cell;
    while (Arg2 >= Listbase) {
      Cell = List;
      if (Cell == Arg1) goto Exit;
      Arg2 = Cell;
    }
    if (Arg2 == Arg1) break;
  }
Exit:;
  while (Arg3 >= Listbase) {
    Cell = List;
    Arg1 = Eval(Cell);
    Arg3 = Cell;
  }
  return (Arg1);
Func_31:;
  return (Put(Arg1, Arg3, Arg2));
Func_32:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  return (Name(Arg1));
Func_33:;
  if (Namebase > Arg1 || Arg1 > Nametail || Namebase > Arg2 || Arg2 > Nametail)
    return (Error3);
  *Atom = Name;
  Hole = &Atom;
  while (*Hole >= Listbase) {
    Cell = List;
    if (Cell == Arg2) {
      Cell = List;
      if (Cell == Atom) Atom = 0;
      *Hole = Cell;
      return (T);
    }
    Hole = List;
  }
  return (Nil);
Func_34:;
  if (Namebase > Arg1 || Arg1 > Nametail || Namebase > Arg2 || Arg2 > Nametail)
    return (Error3);
  Args = Name(Arg1);
  while (Args >= Listbase) {
    Cell = List;
    if (Cell == Arg2) return (List(Cell));
    Args = List(Cell);
  }
  return (Nil);
Func_35:;
  return (Put(Arg1, Arg2, Arg3));
Func_36:;
  return (Eval(Arg1));
Func_37:;
  return (Evlist(Args));
Func_38:;
  return (Apply(Arg1, Arg2));
Func_39:;
  Arg1 = Cons(Eval(Arg1), Nil);
  if (Reset == 2) {
    Arg1 = Errval;
    Reset = 0;
  }
  return (Arg1);
Func_40:;
  if (Arg1 < Listbase) return (Error3);
  List(Arg1) = Arg2;
  return (Arg2);
Func_41:;
  if (Arg1 < Listbase) return (Error3);
  List(Arg1) = Arg2;
  return (Arg2);
Func_42:;
  if (Arg1 == Nil) return (Arg2);
  if (Arg1 < Listbase) return (Error3);
  Args = Arg1;
  while (List(Arg1) >= Listbase) Arg1 = List(Arg1);
  List(Arg1) = Arg2;
  return (Args);
Func_43:;
  if (Numberp(Arg1) == T && Arg1 < 0) return (T);
  return (Nil);
Func_44:;
  Arg2 = Eval(Arg2);
Func_45:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  Arg3 = Name(Arg1);
  if (Arg3 < Stacktail)
    Stack(Arg3) = Arg2;
  else {
    *Global = *Global - 1;
    Bind(Arg1, *Global, Arg2);
  }
  return (Arg2);
Func_46:;
  if (Atombase > Arg1 || Arg1 >= Listbase) return (Error3);
  Line = Pname(Arg1);
  Arg2 = Nil;
  for (Arg1 = Addr(Line) + *Length(Line); Arg1 >= Addr(Line) + 1; Arg1--) {
    Symb = *Byteinteger(Arg1);
    if ('0' <= Symb && Symb <= '9')
      Symb = Zerobase + Symb - '0';
    else
      Symb += Charbase;
    Arg2 = Cons(Symb, Arg2);
  }
  return (Arg2);
Func_47:;
  return (Matom(Pack(Arg1)));
Func_48:;
  return (Arg2);
Func_49:;
  while (Args >= Listbase) {
    Cell = List;
    Arg1 = Eval(Cell);
    Args = Cell;
  }
  return (Arg1);
Func_50:;
  return (Prog(Arg1, List(Args)));
Func_51:;
  if (Numberp(Arg1) == T) return (Mnumb(-Arg1));
  return (Error3);
Func_52:;
  Progflag = Progflag | 1;
  return (Arg1);
Func_53:;
  Progflag = Progflag | 2;
  return (Arg1);
Func_54:;
  return (Reverse(Arg1));
Func_60:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  Pmpt = Pname(Arg1);
  return (Arg1);
Func_61:;
  if (Atombase <= Arg1 && Arg1 < Listbase)
    Prompt(Pname(Arg1));
  else
    Prompt(Pmpt);
  Readch(Symb);
  if ('0' <= Symb && Symb <= '9')
    return (Mnumb(Symb - '0'));
  else
    return (Matom(Tostring(Symb)));
Func_62:;
  if (Atombase <= Arg1 && Arg1 < Listbase) return (Readsexp(Pname(Arg1)));
  return (Readsexp(Pmpt));
Func_63:;
  Print(Arg1);
  return (Arg1);
Func_64:;
  Print(Arg1);
  Printchars(_imp_str_literal(""));
  return (Arg1);
Func_65:;
  Printchars(_imp_str_literal(""));
  if (Arg1 < Atombase) Arg1 = Nil;
  return (Arg1);
Func_66:;
  if (Numberp(Arg1) == T) {
    Selectinput(Arg1);
    return (Mnumb(Arg1));
  }
  return (Error3);
Func_67:;
  if (Numberp(Arg1) == T) {
    Selectoutput(Arg1);
    return (Mnumb(Arg1));
  }
  return (Error3);
Func_68:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  Selectinput(0);
  Closestream;
  Arg2 = Infile;
  Infile = Arg1;
  Define(Instream(), Name(Infile), Afd, Flag);
  Selectinput(Instream());
  return (Arg2);
Func_69:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  Selectoutput(0);
  Closestream;
  Arg2 = Outf;
  Outf = Arg1;
  Define(Outstream(), Name(Outf), Afd, Flag);
  Selectoutput(Outstream());
  return (Arg2);
Func_70:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  *Atom = Name;
  Atom = Atom | 8;
  return (Arg1);
Func_71:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  *Atom = Name;
  Atom = Atom & (~8);
  return (Arg1);
Func_72:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  Name(Arg1) = Name(Arg1) | 16;
  return (Arg1);
Func_73:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  Name(Arg1) = Name(Arg1) & (~16);
  return (Arg1);
Func_74:;
  if (Namebase > Arg1 || Arg1 > Nametail) return (Error3);
  *Atom = Name;
  Atom = Stacktail;
  Atom = Nil;
  Atom = 0;
  Atom = 0;
  return (Arg1);
Func_75:;
  if (Numberp(Arg1) == T && Front - Arg1 > Stackbase)
    Arg1 -= Front;
  else
    Arg1 = Stackbase;
  if (Front != Arg1)
    for (Arg1 = Front - 1; Arg1 >= Arg1; Arg1--) {
      Frame = Stack;
      Line = _imp_join(Pname(Frame & 0xfff), _imp_str_literal("         "));
      *Length(Line) = 9;
      if (Frame & 0x8000)
        Line = _imp_join(Line, _imp_str_literal("* "));
      else
        Line = _imp_join(Line, _imp_str_literal("= "));
      Xprint(Line, Frame);
    }
  return (Stars);
Func_76:;
  if (Zerobase + 40 > Arg1 || Arg1 > Zerobase + 255) return (Error3);
  *Linelength = Arg1 - Zerobase;
  return (Arg1);
Func_77:;
  Garbagecollect();
  return (Mnumb(*Listcount));
Func_78:;
  Pmpt = _imp_str_literal("Read:");
  Reset = 1;
  Errval = Nil;
  return (Percent);
Func_79:;
  Errval = Arg1;
  Reset = 2;
  return (Percent);
Func_80:;
  Arg2 = Nil;
  for (Arg1 = *Namehead - 1; Arg1 >= Namebase; Arg1--) Arg2 = Cons(Arg1, Arg2);
  return (Arg2);
Func_81:;
  Arg2 = Nil;
  Arg3 = Nil;
  for (Arg1 = Stackbase; Arg1 <= Front - 1; Arg1++) {
    Frame = Stack;
    if (Namebase <= Frame && Frame <= Nametail)
      Arg2 = Cons(Cons(Frame, Frame), Arg2);
  }
  for (Arg1 = Stacktail - 1; Arg1 >= *Global; Arg1--) {
    Frame = Stack;
    Arg3 = Cons(Cons(Frame, Frame), Arg3);
  }
  return (Cons(Arg2, Arg3));
Func_82:;
  if (Numberp(Arg1) != T || 0 > Arg1 || Arg1 > 127) return (Error3);
  return (Matom(Tostring(Arg1)));
Func_83:;
  if (Numberp(Arg1) != T) return (Error3);
  while (Args >= Listbase) {
    Cell = List;
    Arg2 = Cell;
    if (Numberp(Arg2) != T) return (Error3);
    if (Arg1 < Arg2) Arg1 = Arg2;
    Args = Cell;
  }
  return (Mnumb(Arg1));
Func_84:;
  if (Numberp(Arg1) != T) return (Error3);
  while (Args >= Listbase) {
    Cell = List;
    Arg2 = Cell;
    if (Numberp(Arg2) != T) return (Error3);
    if (Arg2 < Arg1) Arg1 = Arg2;
    Args = Cell;
  }
  return (Mnumb(Arg1));
Func_85:;
  if (Numberp(Arg1) != T) return (Error3);
  return (Int(Sqrt(Arg1)));
Func_86:;
  if (Numberp(Arg1) != T || T != Numberp(Arg2)) return (Error3);
  return (Mnumb(IEXP(Arg1, Arg2)));
  goto Func_skip;
Func_default:
  fprintf(stderr, "Switch label 'Func(%d):' not set in %s", Func_sw,
          __PRETTY_FUNCTION__);
  exit(1) /* or %signal ... */;
Func_skip:;
}
static int Trace(_imp_string Mess, int Form) {
  Xprint(Mess, Form);
  return (Form);
}
static int Eval(int Form) {
  int Car;
  int Cdr;
  Lispcell *Cell;
  Atomcell *Atom;
  Stackframe *Frame;
  int Break(int Result) {
    int Sexp;
    static int Error_sw;
    static void *Error[4 /*0:3*/] = {
        &&Error_0,
        &&Error_1,
        &&Error_2,
        &&Error_3,
    };
    if (Result >= Atombase || Reset != 0) return (Result);
    Selectinput(0);
    Selectoutput(0);
    Xprint(_imp_str_literal("Eval error:   "), Form);
    goto *Error[Error_sw = Result];
  Error_1:;
    Printstring(
        _imp_join(_imp_str_literal("    Atom is not bound to a value"), Snl));
    goto *Error[Error_sw = 0];
  Error_2:;
    Xprint(_imp_str_literal("    Function not defined: "), Car);
    goto *Error[Error_sw = 0];
  Error_3:;
    Xprint(_imp_str_literal("    Argument not of the correct form in "), Cdr);
  Error_0:;
    Loop(_imp_str_literal("   %:"), Percent);
    if (Reset) return (Percent);
    Sexp = Readsexp(_imp_str_literal("Eval:"));
    if (Sexp == Percent) Sexp = Form;
    return (Eval(Sexp));
  }
  if (Reset) return (Percent);
  Frame = Stack;
  Frame = Evln;
  Frame = Form;
  if (Form >= Listbase) {
    Cell = List;
    Car = Cell;
    Cdr = Cell;
    if (Namebase <= Car && Car <= Nametail) {
      Atom = Name;
      if (Atom & 4) {
        Front++;
        Cdr = Evlist(Cdr);
        Front--;
      }
      Form = Push(Form);
      Frame = Car | 0x8000;
      Frame = Cdr;
      if (Atom & 16) {
        Selectinput(0);
        Selectoutput(0);
        Xprint(_imp_str_literal("Lisp Break:   "), Form);
        Front++;
        Loop(_imp_str_literal("   %:"), Percent);
        Front--;
      }
      if (Atom & 8)
        return (Pop(Break(Trace(
            _imp_join(_imp_str_literal("<--- "),
                      _imp_join(Pname(Car), _imp_str_literal(" "))),
            Func(*Atom,
                 Trace(_imp_join(_imp_str_literal("---> "),
                                 _imp_join(Pname(Car), _imp_str_literal(" "))),
                       Cdr))))));
      return (Pop(Break(Func(*Atom, Cdr))));
    }
    Front++;
    Cdr = Evlist(Cdr);
    Front--;
    return (Break(Apply(Car, Cdr)));
  }
  if (Namebase <= Form && Form <= Nametail) {
    Atom = Name;
    if ((Atom & 0x7) == 3) return (Atom);
    return (Break(Stack(Atom)));
  }
  return (Form);
}
static void Initlisp(void) {
  int I;
  int Sexp;
  Atomcell *Atom;
  Lispcell *Cell;
  Stackframe *Frame;
  for (I = Namebase; I <= Nametail; I++) {
    Atom = Name;
    Atom = Stacktail;
    Atom = Nil;
    Atom = 0;
    Atom = 0;
    Atom = &Errors;
  }
  Selectinput(Setup);
  Reset = 0;
  for (I = Nil; I <= Stars; I++) Sexp = Ratom();
  for (I = 0; I <= Listbase - 1; I++) {
    Cell = List;
    Cell = Error3;
    Cell = Error3;
  }
  *Listhead = Listbase;
  *Listcount = Listtail - *Listhead;
  for (I = Listbase; I <= Listtail - 1; I++) List(I) = I + 1;
  List(Listtail) = 0;
  do
    Sexp = Put(Ratom(), Ratom(), Ratom());
  while (Sexp != Nil);
  Stack(Front) = Error;
  Frame = Stack;
  Frame = *Global;
  Frame = Error1;
  Auxs[Auxp] = Error;
  do
    Sexp = Eval(Readsexp(_imp_str_literal("")));
  while (Sexp != Nil);
  Selectinput(0);
}
void Lisp(_imp_string Parms) {
  int Flag;
  int Conad;
  int Initmode;
  int I;
  int Fixup;
  _imp_string Work;
  Rf Rr;
  unsigned char Pnamespace;
  Atomcell *Atom;
  Local = Stackbase;
  Front = Stackbase;
  Auxp = 0;
  Pmpt = _imp_str_literal("Read:");
  Char = 0x80;
  if (_imp_cond_resolve(Parms, Work, _imp_str_literal("/"), Parms) &&
      Work == _imp_str_literal("")) {
    if (Parms == _imp_str_literal("")) Parms = _imp_str_literal("T#LSPMACH");
    Outfile(Parms, 196608, 0, 0, Conad, Flag);
    if (Flag) goto Err;
    Initmode = Yes;
  } else {
    Initmode = No;
    Connect(Parms, 3, 0, 0, Rr, Flag);
    if (Flag) goto Err;
    Conad = Rr;
  }
  Lispfile = Record(Conad);
  if (Initmode == Yes) {
    Lispfile = Lispfile;
    Lispfile = Ssdatafiletype;
    Lispfile = 3;
    Lispfile = Marker;
    Lispfile = 0x1000;
    Lispfile = Longbase;
    Lispfile += 4 * (Longtail - Longbase + 1);
    Lispfile = Lispfile;
    Lispfile = Lispfile;
    Lispfile = 0x4000;
    Lispfile = Namebase;
    Lispfile = 0xA000;
    Lispfile = Stacktail;
    Lispfile = 0x10000;
    Lispfile = Defaultlinelength;
  } else if (Lispfile != Marker) {
    Flag = 311;
    Setfname(Parms);
    goto Err;
  }
  *Const = &Array;
  Longhead = Lispfile;
  *Pnamespace = &Array;
  Pnamehead = Lispfile;
  Pnametail = Addr(Pnamespace(Pnamemax));
  *Name = &Array;
  Namehead = Lispfile;
  Global = Lispfile;
  Linelength = Lispfile;
  Fixup = Addr(Pnamespace(0)) - Lispfile;
  Lispfile += Fixup;
  Lispfile += Fixup;
  for (I = Namebase; I <= *Namehead - 1; I++) {
    Atom = Name;
    Atom = String(Addr(Atom) + Fixup);
    if (*Global > Atom || Atom > Stacktail) Atom = Stacktail;
  }
  for (I = Charbase; I <= Nametail; I++) {
    Atom = Name;
    if (*Global > Atom || Atom > Stacktail) Atom = Stacktail;
  }
  *List = &Array;
  Listhead = Lispfile;
  Listcount = Lispfile;
  *Stack = &Array;
  Pspaces = _imp_str_literal("");
  Plabel = _imp_str_literal("");
  Line = _imp_str_literal("");
  Clause = _imp_str_literal("");
  Progflag = 0;
  Flag = 0;
  if (Initmode == Yes) Initlisp();
  Nillist = Cons(Nil, Nil);
  List(Nillist) = Push(Nillist);
  Infile = Matom(_imp_str_literal(".IN"));
  Outf = Matom(_imp_str_literal(".OUT"));
  Loop(_imp_str_literal("Lisp:"), Exit);
  Setreturncode(0);
  exit(0);
Err:;
  Selectoutput(0);
  Printstring(_imp_join(
      Snl, _imp_join(_imp_str_literal("LISP fails -"), Failuremessage(Flag))));
  Setreturncode(Flag);
  exit(0);
}