EXTERNALROUTINE  VVDESK(STRING (255)DESKDATA)
ROUTINE  STRINGS TO FILE(STRINGARRAYNAME  S, INTEGER  N,
      STRING (11)FILE, STRING (255)HEADER)
INTEGER  I
EXTERNALROUTINESPEC  CLEAR(STRING (255)S)
EXTERNALROUTINESPEC  DEFINE(STRING (255)S)
      DEFINE("61,".FILE)
      SELECT OUTPUT(61)
      PRINTSTRING(HEADER)
      IF  N > 0 START 
         CYCLE  I = 1, 1, N
            PRINTSTRING(S(I))
            NEWLINE
         REPEAT 
      FINISH 
      SELECT OUTPUT(0)
      CLOSE STREAM(61)
      CLEAR("61")
END 
!
!
!
INCLUDE  "ERCC10.VVPSPECS"
INCLUDE  "ERCC10.VVPFORMATS"
routine  VVrstrg(stringname  s)

! Assuming that the VV DEFINE TRIGGERS call allows left-right cursor
! movement, this routine supplies an input line (message), possibly edited
! by cursor movement, from the terminal and terminated (of course) by a
! trigger character.

! The input is considered "cancelled" if a control character other than
! CR ("Return") terminates the message, or if printable characters are typed
! to the left of the first printable charcter typed (belonging to the current
! message). If the input message is "cancelled", this routine returns a null
! string.

integer  first printable, j, curpt, cancel, start col, nmax, it scrolled
ownbyteintegerarray  buf(-1:255)

      curpt=0          { used in line editing to point to intermediate chars in buf }
      nmax=-1          { highest position used in BUF }
      it scrolled=0
      cancel=0
      first printable=0
      for  j=255, -1, 0 cycle ; buf(j)=' '; repeat 

      cycle                     { read chars of message }
         if  curpt>250 then  cancel=1
         vv read ch(j)
         if  vv bits&scrolled#0 then  it scrolled=it scrolled+1
             { This can't happen with VV DEFINE TRIGGERS(3, ..) because
             { up-down cursor movement is inhibited, except maybe with
             { terminals which do a line-feed operation on typing in
             { col SCOLS-1.
         exit  if  vv bits&trigger#0
   
         if  vv bits&(strange cursor!no effect)#0 then  cancel=1
   
         if  vv bits&canon#0 start 
   
            ! left-right line editing
            if  j=cursor left canon then  curpt=curpt-1 else  c 
            if  j=cursor right canon then  curpt=curpt+1 else  cancel=1

         finish 
   
         if  vv bits&printable#0 start 
            if  first printable=0 start 
               first printable=j                   
               startcol=vv charx
            finish 
   
            if  0<=curpt<=250 then  buf(curpt)=j else  cancel=1
            curpt=curpt+1
            if  curpt>nmax then  nmax=curpt
   
         finish 

      repeat 
      if  j#13 then  cancel=1       { trigger not CR }
   
      vv repair screen
      if  it scrolled#0 then  vv unscroll(it scrolled)
   
      if  cancel#0 start 
         s=""
      finish  else  start 
         buf(-1)=nmax+1
         s=string(addr(buf(-1)))
      finish 

   end    { rstrg }
RECORDFORMAT  RF(INTEGER  ADR, TYPE, START, END)
RECORDFORMAT  WF(STRING (31)NAME, INTEGER  START, END, CP, L0, C0,
      SL, SC, L, C, TB, BB)
!
!
!
DYNAMICROUTINESPEC  CALL(STRING (31)C, STRING (255)P)
SYSTEMROUTINESPEC  CONNECT(STRING (31)FILE, INTEGER  MODE, HOLE, PROT,
      RECORD (RF)NAME  R, INTEGERNAME  FLAG)
EXTERNALINTEGERFNSPEC  EXIST(STRING (255)S)
SYSTEMROUTINESPEC  LOAD(STRING (31)COM, INTEGER  I,
      INTEGERNAME  FLAG)
SYSTEMROUTINESPEC  OUTFILE(STRING (31)S, INTEGER  LEN, MAX, PRM,
      INTEGERNAME  ADR, RES)
SYSTEMROUTINESPEC  PRINTMESS(INTEGER  I)
EXTERNALROUTINESPEC  PROMPT(STRING (255)S)
SYSTEMROUTINESPEC  UCTRANSLATE(INTEGER  ADR, LEN)
EXTERNALSTRINGFNSPEC  UINFS(INTEGER  N)
EXTERNALSTRINGFNSPEC  VDUS(INTEGER  I)
!
!
!
ROUTINE  RSTRG(STRINGNAME  S)
INTEGER  I
      S = ""
      CYCLE 
         READSYMBOL(I)
         IF  I = NL START 
            RETURN  UNLESS  S = ""
         FINISH  ELSE  S = S . TOSTRING(I)
      REPEAT 
END 
!
!
!
STRINGFN  ITOS(INTEGER  VALUE)
STRING (11)S
STRING (1)SIGN
INTEGER  J
   SIGN = ""
   S = ""
   SIGN = "-" AND  VALUE = -VALUE IF  VALUE < 0
   CYCLE 
      J = VALUE
      VALUE = VALUE//10
      J = J-VALUE*10+'0'
      S = TO STRING(J).S
      EXIT  IF  VALUE <= 0
   REPEAT 
   RESULT  = SIGN.S
END 
INTEGERFN  STOI(STRING (255)S, INTEGERNAME  I)
STRING (63)P
INTEGER  TOTAL, SIGN, AD, J, HEX
   HEX = 0
   TOTAL = 0
   SIGN = 1
   AD = ADDR(P)
A: IF  S -> P.(" ").S AND  P="" THEN  -> A;         !CHOP LEADING SPACES
   IF  S -> P.("-").S AND  P="" THEN  SIGN = -1
   IF  S -> P.("X").S AND  P="" THEN  HEX = 1 AND  -> A
   P = S
   UNLESS  S -> P.(" ").S THEN  S = ""
   I = 1
   WHILE  I <= BYTEINTEGER(AD) CYCLE 
      J = BYTE INTEGER(I+AD)
      -> FAULT UNLESS  '0' <= J <= '9' OR  (HEX # 0 C 
         AND  'A' <= J <= 'F')
      IF  HEX = 0 C 
      THEN  TOTAL = 10*TOTAL C 
      ELSE  TOTAL = TOTAL<<4+9*J>>6
      TOTAL = TOTAL+J&15
      I = I+1
   REPEAT 
   IF  HEX # 0 AND  I > 9 THEN  -> FAULT
   IF  I > 1 THEN  I = SIGN*TOTAL AND  RESULT  = 0
FAULT:
   I = 0
   RESULT  = 1
END 
!
!
!
ROUTINE  FILL(INTEGER  LEN, FROM, FILLER)
      RETURN  UNLESS  LEN > 0
!
      *LDTB_X'18000000'
      *LDB_LEN
      *LDA_FROM
      *LB_FILLER
      *MVL_L =DR 
END 
!
!
!
ROUTINE  PRINTCHS(STRING (255)S)
SYSTEMINTEGERFNSPEC  IOCP(INTEGER  EP, PARM)
INTEGER  LEN, ADR, RES; ! KEEP IN THIS ORDER !!!!
      RETURN  IF  LENGTH(S) = 0
      LEN = LENGTH(S)
      ADR = ADDR(S) + 1
      RES = IOCP(19, ADDR(LEN))
END 
!
!
!
ROUTINE  SORT STRINGS(STRINGARRAYNAME  U, INTEGER  N)
! U declared 1:N
INTEGER  I, J, K, M
STRING (255)W
      RETURN  IF  N < 1
!
            M = 1
            M = M << 1 WHILE  M <= N
            M = M - 1
!
            CYCLE 
               M = M >> 1
               EXIT  IF  M = 0
               CYCLE  I = 1, 1, N-M
                  K = I
                  WHILE  K > 0 CYCLE 
                     J = K + M
!
                     EXIT  IF  U(K) <= U(J)
                     W = U(J)
                     U(J) = U(K)
                     U(K) = W
!
                     K = K - M
                  REPEAT 
               REPEAT 
            REPEAT 
END 
!
!
!
ROUTINE  FILES(STRING (6)USER)
INTEGER  J, N, TOT
STRING (11)ARRAY  S(1:256)
RECORDFORMAT  INFF(STRING (11)NAME, INTEGER  S0, KB, S1, S2, S3)
RECORD (INFF)ARRAY  INF(0:254)
EXTERNALINTEGERFNSPEC  DFILENAMES(STRING (6)USER,
      RECORD (INFF)ARRAYNAME  INF, INTEGERNAME  JUNK, N, TOT,
      INTEGER  FSYS, TYPE)
      N = 255
      J = DFILENAMES(USER, INF, J, N, TOT, -1, 0)
      IF  N > 0 = J START 
         CYCLE  I = 1, 1, N
            S(I) = INF(I-1)_NAME
         REPEAT 
         IF  TOT > N START 
            S(N+1) = "{".ITOS(TOT - N)." more}"
            N = N + 1
         FINISH 
      FINISH 
      SORTSTRINGS(S, N)
      STRINGS TO FILE(S, N, "T#FILES", "")
END 
!
!
!
ROUTINE  PDFILE(INTEGER  BASE, STRING (11)FILE, STRING (255)HDR)
INTEGER  N, I
STRING (11)ARRAY  S(1:2048)
RECORDFORMAT  FHDRF(INTEGER  NFB, TXTST, MAX, TYPE, CHKSUM,
      TIMESTAMP, ADR, COUNT)
RECORDFORMAT  MEMF(INTEGER  START, STRING (11)NAME, INTEGER  A,B,C,D)
RECORD (MEMF)ARRAYFORMAT  MEMSF(0:2047)
RECORD (FHDRF)NAME  H
RECORD (MEMSF)ARRAYNAME  MEMS
      H == RECORD(BASE)
      N = H_COUNT
      IF  N = 0 START 
         N = 1
         S(1) = "**empty**"
      FINISH  ELSE  START 
         MEMS == ARRAY(BASE+H_ADR, MEMSF)
         CYCLE  I = 1, 1, N
            S(I) = MEMS(I-1)_NAME
         REPEAT 
      FINISH 
      SORT STRINGS(S, N)
      STRINGS TO FILE(S, N, FILE, HDR)
END 
!
!
!
INTEGER  I, J, C, L, ERR, T, EOF, C0, STATE, CH, P, Q
INTEGER  A, AS1, BOF, L0
STRING (31)CS
STRING (255)S, ASREAD, SLAST, W1, W2
BYTEINTEGERARRAY  OLDSCREEN, SCREEN(1:23*80)
!
RECORD (RF)R
!
CONSTINTEGER  MAXW = 32
RECORD (WF)ARRAYFORMAT  WSF(1:MAXW)
RECORD (WF)ARRAYNAME  WS
RECORD (WF)NAME  W
INTEGERARRAYFORMAT  SVF(1:MAXW)
INTEGERARRAYNAME  SV
INTEGERNAME  NOS
INTEGERARRAY  INT(1:15)
STRING (31)ARRAY  STR(1:15)
!
!
CONSTINTEGER  NCOMS = 9
CONSTSTRING (1)ARRAY  COMS(1:NCOMS) = "W", "S", "*", ":", "C", "L",
      "?", "X", "Q"
SWITCH  COM(1:NCOMS)
!
!
CONSTINTEGER  HORIZ = '-'
CONSTINTEGER  VERT = '|'
CONSTINTEGER  CRNR = '+'
SWITCH  SW(0:6)
ROUTINE  WRSN(STRING (255)S, INTEGER  N)
      PRINTSTRING(S)
      WRITE(N, 1)
      NEWLINE
END 
!
!
!
ROUTINE  WRS(STRING (255)S)
      PRINTSTRING(S)
      NEWLINE
END 
!
!
ROUTINE  MSG(INTEGER  I)
CONSTSTRING (15)ARRAY  T(1:5) = C 
"window no",
"screen line",
"screen col",
"no of lines",
"no of cols"
!
!
!
      ERR = 1 IF  I > 0
      I = -I AND  PRINTSTRING("**WARNING ") IF  I < 0
      WRS(T(I))
END 
!
!
      CS = VDUS(1)
      AS1 = ADDR(SCREEN(1))
      FILL(23*80, ADDR(OLDSCREEN(1)), ' ')
      SLAST = ""
!      PROMPT("Desk: ")
      VVINIT(J)
      RETURN  UNLESS  J = 0
      VV DEFINE TRIGGERS(3, 0, 0)
      DESKDATA = "DESKDATA" IF  DESKDATA = ""
!
      IF  EXIST(DESKDATA) = 0 START 
         OUTFILE(DESKDATA, 4064, 0, 0, A, J)
         PRINTMESS(J) AND  RETURN  UNLESS  J = 0
!
         NOS == INTEGER(A+32)
         SV == ARRAY(A+36, SVF)
         WS == ARRAY(A+36+4*MAXW, WSF)
!
         NOS = 0
         CYCLE  I = 1, 1, MAXW
            SV(I) = 0
            WS(I) = 0
         REPEAT 
      FINISH  ELSE  START 
         CONNECT(DESKDATA, 3, 0, 0, R, J)
         PRINTMESS(J) AND  RETURN  UNLESS  J = 0
         A = R_ADR
         NOS == INTEGER(A+32)
         SV == ARRAY(A+36, SVF)
         WS == ARRAY(A+36+4*MAXW, WSF)
         CYCLE  I = 1, 1, MAXW
            W == WS(I)
            UNLESS  W_NAME = "" START 
               FILES(UINFS(1)) IF  W_NAME = "T#FILES"
               CONNECT(W_NAME, 1, 0, 0, R, J)
               IF  J = 0 START 
                  W_START = R_ADR + R_START
                  W_END = R_ADR + R_END
                  W_CP = W_START
!
                  IF  W_L0 > 1 START ; ! move forward
                     T = W_CP
                     Q = W_L0 - 1; ! number of lines to move
                     CYCLE 
                        CH = BYTEINTEGER(T)
                        T = T + 1
                        Q = Q - 1 IF  CH = NL
                        W_CP = T AND  EXIT  IF  Q = 0 OR  T > W_END
                     REPEAT 
                  FINISH 
               FINISH  ELSE  W = 0
            FINISH 
         REPEAT 
         -> LOOP IF  NOS = 0
         J = 0
         CYCLE  I = 1, 1, NOS
            IF  0 < SV(I) <= MAXW START 
               IF  WS(SV(I))_NAME # "" START 
                  J = J + 1
                  SV(J) = SV(I)
               FINISH 
            FINISH  ELSE  EXIT 
         REPEAT 
         NOS = J
         -> COM(3) IF  NOS > 0; ! Display
      FINISH 
LOOP:
!      RSTRG(S)
      VVGOTO(0, 23)
      PRINTSTRING("Desk: ")
      VVRSTRG(S)
      ASREAD = S ."###"
LENGTH(S) = LENGTH(S)-1
      UCTRANSLATE(ADDR(S)+1, LENGTH(S))
!
      IF  CHARNO(S, 1) = '!' START 
         S -> ("!") . S
         IF  S = "" START 
            -> LOOP IF  SLAST = ""
            S = SLAST
         FINISH  ELSE  SLAST = S
         W1 = "" UNLESS  S -> S . (" ") . W1
         LOAD(S, 0, J)
         IF  J = 0 START 
            CALL(S, W1)
            PROMPT("Desk: ")
         FINISH  ELSE  WRS("?")
         -> LOOP
      FINISH 
!
      S = W1." ".W2 WHILE  S-> W1.("  ").W2
      S = W1.",".W2 WHILE  S-> W1.(" ").W2
      S = S . ","
      I = 0
      I=I+1 AND  J=STOI(STR(I), INT(I)) WHILE  S -> STR(I+1).(",").S
      CYCLE  J = 1, 1, NCOMS
         -> COM(J) IF  STR(1) = COMS(J)
      REPEAT 
      WRS(STR(1) . "???")
      -> LOOP
COM(1):     ! W(INDOW)  num user.file sl sc l c l0 c0
      WRS("???") AND  -> LOOP IF  I < 3
      ERR = 0
      INT(9) = 1 IF  I < 9
      INT(8) = 1 IF  I < 8
      INT(7) = 80 IF  I < 7
      INT(6) = 23 IF  I < 6
      INT(5) = 1 IF  I < 5
      INT(4) = 1 IF  I < 4
      MSG(1) UNLESS  1 <= INT(2) <= MAXW
      MSG(2) UNLESS  1 <= INT(4) <= 23
      MSG(3) UNLESS  1 <= INT(5) <= 80
      MSG(4) UNLESS  1 <= INT(6) <= 23
      MSG(5) UNLESS  1 <= INT(7) <= 80
      INT(6) = 24 - INT(4) IF  INT(4)+INT(6) > 24
      INT(7) = 81 - INT(5) IF  INT(5)+INT(7) > 81
      -> LOOP UNLESS  ERR = 0
      INT(8) = 1 IF  INT(8) < 1
      INT(9) = 1 IF  INT(9) < 1
!
      IF  STR(3) = "!FILES" START 
         FILES(UINFS(1))
         STR(3) = "T#FILES"
      FINISH 
CONN:
      CONNECT(STR(3), 1, 0, 0, R, J)
      UNLESS  J = 0 START 
         PRINTMESS(J)
         WRS("Filename: ".STR(3))
         -> LOOP
      FINISH 
      W == WS(INT(2))
!
      UNLESS  R_TYPE = 3 START 
         IF  R_TYPE = 6 START ; ! PD file
            STR(3) = "T#".STR(3)
               LENGTH(STR(3)) = 11 IF  LENGTH(STR(3)) > 11
            PDFILE(R_ADR, STR(3), "")
            -> CONN
         FINISH  ELSE  WRS("Wrong kind of file") AND  -> LOOP
      FINISH 
!
      W = 0
      W_NAME = STR(3)
      W_START = R_ADR + R_START
      W_END = R_ADR + R_END
      W_CP = W_START
      W_SL = INT(4)
      W_SC = INT(5)
      W_L = INT(6)
      W_C = INT(7)
      W_TB = (W_SL-2)*80+W_SC-1 IF  W_SL > 1
      W_BB = (W_SL+W_L-1)*80+W_SC-1 IF  W_SL+W_L<24
      W_L0 = INT(8)
      W_C0 = INT(9)
      -> LOOP
COM(2):     ! SCREEN VECTOR
      WRS("?") AND  -> LOOP UNLESS  1 < I <= MAXW+1
      NOS = I - 1
      CYCLE  J = 2, 1, I
         SV(J-1) = INT(J)
      REPEAT 
      -> LOOP
COM(3):     ! DISPLAY
COM(4):
      WRS("No S") AND  -> LOOP IF  NOS = 0
!      PRINTCHS(CS) %AND NEWLINE %UNLESS CS = ""
      FILL(23*80, ADDR(SCREEN(1)), ' ')
      CYCLE  J = 1, 1, NOS
         W == WS(SV(J))
         T = W_CP
         EOF = W_END
!
         CYCLE  P = 0, 1, 1
            Q = W_TB
            Q = W_BB IF  P = 1
            IF  Q > 0 START 
               Q = Q + AS1
               FILL(W_C, Q, HORIZ)
               BYTEINTEGER(Q-1) = CRNR IF  W_SC > 1
               BYTEINTEGER(Q+W_C) = CRNR IF  W_SC+W_C < 81
            FINISH 
         REPEAT 
         CYCLE  L = 1, 1, W_L
            A = AS1 + (W_SL + L - 2)*80 + W_SC - 1
            C0 = W_C0
            C = W_C
!
            BYTEINTEGER(A-1) = VERT IF  W_SC > 1; ! left border
            BYTEINTEGER(A+C) = VERT IF  W_SC+C < 81; ! right border
!
            CH = 0
            STATE = 0
            STATE = 1 IF  C0 <= 1
L:
            CH = -2 IF  T > EOF
            UNLESS  CH < 0 START 
               CH = BYTEINTEGER(T)
               T = T + 1
               CH = -1 IF  CH = NL
            FINISH 
            STATE = STATE ! 4 IF  CH < 0; ! EOF or EOL
            -> SW(STATE)
SW(0):
            C0 = C0 - 1; ! ignoring first part of line
            STATE = 1 IF  C0 <= 1
            -> L
SW(1):
            BYTEINTEGER(A) = CH; ! filling
            A = A + 1
            C = C - 1
            STATE = 2 UNLESS  C > 0
            -> L
SW(2):
            -> L; ! skipping to eol
SW(4):
SW(5):
      BYTEINTEGER(A) = ' '
      A = A + 1
      C = C - 1
      STATE = 6 UNLESS  C > 0
      -> L
SW(6):
         REPEAT 
      REPEAT 
!
      J = 1
      CYCLE  L = 1, 1, 23
      P = 0
      CYCLE  C = 1, 1, 80
         IF  OLDSCREEN(J) = SCREEN(J) START 
            P = 0
         FINISH  ELSE  START 
            OLDSCREEN(J) = SCREEN(J)
            IF  P = 0 START 
               P = 1
               VVGOTO(C-1, L-1)
            FINISH 
            PRINTCH(SCREEN(J))
         FINISH 
         J = J + 1
      REPEAT 
      REPEAT 
      -> LOOP
      J = 1
      CYCLE  L = 1, 1, 23
      CYCLE  C = 1, 1, 80
         PRINTSYMBOL(SCREEN(J))
         J = J + 1
      REPEAT 
      NEWLINE
      REPEAT 
      -> LOOP
COM(5):      ! C
      WRS("?") AND  -> LOOP UNLESS  I > 1
      MSG(1) UNLESS  1 <= INT(2) <= MAXW
      W == WS(INT(2))
      MSG(1) AND  -> LOOP IF  W_NAME = ""
      INT(3) = W_C IF  I < 3
      Q = INT(3)
      W_C0 = W_C0 + Q
      W_C0 = 1 IF  W_C0 < 1
      W_C0 = 130 IF  W_C0 > 130
      -> LOOP
COM(6):    ! L
      WRS("?") AND  -> LOOP UNLESS  I > 1
      P = INT(2)
      MSG(1) AND  -> LOOP UNLESS  1 <= P <= MAXW
      W == WS(P)
      MSG(1) AND  -> LOOP IF  W_NAME = ""
!
      IF  I = 3 START 
         S = STR(3)
         L = LENGTH(S)
         IF  L > 0 AND  CHARNO(S, L) = '%' START 
            LENGTH(S) = L - 1
            IF  STOI(S, L) = 0 START 
               IF  L > 99 START 
                  W_CP = W_END
                  W_L0 = 1000000
               FINISH  ELSE  START 
                  W_L0 = 1
                  IF  L > 0 START 
                     T = ((W_END - W_START)*L)//100 + W_START
                     T = T + 1 WHILE  BYTEINTEGER(T)#NL
                     W_CP = T + 1
                  FINISH  ELSE  W_CP = W_START
               FINISH 
            FINISH  ELSE  WRS("?")
            -> LOOP
         FINISH 
      FINISH 
!
      INT(3) = W_L IF  I < 3
      Q = INT(3)
!
      -> LOOP IF  Q = 0; ! no op
      T = W_CP
      L0 = W_L0
      IF  Q > 0 START ; ! go forward
         EOF = W_END
         -> LOOP IF  T > EOF
         CYCLE 
            CH = BYTEINTEGER(T)
            T = T + 1
            Q = Q - 1 AND  L0 = L0 + 1 IF  CH = NL
            W_CP = T AND  W_L0 = L0 AND  -> LOOP IF  Q = 0 OR  T > EOF
         REPEAT 
      FINISH  ELSE  START 
         BOF = W_START
         -> LOOP IF  T = BOF
         T = T - 1
         CYCLE 
            T = T - 1
            W_CP = T + 1 AND  W_L0 = L0 AND  -> LOOP IF  Q = 0 OR  T <= BOF
            Q = Q + 1 AND  L0 = L0 - 1 IF  BYTEINTEGER(T) = NL
         REPEAT 
      FINISH 
COM(7):      ! ?
      CYCLE  J = 1, 1, MAXW
         W == WS(J)
         UNLESS  W_NAME = "" START 
            PRINTSTRING("W")
            WRITE(J, 2)
            SPACE
            PRINTSTRING(W_NAME)
            WRITE(W_SL, 2)
            WRITE(W_SC, 2)
            WRITE(W_L,  2)
            WRITE(W_C,  2)
            WRITE(W_L0, 2)
            WRITE(W_C0, 2)
            NEWLINE
         FINISH 
      REPEAT 
!
      IF  NOS > 0 START 
         PRINTSTRING("S ")
         CYCLE  J = 1, 1, NOS
            WRITE(SV(J), 2)
         REPEAT 
         NEWLINE
      FINISH 
      -> LOOP
COM(8):      ! X
      NOS = 0
      CYCLE  J = 1, 1, MAXW
         SV(J) = 0
         WS(J) = 0
      REPEAT 
      -> LOOP
COM(9):    ! Q
      VV DEFINE TRIGGERS(0, 0, 0)
END 
ENDOFFILE