home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / source / zlist.seq < prev    next >
Text File  |  1991-03-28  |  25KB  |  536 lines

  1. \\ ZLIST.SEQ             A file LISTer           written by Tom Zimmer
  2.  
  3.   ZLIST is a simple file lister, it allows viewing and searching through
  4. text files of any length.
  5.  
  6.   ZLIST IS PUBLIC DOMAIN, ALL RESPONSIBILITY FOR ITS USE IS ASSUMED BY
  7. YOU THE USER.
  8.  
  9.   ZLIST was written in the Forth computer language, and compiled to pure
  10. CALL threaded object code by TCOM.
  11.  
  12.   TCOM is a PUBLIC DOMAIN, optimizing (space & speed) Target COMpiler
  13. that generates CALL threaded object code ".COM" files.
  14.  
  15.   This 18k source file compiles into a 12k .COM file in less than 10 seconds
  16. on a 16mhz 80386 computer.
  17.  
  18.   TCOM was written by Tom Zimmer.
  19.  
  20.   If you would like to obtain a copy of TCOM, send a donation to $60 to:
  21.  
  22.                 Tom Zimmer
  23.                 292 Falcato Drive
  24.                 Milpitas, Ca. 95035     Home: (408) 263-8859
  25.                                         Work: (408) 954-6946
  26.  
  27. -------------------------------------------------------------------------
  28.  
  29. Compiling:      TCOM ZLIST <Enter>              \ you will need TCOM
  30.                                                 \ to do this.
  31.  
  32. Usage:          ZLIST <filename> <optional_word_to_find> <Enter>
  33.  
  34.         Press F1 while in ZLIST, for help if you need it.
  35.  
  36. Note:   Words that start with the "%" symbol in column one of the file
  37.         being listed will not be displayed. This allows formatting your
  38.         files with these special help section start words, which you
  39.         will search for, but will not be displayed to the user.
  40.  
  41.         You can actually specify any word on the command line after the
  42.         filename, and ZLIST will find it and place it on the second
  43.         line of the display.
  44.  
  45. -------------------------------------------------------------------------
  46.  
  47. {
  48.  
  49. \fpc    ' ?cs: alias ?ds:
  50.  
  51. \fpc    code blink_off  ( -- )
  52. \fpc                    mov ax, # $1003
  53. \fpc                    mov bl, # $00           \ disable blink
  54. \fpc                    INT $10
  55. \fpc                    next    end-code
  56.  
  57. \fpc    ONLY FORTH ALSO DEFINITIONS HIDDEN ALSO
  58.  
  59. \ define and reference these following color words NOW, to force them
  60. \ to be allocated in memory now, and to be contiguous.
  61.  
  62. ltblue value hi1bg      hi1bg drop
  63. white  value hi1fg      hi1fg drop
  64. yellow value hi2bg      hi2bg drop
  65. black  value hi2fg      hi2fg drop
  66. dkgray value txtbg      txtbg drop
  67. white  value txtfg      txtfg drop
  68.  
  69.  
  70. 16384   constant listlimit      \ file buffer size limit
  71. 12288   constant listhi         \ hi water mark for buffer fill
  72.  4096   constant listlo         \ lo water mark for buffer fill
  73.    22   constant displaylines   \ number of lines to display on screen
  74.  
  75. handle listhndl                 \ current file handle
  76. handle listhndl2                \ new file handle
  77.  
  78. \ -------------------------------------------------------------------------
  79. \ Some values needed by program.
  80. \ I like values as I think they are more readable than variables. T.Z.
  81.  
  82. 0 value hif                     \ hilight colors have been modified
  83. 0 value listblk                 \ 4k block number of lowest block in memory
  84. 0 value listlen                 \ quantity of text in buffer
  85. 0 value listoff                 \ offset in buffer of top line of display
  86. 0 value listoffmax              \ highest allowable line in this file
  87. 0 value listblkmax              \ highest allowable block number
  88. 0 value listbuf                 \ pointer to 16k text buffer
  89. 0 value listscroll              \ horizontal scrolling offset
  90. 0 value lfindbuf                \ search text buffer
  91. 0 value lfindoff                \ column offset where text last found
  92. 0 value lfound                  \ was text found flag
  93. 0 value lfound1st
  94. 0 value lfcnt
  95.  
  96. defer >hilight                  \ hilight defered words
  97. defer >hilight2
  98. defer >text
  99.  
  100. \ -------------------------------------------------------------------------
  101.  
  102. : >hi1          ( -- )          \ hilight one, for status lines
  103.                 hi1bg >bg hi1fg >fg ;
  104.  
  105. : >hi2          ( -- )          \ hilight two, for search found text
  106.                 hi2bg >bg hi2fg >fg ;
  107.  
  108. : >txt          ( -- )          \ normal text
  109.                 txtbg >bg txtfg >fg ;
  110.  
  111. : ?save_colors  ( -- )
  112.                 hif 0= ?exit
  113.                 " ZLIST.COM" ">$ listhndl $>handle
  114.                 read-write listhndl hopen ?exit
  115.                 ?ds: ?cs: - $10 * $100 - &> hi1bg + 0   \ offset into file
  116.                 listhndl movepointer                    \ adj file pointer
  117.                 &> hi1bg 12 listhndl hwrite drop        \ write colors
  118.                 listhndl hclose drop ;
  119.  
  120. : eeol          ( -- )          \ erase to end of line
  121.                 cols #out @ - 1- 0max spaces ;
  122.  
  123. : leeol         ( -- )          \ erase to end of line
  124.                 cols #out @ - 1- 0max 0 ?do  ." ─"  loop    ;
  125.  
  126. : .first_line   ( a1 n1 -- a2 n2 )      \ if search text found,
  127.                                         \ bolden first line
  128.                 >hilight ." │" >text
  129.                 2dup  $0A scan 2dup 2>r nip - 1- 0max
  130.                 over c@ '%' =
  131.                 if      2dup bl scan 2dup 2>r nip - spaces drop 2r>
  132.                 then    listscroll /string cols 2- min
  133.                 lfound1st
  134.                 if      off> lfound1st
  135.                         listscroll lfindoff cols 1- > or
  136.                         if      >hilight2
  137.                         else    over lfindoff    type
  138.                                 lfindoff    /string >hilight2
  139.                                 over lfindbuf c@ type
  140.                                 lfindbuf c@ /string >text
  141.                         then
  142.                 then    type eeol cr 2r> 1 /string ;
  143.  
  144. : .one_line     ( a1 n1 -- a2 n2 )      \ display one line of screen
  145.                 >hilight ." │" >text
  146.                 2dup  $0A scan 2dup 2>r nip - 1- 0max
  147.                 over c@ '%' =
  148.                 if      2dup bl scan 2dup 2>r nip - spaces drop 2r>
  149.                 then    listscroll /string cols 2- min type
  150.                 eeol cr 2r> 1 /string ;
  151.  
  152. : dolist        ( -- )          \ list current displaylines of file
  153.                 0 1 at
  154.                 listbuf listlen listoff /string
  155.                 .first_line
  156.                 displaylines 1- 0               \ display rest of screen
  157.                 do      .one_line
  158.                 loop    2drop ;
  159.  
  160. : .emptyscr     ( -- )          \ list current displaylines of file
  161.                 0 1 at
  162.                 listbuf 0
  163.                 .first_line
  164.                 displaylines 1- 0               \ display rest of screen
  165.                 do      .one_line
  166.                 loop    2drop ;
  167.  
  168. : .rbar         ( -- )          \ display the right bar with file offset
  169.                 savecursor >hilight
  170.                 listhndl endfile nip
  171.                 if      listblk 4096 *d listoff 0 d+ 100 mu/mod rot drop
  172.                         listhndl endfile 100 mu/mod rot drop
  173.                         displaylines um/mod nip 1 max
  174.                 else    listblk 4096 *d listoff 0 d+
  175.                         listhndl endfile displaylines um/mod nip 1 max
  176.                 then
  177.                 um/mod nip 1+ displaylines ( 1+ ) min dup 1
  178.                 ?do     cols 1-    i at ." │"
  179.                 loop    cols 1- over at ." █"
  180.                 1+ displaylines 1+ swap over min
  181.                 ?do     cols 1-    i at ." │"
  182.                 loop    restcursor ;
  183.  
  184. : %+1line       ( -- n1 )               \ forward a line in the file
  185.                                         \ with auto buffer refilling
  186.                 listoff listhi >                \ in last 4k block
  187.                 listlen listlimit = and         \ and buffer full
  188.                 if      listbuf dup listlo + swap listhi cmove
  189.                                                 \ move back low water mark
  190.                         listblk 4 + listlo *d listhndl movepointer
  191.                         listbuf listhi + listlo listhndl hread
  192.                         listhi + !> listlen
  193.                         incr> listblk
  194.                         listlo negate +!> listoff
  195.                 then
  196.                 listbuf listlen listoff /string  $0A scan drop 1+ listbuf - ;
  197.  
  198. : +1line        ( -- )          \ forward a line in file, limit forward
  199.                                 \ movement to top of last screen full in file
  200.                 %+1line
  201.                 listblk listblkmax =            \ if at end of file
  202.                 if      listoffmax umin         \ then limit to last screen
  203.                 then    !> listoff ;
  204.  
  205. : f+1line       ( -- )          \ forward a line in file, no forward limit
  206.                 %+1line !> listoff ;
  207.  
  208. : -1line        ( -- )          \ back a line in file with auto buffer
  209.                                 \ refilling
  210.                 listoff listlo <
  211.                 listblk 0> and
  212.                 if      listbuf dup listlo + listlen listlo - cmove>
  213.                         decr> listblk
  214.                         listblk listlo *d listhndl movepointer
  215.                         listbuf listlo listhndl hread drop
  216.                         listlimit !> listlen
  217.                         listlo +!> listoff
  218.                 then
  219.                 listoff 0=
  220.                 listoff 2- 0= or
  221.                 if      off> listoff
  222.                 else    listoff 2- listbuf over + swap
  223.                          $0A -scan drop
  224.                         dup c@ $0A =            \ if we found a LINEFEED
  225.                         if      1+              \ then bump to next char
  226.                         then    listbuf - !> listoff
  227.                 then    ;
  228.  
  229. : lpgdn         ( -- )          \ forward "displaylines" into file
  230.                 displaylines 0   do  +1line  loop
  231.                 off> lfound .rbar ;
  232.  
  233. : %lpgup        ( -- )          \ backward "displaylines" into file
  234.                 displaylines 0   do  -1line  loop  ;
  235.  
  236. : lpgup         ( -- )
  237.                 %lpgup
  238.                 off> lfound .rbar ;
  239.  
  240. : lhome         ( -- )          \ to top of file
  241.                 0 !> listblk
  242.                 0.0 listhndl movepointer
  243.                 listbuf listlimit listhndl hread !> listlen
  244.                 off> listoff
  245.                 off> listscroll
  246.                 off> lfound
  247.                 .rbar ;
  248.  
  249. : %lend         ( -- )          \ to bottom of file, actually limited
  250.                                 \ to bottom of file minus one page full
  251.                 listhndl endfile listlo um/mod nip 3 - 0max !> listblk
  252.                 listblk listlo *d listhndl movepointer
  253.                 listbuf listlimit listhndl hread !> listlen
  254.                 listlen !> listoff
  255.                 %lpgup ;
  256.  
  257. : lend          ( -- )
  258.                 %lend
  259.                 off> lfound .rbar ;
  260.  
  261. : lleft         ( -- )          \ scroll screen left
  262.                 listscroll 8 - 0max !> listscroll ;
  263.  
  264. : lright        ( -- )          \ scroll screen right
  265.                 listscroll 8 + listlo min !> listscroll ;
  266.  
  267. : lafind        ( -- )          \ search for already entered text again
  268.                 listblk listoff
  269.                 lfound
  270.                 if      f+1line
  271.                 then    2>r
  272.                 off> lfcnt
  273.                 off> lfound
  274.                 1 1 at >hilight ."   Searching ..." eeol
  275.                 begin   lfindbuf count
  276.                         listbuf listlen listoff /string
  277.                         2dup  $0A scan nip - 1- 0max search 0=
  278.                         listoff listlen < and
  279.                 while   drop f+1line
  280.                         incr> lfcnt
  281.                         lfcnt 255 and 0=
  282.                         if      .rbar
  283.                         then
  284.                 repeat  !> lfindoff
  285.                 1 displaylines 1+ at
  286.                 listoff listlen >=
  287.                 if      ."  Text not found " leeol beep
  288.                         2r> !> listoff !> listblk
  289.                         listblk listlo *d listhndl movepointer
  290.                         listbuf listlimit listhndl hread !> listlen
  291.                 else    2r> 2drop
  292.                         on> lfound
  293.                         on> lfound1st
  294.                         ."  Text found at column " lfindoff . leeol
  295.                 then    >text .rbar ;
  296.  
  297. : lfind         ( -- )          \ enter text and search for it
  298.                 1 1 at >hilight ."  Text to find:" eeol
  299.                 >hilight2
  300.                 on> autoclear
  301.                 16 1 lfindbuf 32 lineeditor >text       \ get text from user
  302.                 if      lafind                          \ and go find it
  303.                 then    ;
  304.  
  305. : lhfind        ( -- )          \ find word at program startup
  306.                 bl word count lfindbuf place
  307.                 lfindbuf c@ 0= ?exit    \ leave if no word specified
  308.                 lafind
  309.                 lfound
  310.                 if      -1line
  311.                 then    off> lfound
  312.                 lfindbuf off ;
  313.  
  314. : .listing_file ( -- )          \ display the current filename
  315.                 >hilight 0  0 at
  316.                 ." ┌ Listing: " listhndl count type space
  317.                 leeol ." ┐" >text ;
  318.  
  319. : .lastline     ( -- )          \ show the last line of display
  320.                  0 displaylines 1+ at >hilight
  321. ." └ ESC=Quit,   ^O=Open another file,    F6=Find,   P=file to Printer,   F1=Help ┘" >text ;
  322.  
  323. : lendset       ( -- )          \ set end of file markers
  324.                 %lend                   \ goto last displayable screen
  325.                 listoff !> listoffmax   \ set max pameters for use later
  326.                 listblk !> listblkmax
  327.                 lhome ;                 \ go back to top of file
  328.  
  329. : lopen         ( -- )          \ open a new file
  330.                 1 1 at >hilight ."  File to open:" eeol
  331.                 >hilight2
  332.                 on> autoclear
  333.                 16 1 listhndl2 63 lineeditor            \ get file from user
  334.                 >text 0= ?exit                          \ leave if canceled
  335.                 listhndl2 count + off                   \ null terminate
  336.                 listhndl2 hopen 0=                      \ try to open it
  337.                 if                                      \ if it worked,
  338.                         listhndl hclose drop            \ then close old file
  339.                         listhndl2 listhndl b/hcb cmove  \ move in new file
  340.                         listbuf listlimit listhndl hread \ read new file
  341.                         !> listlen                      \ set the read length
  342.                         off> listblk                    \ block to zero
  343.                         .listing_file                   \ show file listing
  344.                         lendset                         \ set end stuff
  345.                 else    1 23 at >hilight
  346.                         ."  Couldn't open file!" leeol beep >text
  347.                 then    ;
  348.  
  349. : sp>col        ( n1 -- )       \ spaces upto column n1
  350.                 #out @ - 0max spaces ;
  351.  
  352. : eeol_cr_bar   ( -- )
  353.                 eeol >hilight ." │" cr ." │" >text ;
  354.  
  355. : do_zprint    ( -- )          \ copy current file to printer
  356.                 " COPY "    tib  place
  357.                 listhndl count tib +place
  358.                 "  PRN>NUL" tib +place
  359.                 tib $sys drop
  360.                 ^L pemit  ;                     \ send a FORMFEED
  361.  
  362. : zprint        ( -- )          \ print current file
  363.                 1 1 at
  364.                 ?printer.ready          \ and printer is online
  365.                 if      >hilight  ."  Printing .... " eeol
  366.                         do_zprint
  367.                 else    >hilight2 ."  *** Printer is OFFLINE ***" eeol
  368.                         beep    1 seconds
  369.                 then    >text ;
  370.  
  371. : %lhelp        ( -- )          \ show some help information
  372.                 0 1 at  >hilight ." │" >text                    eeol_cr_bar
  373.                 35 sp>col >hilight2 ."  HELP! " >text           eeol_cr_bar
  374.                                                                 eeol_cr_bar
  375.                 ."      F1 = Display this help screen"       45 sp>col
  376.                   ."  Home = Top of file"                       eeol_cr_bar
  377.                 ."      F6 = Specify and find text in file"  45 sp>col
  378.                   ."   End = End of file"                       eeol_cr_bar
  379.                 ."  Alt-F6 = Find next occurance of text"    45 sp>col
  380.                   ."      = Up   one line"                     eeol_cr_bar
  381.                 ."     F10 = Leave ZLIST and return to DOS"  45 sp>col
  382.                   ."      = Down one line"                     eeol_cr_bar
  383.                 ."     ESC = Leave ZLIST and return to DOS"  45 sp>col
  384.                   ."  PgUp = Up   22 lines in file"             eeol_cr_bar
  385.                 ."      ^O = Specify and OPEN a new file"    45 sp>col
  386.                   ."  PgDn = Down 22 lines in file"             eeol_cr_bar
  387.                 12 sp>col
  388.                 ."  F3,F5,F7=FG & Alt-F3,F5,F7=BG adjust colors while in HELP"
  389.                                                                 eeol_cr_bar
  390.                                                                 eeol_cr_bar
  391.                 21 sp>col >hilight2
  392.                 ."  ZLIST is a PUBLIC DOMAIN PROGRAM " >text    eeol_cr_bar
  393.                                                                 eeol_cr_bar
  394. ."     ZLIST was written using TCOM, a Target COMpiler for the Forth computer"
  395.                                                                 eeol_cr_bar
  396. ."     language. TCOM is a PUBLIC DOMAIN PROGRAM written by Tom Zimmer."
  397.                                                                 eeol_cr_bar
  398. ."     TCOM is available for a $60 donation, from:  "
  399.                           >hilight2 ."  Tom Zimmer           " >text
  400.                                                                 eeol_cr_bar
  401.                 50 sp>col >hilight2 ."  292 Falcato Drive    " >text
  402.                                                                 eeol_cr_bar
  403.                 50 sp>col >hilight2 ."  Milpitas, Ca. 95035  " >text
  404.                                                                 eeol_cr_bar
  405.                                                                 eeol_cr_bar
  406.                 50 sp>col >hilight2 ."  Home: (408) 263-8859 " >text
  407.                                                                 eeol_cr_bar
  408.                 50 sp>col >hilight2 ."  Work: (408) 954-6946 " >text
  409.                                                                 eeol_cr_bar
  410.                                                                 eeol_cr_bar
  411.                 0 23 at
  412.                 >hilight ." └ Press " >hilight2 ."  ESC "
  413.                 >hilight ."  to continue file viewing "
  414.                 leeol ." ┘" >text ;
  415.  
  416. : dohelpkey     ( c1 -- )
  417.                 case
  418.         ( F3 )          189 of  incr> hi2fg on> hif  endof
  419.         ( F5 )          191 of  incr> hi1fg on> hif  endof
  420.         ( F7 )          193 of  incr> txtfg on> hif  endof
  421.         ( Alt-F3 )      234 of  incr> hi2bg on> hif  endof
  422.         ( Alt-F5 )      236 of  incr> hi1bg on> hif  endof
  423.         ( Alt-F7 )      238 of  incr> txtbg on> hif  endof
  424.                                 drop
  425.                 endcase ;
  426.  
  427. : lhelp         ( -- )
  428.                 .listing_file
  429.                 begin   .listing_file
  430.                         %lhelp
  431.                         key dup 127 >
  432.                 while   dohelpkey
  433.                 repeat  drop .lastline ;
  434.  
  435. : dolistkey     ( c1 -- )       \ handle keys entered by user
  436.                 case
  437.         ( ^home )       247 of  lhome           endof   \ top of file
  438.         ( ^end )        245 of  lend            endof   \ end of file
  439.         ( home )        199 of  lhome           endof   \ top of file
  440.         ( end )         207 of  lend            endof   \ end of file
  441.         ( up arrow )    200 of  -1line          endof   \ up one line
  442.         ( down arrow )  208 of  +1line          endof   \ down one line
  443.         ( left arrow )  203 of  lleft           endof   \ scroll left
  444.         ( right arrow ) 205 of  lright          endof   \ scroll right
  445.         ( pgup )        201 of  lpgup           endof   \ up 22 lines
  446.         ( pgdn )        209 of  lpgdn           endof   \ down 22 lines
  447.                          ^W of  -1line          endof   \ up one line
  448.                          ^Z of  +1line          endof   \ down one line
  449.                          ^E of  -1line          endof   \ up one line
  450.                          ^X of  +1line          endof   \ down one line
  451.                          ^R of  lpgup           endof   \ up 22 lines
  452.                          ^C of  lpgdn           endof   \ down 22 lines
  453.         ( enter )        13 of  +1line          endof   \ down one line
  454.         ( F6 )          192 of  lfind           endof   \ find text
  455.         ( Alt-F6 )      237 of  lafind          endof   \ find text again
  456.         ( F1 )          187 of  lhelp           endof   \ HELP
  457.                         ^O  of  lopen           endof   \ open a new file
  458.                         upc
  459.                         'P' of  zprint          endof   \ print cur file
  460.                                 drop
  461.                 endcase ;
  462.  
  463. : listshow      ( -- )          \ process user input & test for done
  464.                 .lastline
  465.                 begin   dolist                  \ update the screen
  466.                         key                     \ get a key from user
  467.         ( ESC )         dup   27 <>             \ while not ESC
  468.         ( F10 )         over 196 <> and         \ and not F10
  469.                 while   .lastline               \ update last screen line
  470.                         dolistkey               \ process the users key
  471.                 repeat  drop ;
  472.  
  473. : listread      ( | name -- )   \ read file into memory
  474.                 bl word c@ 0=                   \ get file from DOS cndline
  475.                 if      ." File to list: "      \ if enpty, prompt for file
  476.                         query bl word drop
  477.                 then
  478.                 here listhndl $>handle          \ move file to LISTHNDL
  479.                 listhndl hopen                  \ try to open the file
  480.                 abort"  Couldn't open file"     \ and abort if we couldn't
  481.                 listbuf listlimit listhndl hread \ then read the file
  482.                 !> listlen                      \ and set read length
  483.                 off> listblk ;                  \ and first block of file
  484.  
  485.  
  486. : ZLIST         ( | name -- )   \ this is the ZLIST program
  487.                 blink_off
  488.                 listread                        \ read first part of file
  489.                 lfindbuf off                    \ clear text find buffer
  490.                 listhndl2 clr-hcb               \ clear second file handle
  491.                 savecursor cursor-off           \ save cursor status
  492.                 ?vmode 7 =                      \ setup hilighting for vmode
  493.                 if      ['] >rev  is >hilight   \ for mono, use reverse
  494.                         ['] >rev  is >hilight2
  495.                         ['] >norm is >text
  496.                 else    ['] >hi1  is >hilight   \ for color
  497.                         ['] >hi2  is >hilight2
  498.                         ['] >txt  is >text
  499.                 then
  500.                 .listing_file                   \ show file we are listing
  501.                 >text                           \ select normal attributes
  502.                 lendset                         \ set the end of file stuff
  503.                 .emptyscr
  504.                 .lastline
  505.                 lhfind                          \ find word in first column
  506.                 listshow                        \ go list the file to user
  507.                 restcursor 0 displaylines 1+ at \ goto bottom of screen
  508.                 listhndl hclose drop            \ and close the file
  509.                                                 \ as we are leaving now
  510.                 ?save_colors ;
  511.  
  512. \ Following lines add compatibility for both F-PC and TCOM
  513.  
  514. \fpc listlimit array fpcbuf   fpcbuf   !> listbuf  \ init buffer for F-PC
  515. \fpc 34        array fpclfbuf fpclfbuf !> lfindbuf
  516.  
  517. \fpc \s         \ discard rest if using F-PC
  518.  
  519. : main          ( -- )          \ perform needed program setup for TCOM
  520.                                 \ I like "main", it sounds like "C".
  521.                 DECIMAL                         \ always select decimal
  522.                 listlimit ds:alloc !> listbuf   \ text buffer
  523.                 34        ds:alloc !> lfindbuf  \ search buffer
  524.                 INIT-CURSOR                     \ get intial cursor shape
  525.                 ?DS: SSEG !                     \ init search segment
  526.                 caps on                         \ case INSENSITIVE
  527.                 vmode.set                       \ video direct display
  528.                 $6000 SET_MEMORY                \ default to min code space
  529.                 DOS_TO_TIB                      \ move command tail to TIB
  530.                 COMSPEC_INIT                    \ init command specification
  531.                 ZLIST    ;
  532.  
  533.  
  534.  
  535.  
  536.