home *** CD-ROM | disk | FTP | other *** search
/ CD-ROM Magic 1995 #1 / CDM_5.ISO / shell / zippers / tinyprog.arj / TINYPROG.DOC < prev    next >
Encoding:
Text File  |  1991-01-01  |  22.3 KB  |  794 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.                This document describes the program TINYPROG.EXE.
  8.  
  9.  
  10.  
  11.                                                Tranzoa, Co.
  12.                                                P.O. Box 911
  13.                                                Maple Valley, WA  98038
  14.                                                (206) 432-3532
  15.  
  16.        -----------------------------------------------------------------
  17.  
  18.  
  19.                           WHAT TINYPROG DOES FOR YOU
  20.  
  21.  
  22.             Makes EXE or COM file programs smaller.
  23.  
  24.             Stops corrupted or patched programs from running.
  25.  
  26.             Makes EXE files as easy to self-configure as COM files.
  27.  
  28.             Encrypts programs to make internal text unreadable.
  29.  
  30.  
  31.        -----------------------------------------------------------------
  32.  
  33.  
  34.                           WHAT TINYPROG NEEDS TO RUN
  35.  
  36.  
  37.             PC or compatible computer.
  38.  
  39.             DOS 2.x or higher.
  40.  
  41.             90k bytes of memory plus 10k bytes for every 2500 relocation
  42.               table entries in EXE files to be converted.
  43.  
  44.  
  45.        -----------------------------------------------------------------
  46.  
  47.  
  48.                    WHAT PROGRAMS CONVERTED BY TINYPROG NEED
  49.  
  50.  
  51.             PC or compatible computer.
  52.  
  53.             DOS 2.x or higher.
  54.  
  55.             Possibly more memory than the original program. (See below.)
  56.  
  57.  
  58.        -----------------------------------------------------------------
  59.  
  60.  
  61.  
  62.                                   1
  63.  
  64.  
  65.  
  66.  
  67.                               HOW TO RUN TINYPROG
  68.  
  69.  
  70.             C>TINYPROG original.exe smaller.exe
  71.             or
  72.             C>TINYPROG original.com smaller.exe
  73.  
  74.             These   commands   convert  the  file,   ORIGINAL.xxx   into
  75.        SMALLER.EXE.   If  ORIGINAL.xxx is over a few K  bytes  in  size,
  76.        SMALLER.EXE  will be from 10% to 50% smaller.  When run,  SMALLER
  77.        may  load  slightly  slower from RAM disks and  hard  disks  than
  78.        ORIGINAL.xxx  did.   But,  you  may not be  able  to  detect  the
  79.        difference.
  80.  
  81.  
  82.             C>TINYPROG original.exe
  83.             or
  84.             C>TINYPROG original.com
  85.  
  86.             These commands convert the file, ORIGINAL.xxx into the file,
  87.        ORIGINAL.EXE.  The original program file, ORIGINAL.xxx is  copied
  88.        to ORIGINAL.BXE if the file, ORIGINAL.BXE does not already exist.
  89.  
  90.        -----------------------------------------------------------------
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.                                   2
  124.  
  125.  
  126.  
  127.  
  128.                                  RESTRICTIONS
  129.  
  130.  
  131.             Special programs............................................
  132.  
  133.                  TINYPROG will not work on these programs:
  134.  
  135.                  COMMAND.COM
  136.                  IBMBIO.COM
  137.                  IBMDOS.COM
  138.  
  139.                       These  programs are COM files in  name  only,
  140.                  and MUST NOT be converted!
  141.  
  142.  
  143.             Device drivers..............................................
  144.  
  145.                       Device   drivers  cannot  be   converted   by
  146.                  TINYPROG.   As  a precaution,  TINYPROG  will  not
  147.                  convert   files  with  .SYS  or  .BIN  file   name
  148.                  extensions,  or files that TINYPROG senses  to  be
  149.                  DOS device drivers.
  150.  
  151.  
  152.             Self-configuring programs...................................
  153.  
  154.                       A   few  programs  configure  themselves   by
  155.                  writing  data  back to the program  file,  itself.
  156.                  They  cannot  read or write a copy  of  themselves
  157.                  that  has been converted by TINYPROG.   Many  will
  158.                  sense if their program file is not as they expect.
  159.                  Some  programs  of this type do not  check!   They
  160.                  simply   clobber   the  TINYPROG'ed   version   of
  161.                  themselves.   Usually,  you can  use  TINYPROG  to
  162.                  convert  this  type  of  program  after  you  have
  163.                  configured the program.
  164.  
  165.  
  166.             Programs with internal overlays.............................
  167.  
  168.                       TINYPROG  may  sense  programs  that  contain
  169.                  overlay  modules in their own program file.   (See
  170.                  below.)
  171.  
  172.  
  173.  
  174.             Otherwise...................................................
  175.  
  176.             Run  TINYPROG on any other program, either EXE or COM  file,
  177.        that you want to convert.
  178.  
  179.             If TINYPROG tells you to use the /A, /C, or /I options,  and
  180.        the program you are converting is not your own, stop right there.
  181.        You should not convert this program.
  182.  
  183.  
  184.                                   3
  185.  
  186.  
  187.  
  188.  
  189.  
  190.                  The request for the /A option tells you that  this
  191.             program  has already been TINYPROG'ed.  Doing it  again
  192.             may  harm the program by throwing away special,  'user-
  193.             data,' information that the program contains.
  194.  
  195.                  The  request  for  the /C option  tells  you  that
  196.             TINYPROG thinks that the input file is both a COM  file
  197.             and is too big to be a good COM file.
  198.  
  199.                  The request for the /I option tells you that  this
  200.             program  cannot be run through TINYPROG without  losing
  201.             some of the original program file.  If you do not  know
  202.             what   that   program's  extra  file   information   is
  203.             (overlays?), you are safer to leave the program alone.
  204.  
  205.  
  206.             Run the converted program to verify that all is well.   Keep
  207.        a  copy of the original program backed-up somewhere,  of  course.
  208.        Use  DOS  commands to copy/rename the converted  program  to  the
  209.        original program file name.
  210.  
  211.        -----------------------------------------------------------------
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.                                   4
  246.  
  247.  
  248.  
  249.  
  250.                                   PAY TO PLAY
  251.  
  252.  
  253.             Programmers:
  254.  
  255.             If  you use TINYPROG to make yourself money or to save  time
  256.        or trouble, then you and your organization will want to feel good
  257.        about  yourselves.   We  will,  too.   If  you  are  a   software
  258.        developer,  you  probably  know that  highly  optimized  assembly
  259.        language and custom data compression algorithms don't come easy.
  260.             So,  please  send  to Tranzoa the price - to you  -  of  the
  261.        alternative to TINYPROG, plus 1/10th of what TINYPROG is worth to
  262.        you beyond that alternative.  Or, 15 dollars.  Whichever is more.
  263.  
  264.             Naturally,  we will send to you a copy of  TINYPROG  without
  265.        the "shareware irritant" - the random number prompt.
  266.  
  267.             Oh,  by the way, your program will be clearly  converted  by
  268.        TINYPROG.
  269.  
  270.  
  271.             Users:
  272.  
  273.             Well,  what's  disk space cost, anyway?  Not  much.   So  we
  274.        don't  expect much in return.  But if it's your turn to  chip  in
  275.        for  that vast, "free-software" universe that we all use to  make
  276.        our PC's valuable, please keep Tranzoa in mind.
  277.  
  278.  
  279.             Everybody:
  280.  
  281.             There  are two versions of this program.  One  version,  you
  282.        have paid Tranzoa for; the other, you did not.  Which version  do
  283.        you have?  The paid-for version does not ask you to type a random
  284.        number when it converts a program.
  285.  
  286.             The version that you paid for is yours to use where and when
  287.        you wish.  But if someone else is using your copy, you should not
  288.        be using it.
  289.  
  290.             The  other  program version (the one that you  did  not  pay
  291.        Tranzoa for), you may use, copy, and give to whomever you choose.
  292.        You may not resell it, though, for more than a nominal charge (in
  293.        mid-1990:  $10)  either alone or in combination  with  any  other
  294.        product without getting the OK from Tranzoa.
  295.  
  296.             Of course, programs that you convert with TINYPROG are  your
  297.        own business and responsibility.
  298.  
  299.  
  300.  
  301.        -----------------------------------------------------------------
  302.  
  303.  
  304.  
  305.  
  306.                                   5
  307.  
  308.  
  309.  
  310.  
  311.                          TINYPROG COMMAND LINE OPTIONS
  312.  
  313.  
  314.             To  detect command line options, TINYPROG understands   both
  315.        '/'  and '-'.  You must rename files whose names begin  with  the
  316.        dash ('-') character in order to run TINYPROG on them.
  317.  
  318.             The  command line options can actually be in any  order,  to
  319.        the left or right of the file names.
  320.  
  321.  
  322.             Here are the details of the command line options:
  323.  
  324.  
  325.        /A         This  switch  tells TINYPROG to convert  a  file  even
  326.        though  the  file  looks like it has  already  been  produced  by
  327.        TINYPROG.  We use this switch in testing.
  328.  
  329.  
  330.  
  331.        /C       This switch tells TINYPROG to create the output EXE file
  332.        even  though the input file, which is not an EXE file, is  really
  333.        too long to be a reasonable COM file.
  334.  
  335.  
  336.        /I        This switch tells TINYPROG to convert an EXE file  even
  337.        though  the  EXE file is too much longer than its  "load  image."
  338.        The  "load image" is a value in the EXE file's header that  tells
  339.        DOS  how much of the file to load into memory.  If the  file  has
  340.        data  past  the  next even 128 bytes  beyond  the  "load  image,"
  341.        TINYPROG won't convert the EXE file without this switch option.
  342.  
  343.  
  344.        /H        This  switch  option  tells  TINYPROG  to  write   this
  345.        documentation out to a given file or to the DOS STDOUT device  if
  346.        no  file  name is given.  If a given file name  exists,  TINYPROG
  347.        asks you whether you want to overwrite it before doing so.
  348.  
  349.  
  350.        /U       These options allow you to put clear-text,  unencrypted,
  351.        uncompressed  "user-data"  at the top of your  output  EXE  file.
  352.        This option takes its own options in quite a few ways.  Here  are
  353.        some examples:
  354.  
  355.  
  356.  
  357.             /Ut "\r\n (C) Copyright 2001  Zingo, Inc.\r\n"
  358.  
  359.             Puts  the  text string in the user-data area.  To  put  text
  360.        with  embedded  spaces into the user-data area,  type  the  whole
  361.        string inside double quotes.
  362.  
  363.  
  364.             These two options are equivalent:
  365.  
  366.  
  367.                                   6
  368.  
  369.  
  370.  
  371.  
  372.             /Ut1234567890
  373.             /Ut 1234567890
  374.  
  375.  
  376.             These options are equivalent:
  377.  
  378.             /Ub 12 100          (put 100 bytes of value decimal 12)
  379.             /Ub 0xC 100         (the numbers can be in hex, C-style)
  380.             /uB 12 0x64
  381.             -ub 014 100         (the numbers can be leading-zero octal)
  382.             -ub014 100          (the numbers can be fairly free-form)
  383.             -ub12,100
  384.             /UB 12,100
  385.  
  386.  
  387.  
  388.             There are four ways to put user-data into your program.   In
  389.        one  command  line you can use any or all of these ways,  in  any
  390.        order you choose.  The final user-data will be in the order given
  391.        in  the command line with no extra bytes put between  separately-
  392.        given data.  Your final user-data area must be under 60k bytes in
  393.        length.
  394.  
  395.             Here are the four ways of specifying user-data:
  396.  
  397.             ASCII Text:
  398.  
  399.             You may specify simple ASCII text.  In the text strings, you
  400.        may specify non-ASCII byte values using these extended C language
  401.        conventions:
  402.  
  403.              \a     Bell               \b    Backspace
  404.              \f     Form feed          \n    Line feed
  405.              \r     Carriage return    \t    Tab
  406.              \v     Vertical tab       \z    Control Z (End_of_file)
  407.              \-     Minus sign/dash    \/    Forward slash
  408.              \'     Single quote       \"    Double quote
  409.              \\     Back-slash         \?    Question mark
  410.              \xHHH  Hex value          \DDD  Octal value
  411.              \_     Ignored (Used for null-string: "\_")
  412.  
  413.             The   text  is  put  in  the  program  without   any   extra
  414.        information.   To  put  a trailing NULL character  in  the  text,
  415.        simple use the '\0' character sequence at the end of your string.
  416.  
  417.  
  418.             Examples:
  419.  
  420.             /UT "text"
  421.             /ut "\r\n Howdy, howdy, howdy.\r\n"
  422.             /ut "I say, \"What's up, Doc.\""
  423.             /ut "\a beep"
  424.             -ut "A normal C string\0"
  425.  
  426.  
  427.  
  428.                                   7
  429.  
  430.  
  431.  
  432.  
  433.  
  434.             Byte values:
  435.  
  436.             You  may specify blocks of data in which every byte has  the
  437.        same value.
  438.  
  439.             Examples:
  440.  
  441.             /UB 0 2048     (2k of zeros)
  442.             -ub -1 100     (100 Hex FF's)
  443.             /UB -128 1     (1 Hex 80 byte)
  444.             /UB 255 1      (1 Hex FF byte)
  445.  
  446.  
  447.  
  448.             Word (16 bit) values:
  449.  
  450.             You  may specify blocks of data in which every  16-bit  word
  451.        has the same value.  The words are stored low-byte-first and  are
  452.        not aligned on even word boundaries.
  453.  
  454.             Examples:
  455.  
  456.             /Uw 0 2048     (4k of zeros)
  457.             -uw -1 100     (200 Hex FF's)
  458.             /Uw -128 1     (1 Hex 0080 word)
  459.             /UW 255 1      (1 Hex 00FF word)
  460.             /uw -32768 2   (2 words of Hex 8000)
  461.             /uw 65535 7    (7 words of Hex FFFF)
  462.             /uw  -1  4     (4 words of Hex FFFF)
  463.  
  464.  
  465.  
  466.             Files:
  467.  
  468.             You may include an entire file.  TINYPROG copies the file as
  469.        binary data to the user-data area.
  470.  
  471.             Examples (these options are all equivalent):
  472.  
  473.             /uFX.Y         (puts the file X.Y into user-data area)
  474.             /uf   x.y
  475.             /ufx.y
  476.  
  477.  
  478.  
  479.  
  480.             Finally, here are some complex examples:
  481.  
  482.        /ut"MY_PROGRAM \0"  /ut "5/26/90" /ub 0x20 32 /uf DATA_FILE.DAT
  483.  
  484.        /ut "Overlay1\0" /uf OVER1.EXE /utOverlay2\0 /ufOVER2.EXE
  485.  
  486.  
  487.  
  488.  
  489.                                   8
  490.  
  491.  
  492.  
  493.  
  494.             Here is the structure of the user-data area and the top of a
  495.        TINYPROG-produced EXE file:
  496.  
  497.             The  first  32 bytes are the EXE file header.   This  header
  498.        tells DOS what it needs to know to load and run the program.
  499.  
  500.             The  next  3 bytes are a jump instruction to jump  over  the
  501.        user  data area.  The first of these 3 bytes is the JMP  op-code.
  502.        The  next  two bytes are 1 word with the length in bytes  of  the
  503.        user-data area + 1.
  504.  
  505.             The next 0..60k bytes are the user-data area.
  506.  
  507.             The  user  data  area is followed by a  Control  Z  and  the
  508.        initial TINYPROG code.
  509.  
  510.  
  511.        -----------------------------------------------------------------
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.                                   9
  551.  
  552.  
  553.  
  554.  
  555.  
  556.                 PROGRAMMERS, WHAT TINYPROG DOES TO YOUR PROGRAM
  557.  
  558.  
  559.             TINYPROG  compresses  your program and adds to it  new  code
  560.        that decompresses your program whenever it is run.  TINYPROG  can
  561.        also add, to the front of the EXE file, uncompressed, unencrypted
  562.        data and text that you specify.
  563.  
  564.  
  565.             When your program runs, the TINYPROG code decrypts and  does
  566.        a  Cyclical  Redundancy Check (CRC) on  the  compressed  program.
  567.        Then the TINYPROG code decompresses your program and jumps to the
  568.        real  program beginning.  If the TINYPROG logic finds a CRC  mis-
  569.        match  or  if the decompression logic is not happy,  the  program
  570.        prints  an  error  message  to  the  screen  and  exits  with  an
  571.        ERRORLEVEL of 255.
  572.  
  573.             The  error messages are sent to the DOS STDERR file  handle.
  574.        This  file handle usually points to the PC's screen -  even  when
  575.        the  user redirects normal output (the STDOUT file handle)  to  a
  576.        file.
  577.  
  578.  
  579.             Here are the two messages and their meanings:
  580.  
  581.  
  582.                       TINYPROG says, "Bad program file!"
  583.  
  584.             The  file was not loaded as an EXE program, or  the  program
  585.        failed the CRC test.
  586.  
  587.  
  588.                        TINYPROG says, "Patched program!"
  589.  
  590.             The  decompression  logic found  something  horrible.   This
  591.        implies either a bug in the compression/decompression logic or  a
  592.        patch  that escaped the CRC check.  Tranzoa wants to  know  about
  593.        this message.
  594.  
  595.  
  596.  
  597.        -----------------------------------------------------------------
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.                                   10
  612.  
  613.  
  614.  
  615.  
  616.  
  617.                      THE COST OF TINYPROG'ING YOUR PROGRAM
  618.  
  619.  
  620.             Beyond  the zillions you send to Tranzoa, here is the  price
  621.        you  pay  for a smaller program file  and  file-corruption  self-
  622.        testing:
  623.  
  624.             1)   Slower loading.  Our benchmark, 215k program compresses
  625.        to  140k.  (It has 40k of "help" text but no big,  zeroed  memory
  626.        blocks.)   Loading  the program on a 4.77 megahertz XT  takes  an
  627.        extra  30k per second beyond disk-read time.  On a  25  megahertz
  628.        386, only from RAM disk is the extra load time perceptible.   And
  629.        then, barely so.
  630.  
  631.             2)    You  can't  patch the code.  You may,  though,  put  a
  632.        patch/configuration area in front of the program file.   Example:
  633.        the copyright at the top of TINYPROG, itself.
  634.  
  635.             3)    TINYPROG  output-programs must be  .EXE  files.   (See
  636.        below.)
  637.  
  638.             4)    Unusual programs may require more memory to  load  and
  639.        run.  (See below.)
  640.  
  641.  
  642.        -----------------------------------------------------------------
  643.  
  644.  
  645.                         TINYPROG OUTPUTS .EXE PROGRAMS
  646.  
  647.  
  648.             When you run a normal EXE program, DOS insures that there is
  649.        sufficient  memory to run the program.  COM programs  must  check
  650.        for  themselves.  If TINYPROG were to output COM programs,  extra
  651.        code  would be included with your program to check memory.   This
  652.        code  takes more space than the EXE file "header"  that  TINYPROG
  653.        includes  with  your  program.   The  EXE  file  header  and  its
  654.        information would be the only difference between a EXE file and a
  655.        COM file put out by TINYPROG.
  656.  
  657.  
  658.        -----------------------------------------------------------------
  659.  
  660.  
  661.                               MEMORY REQUIREMENTS
  662.  
  663.  
  664.             TINYPROG  adds extra code to your program.  This code  needs
  665.        approximately  1.5k bytes beyond your program's "load  image"  to
  666.        operate.   What is a "load image?"  The load image of a COM  file
  667.        is  its file length.  EXE files contain their load image size  in
  668.        some  extra  information  at  the top  of  the  file  called  the
  669.        "header."   Normally, both types of programs need more memory  to
  670.  
  671.  
  672.                                   11
  673.  
  674.  
  675.  
  676.        run  in than their load image size.  Except for extremely  simple
  677.        or  unusual programs, the extra memory needed to run the  program
  678.        exceeds  1.5k  by a good margin.  So, in a  sense,  the  TINYPROG
  679.        version of your program needs NO extra memory.
  680.  
  681.             There  is  a  notable exception to this  "no  extra  memory"
  682.        requirement:    certain  EXE  programs  have  no  initial   stack
  683.        specified.   These programs are dangerous to run with  less  than
  684.        64k  of memory remaining.  TINYPROG converts these programs in  a
  685.        way that makes them safe.  Without enough memory, DOS will simply
  686.        not load them.
  687.  
  688.             A  few  EXE programs tell DOS to give them  only  a  certain
  689.        amount of memory to run in.  When the added TINYPROG code sets up
  690.        the  run-time environment for such programs, it may cause DOS  to
  691.        give these programs slightly more memory than would have been the
  692.        case with the original program.
  693.  
  694.  
  695.        -----------------------------------------------------------------
  696.  
  697.  
  698.                                    OVERLAYS
  699.  
  700.             We're sorry.  Since overlaid programs are usually big,  they
  701.        certainly could use TINYPROG compression!  There are, of  course,
  702.        ways  to  compress overlays.  But we must wait  for  the  linkage
  703.        editor people to want the ability.
  704.  
  705.  
  706.        -----------------------------------------------------------------
  707.  
  708.  
  709.                            LONG .COM OR OTHER FILES
  710.  
  711.             In  testing,  you may have found that TINYPROG  accepts  any
  712.        input  file name other than the special DOS files, .BIN and  .SYS
  713.        files.   So, you can tell TINYPROG to convert a large  data  file
  714.        into  an EXE file.  If the data file has code up front,  it  will
  715.        actually run as a program.  Now, TINYPROG will convert these long
  716.        non-EXE  files, but when they load as programs, their stack  will
  717.        be  at the end of their 64k segment, presumably in the middle  of
  718.        the loaded program.  You can count on a few 10's of bytes in that
  719.        area being clobbered even if you swap the stack right at the  top
  720.        of the program.
  721.  
  722.  
  723.        -----------------------------------------------------------------
  724.  
  725.  
  726.                          CPU PROTECTED MODE OPERATION
  727.  
  728.             The code TINYPROG adds to your program uses segment register
  729.        arithmetic.   This  arithmetic will not work in  protected  mode.
  730.        But, it will work in VM-86 mode on a 386 or 486 CPU.
  731.  
  732.  
  733.                                   12
  734.  
  735.  
  736.  
  737.  
  738.  
  739.        -----------------------------------------------------------------
  740.  
  741.  
  742.                                 USER DATA AREA
  743.  
  744.  
  745.             Currently,  the  user-patch-area  is not in  RAM  when  your
  746.        program  gets control of the CPU.  At run-time you must  read  it
  747.        from the program file.  (Under DOS 2.x, this may not be possible.
  748.        Generally,  you must tell your user to run your  program  another
  749.        way,  or ask him for the explicit name, or do tricks to find  the
  750.        original command line in memory.)
  751.  
  752.  
  753.  
  754.                         How to Patch the User Data Area
  755.  
  756.             The user data area starts at the 35th byte of your program's
  757.        EXE file.  Its length + 1 is in the 31st and 32nd bytes as a low-
  758.        byte-first word.  The data is in the order of how it was given in
  759.        the command line.
  760.  
  761.  
  762.        -----------------------------------------------------------------
  763.        June 8, 1990
  764.        -----------------------------------------------------------------
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.                                   13
  795.  
  796.