Wapp

Hex Artifact Content
Login

Artifact 455056f1a74c494fc84ec8816471f058c6742b9b37e97ca4443095d786c5fdc1:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 77 61 70 70 74  #!/usr/bin/wappt
0010: 63 6c 73 68 0a 23 0a 23 20 49 6e 76 6f 6b 65 20  clsh.#.# Invoke 
0020: 61 73 20 22 74 63 6c 73 68 20 74 65 73 74 30 31  as "tclsh test01
0030: 2e 74 63 6c 22 20 61 6e 64 20 74 68 65 6e 20 73  .tcl" and then s
0040: 75 72 66 20 74 68 65 20 77 65 62 73 69 74 65 20  urf the website 
0050: 74 68 61 74 20 70 6f 70 73 20 75 70 0a 23 20 74  that pops up.# t
0060: 6f 20 76 65 72 69 66 79 20 74 68 65 20 6c 6f 67  o verify the log
0070: 69 63 20 69 6e 20 77 61 70 70 2e 0a 23 0a 69 66  ic in wapp..#.if
0080: 20 7b 5b 63 61 74 63 68 20 7b 70 61 63 6b 61 67   {[catch {packag
0090: 65 20 72 65 71 75 69 72 65 20 77 61 70 70 7d 5d  e require wapp}]
00a0: 7d 20 7b 0a 20 20 73 6f 75 72 63 65 20 5b 66 69  } {.  source [fi
00b0: 6c 65 20 64 69 72 20 5b 66 69 6c 65 20 64 69 72  le dir [file dir
00c0: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 5d   [info script]]]
00d0: 2f 77 61 70 70 2e 74 63 6c 0a 7d 0a 70 72 6f 63  /wapp.tcl.}.proc
00e0: 20 77 61 70 70 2d 64 65 66 61 75 6c 74 20 7b 7d   wapp-default {}
00f0: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 77 61 70 70   {.  global wapp
0100: 0a 20 20 73 65 74 20 42 20 5b 77 61 70 70 2d 70  .  set B [wapp-p
0110: 61 72 61 6d 20 42 41 53 45 5f 55 52 4c 5d 0a 20  aram BASE_URL]. 
0120: 20 73 65 74 20 42 58 28 79 29 20 24 42 0a 20 20   set BX(y) $B.  
0130: 73 65 74 20 52 20 5b 77 61 70 70 2d 70 61 72 61  set R [wapp-para
0140: 6d 20 53 43 52 49 50 54 5f 4e 41 4d 45 5d 0a 20  m SCRIPT_NAME]. 
0150: 20 77 61 70 70 2d 63 61 63 68 65 2d 63 6f 6e 74   wapp-cache-cont
0160: 72 6f 6c 20 6d 61 78 2d 61 67 65 3d 31 35 0a 20  rol max-age=15. 
0170: 20 77 61 70 70 20 22 3c 68 31 3e 48 65 6c 6c 6f   wapp "<h1>Hello
0180: 2c 20 57 6f 72 6c 64 21 3c 2f 68 31 3e 5c 6e 22  , World!</h1>\n"
0190: 0a 20 20 77 61 70 70 20 22 3c 6f 6c 3e 22 0a 20  .  wapp "<ol>". 
01a0: 20 77 61 70 70 2d 75 6e 73 61 66 65 20 22 3c 6c   wapp-unsafe "<l
01b0: 69 3e 3c 70 3e 3c 61 20 68 72 65 66 3d 27 24 52  i><p><a href='$R
01c0: 2f 65 6e 76 27 3e 57 61 70 70 20 45 6e 76 69 72  /env'>Wapp Envir
01d0: 6f 6e 6d 65 6e 74 3c 2f 61 3e 3c 2f 70 3e 5c 6e  onment</a></p>\n
01e0: 22 0a 20 20 77 61 70 70 2d 73 75 62 73 74 20 7b  ".  wapp-subst {
01f0: 3c 6c 69 3e 3c 70 3e 3c 61 20 68 72 65 66 3d 27  <li><p><a href='
0200: 65 6e 76 32 27 3e 45 6e 76 69 72 6f 6e 6d 65 6e  env2'>Environmen
0210: 74 20 75 73 69 6e 67 20 77 61 70 70 2d 64 65 62  t using wapp-deb
0220: 75 67 2d 65 6e 76 3c 2f 61 3e 5c 6e 7d 0a 20 20  ug-env</a>\n}.  
0230: 77 61 70 70 2d 73 75 62 73 74 20 7b 3c 6c 69 3e  wapp-subst {<li>
0240: 3c 70 3e 3c 61 20 68 72 65 66 3d 27 25 75 72 6c  <p><a href='%url
0250: 25 28 24 42 29 25 2f 66 75 6c 6c 65 6e 76 27 3e  %($B)%/fullenv'>
0260: 46 75 6c 6c 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  Full Environment
0270: 3c 2f 61 3e 5c 6e 7d 0a 20 20 73 65 74 20 63 72  </a>\n}.  set cr
0280: 61 7a 79 20 5b 6c 73 6f 72 74 20 5b 77 61 70 70  azy [lsort [wapp
0290: 2d 70 61 72 61 6d 2d 6c 69 73 74 5d 5d 0a 20 20  -param-list]].  
02a0: 77 61 70 70 2d 73 75 62 73 74 20 7b 3c 6c 69 3e  wapp-subst {<li>
02b0: 3c 70 3e 3c 61 20 68 72 65 66 3d 27 25 75 72 6c  <p><a href='%url
02c0: 28 24 42 29 2f 65 6e 76 3f 6b 65 79 73 3d 25 75  ($B)/env?keys=%u
02d0: 72 6c 28 24 63 72 61 7a 79 29 27 3e 7d 0a 20 20  rl($crazy)'>}.  
02e0: 77 61 70 70 20 22 45 6e 76 69 72 6f 6e 6d 65 6e  wapp "Environmen
02f0: 74 20 77 69 74 68 20 63 72 61 7a 79 20 55 52 4c  t with crazy URL
0300: 3c 2f 61 3e 5c 6e 22 0a 20 20 77 61 70 70 2d 74  </a>\n".  wapp-t
0310: 72 69 6d 20 7b 0a 20 20 20 20 3c 6c 69 3e 3c 70  rim {.    <li><p
0320: 3e 3c 61 20 68 72 65 66 3d 27 25 75 72 6c 28 24  ><a href='%url($
0330: 42 29 2f 6c 69 6e 74 27 3e 4c 69 6e 74 3c 2f 61  B)/lint'>Lint</a
0340: 3e 0a 20 20 20 20 3c 6c 69 3e 3c 70 3e 3c 61 20  >.    <li><p><a 
0350: 68 72 65 66 3d 27 25 75 72 6c 28 24 42 29 2f 65  href='%url($B)/e
0360: 72 72 6f 72 6f 75 74 27 3e 44 65 6c 69 62 65 72  rrorout'>Deliber
0370: 61 74 65 20 65 72 72 6f 72 3c 2f 61 3e 0a 20 20  ate error</a>.  
0380: 20 20 3c 6c 69 3e 3c 70 3e 3c 61 20 68 72 65 66    <li><p><a href
0390: 3d 27 25 75 72 6c 28 24 42 29 2f 65 6e 63 6f 64  ='%url($B)/encod
03a0: 69 6e 67 73 27 3e 45 6e 63 6f 64 69 6e 67 20 63  ings'>Encoding c
03b0: 68 65 63 6b 73 3c 2f 61 3e 0a 20 20 20 20 3c 6c  hecks</a>.    <l
03c0: 69 3e 3c 70 3e 3c 61 20 68 72 65 66 3d 27 25 75  i><p><a href='%u
03d0: 72 6c 28 24 42 29 2f 72 65 64 69 72 65 63 74 27  rl($B)/redirect'
03e0: 3e 52 65 64 69 72 65 63 74 20 74 6f 20 65 6e 76  >Redirect to env
03f0: 3c 2f 61 3e 0a 20 20 20 20 3c 6c 69 3e 3c 70 3e  </a>.    <li><p>
0400: 3c 61 20 68 72 65 66 3d 27 25 75 72 6c 28 24 42  <a href='%url($B
0410: 29 2f 67 6c 6f 62 61 6c 73 27 3e 54 43 4c 20 67  )/globals'>TCL g
0420: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 3c  lobal variables<
0430: 2f 61 3e 0a 20 20 20 20 3c 6c 69 3e 3c 70 3e 3c  /a>.    <li><p><
0440: 61 20 68 72 65 66 3d 27 25 75 72 6c 25 28 24 42  a href='%url%($B
0450: 58 28 79 29 29 25 2f 63 73 70 74 65 73 74 27 3e  X(y))%/csptest'>
0460: 43 6f 6e 74 65 6e 74 20 53 65 63 75 72 69 74 79  Content Security
0470: 20 50 6f 6c 69 63 79 3c 2f 61 3e 0a 20 20 20 20   Policy</a>.    
0480: 3c 6c 69 3e 3c 70 3e 3c 61 20 68 72 65 66 3d 27  <li><p><a href='
0490: 25 75 72 6c 28 24 42 29 2f 66 69 6c 65 75 70 6c  %url($B)/fileupl
04a0: 6f 61 64 27 3e 46 69 6c 65 20 55 70 6c 6f 61 64  oad'>File Upload
04b0: 0a 20 20 20 20 55 73 69 6e 67 20 6d 75 6c 74 69  .    Using multi
04c0: 70 61 72 74 2f 66 6f 72 6d 2d 64 61 74 61 3c 2f  part/form-data</
04d0: 61 3e 0a 20 20 20 20 3c 6c 69 3e 3c 70 3e 3c 61  a>.    <li><p><a
04e0: 20 68 72 65 66 3d 27 25 75 72 6c 28 24 42 29 2f   href='%url($B)/
04f0: 73 65 6c 66 27 3e 54 68 65 20 73 6f 75 72 63 65  self'>The source
0500: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 73 63   code to this sc
0510: 72 69 70 74 3c 2f 61 3e 0a 20 20 7d 0a 20 20 73  ript</a>.  }.  s
0520: 65 74 20 78 20 22 25 73 74 72 69 6e 67 28 2e 2e  et x "%string(..
0530: 2e 29 22 0a 20 20 73 65 74 20 76 20 61 62 63 27  .)".  set v abc'
0540: 64 65 66 5c 22 67 68 69 5c 5c 6a 6b 6c 3c 2f 73  def\"ghi\\jkl</s
0550: 63 72 69 70 74 3e 0a 20 20 77 61 70 70 2d 73 75  cript>.  wapp-su
0560: 62 73 74 20 7b 3c 6c 69 3e 25 68 74 6d 6c 28 24  bst {<li>%html($
0570: 78 29 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  x) substitution 
0580: 74 65 73 74 3a 20 22 25 73 74 72 69 6e 67 25 28  test: "%string%(
0590: 24 76 29 25 22 5c 6e 7d 0a 20 20 77 61 70 70 20  $v)%"\n}.  wapp 
05a0: 22 3c 2f 6f 6c 3e 22 0a 20 20 69 66 20 7b 5b 77  "</ol>".  if {[w
05b0: 61 70 70 2d 70 61 72 61 6d 2d 65 78 69 73 74 73  app-param-exists
05c0: 20 73 68 6f 77 65 6e 76 5d 7d 20 7b 0a 20 20 20   showenv]} {.   
05d0: 20 77 61 70 70 2d 70 61 67 65 2d 65 6e 76 0a 20   wapp-page-env. 
05e0: 20 7d 0a 20 20 77 61 70 70 2d 74 72 69 6d 20 7b   }.  wapp-trim {
05f0: 0a 20 20 20 20 3c 70 3e 54 68 65 20 63 72 65 61  .    <p>The crea
0600: 74 6f 72 20 6f 66 20 57 61 70 70 3a 3c 62 72 3e  tor of Wapp:<br>
0610: 0a 20 20 20 20 3c 69 6d 67 20 73 72 63 3d 22 25  .    <img src="%
0620: 75 72 6c 28 24 52 2f 64 72 68 2e 6a 70 67 29 22  url($R/drh.jpg)"
0630: 3e 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 77 61 70  >.  }.}.proc wap
0640: 70 2d 70 61 67 65 2d 72 65 64 69 72 65 63 74 20  p-page-redirect 
0650: 7b 7d 20 7b 0a 20 20 77 61 70 70 2d 72 65 64 69  {} {.  wapp-redi
0660: 72 65 63 74 20 65 6e 76 0a 7d 0a 70 72 6f 63 20  rect env.}.proc 
0670: 77 61 70 70 2d 70 61 67 65 2d 67 6c 6f 62 61 6c  wapp-page-global
0680: 73 20 7b 7d 20 7b 0a 20 20 77 61 70 70 2d 74 72  s {} {.  wapp-tr
0690: 69 6d 20 7b 0a 20 20 20 20 3c 68 31 3e 54 43 4c  im {.    <h1>TCL
06a0: 20 47 6c 6f 62 61 6c 20 56 61 72 69 61 62 6c 65   Global Variable
06b0: 73 3c 2f 68 31 3e 0a 20 20 20 20 3c 75 6c 3e 0a  s</h1>.    <ul>.
06c0: 20 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 76 6e    }.  foreach vn
06d0: 61 6d 65 20 5b 6c 73 6f 72 74 20 5b 75 70 6c 65  ame [lsort [uple
06e0: 76 65 6c 20 23 30 20 69 6e 66 6f 20 76 61 72 73  vel #0 info vars
06f0: 5d 5d 20 7b 0a 20 20 20 20 73 65 74 20 76 61 6c  ]] {.    set val
0700: 20 3f 3f 3f 0a 20 20 20 20 63 61 74 63 68 20 7b   ???.    catch {
0710: 73 65 74 20 76 61 6c 20 5b 73 65 74 20 3a 3a 24  set val [set ::$
0720: 76 6e 61 6d 65 5d 7d 0a 20 20 20 20 73 65 74 20  vname]}.    set 
0730: 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  len [string leng
0740: 74 68 20 24 76 61 6c 5d 0a 20 20 20 20 69 66 20  th $val].    if 
0750: 7b 24 6c 65 6e 3e 31 30 30 7d 20 7b 0a 20 20 20  {$len>100} {.   
0760: 20 20 20 77 61 70 70 2d 73 75 62 73 74 20 7b 3c     wapp-subst {<
0770: 6c 69 3e 25 68 74 6d 6c 28 24 76 6e 61 6d 65 29  li>%html($vname)
0780: 20 3d 20 3c 69 3e 2e 2e 2e 20 25 68 74 6d 6c 28   = <i>... %html(
0790: 24 6c 65 6e 29 20 62 79 74 65 20 73 74 72 69 6e  $len) byte strin
07a0: 67 2e 2e 2e 3c 2f 69 3e 5c 6e 7d 0a 20 20 20 20  g...</i>\n}.    
07b0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 77  } else {.      w
07c0: 61 70 70 2d 73 75 62 73 74 20 7b 3c 6c 69 3e 25  app-subst {<li>%
07d0: 68 74 6d 6c 28 24 76 6e 61 6d 65 20 3d 20 5b 6c  html($vname = [l
07e0: 69 73 74 20 24 76 61 6c 5d 29 3c 2f 6c 69 3e 5c  ist $val])</li>\
07f0: 6e 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 70  n}.    }.  }.}.p
0800: 72 6f 63 20 77 61 70 70 2d 70 61 67 65 2d 65 6e  roc wapp-page-en
0810: 76 32 20 7b 7d 20 7b 0a 20 20 77 61 70 70 2d 61  v2 {} {.  wapp-a
0820: 6c 6c 6f 77 2d 78 6f 72 69 67 69 6e 2d 70 61 72  llow-xorigin-par
0830: 61 6d 73 0a 20 20 77 61 70 70 2d 74 72 69 6d 20  ams.  wapp-trim 
0840: 7b 0a 20 20 20 20 3c 68 31 3e 57 61 70 70 20 45  {.    <h1>Wapp E
0850: 6e 76 69 72 6f 6e 6d 65 6e 74 20 75 73 69 6e 67  nvironment using
0860: 20 77 61 70 70 2d 64 65 62 75 67 2d 65 6e 76 3c   wapp-debug-env<
0870: 2f 68 31 3e 0a 20 20 20 20 3c 70 3e 54 68 69 73  /h1>.    <p>This
0880: 20 70 61 67 65 20 75 73 65 73 20 77 61 70 70 2d   page uses wapp-
0890: 61 6c 6c 6f 77 2d 78 6f 72 69 67 69 6e 2d 70 61  allow-xorigin-pa
08a0: 72 61 6d 73 20 73 6f 20 74 68 61 74 20 6e 65 77  rams so that new
08b0: 0a 20 20 20 20 20 20 20 71 75 65 72 79 20 70 61  .       query pa
08c0: 72 61 6d 65 74 65 72 73 20 6d 61 79 20 62 65 20  rameters may be 
08d0: 61 64 64 65 64 20 6d 61 6e 75 61 6c 6c 79 20 74  added manually t
08e0: 6f 20 74 68 65 20 55 52 4c 2e 3c 2f 70 3e 0a 20  o the URL.</p>. 
08f0: 20 20 20 3c 70 72 65 3e 25 68 74 6d 6c 28 5b 77     <pre>%html([w
0900: 61 70 70 2d 64 65 62 75 67 2d 65 6e 76 5d 29 3c  app-debug-env])<
0910: 2f 70 72 65 3e 0a 20 20 7d 0a 7d 0a 70 72 6f 63  /pre>.  }.}.proc
0920: 20 77 61 70 70 2d 70 61 67 65 2d 65 6e 76 20 7b   wapp-page-env {
0930: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 77 61 70  } {.  global wap
0940: 70 0a 20 20 77 61 70 70 2d 61 6c 6c 6f 77 2d 78  p.  wapp-allow-x
0950: 6f 72 69 67 69 6e 2d 70 61 72 61 6d 73 0a 20 20  origin-params.  
0960: 77 61 70 70 2d 73 65 74 2d 63 6f 6f 6b 69 65 20  wapp-set-cookie 
0970: 65 6e 76 2d 63 6f 6f 6b 69 65 20 73 69 6d 70 6c  env-cookie simpl
0980: 65 0a 20 20 77 61 70 70 20 22 3c 68 31 3e 57 61  e.  wapp "<h1>Wa
0990: 70 70 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 3c 2f  pp Environment</
09a0: 68 31 3e 5c 6e 22 0a 20 20 77 61 70 70 2d 75 6e  h1>\n".  wapp-un
09b0: 73 61 66 65 20 22 3c 66 6f 72 6d 20 6d 65 74 68  safe "<form meth
09c0: 6f 64 3d 27 47 45 54 27 20 61 63 74 69 6f 6e 3d  od='GET' action=
09d0: 27 5b 77 61 70 70 2d 70 61 72 61 6d 20 53 45 4c  '[wapp-param SEL
09e0: 46 5f 55 52 4c 5d 27 3e 5c 6e 22 0a 20 20 77 61  F_URL]'>\n".  wa
09f0: 70 70 20 22 3c 69 6e 70 75 74 20 74 79 70 65 3d  pp "<input type=
0a00: 27 63 68 65 63 6b 62 6f 78 27 20 6e 61 6d 65 3d  'checkbox' name=
0a10: 27 73 68 6f 77 68 64 72 27 22 0a 20 20 69 66 20  'showhdr'".  if 
0a20: 7b 5b 77 61 70 70 2d 70 61 72 61 6d 2d 65 78 69  {[wapp-param-exi
0a30: 73 74 73 20 73 68 6f 77 68 64 72 5d 7d 20 7b 0a  sts showhdr]} {.
0a40: 20 20 20 20 77 61 70 70 20 22 20 63 68 65 63 6b      wapp " check
0a50: 65 64 22 0a 20 20 7d 0a 20 20 77 61 70 70 20 22  ed".  }.  wapp "
0a60: 3e 20 53 68 6f 77 20 48 65 61 64 65 72 5c 6e 22  > Show Header\n"
0a70: 0a 20 20 77 61 70 70 20 22 3c 69 6e 70 75 74 20  .  wapp "<input 
0a80: 74 79 70 65 3d 27 73 75 62 6d 69 74 27 20 76 61  type='submit' va
0a90: 6c 75 65 3d 27 47 6f 27 3e 5c 6e 22 0a 20 20 77  lue='Go'>\n".  w
0aa0: 61 70 70 20 22 3c 2f 66 6f 72 6d 3e 22 0a 20 20  app "</form>".  
0ab0: 77 61 70 70 20 22 3c 70 72 65 3e 5c 6e 22 0a 20  wapp "<pre>\n". 
0ac0: 20 66 6f 72 65 61 63 68 20 76 61 72 20 5b 6c 73   foreach var [ls
0ad0: 6f 72 74 20 5b 77 61 70 70 2d 70 61 72 61 6d 2d  ort [wapp-param-
0ae0: 6c 69 73 74 5d 5d 20 7b 0a 20 20 20 20 69 66 20  list]] {.    if 
0af0: 7b 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24  {[string index $
0b00: 76 61 72 20 30 5d 3d 3d 22 2e 22 20 26 26 0a 20  var 0]=="." &&. 
0b10: 20 20 20 20 20 20 20 20 28 24 76 61 72 21 3d 22          ($var!="
0b20: 2e 68 65 61 64 65 72 22 20 7c 7c 20 21 5b 77 61  .header" || ![wa
0b30: 70 70 2d 70 61 72 61 6d 2d 65 78 69 73 74 73 20  pp-param-exists 
0b40: 73 68 6f 77 68 64 72 5d 29 7d 20 63 6f 6e 74 69  showhdr])} conti
0b50: 6e 75 65 0a 20 20 20 20 77 61 70 70 2d 73 75 62  nue.    wapp-sub
0b60: 73 74 20 7b 25 68 74 6d 6c 28 24 76 61 72 29 20  st {%html($var) 
0b70: 3d 20 25 68 74 6d 6c 28 5b 6c 69 73 74 20 5b 77  = %html([list [w
0b80: 61 70 70 2d 70 61 72 61 6d 20 24 76 61 72 5d 5d  app-param $var]]
0b90: 29 5c 6e 7d 0a 20 20 7d 0a 20 20 77 61 70 70 20  )\n}.  }.  wapp 
0ba0: 22 3c 2f 70 72 65 3e 22 0a 20 20 77 61 70 70 2d  "</pre>".  wapp-
0bb0: 75 6e 73 61 66 65 20 22 3c 70 3e 3c 61 20 68 72  unsafe "<p><a hr
0bc0: 65 66 3d 27 5b 77 61 70 70 2d 70 61 72 61 6d 20  ef='[wapp-param 
0bd0: 42 41 53 45 5f 55 52 4c 5d 2f 27 3e 48 6f 6d 65  BASE_URL]/'>Home
0be0: 3c 2f 61 3e 3c 2f 70 3e 5c 6e 22 0a 20 20 77 61  </a></p>\n".  wa
0bf0: 70 70 2d 74 72 69 6d 20 7b 3c 68 31 3e 55 73 69  pp-trim {<h1>Usi
0c00: 6e 67 20 26 23 33 37 3b 73 74 72 69 6e 67 3c 2f  ng &#37;string</
0c10: 68 31 3e 7d 0a 20 20 77 61 70 70 20 22 3c 70 72  h1>}.  wapp "<pr
0c20: 65 3e 5c 6e 22 0a 20 20 66 6f 72 65 61 63 68 20  e>\n".  foreach 
0c30: 76 61 72 20 5b 6c 73 6f 72 74 20 5b 77 61 70 70  var [lsort [wapp
0c40: 2d 70 61 72 61 6d 2d 6c 69 73 74 5d 5d 20 7b 0a  -param-list]] {.
0c50: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
0c60: 69 6e 64 65 78 20 24 76 61 72 20 30 5d 3d 3d 22  index $var 0]=="
0c70: 2e 22 20 26 26 0a 20 20 20 20 20 20 20 20 20 28  ." &&.         (
0c80: 24 76 61 72 21 3d 22 2e 68 65 61 64 65 72 22 20  $var!=".header" 
0c90: 7c 7c 20 21 5b 77 61 70 70 2d 70 61 72 61 6d 2d  || ![wapp-param-
0ca0: 65 78 69 73 74 73 20 73 68 6f 77 68 64 72 5d 29  exists showhdr])
0cb0: 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 77  } continue.    w
0cc0: 61 70 70 2d 73 75 62 73 74 20 7b 25 68 74 6d 6c  app-subst {%html
0cd0: 28 24 76 61 72 29 20 3d 20 25 73 74 72 69 6e 67  ($var) = %string
0ce0: 28 5b 6c 69 73 74 20 5b 77 61 70 70 2d 70 61 72  ([list [wapp-par
0cf0: 61 6d 20 24 76 61 72 5d 5d 29 5c 6e 7d 0a 20 20  am $var]])\n}.  
0d00: 7d 0a 20 20 77 61 70 70 20 22 3c 2f 70 72 65 3e  }.  wapp "</pre>
0d10: 22 0a 7d 0a 70 72 6f 63 20 77 61 70 70 2d 70 61  ".}.proc wapp-pa
0d20: 67 65 2d 66 75 6c 6c 65 6e 76 20 7b 7d 20 7b 0a  ge-fullenv {} {.
0d30: 20 20 77 61 70 70 2d 73 65 74 2d 63 6f 6f 6b 69    wapp-set-cooki
0d40: 65 20 65 6e 76 2d 63 6f 6f 6b 69 65 20 66 75 6c  e env-cookie ful
0d50: 6c 0a 20 20 77 61 70 70 20 22 3c 68 31 3e 57 61  l.  wapp "<h1>Wa
0d60: 70 70 20 46 75 6c 6c 20 45 6e 76 69 72 6f 6e 6d  pp Full Environm
0d70: 65 6e 74 3c 2f 68 31 3e 5c 6e 22 0a 20 20 77 61  ent</h1>\n".  wa
0d80: 70 70 2d 75 6e 73 61 66 65 20 22 3c 66 6f 72 6d  pp-unsafe "<form
0d90: 20 6d 65 74 68 6f 64 3d 27 50 4f 53 54 27 20 61   method='POST' a
0da0: 63 74 69 6f 6e 3d 27 5b 77 61 70 70 2d 70 61 72  ction='[wapp-par
0db0: 61 6d 20 53 45 4c 46 5f 55 52 4c 5d 27 3e 5c 6e  am SELF_URL]'>\n
0dc0: 22 0a 20 20 77 61 70 70 20 22 3c 69 6e 70 75 74  ".  wapp "<input
0dd0: 20 74 79 70 65 3d 27 63 68 65 63 6b 62 6f 78 27   type='checkbox'
0de0: 20 6e 61 6d 65 3d 27 76 61 72 31 27 22 0a 20 20   name='var1'".  
0df0: 69 66 20 7b 5b 77 61 70 70 2d 70 61 72 61 6d 2d  if {[wapp-param-
0e00: 65 78 69 73 74 73 20 73 68 6f 77 68 64 72 5d 7d  exists showhdr]}
0e10: 20 7b 0a 20 20 20 20 77 61 70 70 20 22 20 63 68   {.    wapp " ch
0e20: 65 63 6b 65 64 22 0a 20 20 7d 0a 20 20 23 20 44  ecked".  }.  # D
0e30: 65 6c 69 62 65 72 61 74 65 6c 79 20 75 6e 73 61  eliberately unsa
0e40: 66 65 20 63 61 6c 6c 73 20 74 6f 20 77 61 70 70  fe calls to wapp
0e50: 2d 73 75 62 73 74 20 61 6e 64 20 77 61 70 70 2d  -subst and wapp-
0e60: 74 72 69 6d 2c 20 61 64 64 65 64 20 68 65 72 65  trim, added here
0e70: 0a 20 20 23 20 74 6f 20 74 65 73 74 20 77 61 70  .  # to test wap
0e80: 70 2d 73 61 66 65 74 79 2d 63 68 65 63 6b 0a 20  p-safety-check. 
0e90: 20 23 0a 20 20 77 61 70 70 2d 73 75 62 73 74 20   #.  wapp-subst 
0ea0: 22 3e 20 56 61 72 31 5c 6e 22 0a 20 20 77 61 70  "> Var1\n".  wap
0eb0: 70 2d 74 72 69 6d 20 22 3c 69 6e 70 75 74 20 74  p-trim "<input t
0ec0: 79 70 65 3d 27 73 75 62 6d 69 74 27 20 6e 61 6d  ype='submit' nam
0ed0: 65 3d 27 73 31 27 20 76 61 6c 75 65 3d 27 47 6f  e='s1' value='Go
0ee0: 27 3e 5c 6e 22 0a 20 20 77 61 70 70 20 22 3c 69  '>\n".  wapp "<i
0ef0: 6e 70 75 74 20 74 79 70 65 3d 27 68 69 64 64 65  nput type='hidde
0f00: 6e 27 20 6e 61 6d 65 3d 27 68 69 64 64 65 6e 2d  n' name='hidden-
0f10: 70 61 72 61 6d 65 74 65 72 2d 31 27 20 22 0a 20  parameter-1' ". 
0f20: 20 77 61 70 70 20 22 76 61 6c 75 65 3d 27 74 68   wapp "value='th
0f30: 65 20 6c 6f 6e 67 20 76 61 6c 75 65 20 2f 20 6f  e long value / o
0f40: 66 20 3f 24 20 68 69 64 64 65 6e 2d 31 2e 2e 3c  f ?$ hidden-1..<
0f50: 68 69 3e 27 3e 5c 6e 22 0a 20 20 77 61 70 70 20  hi>'>\n".  wapp 
0f60: 22 3c 2f 66 6f 72 6d 3e 22 0a 20 20 77 61 70 70  "</form>".  wapp
0f70: 20 22 3c 70 72 65 3e 5c 6e 22 0a 20 20 66 6f 72   "<pre>\n".  for
0f80: 65 61 63 68 20 76 61 72 20 5b 6c 73 6f 72 74 20  each var [lsort 
0f90: 5b 77 61 70 70 2d 70 61 72 61 6d 2d 6c 69 73 74  [wapp-param-list
0fa0: 5d 5d 20 7b 0a 20 20 20 20 69 66 20 7b 24 76 61  ]] {.    if {$va
0fb0: 72 3d 3d 22 2e 72 65 70 6c 79 22 7d 20 63 6f 6e  r==".reply"} con
0fc0: 74 69 6e 75 65 0a 20 20 20 20 77 61 70 70 2d 73  tinue.    wapp-s
0fd0: 75 62 73 74 20 7b 25 68 74 6d 6c 28 24 76 61 72  ubst {%html($var
0fe0: 29 20 3d 20 25 68 74 6d 6c 28 5b 6c 69 73 74 20  ) = %html([list 
0ff0: 5b 77 61 70 70 2d 70 61 72 61 6d 20 24 76 61 72  [wapp-param $var
1000: 5d 5d 29 5c 6e 5c 6e 7d 0a 20 20 7d 0a 20 20 77  ]])\n\n}.  }.  w
1010: 61 70 70 20 22 3c 2f 70 72 65 3e 22 0a 20 20 77  app "</pre>".  w
1020: 61 70 70 2d 73 75 62 73 74 20 7b 3c 70 3e 3c 61  app-subst {<p><a
1030: 20 68 72 65 66 3d 27 25 68 74 6d 6c 28 5b 77 61   href='%html([wa
1040: 70 70 2d 70 61 72 61 6d 20 42 41 53 45 5f 55 52  pp-param BASE_UR
1050: 4c 5d 29 2f 27 3e 48 6f 6d 65 3c 2f 61 3e 3c 2f  L])/'>Home</a></
1060: 70 3e 5c 6e 7d 0a 7d 0a 70 72 6f 63 20 77 61 70  p>\n}.}.proc wap
1070: 70 2d 70 61 67 65 2d 6c 69 6e 74 20 7b 7d 20 7b  p-page-lint {} {
1080: 0a 20 20 77 61 70 70 20 22 3c 68 31 3e 50 6f 74  .  wapp "<h1>Pot
1090: 65 6e 74 61 6c 20 43 72 6f 73 73 2d 53 69 74 65  ental Cross-Site
10a0: 20 49 6e 6a 65 63 74 69 6f 6e 20 56 75 6c 65 72   Injection Vuler
10b0: 61 62 69 6c 69 74 69 65 73 20 49 6e 20 54 68 69  abilities In Thi
10c0: 73 20 41 70 70 3c 2f 68 31 3e 5c 6e 22 0a 20 20  s App</h1>\n".  
10d0: 73 65 74 20 72 65 73 20 5b 77 61 70 70 2d 73 61  set res [wapp-sa
10e0: 66 65 74 79 2d 63 68 65 63 6b 5d 0a 20 20 69 66  fety-check].  if
10f0: 20 7b 24 72 65 73 3d 3d 22 22 7d 20 7b 0a 20 20   {$res==""} {.  
1100: 20 20 77 61 70 70 20 22 3c 70 3e 4e 6f 20 70 72    wapp "<p>No pr
1110: 6f 62 6c 65 6d 73 20 66 6f 75 6e 64 2e 3c 2f 70  oblems found.</p
1120: 3e 5c 6e 22 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  >\n".  } else {.
1130: 20 20 20 20 77 61 70 70 2d 74 72 69 6d 20 7b 0a      wapp-trim {.
1140: 20 20 20 20 20 20 3c 70 72 65 3e 0a 20 20 20 20        <pre>.    
1150: 20 20 25 68 74 6d 6c 28 24 72 65 73 29 0a 20 20    %html($res).  
1160: 20 20 20 20 3c 2f 70 72 65 3e 0a 20 20 20 20 7d      </pre>.    }
1170: 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 77 61 70 70  .  }.}.proc wapp
1180: 2d 70 61 67 65 2d 66 69 6c 65 75 70 6c 6f 61 64  -page-fileupload
1190: 20 7b 7d 20 7b 0a 20 20 77 61 70 70 2d 63 6f 6e   {} {.  wapp-con
11a0: 74 65 6e 74 2d 73 65 63 75 72 69 74 79 2d 70 6f  tent-security-po
11b0: 6c 69 63 79 20 7b 64 65 66 61 75 6c 74 5f 73 72  licy {default_sr
11c0: 63 20 27 73 65 6c 66 27 20 27 69 6e 6c 69 6e 65  c 'self' 'inline
11d0: 27 7d 0a 20 20 77 61 70 70 2d 74 72 69 6d 20 7b  '}.  wapp-trim {
11e0: 0a 20 20 20 20 3c 68 31 3e 57 61 70 70 20 46 69  .    <h1>Wapp Fi
11f0: 6c 65 20 55 70 6c 6f 61 64 20 46 6f 72 6d 20 54  le Upload Form T
1200: 65 73 74 3c 2f 68 31 3e 0a 20 20 20 20 3c 70 3e  est</h1>.    <p>
1210: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 50 4f  <form method="PO
1220: 53 54 22 20 65 6e 63 74 79 70 65 3d 22 6d 75 6c  ST" enctype="mul
1230: 74 69 70 61 72 74 2f 66 6f 72 6d 2d 64 61 74 61  tipart/form-data
1240: 22 3e 0a 20 20 20 20 3c 69 6e 70 75 74 20 74 79  ">.    <input ty
1250: 70 65 3d 22 66 69 6c 65 22 20 6e 61 6d 65 3d 22  pe="file" name="
1260: 66 31 22 3e 3c 62 72 3e 0a 20 20 20 20 3c 69 6e  f1"><br>.    <in
1270: 70 75 74 20 74 79 70 65 3d 22 66 69 6c 65 22 20  put type="file" 
1280: 6e 61 6d 65 3d 22 66 32 22 3e 3c 62 72 3e 0a 20  name="f2"><br>. 
1290: 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22     <input type="
12a0: 66 69 6c 65 22 20 6e 61 6d 65 3d 22 66 33 22 3e  file" name="f3">
12b0: 3c 62 72 3e 0a 20 20 20 20 3c 69 6e 70 75 74 20  <br>.    <input 
12c0: 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 76 61  type="submit" va
12d0: 6c 75 65 3d 22 55 70 6c 6f 61 64 20 46 69 6c 65  lue="Upload File
12e0: 73 22 3e 0a 20 20 20 20 3c 2f 66 6f 72 6d 3e 3c  s">.    </form><
12f0: 2f 70 3e 0a 20 20 7d 0a 20 20 66 6f 72 65 61 63  /p>.  }.  foreac
1300: 68 20 6e 61 6d 65 20 7b 66 31 20 66 32 20 66 33  h name {f1 f2 f3
1310: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 77 61 70  } {.    if {[wap
1320: 70 2d 70 61 72 61 6d 20 24 6e 61 6d 65 2e 66 69  p-param $name.fi
1330: 6c 65 6e 61 6d 65 5d 3d 3d 22 22 7d 20 63 6f 6e  lename]==""} con
1340: 74 69 6e 75 65 0a 20 20 20 20 77 61 70 70 2d 73  tinue.    wapp-s
1350: 75 62 73 74 20 7b 3c 68 32 3e 25 68 74 6d 6c 28  ubst {<h2>%html(
1360: 24 6e 61 6d 65 29 3a 20 25 68 74 6d 6c 28 5b 77  $name): %html([w
1370: 61 70 70 2d 70 61 72 61 6d 20 24 6e 61 6d 65 2e  app-param $name.
1380: 66 69 6c 65 6e 61 6d 65 5d 29 3c 2f 68 32 3e 5c  filename])</h2>\
1390: 6e 7d 0a 20 20 20 20 73 65 74 20 6d 69 6d 65 74  n}.    set mimet
13a0: 79 70 65 20 5b 77 61 70 70 2d 70 61 72 61 6d 20  ype [wapp-param 
13b0: 24 6e 61 6d 65 2e 6d 69 6d 65 74 79 70 65 5d 0a  $name.mimetype].
13c0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13d0: 6d 61 74 63 68 20 74 65 78 74 2f 2a 20 24 6d 69  match text/* $mi
13e0: 6d 65 74 79 70 65 5d 7d 20 7b 0a 20 20 20 20 20  metype]} {.     
13f0: 20 77 61 70 70 2d 73 75 62 73 74 20 7b 3c 70 72   wapp-subst {<pr
1400: 65 3e 25 68 74 6d 6c 28 5b 77 61 70 70 2d 70 61  e>%html([wapp-pa
1410: 72 61 6d 20 24 6e 61 6d 65 2e 63 6f 6e 74 65 6e  ram $name.conten
1420: 74 5d 29 3c 2f 70 72 65 3e 5c 6e 7d 0a 20 20 20  t])</pre>\n}.   
1430: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69   } elseif {[stri
1440: 6e 67 20 6d 61 74 63 68 20 69 6d 61 67 65 2f 2a  ng match image/*
1450: 20 24 6d 69 6d 65 74 79 70 65 5d 7d 20 7b 0a 20   $mimetype]} {. 
1460: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 62       set data [b
1470: 69 6e 61 72 79 20 65 6e 63 6f 64 65 20 62 61 73  inary encode bas
1480: 65 36 34 20 5b 77 61 70 70 2d 70 61 72 61 6d 20  e64 [wapp-param 
1490: 24 6e 61 6d 65 2e 63 6f 6e 74 65 6e 74 5d 5d 0a  $name.content]].
14a0: 20 20 20 20 20 20 77 61 70 70 2d 73 75 62 73 74        wapp-subst
14b0: 20 7b 3c 69 6d 67 20 73 72 63 3d 22 64 61 74 61   {<img src="data
14c0: 3a 25 75 72 6c 28 24 6d 69 6d 65 74 79 70 65 29  :%url($mimetype)
14d0: 3b 62 61 73 65 36 34 2c 25 75 6e 73 61 66 65 28  ;base64,%unsafe(
14e0: 24 64 61 74 61 29 22 3e 5c 6e 7d 0a 20 20 20 20  $data)">\n}.    
14f0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 77  } else {.      w
1500: 61 70 70 2d 73 75 62 73 74 20 7b 3c 70 3e 55 6e  app-subst {<p>Un
1510: 72 65 6e 64 65 72 61 62 6c 65 20 6d 69 6d 65 2d  renderable mime-
1520: 74 79 70 65 3a 20 25 68 74 6d 6c 28 24 6d 69 6d  type: %html($mim
1530: 65 74 79 70 65 29 3c 2f 70 3e 5c 6e 7d 0a 20 20  etype)</p>\n}.  
1540: 20 20 7d 0a 20 20 20 20 77 61 70 70 2d 73 65 74    }.    wapp-set
1550: 2d 70 61 72 61 6d 20 24 6e 61 6d 65 2e 63 6f 6e  -param $name.con
1560: 74 65 6e 74 20 5c 0a 20 20 20 20 20 20 20 22 2e  tent \.       ".
1570: 2e 2e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  .. [string lengt
1580: 68 20 5b 77 61 70 70 2d 70 61 72 61 6d 20 24 6e  h [wapp-param $n
1590: 61 6d 65 2e 63 6f 6e 74 65 6e 74 5d 5d 20 62 79  ame.content]] by
15a0: 74 65 73 20 6f 66 20 64 61 74 61 20 2e 2e 2e 22  tes of data ..."
15b0: 0a 20 20 7d 0a 20 20 77 61 70 70 2d 74 72 69 6d  .  }.  wapp-trim
15c0: 20 7b 0a 20 20 20 20 3c 68 32 3e 45 6e 76 69 72   {.    <h2>Envir
15d0: 6f 6e 6d 65 6e 74 3c 2f 68 32 3e 0a 20 20 20 20  onment</h2>.    
15e0: 3c 70 72 65 3e 25 68 74 6d 6c 28 5b 77 61 70 70  <pre>%html([wapp
15f0: 2d 64 65 62 75 67 2d 65 6e 76 5d 29 0a 20 20 20  -debug-env]).   
1600: 20 2e 68 65 61 64 65 72 20 3d 20 25 68 74 6d 6c   .header = %html
1610: 28 5b 77 61 70 70 2d 70 61 72 61 6d 20 2e 68 65  ([wapp-param .he
1620: 61 64 65 72 5d 29 0a 20 20 20 20 3c 2f 70 72 65  ader]).    </pre
1630: 3e 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 77 61  >.  }.}..proc wa
1640: 70 70 2d 70 61 67 65 2d 65 6e 63 6f 64 69 6e 67  pp-page-encoding
1650: 73 20 7b 7d 20 7b 0a 20 20 73 65 74 20 73 74 72  s {} {.  set str
1660: 6c 69 73 74 20 7b 0a 20 20 20 20 20 7b 4a 6f 68  list {.     {Joh
1670: 61 6e 6e 20 53 74 72 61 75 c3 9f 7d 0a 20 20 20  ann Strau..}.   
1680: 20 20 7b d0 92 d0 b0 d0 b3 d0 b8 d1 84 20 d0 a1    {.......... ..
1690: d3 99 d0 bc d3 99 d0 b4 d0 be d2 93 d0 bb d1 83  ................
16a0: 7d 0a 20 20 20 20 20 7b e4 b8 ad e5 9b bd 7d 0a  }.     {......}.
16b0: 20 20 20 20 20 7b 24 5b 68 69 5d 7b 74 68 65 72       {$[hi]{ther
16c0: 65 7d 24 7d 0a 20 20 20 20 20 7b 68 74 74 70 73  e}$}.     {https
16d0: 3a 2f 2f 64 72 68 40 73 71 6c 69 74 65 2e 6f 72  ://drh@sqlite.or
16e0: 67 2f 69 6e 66 6f 3f 6e 61 6d 65 3d 74 72 75 6e  g/info?name=trun
16f0: 6b 23 62 6c 6f 63 6b 32 7d 0a 20 20 7d 0a 20 20  k#block2}.  }.  
1700: 77 61 70 70 2d 73 75 62 73 74 20 7b 0a 20 20 20  wapp-subst {.   
1710: 20 20 3c 68 31 3e 54 65 73 74 20 74 68 65 20 25    <h1>Test the %
1720: 71 70 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  qp substitutions
1730: 3c 2f 68 31 3e 0a 20 20 20 20 20 3c 74 61 62 6c  </h1>.     <tabl
1740: 65 20 62 6f 72 64 65 72 3d 31 20 63 65 6c 6c 70  e border=1 cellp
1750: 61 64 64 69 6e 67 3d 35 3e 0a 20 20 20 20 20 3c  adding=5>.     <
1760: 74 72 3e 3c 74 68 3e 4f 72 69 67 69 6e 61 6c 3c  tr><th>Original<
1770: 74 68 3e 45 6e 63 6f 64 65 64 3c 74 68 3e 52 6f  th>Encoded<th>Ro
1780: 75 6e 64 2d 54 72 69 70 3c 2f 74 72 3e 0a 20 20  und-Trip</tr>.  
1790: 7d 0a 20 20 66 6f 72 65 61 63 68 20 73 74 72 20  }.  foreach str 
17a0: 24 73 74 72 6c 69 73 74 20 7b 0a 20 20 20 20 77  $strlist {.    w
17b0: 61 70 70 2d 73 75 62 73 74 20 7b 3c 74 72 3e 3c  app-subst {<tr><
17c0: 74 64 3e 25 75 6e 73 61 66 65 28 24 73 74 72 29  td>%unsafe($str)
17d0: 3c 74 64 3e 25 71 70 28 24 73 74 72 29 7d 0a 20  <td>%qp($str)}. 
17e0: 20 20 20 73 65 74 20 78 20 5b 77 61 70 70 49 6e     set x [wappIn
17f0: 74 2d 64 65 63 6f 64 65 2d 75 72 6c 20 5b 77 61  t-decode-url [wa
1800: 70 70 49 6e 74 2d 65 6e 63 2d 71 70 20 24 73 74  ppInt-enc-qp $st
1810: 72 5d 5d 0a 20 20 20 20 77 61 70 70 2d 73 75 62  r]].    wapp-sub
1820: 73 74 20 7b 3c 74 64 3e 25 75 6e 73 61 66 65 28  st {<td>%unsafe(
1830: 24 78 29 3c 2f 74 72 3e 5c 6e 7d 0a 20 20 7d 0a  $x)</tr>\n}.  }.
1840: 20 20 77 61 70 70 2d 73 75 62 73 74 20 7b 3c 2f    wapp-subst {</
1850: 74 61 62 6c 65 3e 7d 0a 0a 20 20 77 61 70 70 2d  table>}..  wapp-
1860: 73 75 62 73 74 20 7b 0a 20 20 20 20 20 3c 68 31  subst {.     <h1
1870: 3e 54 65 73 74 20 74 68 65 20 25 75 72 6c 20 73  >Test the %url s
1880: 75 62 73 74 69 74 75 74 69 6f 6e 73 3c 2f 68 31  ubstitutions</h1
1890: 3e 0a 20 20 20 20 20 3c 74 61 62 6c 65 20 62 6f  >.     <table bo
18a0: 72 64 65 72 3d 31 20 63 65 6c 6c 70 61 64 64 69  rder=1 cellpaddi
18b0: 6e 67 3d 35 3e 0a 20 20 20 20 20 3c 74 72 3e 3c  ng=5>.     <tr><
18c0: 74 68 3e 4f 72 69 67 69 6e 61 6c 3c 74 68 3e 45  th>Original<th>E
18d0: 6e 63 6f 64 65 64 3c 74 68 3e 52 6f 75 6e 64 2d  ncoded<th>Round-
18e0: 54 72 69 70 3c 2f 74 72 3e 0a 20 20 7d 0a 20 20  Trip</tr>.  }.  
18f0: 66 6f 72 65 61 63 68 20 73 74 72 20 24 73 74 72  foreach str $str
1900: 6c 69 73 74 20 7b 0a 20 20 20 20 77 61 70 70 2d  list {.    wapp-
1910: 73 75 62 73 74 20 7b 3c 74 72 3e 3c 74 64 3e 25  subst {<tr><td>%
1920: 75 6e 73 61 66 65 28 24 73 74 72 29 3c 74 64 3e  unsafe($str)<td>
1930: 25 75 72 6c 28 24 73 74 72 29 7d 0a 20 20 20 20  %url($str)}.    
1940: 73 65 74 20 78 20 5b 77 61 70 70 49 6e 74 2d 64  set x [wappInt-d
1950: 65 63 6f 64 65 2d 75 72 6c 20 5b 77 61 70 70 49  ecode-url [wappI
1960: 6e 74 2d 65 6e 63 2d 75 72 6c 20 24 73 74 72 5d  nt-enc-url $str]
1970: 5d 0a 20 20 20 20 77 61 70 70 2d 73 75 62 73 74  ].    wapp-subst
1980: 20 7b 3c 74 64 3e 25 75 6e 73 61 66 65 28 24 78   {<td>%unsafe($x
1990: 29 3c 2f 74 72 3e 5c 6e 7d 0a 20 20 7d 0a 20 20  )</tr>\n}.  }.  
19a0: 77 61 70 70 2d 73 75 62 73 74 20 7b 3c 2f 74 61  wapp-subst {</ta
19b0: 62 6c 65 3e 7d 0a 7d 0a 23 20 44 65 6c 69 62 65  ble>}.}.# Delibe
19c0: 72 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65 20  rately generate 
19d0: 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 65 73 74  an error to test
19e0: 20 65 72 72 6f 72 20 68 61 6e 64 6c 69 6e 67 2e   error handling.
19f0: 0a 70 72 6f 63 20 77 61 70 70 2d 70 61 67 65 2d  .proc wapp-page-
1a00: 65 72 72 6f 72 6f 75 74 20 7b 7d 20 7b 0a 20 20  errorout {} {.  
1a10: 77 61 70 70 20 22 3c 68 31 3e 49 6e 74 65 6e 74  wapp "<h1>Intent
1a20: 69 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 20 61  ially generate a
1a30: 6e 20 65 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a  n error</h1>\n".
1a40: 20 20 77 61 70 70 20 22 3c 70 3e 54 68 69 73 20    wapp "<p>This 
1a50: 74 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 69  test should be i
1a60: 67 6e 6f 72 65 64 20 62 79 20 74 68 65 20 65 72  gnored by the er
1a70: 72 6f 72 20 68 61 6e 64 6c 65 72 5c 6e 22 0a 20  ror handler\n". 
1a80: 20 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67   # The following
1a90: 20 6c 69 6e 65 20 64 65 6c 69 62 65 72 61 74 65   line deliberate
1aa0: 6c 79 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72  ly throws an err
1ab0: 6f 72 20 74 6f 20 74 65 73 74 20 74 68 65 0a 20  or to test the. 
1ac0: 20 23 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72   # error recover
1ad0: 69 6e 67 20 6c 6f 67 69 63 20 77 69 74 68 69 6e  ing logic within
1ae0: 20 57 61 70 70 0a 20 20 77 61 70 70 20 24 6e 6f   Wapp.  wapp $no
1af0: 53 75 63 68 56 61 72 69 61 62 6c 65 0a 20 20 77  SuchVariable.  w
1b00: 61 70 70 20 22 54 68 69 73 20 69 73 20 61 20 24  app "This is a $
1b10: 74 65 73 74 20 6f 66 20 77 61 70 70 2d 73 61 66  test of wapp-saf
1b20: 65 74 79 2d 63 68 65 63 6b 22 0a 20 20 77 61 70  ety-check".  wap
1b30: 70 20 22 54 68 69 73 20 69 73 20 61 6e 6f 74 68  p "This is anoth
1b40: 65 72 20 5b 74 65 73 74 20 6f 66 5d 20 77 61 70  er [test of] wap
1b50: 70 2d 73 61 66 65 74 79 2d 63 68 65 63 6b 22 0a  p-safety-check".
1b60: 20 20 77 61 70 70 20 22 3c 70 3e 41 66 74 65 72    wapp "<p>After
1b70: 20 74 68 65 20 65 72 72 6f 72 5c 6e 22 0a 7d 0a   the error\n".}.
1b80: 70 72 6f 63 20 77 61 70 70 2d 70 61 67 65 2d 63  proc wapp-page-c
1b90: 73 70 74 65 73 74 20 7b 7d 20 7b 0a 20 20 77 61  sptest {} {.  wa
1ba0: 70 70 2d 61 6c 6c 6f 77 2d 78 6f 72 69 67 69 6e  pp-allow-xorigin
1bb0: 2d 70 61 72 61 6d 73 0a 20 20 69 66 20 7b 5b 77  -params.  if {[w
1bc0: 61 70 70 2d 70 61 72 61 6d 2d 65 78 69 73 74 73  app-param-exists
1bd0: 20 63 73 70 5d 7d 20 7b 0a 20 20 20 20 77 61 70   csp]} {.    wap
1be0: 70 2d 63 6f 6e 74 65 6e 74 2d 73 65 63 75 72 69  p-content-securi
1bf0: 74 79 2d 70 6f 6c 69 63 79 20 5b 77 61 70 70 2d  ty-policy [wapp-
1c00: 70 61 72 61 6d 20 63 73 70 5d 0a 20 20 7d 0a 20  param csp].  }. 
1c10: 20 77 61 70 70 2d 74 72 69 6d 20 7b 0a 20 20 20   wapp-trim {.   
1c20: 20 3c 68 31 3e 43 6f 6e 74 65 6e 74 20 53 65 63   <h1>Content Sec
1c30: 75 72 69 74 79 20 50 6f 6c 69 63 79 20 54 65 73  urity Policy Tes
1c40: 74 20 50 61 67 65 3c 2f 68 31 3e 0a 20 20 20 20  t Page</h1>.    
1c50: 3c 70 3e 20 54 68 65 72 65 20 69 73 20 61 20 26  <p> There is a &
1c60: 6c 74 3b 73 63 72 69 70 74 26 67 74 3b 20 61 74  lt;script&gt; at
1c70: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
1c80: 20 20 20 74 68 69 73 20 70 61 67 65 20 74 68 61     this page tha
1c90: 74 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 61 6e  t will invoke an
1ca0: 20 61 6c 65 72 74 28 29 2e 20 20 54 68 65 0a 20   alert().  The. 
1cb0: 20 20 20 73 63 72 69 70 74 20 77 69 6c 6c 20 62     script will b
1cc0: 65 20 64 69 73 61 62 6c 65 64 20 62 79 20 74 68  e disabled by th
1cd0: 65 20 64 65 66 61 75 6c 74 20 43 53 50 2e 0a 20  e default CSP.. 
1ce0: 20 20 20 3c 70 3e 55 73 65 20 74 68 65 20 63 73     <p>Use the cs
1cf0: 70 3d 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  p= query paramet
1d00: 65 72 20 74 6f 20 63 68 61 6e 67 65 20 43 53 50  er to change CSP
1d10: 2e 0a 20 20 20 20 3c 73 63 72 69 70 74 3e 61 6c  ..    <script>al
1d20: 65 72 74 28 22 54 68 69 73 20 69 73 20 74 68 65  ert("This is the
1d30: 20 61 6c 65 72 74 22 29 3b 3c 2f 73 63 72 69 70   alert");</scrip
1d40: 74 3e 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 77 61  t>.  }.}.proc wa
1d50: 70 70 2d 70 61 67 65 2d 73 65 6c 66 20 7b 7d 20  pp-page-self {} 
1d60: 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  {.  set fd [open
1d70: 20 5b 77 61 70 70 2d 70 61 72 61 6d 20 53 43 52   [wapp-param SCR
1d80: 49 50 54 5f 46 49 4c 45 4e 41 4d 45 5d 20 72 62  IPT_FILENAME] rb
1d90: 5d 0a 20 20 73 65 74 20 73 63 72 69 70 74 20 5b  ].  set script [
1da0: 72 65 61 64 20 24 66 64 5d 0a 20 20 63 6c 6f 73  read $fd].  clos
1db0: 65 20 24 66 64 0a 20 20 77 61 70 70 2d 63 6f 6e  e $fd.  wapp-con
1dc0: 74 65 6e 74 2d 73 65 63 75 72 69 74 79 2d 70 6f  tent-security-po
1dd0: 6c 69 63 79 20 7b 64 65 66 61 75 6c 74 2d 73 72  licy {default-sr
1de0: 63 20 27 69 6e 6c 69 6e 65 27 20 27 75 6e 73 61  c 'inline' 'unsa
1df0: 66 65 2d 69 6e 6c 69 6e 65 27 7d 0a 20 20 77 61  fe-inline'}.  wa
1e00: 70 70 2d 74 72 69 6d 20 7b 0a 20 20 20 20 3c 68  pp-trim {.    <h
1e10: 31 3e 53 6f 75 72 63 65 20 63 6f 64 65 20 74 6f  1>Source code to
1e20: 20 74 68 69 73 20 73 63 72 69 70 74 3c 2f 68 31   this script</h1
1e30: 3e 0a 20 20 20 20 3c 70 72 65 20 73 74 79 6c 65  >.    <pre style
1e40: 3d 27 62 6f 72 64 65 72 3a 20 31 70 78 20 73 6f  ='border: 1px so
1e50: 6c 69 64 20 62 6c 61 63 6b 3b 27 3e 25 68 74 6d  lid black;'>%htm
1e60: 6c 28 24 73 63 72 69 70 74 29 3c 2f 70 72 65 3e  l($script)</pre>
1e70: 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 77 61 70 70  .  }.}.proc wapp
1e80: 2d 70 61 67 65 2d 64 72 68 2e 6a 70 67 20 7b 7d  -page-drh.jpg {}
1e90: 20 7b 0a 20 20 77 61 70 70 2d 6d 69 6d 65 74 79   {.  wapp-mimety
1ea0: 70 65 20 69 6d 61 67 65 2f 6a 70 65 67 0a 20 20  pe image/jpeg.  
1eb0: 77 61 70 70 2d 63 61 63 68 65 2d 63 6f 6e 74 72  wapp-cache-contr
1ec0: 6f 6c 20 6d 61 78 2d 61 67 65 3d 33 36 30 30 0a  ol max-age=3600.
1ed0: 20 20 77 61 70 70 2d 75 6e 73 61 66 65 20 5b 62    wapp-unsafe [b
1ee0: 69 6e 61 72 79 20 64 65 63 6f 64 65 20 62 61 73  inary decode bas
1ef0: 65 36 34 20 7b 0a 20 20 20 20 2f 39 6a 2f 34 41  e64 {.    /9j/4A
1f00: 41 51 53 6b 5a 4a 52 67 41 42 41 51 45 41 6c 67  AQSkZJRgABAQEAlg
1f10: 43 57 41 41 44 2f 2f 67 41 65 54 45 56 42 52 43  CWAAD//gAeTEVBRC
1f20: 42 55 5a 57 4e 6f 62 6d 39 73 62 32 64 70 5a 58  BUZWNobm9sb2dpZX
1f30: 4d 67 53 57 35 6a 4c 69 42 57 0a 20 20 20 20 4d  MgSW5jLiBW.    M
1f40: 53 34 77 4d 66 2f 62 41 45 4d 41 43 41 59 47 42  S4wMf/bAEMACAYGB
1f50: 77 59 46 43 41 63 48 42 77 6b 4a 43 41 6f 4d 46  wYFCAcHBwkJCAoMF
1f60: 41 30 4d 43 77 73 4d 47 52 49 54 44 78 51 64 47  A0MCwsMGRITDxQdG
1f70: 68 38 65 48 52 6f 63 48 43 41 6b 4c 69 63 67 0a  h8eHRocHCAkLicg.
1f80: 20 20 20 20 49 69 77 6a 48 42 77 6f 4e 79 6b 73      IiwjHBwoNyks
1f90: 4d 44 45 30 4e 44 51 66 4a 7a 6b 39 4f 44 49 38  MDE0NDQfJzk9ODI8
1fa0: 4c 6a 4d 30 4d 76 2f 62 41 45 4d 42 43 51 6b 4a  LjM0Mv/bAEMBCQkJ
1fb0: 44 41 73 4d 47 41 30 4e 47 44 49 68 48 43 45 79  DAsMGA0NGDIhHCEy
1fc0: 4d 6a 49 79 0a 20 20 20 20 4d 6a 49 79 4d 6a 49  MjIy.    MjIyMjI
1fd0: 79 4d 6a 49 79 4d 6a 49 79 4d 6a 49 79 4d 6a 49  yMjIyMjIyMjIyMjI
1fe0: 79 4d 6a 49 79 4d 6a 49 79 4d 6a 49 79 4d 6a 49  yMjIyMjIyMjIyMjI
1ff0: 79 4d 6a 49 79 4d 6a 49 79 4d 6a 49 79 4d 6a 49  yMjIyMjIyMjIyMjI
2000: 79 4d 6a 49 79 4d 76 2f 41 0a 20 20 20 20 41 42  yMjIyMv/A.    AB
2010: 45 49 41 4a 49 41 6c 41 4d 42 45 51 41 43 45 51  EIAJIAlAMBEQACEQ
2020: 45 44 45 51 48 2f 78 41 41 63 41 41 41 42 42 51  EDEQH/xAAcAAABBQ
2030: 45 42 41 51 41 41 41 41 41 41 41 41 41 41 41 41  EBAQAAAAAAAAAAAA
2040: 41 43 41 41 45 44 42 41 55 47 42 77 6a 2f 0a 20  ACAAEDBAUGBwj/. 
2050: 20 20 20 78 41 41 39 45 41 41 43 41 51 4d 43 41     xAA9EAACAQMCA
2060: 77 59 44 42 67 51 44 43 51 41 41 41 41 41 42 41  wYDBgQDCQAAAAABA
2070: 67 4d 41 42 42 45 46 49 52 49 78 51 51 59 54 49  gMABBEFIRIxQQYTI
2080: 6a 4a 52 59 51 64 78 6b 54 4e 43 67 61 47 78 77  jJRYQdxkTNCgaGxw
2090: 52 51 57 0a 20 20 20 20 49 31 49 56 4a 48 49 30  RQW.    I1IVJHI0
20a0: 51 32 4a 7a 67 72 4c 52 34 66 44 2f 78 41 41 5a  Q2JzgrLR4fD/xAAZ
20b0: 41 51 45 42 41 41 4d 42 41 41 41 41 41 41 41 41  AQEBAAMBAAAAAAAA
20c0: 41 41 41 41 41 41 41 41 41 51 49 44 42 41 58 2f  AAAAAAAAAQIDBAX/
20d0: 78 41 41 6b 45 51 45 42 0a 20 20 20 20 41 41 49  xAAkEQEB.    AAI
20e0: 43 41 67 49 44 41 41 4d 42 41 41 41 41 41 41 41  CAgIDAAMBAAAAAAA
20f0: 41 41 51 49 52 41 7a 45 53 49 51 52 42 45 79 4a  AAQIRAzESIQRBEyJ
2100: 68 42 54 4a 52 51 76 2f 61 41 41 77 44 41 51 41  hBTJRQv/aAAwDAQA
2110: 43 45 51 4d 52 41 44 38 41 39 79 35 43 0a 20 20  CEQMRAD8A9y5C.  
2120: 20 20 6f 79 52 44 65 54 35 55 52 4b 66 4c 52 51    oyRDeT5URKfLRQ
2130: 74 35 68 52 45 72 66 59 6d 67 7a 52 39 71 4b 69  t5hRErfYmgzR9qKi
2140: 72 6f 33 52 71 6f 6c 47 38 59 6f 47 58 6d 52 51  ro3RqolG8YoGXmRQ
2150: 43 4e 69 61 42 4b 65 47 53 67 4e 78 51 4b 50 78  CNiaBKeGSgNxQKPx
2160: 49 79 0a 20 20 20 20 48 70 52 45 47 4f 46 79 4b  Iy.    HpREGOFyK
2170: 4b 49 30 44 59 6f 46 69 67 56 41 71 6f 4d 37 4c  KI0DYoFigVAqoM7L
2180: 55 45 63 59 79 53 61 43 56 75 67 6f 42 62 37 51  UEcYySaCVugoBb7Q
2190: 55 45 72 2f 5a 47 67 7a 52 39 6f 76 34 31 46 58  UEr/ZGgzR9ov41FX
21a0: 45 38 72 56 55 53 70 0a 20 20 20 20 39 6b 4b 41  E8rVUSp.    9kKA
21b0: 65 49 4b 63 6b 30 41 72 49 6b 6e 6a 6a 5a 58 55  eIKck0ArIknjjZXU
21c0: 37 63 53 6e 49 71 42 4e 30 4e 55 53 6e 64 41 61  7cSnIqBN0NUSndAa
21d0: 41 46 50 44 49 44 30 4f 31 45 4b 5a 63 48 4e 46  AFPDID0O1EKZcHNF
21e0: 42 7a 46 41 71 42 47 67 56 41 31 41 0a 20 20 20  BzFAqBGgVA1A.   
21f0: 20 55 68 77 6c 41 30 51 38 46 41 5a 38 31 41 78   UhwlA0Q8FAZ81Ax
2200: 2b 31 6f 4a 58 2b 79 4e 45 5a 54 79 4a 46 2f 55  +1oJX+yNEZTyJF/U
2210: 6b 5a 55 52 51 53 7a 4d 63 41 44 31 4a 71 4b 35  kZURQSzMcAD1JqK5
2220: 4c 74 44 38 55 64 48 30 61 7a 63 32 4f 62 2b 34  LtD8UdH0azc2Ob+4
2230: 4a 0a 20 20 20 20 77 46 54 49 51 65 35 50 2f 69  J.    wFTIQe5P/i
2240: 70 61 73 78 72 68 64 51 2b 4e 4f 74 54 78 74 2f  pasxrhdQ+NOtTxt/
2250: 41 77 32 74 6e 48 6a 49 5a 6c 37 78 68 39 64 76  Aw2tnHjIZl7xh9dv
2260: 79 71 65 54 4b 59 4f 4d 76 75 31 2b 73 61 6b 6a  yqeTKYOMvu1+sakj
2270: 70 64 61 70 63 79 0a 20 20 20 20 49 35 79 51 30  pdapcy.    I5yQ0
2280: 70 43 6b 2b 77 48 53 69 36 51 61 66 32 6c 31 48  pCk+wHSi6Qaf2l1H
2290: 53 6e 55 57 4e 2f 63 57 37 71 33 45 65 35 6b 49  SnUWN/cW7q3Ee5kI
22a0: 41 2f 44 6b 61 64 47 74 74 35 66 69 62 32 6c 53  A/DkadGtt5fib2lS
22b0: 66 76 54 71 6e 41 34 49 79 70 51 0a 20 20 20 20  fvTqnA4IypQ.    
22c0: 45 4d 66 63 45 59 78 54 64 54 78 6a 31 66 73 6a  EMfcEYxTdTxj1fsj
22d0: 38 55 39 49 31 78 30 73 62 31 78 61 58 6a 41 42  8U9I1x0sb1xaXjAB
22e0: 57 66 61 4f 51 2b 67 50 51 2b 78 72 4b 56 6a 72  WfaOQ+gPQ+xrKVjr
22f0: 54 76 54 75 76 79 71 6f 50 7a 78 35 36 30 45 49  TvTuvyqoPzx560EI
2300: 0a 20 20 20 20 32 4f 4b 42 36 42 71 42 55 43 6f  .    2OKB6BqBUCo
2310: 46 4e 30 46 41 61 6a 43 69 67 63 62 76 51 43 4e  FN0FAajCigcbvQCN
2320: 35 61 43 57 54 61 49 30 48 6a 2f 78 4f 37 56 77  5aCWTaI0Hj/xO7Vw
2330: 78 39 33 6f 4d 44 35 6b 6b 38 55 2b 44 79 58 6f  x93oMD5kk8U+DyXo
2340: 70 2b 66 4f 73 0a 20 20 20 20 61 7a 78 6a 78 75  p+fOs.    azxjxu
2350: 2f 75 62 6e 56 4c 39 2b 35 56 75 46 57 41 58 67  /ubnVL9+5VuFWAXg
2360: 48 51 63 2f 72 57 46 73 6e 62 62 6a 68 63 75 6c  HQc/rWFsnbbjhcul
2370: 71 32 37 4a 33 30 38 61 6d 59 46 56 50 51 64 61  q27J308amYFVPQda
2380: 31 33 6c 6a 6f 6e 78 63 76 74 0a 20 20 20 20 70  13ljonxcvt.    p
2390: 52 39 6c 70 55 38 48 64 7a 41 2b 6f 47 54 57 50  R9lpU8HdzA+oGTWP
23a0: 35 57 63 2b 50 38 41 78 4e 2f 4a 4e 35 2f 44 6d  5Wc+P8AxN/JN5/Dm
23b0: 53 4f 4e 76 58 44 44 42 4e 54 38 79 33 34 6c 37  SONvXDDBNT8y34l7
23c0: 59 31 39 6f 46 37 62 46 69 56 50 46 6a 66 50 0a  Y19oF7bFiVPFjfP.
23d0: 20 20 20 20 57 74 6b 35 4a 57 6a 4c 67 73 5a 30      Wtk5JWjLgsZ0
23e0: 63 4d 31 75 36 38 53 34 47 63 6e 62 65 74 6b 79  cM1u68S4Gcnbetky
23f0: 6c 61 62 68 5a 32 2b 68 76 68 56 32 6c 4f 6f 61  labhZ2+hvhV2lOoa
2400: 4d 4e 4b 76 4c 6a 76 4c 71 33 79 59 69 78 79 58  MNKvLjvLq3yYixyX
2410: 69 36 62 2b 0a 20 20 20 20 6f 4f 33 79 78 57 55  i6b+.    oO3yxWU
2420: 72 56 6c 4e 56 36 47 68 34 57 4b 31 6b 78 4d 36  rVlNV6Gh4WK1kxM6
2430: 34 62 4e 41 4e 41 71 42 71 42 71 42 50 76 49 42  4bNANAqBqBqBPvIB
2440: 36 55 45 6f 6f 48 58 31 6f 41 58 65 57 67 61 2f  6UEooHX1oAXeWga/
2450: 75 6f 62 50 54 35 72 6d 64 0a 20 20 20 20 77 6b  uobPT5rmd.    wk
2460: 4d 61 46 33 59 39 41 4b 4a 48 7a 46 72 4e 73 4e  MaF3Y9AKJHzFrNsN
2470: 61 37 51 33 57 70 4d 5a 41 6b 6a 38 55 53 4d 64  a7Q3WpMZAkj8USMd
2480: 2b 48 6b 4d 2f 68 57 75 33 55 62 38 4d 4e 33 54  +HkM/hWu3Ub8MN3T
2490: 71 4e 4a 30 53 33 73 6f 51 46 69 48 45 52 0a 20  qNJ0S3soQFiHER. 
24a0: 20 20 20 6b 6b 37 31 78 5a 35 62 37 65 78 78 63     kk71xZ5b7exxc
24b0: 63 78 6d 6f 36 4b 7a 73 73 62 42 63 6a 33 46 61  cxmo6KzssbBcj3Fa
24c0: 37 58 52 71 61 61 6b 4e 73 45 38 69 42 63 2b 31  7XRqaakNsE8iBc+1
24d0: 4e 70 55 72 51 4e 6a 6c 74 55 54 63 5a 56 2f 6f  NpUrQNjltUTcZV/o
24e0: 30 4e 78 0a 20 20 20 20 34 35 6f 46 59 2b 75 4b  0Nx.    45oFY+uK
24f0: 79 6c 73 53 7a 47 75 58 31 66 73 76 48 4b 65 38  ylsSzGuX1fsvHKe8
2500: 74 30 77 63 63 67 66 7a 72 5a 6a 6e 70 7a 63 76  t0wccgfzrZjnpzcv
2510: 46 4b 78 4c 4f 53 37 37 50 33 4e 76 66 32 6a 4e  FKxLOS77P3Nvf2jN
2520: 44 64 52 50 78 4c 67 37 0a 20 20 20 20 53 41 65  DdRPxLg7.    SAe
2530: 5a 54 38 78 6b 66 4b 75 76 47 2f 62 7a 4f 54 48  ZT8xkfKuvG/bzOTH
2540: 56 30 2b 6a 62 53 35 57 37 74 49 4c 70 42 68 5a  V0+jbS5W7tILpBhZ
2550: 55 56 77 50 51 45 5a 72 61 30 4c 52 38 53 55 45  UVwPQEZra0LR8SUE
2560: 65 4b 42 73 55 43 78 51 4c 61 67 45 62 0a 20 20  eKBsUCxQLagEb.  
2570: 20 20 79 45 30 45 76 72 51 45 6f 35 30 41 52 2b    yE0EvrQEo50AR+
2580: 63 6d 67 35 37 34 69 63 58 38 69 61 6c 77 48 42  cmg574icX8ialwHB
2590: 34 56 2f 77 43 34 56 4c 30 75 50 62 78 4b 78 74  4V/wC4VL0uPbxKxt
25a0: 7a 4c 64 51 34 4f 63 34 79 53 63 6e 47 63 6a 50  zLdQ4Oc4yScnGcjP
25b0: 31 72 0a 20 20 20 20 52 79 58 30 36 2f 6a 7a 39  1r.    RyX06/jz9
25c0: 6e 5a 77 49 53 36 72 30 35 56 78 57 76 57 6e 54  nZwIS6r05VxWvWnT
25d0: 70 4c 4a 68 46 48 6a 68 33 49 33 71 79 73 63 76  pLJhFHjh3I3qyscv
25e0: 61 59 34 34 6a 74 55 74 5a 66 51 73 37 63 73 69  aY44jtUtZfQs7csi
25f0: 69 46 4b 36 6d 42 6c 0a 20 20 20 20 34 52 79 72  iFK6mBl.    4Ryr
2600: 4c 66 70 68 72 32 77 70 41 4f 39 39 71 78 6a 4f  Lfphr2wpAO99qxjO
2610: 75 51 31 53 30 37 34 58 45 51 55 6b 70 49 57 51  uQ1S074XEQUkpIWQ
2620: 2b 6c 64 6e 46 66 54 79 2f 6b 54 39 6e 72 33 59  +ldnFfTy/kT9nr3Y
2630: 36 57 53 66 73 6a 70 7a 53 76 78 4f 0a 20 20 20  6WSfsjpzSvxO.   
2640: 20 49 51 70 4f 4d 63 74 76 32 72 6f 6a 6a 76 62   IQpOMctv2rojjvb
2650: 65 51 34 79 4b 71 45 77 33 32 6f 70 73 55 51 31  eQ4yKqEw32opsUQ1
2660: 41 71 41 59 78 6b 6b 30 45 67 6f 44 47 77 4e 41  AqAYxkk0EgoDGwNA
2670: 45 51 33 6f 4f 62 2b 49 37 42 65 77 75 6f 63 53  EQ3oOb+I7BewuocS
2680: 38 0a 20 20 20 20 53 6b 49 43 50 2b 6f 56 4c 30  8.    SkICP+oVL0
2690: 75 50 62 78 62 53 37 68 49 74 51 43 45 67 6c 51  uPbxbS7hItQCEglQ
26a0: 42 6e 33 36 66 6c 58 50 79 54 30 37 4f 43 36 72  Bn36flXPyT07OC6r
26b0: 74 72 59 35 6b 47 4f 6f 72 6a 72 30 38 65 6d 37  trY5kGOorjr08em7
26c0: 41 65 52 4a 41 32 0a 20 20 20 20 70 37 46 6c 53  AeRJA2.    p7FlS
26d0: 68 4f 4d 6a 4e 4e 4b 63 73 71 6e 63 69 71 69 4f  hOMjNNKcsqnciqiO
26e0: 54 78 4c 34 53 44 37 55 31 55 32 79 35 6c 41 6b  TxL4SD7U1U2y5lAk
26f0: 35 59 48 74 55 58 62 6b 62 79 35 6a 58 56 57 47  5YHtUXbkby5jXVWG
2700: 52 67 73 63 35 2b 57 4b 36 2b 4c 0a 20 20 20 20  Rgsc5+WK6+L.    
2710: 70 35 33 79 50 64 65 6d 2f 44 2b 51 79 64 6c 6f  p53yPdem/D+Qydlo
2720: 63 34 4b 68 32 43 6e 32 7a 58 54 48 46 65 33 55  c4Kh2Cn2zXTHFe3U
2730: 59 77 61 72 45 66 4d 55 41 59 6f 45 61 4b 62 46  YwarEfMUAYoEaKbF
2740: 45 4e 47 4d 43 67 50 37 39 51 47 32 79 31 51 4d  ENGMCgP79QG2y1QM
2750: 0a 20 20 20 20 58 4d 30 47 46 32 36 74 68 65 64  .    XM0GF26thed
2760: 69 39 54 68 4c 42 43 59 75 49 45 6e 71 43 44 6a  i9ThLBCYuIEnqCDj
2770: 35 37 56 4d 72 36 5a 59 53 32 36 6a 35 36 69 44  57VMr6ZYS26j56iD
2780: 51 33 45 62 6a 5a 47 59 41 62 38 74 2b 56 61 4d  Q3EbjZGYAb8t+VaM
2790: 2b 6e 56 78 7a 0a 20 20 20 20 56 64 38 62 35 64  +nVxz.    Vd8b5d
27a0: 4f 74 7a 49 73 66 47 34 58 43 72 58 4a 72 66 74  OtzIsfG4XCrXJrft
27b0: 36 4e 79 31 36 63 33 64 64 74 64 53 5a 6f 34 72  6Ny16c3ddtdSZo4r
27c0: 53 51 75 30 68 34 56 4b 52 38 51 4a 39 41 63 59  SQu0h4VKR8QJ9AcY
27d0: 7a 57 36 63 64 73 33 70 6f 76 0a 20 20 20 20 4e  zW6cds3pov.    N
27e0: 4a 64 62 62 65 67 61 78 71 74 32 79 6d 35 62 6a  Jdbbegaxqt2ym5bj
27f0: 41 32 59 59 77 51 66 6c 57 6e 4c 54 70 77 74 76  A2YYwQflWnLTpwtv
2800: 62 57 31 79 35 76 49 4c 63 79 51 74 33 5a 43 35  bW1y5vILcyQt3ZC5
2810: 4a 4e 53 4d 38 75 76 54 68 30 31 33 74 41 6c 0a  JNSM8uvTh013tAl.
2820: 20 20 20 20 37 45 70 6b 75 48 6a 6d 5a 75 37 41      7EpkuHjmZu7A
2830: 78 6c 73 63 38 66 4b 75 6a 48 6a 75 55 33 48 46  xlsc8fKujHjuU3HF
2840: 6e 79 2b 47 57 72 58 53 61 4c 72 4d 31 35 78 78  ny+GWrXSaLrM15xx
2850: 54 75 7a 34 4a 41 5a 67 51 79 4d 4f 61 73 44 79  Tuz4JAZgQyMOasDy
2860: 4e 61 63 70 0a 20 20 20 20 71 74 75 4f 58 72 62  Nacp.    qtuOXrb
2870: 6e 4e 61 5a 6f 64 54 75 31 43 35 59 62 71 42 31  nNaZodTu1C5YbqB1
2880: 42 48 54 38 36 33 38 56 39 4f 58 6e 6e 37 61 65  BHT8638V9OXnn7ae
2890: 77 66 44 6d 46 62 66 73 68 44 44 78 5a 6c 52 32  wfDmFbfshDDxZlR2
28a0: 4d 71 2f 32 45 37 67 66 54 0a 20 20 20 20 46 64  Mq/2E7gfT.    Fd
28b0: 47 47 55 73 39 4f 54 6c 77 79 77 75 73 6e 58 63  GGUs9OTlwywusnXc
28c0: 77 44 57 62 55 51 6f 47 49 7a 51 4e 52 53 78 52  wDWbUQoGIzQNRSxR
28d0: 44 4a 79 6f 43 48 4f 6f 43 66 79 31 51 6f 36 44  DJyoCHOoCfy1Qo6D
28e0: 6d 65 33 30 45 6b 75 69 51 53 49 7a 41 52 0a 20  me30EkuiQSIzAR. 
28f0: 20 20 20 58 4b 6c 77 70 35 67 67 6a 39 53 4b 30     XKlwp5ggj9SK0
2900: 66 49 2f 31 64 76 2b 50 31 2b 57 7a 2b 50 4c 72  fI/1dv+P1+Wz+PLr
2910: 2f 73 37 62 54 33 53 79 51 33 59 45 7a 34 64 6f  /s7bT3SyQ3YEz4do
2920: 38 63 74 2b 65 4b 35 70 79 58 57 6e 62 79 63 4d  8ct+eK5pyXWnbycM
2930: 38 76 4a 0a 20 20 20 20 70 50 70 37 58 79 4e 44  8vJ.    pPp7XyND
2940: 74 77 45 62 2b 70 39 71 31 57 31 75 6d 4d 70 6e  twEb+p9q1W1umMpn
2950: 37 4e 52 75 39 73 77 74 6f 75 4b 33 2b 7a 4f 34  7NRu9swtouK3+zO4
2960: 34 4f 66 49 44 35 6e 36 31 6e 4f 54 4b 66 61 58  4OfID5n61nOTKfaX
2970: 69 78 74 33 59 75 70 61 0a 20 20 20 20 69 79 62  ixt3Yupa.    iyb
2980: 6a 62 68 37 77 6e 4a 78 7a 4f 54 6b 6b 31 68 61  jbh7wnJxzOTkk1ha
2990: 32 59 34 72 65 70 6c 5a 2b 41 41 6e 63 63 36 68  2Y4replZ+AAncc6h
29a0: 70 6d 48 73 33 46 4e 4a 42 4d 38 4d 45 70 68 4f  pmHs3FNJBM8MEphO
29b0: 59 79 77 77 56 7a 36 56 6e 4d 72 50 74 0a 20 20  YywwVz6VnMrPt.  
29c0: 20 20 72 79 77 6c 37 69 79 2b 6b 46 4a 70 4c 6d    rywl7iy+kFJpLm
29d0: 50 77 75 33 6d 32 32 50 76 57 46 74 4e 54 37 56  Pwu3m22PvWFtNT7V
29e0: 44 59 57 44 61 6e 48 64 7a 35 37 38 6e 67 54 66  DYWDanHdz578ngTf
29f0: 59 6b 43 74 6b 79 39 61 59 34 38 63 75 57 33 6f  YkCtky9aY48cuW3o
2a00: 6e 5a 0a 20 20 20 20 47 7a 2f 68 39 49 6c 6c 5a  nZ.    Gz/h9IllZ
2a10: 51 47 75 4a 53 34 48 73 4e 68 2b 68 72 72 34 4a  QGuJS4HsNh+hrr4J
2a20: 2b 75 2f 2b 76 4f 2b 64 6e 4c 79 2b 4d 2b 6f 33  +u/+vO+dnLy+M+o3
2a30: 56 36 69 74 37 6b 50 79 4e 45 50 30 6f 42 6f 47  V6it7kPyNEP0oBoG
2a40: 6f 70 4c 73 4b 69 48 0a 20 20 20 20 58 6e 51 50  opLsKiH.    XnQP
2a50: 49 66 44 56 44 78 30 45 57 6f 57 73 64 37 59 79  IfDVDx0EWoWsd7Yy
2a60: 32 30 76 6b 6b 58 68 50 74 37 31 6a 6c 6a 4d 70  20vkkXhPt71jljMp
2a70: 71 73 75 50 4f 34 5a 7a 4b 66 54 79 61 54 53 7a  qsuPO4ZzKfTyaTSz
2a80: 59 36 70 65 53 7a 4c 2f 41 46 51 41 0a 20 20 20  Y6peSzL/AFQA.   
2a90: 20 71 6e 30 33 33 48 34 37 47 76 4f 75 4e 78 79   qn033H47GvOuNxy
2aa0: 31 58 76 5a 63 6b 7a 34 35 63 56 32 78 5a 55 59  1XvZckz45cV2xZUY
2ab0: 44 6f 61 78 2b 31 78 75 31 76 55 64 51 74 72 43  Doax+1xu1vUdQtrC
2ac0: 33 4d 6a 75 42 67 56 64 4e 6b 2f 72 49 6b 75 31  3MjuBgVdNk/rIku1
2ad0: 6d 0a 20 20 20 20 52 5a 6e 5a 55 42 32 77 54 76  m.    RZnZUB2wTv
2ae0: 54 53 57 72 63 37 77 64 79 47 53 35 6a 4c 44 62  TSWrc7wdyGS5jLDb
2af0: 42 32 71 2b 4b 58 4a 48 62 36 74 46 61 33 61 32  B2q+KXJHb6tFa3a2
2b00: 30 35 34 51 34 79 70 36 48 35 56 4c 4b 76 62 59  054Q4yp6H5VLKvbY
2b10: 6d 6e 6a 61 49 46 0a 20 20 20 20 47 42 7a 55 59  mnjaIF.    GBzUY
2b20: 57 4d 6d 4c 54 44 71 46 35 46 43 68 41 6b 45 79  WMmLTDqF5FChAkEy
2b30: 73 70 78 37 66 38 41 33 30 72 4c 48 48 79 31 47  spx7f8A30rLHHy1G
2b40: 48 35 66 78 7a 4c 4b 76 55 62 4e 46 68 68 53 46  H5fxzLKvUbNFhhSF
2b50: 4e 6b 52 51 6f 2f 43 76 53 6b 31 0a 20 20 20 20  NkRQo/CvSk1.    
2b60: 4e 50 43 79 74 79 76 6c 52 4d 4d 4e 51 50 56 51  NPCytyvlRMMNQPVQ
2b70: 68 51 4d 61 4b 47 67 59 65 57 6f 67 6c 35 31 51  hQMaKGgYeWogl51Q
2b80: 70 4f 57 4b 41 6f 2b 64 41 63 6e 6b 6f 4f 4a 37  pOWKAo+dAcnkoOJ7
2b90: 54 57 45 73 30 79 54 51 77 79 53 63 51 34 47 45  TWEs0yTQwyScQ4GE
2ba0: 0a 20 20 20 20 61 35 4f 65 6c 63 76 50 68 62 5a  .    a5OelcvPhbZ
2bb0: 59 37 2f 69 63 75 4d 78 75 4f 56 63 68 33 7a 4a  Y7/icuMxuOVch3zJ
2bc0: 49 71 44 5a 73 6b 56 79 58 74 33 63 64 5a 66 45  IqDZskVyXt3cdZfE
2bd0: 4c 2b 37 37 2b 34 6b 34 67 6a 48 75 6f 63 65 68  L+77+4k4gjHuoceh
2be0: 78 78 48 39 71 0a 20 20 20 20 32 59 73 37 6e 37  xxH9q.    2Ys7n7
2bf0: 30 73 58 57 6b 57 2b 6f 4c 48 4c 4a 41 4a 58 51  0sXWkW+oLHLJAJXQ
2c00: 35 51 73 4d 34 50 79 72 4c 70 4e 37 56 34 39 41  5QsM4PyrLpN7V49A
2c10: 37 77 4f 6c 35 43 5a 49 79 63 34 59 5a 46 58 63  7wOl5CZIyc4YZFXc
2c20: 59 36 73 37 54 61 6a 62 32 7a 0a 20 20 20 20 57  Y6s7Tajb2z.    W
2c30: 4a 6a 6e 62 67 6a 6a 33 56 78 73 55 49 35 45 47  Jjnbgjj3VxsUI5EG
2c40: 73 56 75 66 6f 2b 6a 33 73 7a 51 50 48 4d 2f 65  sVufo+j3szQPHM/e
2c50: 39 30 33 43 4a 4d 62 4f 4d 5a 42 2b 68 72 58 6c  903CJMbOMZB+hrXl
2c60: 50 66 70 6c 35 62 6a 75 75 79 6c 69 39 78 64 0a  Pfpl5bjuuyli9xd.
2c70: 20 20 20 20 6d 39 59 44 75 6f 79 52 6e 50 4e 73      m9YDuoyRnPNs
2c80: 62 44 38 38 31 30 63 47 46 74 38 76 2b 4f 44 35  bD8810cGFt8v+OD5
2c90: 50 4c 4a 6a 63 50 75 75 79 54 77 79 56 32 50 4f  PLJjcPuuyTwyV2PO
2ca0: 53 53 44 59 47 68 41 67 30 44 30 44 47 69 6d 6f  SSDYGhAg0D0DGimo
2cb0: 42 48 49 55 0a 20 20 20 20 51 53 30 44 4f 66 47  BHIU.    QS0DOfG
2cc0: 4b 41 34 75 56 41 55 6e 6b 6f 52 6e 45 34 59 2f  KA4uVAUnkoRnE4Y/
2cd0: 4f 6f 72 7a 44 56 34 6d 73 39 55 6e 55 44 65 4b  OorzDV4ms9UnUDeK
2ce0: 55 6b 66 49 37 6a 38 71 38 37 6b 6d 73 72 48 73  UkfI7j8q87kmsrHs
2cf0: 63 4f 65 38 4a 57 4e 63 61 0a 20 20 20 20 50 5a  cOe8JWNca.    PZ
2d00: 36 72 48 4b 6b 71 6c 48 62 78 49 36 4d 56 5a 54  6rHKkqlHbxI6MVZT
2d10: 36 67 69 70 6a 6c 63 57 33 57 4f 63 31 56 69 30  6gipjlcW3WOc1Vi0
2d20: 73 6d 69 50 42 2f 44 75 77 35 4d 79 33 54 4a 77  smiPB/Duw5My3TJw
2d30: 38 73 45 44 72 79 4f 33 76 57 7a 65 30 2f 0a 20  8sEDryO3vWze0/. 
2d40: 20 20 20 46 6e 2f 35 71 30 31 73 63 50 67 33 4a     Fn/5q01scPg3J
2d50: 48 51 53 33 4f 4d 6a 48 50 77 2b 2f 53 70 47 58  HQS3OMjHPw+/SpGX
2d60: 34 2b 53 7a 39 73 6d 65 2b 67 78 53 33 49 75 72  4+Sz9sme+gxS3Iur
2d70: 6f 38 59 69 55 39 32 68 4a 49 58 50 33 73 45 37  o8YiU92hJIXP3sE7
2d80: 6d 6d 57 0a 20 20 20 20 65 70 71 4a 6a 78 79 58  mmW.    epqJjxyX
2d90: 66 61 61 42 56 69 68 57 4a 41 41 57 59 73 33 37  faaBVihWJAAWYs37
2da0: 44 39 4b 31 73 63 73 6e 71 6e 5a 4f 33 4e 76 6f  D9K1scsnqnZO3Nvo
2db0: 4d 54 4d 4d 47 5a 6a 4a 2b 48 49 66 70 58 64 77  MTMMGZjJ+HIfpXdw
2dc0: 7a 57 44 79 76 6b 5a 65 0a 20 20 20 20 58 4a 57  zWDyvkZe.    XJW
2dd0: 77 34 77 63 31 75 61 45 6f 50 45 6c 42 47 4e 6a  w4wc1uaEoPElBGNj
2de0: 52 54 30 43 4e 45 4e 76 51 41 4f 59 6f 44 58 72  RT0CNENvQAOYoDXr
2df0: 55 41 73 66 48 56 45 69 63 7a 38 36 41 70 50 4c  UAsfHVEicz86ApPL
2e00: 51 5a 6b 6a 42 41 37 48 6b 42 6d 6f 50 0a 20 20  QZkjBA7HkBmoP.  
2e10: 20 20 49 70 64 56 75 64 59 6e 31 43 38 75 4d 5a    IpdVudYn1C8uMZ
2e20: 53 37 6b 68 56 51 4d 63 4b 4a 67 43 75 50 6d 39  S7khVQMcKJgCuPm9
2e30: 35 76 53 2b 50 6a 72 69 38 6a 57 2b 53 79 38 4a  5vS+Pjri8jW+Sy8J
2e40: 77 65 6d 39 61 48 54 6a 66 61 2b 6c 75 5a 52 67  wem9aHTjfa+luZRg
2e50: 4f 52 0a 20 20 20 20 36 6a 30 71 79 31 75 6b 67  OR.    6j0qy1ukg
2e60: 30 30 39 6b 50 45 47 4f 31 58 79 5a 57 51 45 75  009kPEGO1XyZWQEu
2e70: 46 4a 55 63 67 65 76 57 73 65 2b 32 46 31 45 2b  FJUcgevWse+2F1E+
2e80: 68 36 64 48 71 75 72 78 51 53 79 63 45 62 45 6c  h6dHqurxQSycEbEl
2e90: 6a 31 59 44 66 68 48 0a 20 20 20 20 75 61 32 38  j1YDfhH.    ua28
2ea0: 57 48 6c 6c 71 75 50 6d 35 4c 6a 68 75 50 57 45  WHllquPm5LjhuPWE
2eb0: 52 59 34 31 52 46 43 71 6f 41 41 48 49 43 75 35  RY41RFCqoAAHICu5
2ec0: 35 5a 4d 4d 72 56 43 69 4f 32 4b 42 4d 4e 36 4b  5ZMMrVCiO2KBMN6K
2ed0: 59 55 44 30 51 32 4b 43 4e 54 34 6a 0a 20 20 20  YUD0Q2KCNT4j.   
2ee0: 20 51 47 4f 56 41 48 33 36 43 5a 4f 66 7a 46 41   QGOVAH36CZOfzFA
2ef0: 70 33 57 4f 50 69 64 67 71 2b 72 48 46 42 67 58  p3WOPidgq+rHFBgX
2f00: 56 33 48 4b 68 57 47 51 4e 6b 34 4a 46 52 6a 6c  V3HKhWGQNk4JFRjl
2f10: 6c 36 65 63 33 56 6d 6d 6e 61 6c 65 77 6a 5a 5a  l6ec3VmmnalewjZZ
2f20: 70 0a 20 20 20 20 6a 63 4b 50 39 66 50 38 77 61  p.    jcKP9fP8wa
2f30: 34 75 61 57 5a 76 57 2b 4a 6c 4d 75 48 54 4b 6c  4uaWZvW+JlMuHTKl
2f40: 64 72 61 59 53 52 48 77 38 2b 47 73 65 32 64 78  draYSRHw8+Gse2dx
2f50: 75 4e 39 4a 6f 39 65 69 69 62 42 62 68 39 51 61  uN9Jo9eiibBbh9Qa
2f60: 6e 68 57 65 50 4e 0a 20 20 20 20 50 73 58 38 77  nhWePN.    PsX8w
2f70: 78 42 7a 77 79 38 2f 65 6e 6a 56 76 4e 42 43 38  xBzwy8/enjVvNBC8
2f80: 61 36 4f 45 42 41 50 55 2b 6c 4e 61 59 58 4b 35  a6OEBAPU+lNaYXK5
2f90: 39 4e 44 54 62 67 32 2f 61 54 52 6f 49 76 4d 38  9NDTbg2/aTRoIvM8
2fa0: 72 73 51 50 52 55 4f 66 31 72 62 0a 20 20 20 20  rsQPRUOf1rb.    
2fb0: 77 2f 37 62 61 50 6c 7a 58 48 49 39 67 42 7a 2b  w/7baPlzXHI9gBz+
2fc0: 4f 39 64 62 7a 6a 64 44 56 41 72 34 58 6f 4a 47  O9dbzjdDVAr4XoJG
2fd0: 33 6f 49 38 37 30 55 34 4e 41 39 42 43 76 57 69  3oI870U4NA9BCvWi
2fe0: 47 65 65 4f 4a 66 47 34 42 39 4f 76 30 6f 6c 73  GeeOJfG4B9Ov0ols
2ff0: 0a 20 20 20 20 69 70 4a 66 34 2b 7a 69 4a 39 32  .    ipJf4+ziJ92
3000: 4f 4b 6a 47 35 4b 63 6d 6f 58 72 73 56 45 71 78  OKjG5KcmoXrsVEqx
3010: 6a 2f 67 58 39 7a 52 6a 63 71 78 70 47 6c 76 72  j/gX9zRjcqxpGlvr
3020: 38 78 79 53 4f 77 55 5a 4c 4d 63 6d 6f 78 74 57  8xySOwUZLMcmoxtW
3030: 6f 56 56 45 34 0a 20 20 20 20 41 4d 59 4a 41 6f  oVVE4.    AMYJAo
3040: 52 68 64 72 4c 43 57 58 54 68 66 57 36 46 72 69  RhdrLCWXThfW6Fri
3050: 31 79 2f 41 50 39 34 6e 33 6c 2f 63 65 34 72 58  1y/AP94n3l/ce4rX
3060: 79 59 2b 55 64 58 78 65 61 38 65 66 38 41 4b 35  yY+UdXxea8ef8AK5
3070: 65 31 4d 46 37 45 6b 36 4e 78 0a 20 20 20 20 78  e1MF7Ek6Nx.    x
3080: 76 75 4e 75 6c 63 64 39 50 59 33 4c 44 7a 39 6e  vuNulcd9PY3LDz9n
3090: 34 4c 74 77 65 49 4b 63 62 34 36 31 66 4b 78 6a  4LtweIKcb461fKxj
30a0: 65 50 47 7a 61 76 46 32 59 53 43 62 76 47 6b 4a  ePGzavF2YSCbvGkJ
30b0: 55 65 74 57 35 56 6a 4f 4f 64 74 58 2b 48 68 0a  UetW5VjOOdtX+Hh.
30c0: 20 20 20 20 69 58 43 44 46 59 74 32 4d 30 74 64      iXCDFYt2M0td
30d0: 6b 72 55 33 2b 74 33 47 72 4d 4d 77 32 79 6d 33  krU3+t3GrMMw2ym3
30e0: 67 50 71 78 38 37 66 6b 42 2b 42 72 70 34 63 64  gPqx87fkB+Brp4cd
30f0: 54 62 7a 50 6e 63 75 37 34 78 36 45 6d 72 74 41  TbzPncu74x6EmrtA
3100: 36 70 4c 48 0a 20 20 20 20 78 49 42 35 6c 35 69  6pLH.    xIB5l5i
3110: 75 68 77 2b 65 6d 68 42 66 57 39 78 39 6e 49 4d  uhw+emhBfW9x9nIM
3120: 6e 37 70 32 4e 47 63 79 6c 53 74 73 63 31 56 53  n7p2NGcylStsc1VS
3130: 6a 63 55 45 5a 46 46 4b 67 56 42 52 5a 6e 63 65  jcUEZFFKgVBRZnce
3140: 62 41 39 46 32 71 4e 56 79 0a 20 20 20 20 52 39  bA9F2qNVy.    R9
3150: 32 46 42 49 41 42 6f 78 32 41 70 76 6d 69 62 56  2FBIABox2ApvmibV
3160: 35 59 73 37 6a 6d 4b 47 32 51 78 61 32 31 49 79  5Ys7jmKG2Qxa21Iy
3170: 4d 4d 4b 77 77 61 49 73 67 45 6b 75 76 4c 49 4e  MMKwwaIsgEkuvLIN
3180: 51 65 57 39 6f 76 69 68 66 74 72 6c 7a 70 0a 20  QeW9ovihftrlzp. 
3190: 20 20 20 65 6d 57 38 4d 45 45 45 68 69 4d 6b 36     emW8MEEEhiMk6
31a0: 63 54 53 45 48 42 32 35 41 66 6e 56 30 75 36 6c  cTSEHB25AfnV0u6l
31b0: 6d 74 32 30 66 55 46 6b 52 65 48 54 72 34 43 57  mt20fUFkReHTr4CW
31c0: 4d 41 35 43 4d 52 6c 6c 7a 37 45 2f 51 69 75 54  MA5CMRllz7E/QiuT
31d0: 6b 78 31 0a 20 20 20 20 58 71 2f 47 35 66 4c 48  kx1.    Xq/G5fLH
31e0: 54 56 4b 53 4b 71 76 47 34 49 36 56 72 64 63 75  TVKSKqvG4I6Vrdcu
31f0: 6a 6b 7a 7a 63 2f 43 50 61 69 73 2b 2f 6c 6d 75  jkzzc/CPais+/lmu
3200: 4c 71 33 30 6d 31 62 2f 41 44 4e 32 34 6a 44 4c  Lq30m1b/ADN24jDL
3210: 7a 56 65 70 2b 6d 61 75 0a 20 20 20 20 47 4f 36  zVep+mau.    GO6
3220: 31 38 76 4a 34 59 75 76 37 4d 36 35 32 61 75 42  18vJ4Yuv7M652auB
3230: 4e 6f 6d 6a 33 71 4e 63 32 4a 4b 76 46 6a 47 51  Nomj3qNc2JKvFjGQ
3240: 44 67 6c 54 39 34 5a 36 69 75 32 59 36 6a 78 63  DglT94Z6iu2Y6jxc
3250: 38 76 4b 37 72 6f 4e 6d 55 62 37 35 7a 0a 20 20  8vK7roNmUb75z.  
3260: 20 20 56 59 51 4c 78 4b 34 39 44 36 69 67 6b 68    VYQLxK49D6igkh
3270: 75 37 75 32 77 76 48 33 71 44 6f 39 47 55 79 73  u7u2wvH3qDo9GUys
3280: 61 6c 70 71 73 4d 32 45 63 47 4a 2f 52 75 52 2f  alpqsM2EcGJ/RuR/
3290: 47 71 7a 6d 55 71 38 61 4d 77 35 6f 68 39 71 43  GqzmUq8aMw5oh9qC
32a0: 69 70 0a 20 20 20 20 42 41 78 6a 63 62 56 48 4f  ip.    BAxjcbVHO
32b0: 54 44 62 47 4b 67 6a 59 62 55 45 4c 62 5a 32 33  TDbGKgjYbUELbZ23
32c0: 71 6f 71 58 56 75 73 36 59 49 33 6f 4b 4d 52 6b  qoqXVus6YI3oKMRk
32d0: 74 6d 4d 63 67 4a 54 6f 61 44 7a 44 34 68 39 6c  tmMcgJToaDzD4h9l
32e0: 47 57 2f 58 57 72 46 0a 20 20 20 20 63 72 4d 63  GW/XWrF.    crMc
32f0: 53 41 44 37 2f 77 44 37 48 36 56 46 62 76 5a 32  SAD7/wD7H6VFbvZ2
3300: 33 2f 78 50 73 73 73 46 79 43 30 52 41 47 2f 4e  3/xPsssFyC0RAG/N
3310: 43 4f 52 48 75 4b 6c 78 6c 6d 6d 58 48 79 58 44  CORHuKlxlmmXHyXD
3320: 4b 57 4a 34 74 4f 31 44 54 31 34 5a 0a 20 20 20  KWJ4tO1DT14Z.   
3330: 20 49 78 50 41 42 74 4a 46 34 74 76 6c 7a 46 63   IxPABtJF4tvlzFc
3340: 75 58 48 59 39 6a 6a 35 38 4d 2b 71 66 6a 6c 75  uXHY9jj58M+qfjlu
3350: 51 55 74 34 6a 74 35 6d 35 42 66 6e 57 4f 4f 4e  QUt4jt5m5BfnWOON
3360: 79 75 6f 32 35 38 75 50 48 4e 35 56 7a 76 61 5a  yuo258uPHN5VzvaZ
3370: 35 0a 20 20 20 20 4e 46 30 2b 5a 39 4e 44 6d 2f  5.    NF0+Z9NDm/
3380: 6d 6a 4b 50 65 75 4d 47 4e 44 7a 57 4d 66 64 7a  mjKPeuMGNDzWMfdz
3390: 31 62 6e 38 71 36 2b 50 43 59 76 49 35 76 6b 35  1bn8q6+PCYvI5vk5
33a0: 63 74 2f 6a 48 2b 46 76 5a 6d 37 54 58 59 4e 59  ct/jH+FvZm7TXYNY
33b0: 6b 52 6b 68 68 44 0a 20 20 20 20 48 69 35 63 52  kRkhhD.    Hi5cR
33c0: 49 49 43 2f 6e 6b 31 6e 74 7a 37 65 33 78 35 62  IIC/nk1ntz7e3x5b
33d0: 78 48 6d 61 67 4d 6e 68 32 71 71 45 38 39 7a 73  xHmagMnh2qqE89zs
33e0: 65 6c 44 59 6c 47 64 69 4e 76 53 69 62 58 4c 61  elDYlGdiNvSibXLa
33f0: 36 6c 74 38 44 4a 65 50 2b 30 38 0a 20 20 20 20  6lt8DJeP+08.    
3400: 78 38 71 72 50 48 4c 54 54 52 31 6b 55 4f 70 42  x8qrPHLTTR1kUOpB
3410: 42 6f 32 79 37 46 6d 71 4d 65 33 6b 42 6d 6e 6a  Bo2y7FmqMe3kBmnj
3420: 55 37 41 38 51 39 76 57 73 58 4f 76 4b 65 49 5a  U7A8Q9vWsXOvKeIZ
3430: 6f 47 78 6b 31 41 4c 78 35 36 56 52 57 6c 6a 49  oGxk1ALx56VRWljI
3440: 0a 20 20 20 20 33 41 6f 69 48 4d 5a 38 4d 71 6a  .    3AoiHMZ8Mqj
3450: 42 36 30 47 5a 72 57 6c 7a 54 36 63 30 4e 76 43  B60GZrWlzT6c0NvC
3460: 62 68 47 64 48 56 56 48 55 4d 4d 6a 36 5a 71 61  bhGdHVVHUMMj6Zqa
3470: 39 72 39 61 52 72 70 55 56 75 5a 44 61 4b 59 77  9r9aRrpUVuZDaKYw
3480: 54 6c 34 52 73 0a 20 20 20 20 56 50 71 50 55 56  Tl4Rs.    VPqPUV
3490: 57 4b 4b 4a 35 41 47 6a 49 56 30 7a 7a 4a 33 48  WKKJ5AGjIV0zzJ3H
34a0: 75 4b 4d 38 63 39 4a 54 41 57 59 4d 36 6c 73 64  uKM8c9JTAWYM6lsd
34b0: 44 55 53 35 57 39 73 44 57 64 4b 62 55 72 2b 78  DUS5W9sDWdKbUr+x
34c0: 74 5a 49 73 57 30 38 70 57 51 0a 20 20 20 20 6a  tZIsW08pWQ.    j
34d0: 2b 30 41 6e 48 34 34 6f 6b 64 4e 48 61 4c 45 69  +0AnH44okdNHaLEi
34e0: 78 57 38 51 6a 68 6a 47 45 56 52 67 41 55 68 65  xW8QjhjGEVRgAUhe
34f0: 30 36 77 79 62 5a 71 67 6d 42 55 38 38 31 41 36  06wybZqgmBU881A6
3500: 70 74 6b 37 31 52 4b 67 6f 4a 51 75 31 46 50 0a  ptk71RKgoJQu1FP.
3510: 20 20 20 20 48 4b 39 73 33 45 70 79 70 38 79 31      HK9s3Epyp8y1
3520: 57 63 75 6d 71 47 34 67 43 70 32 50 4b 6a 61 35  WcumqG4gCp2PKja5
3530: 33 53 6a 2f 41 4a 74 2f 39 4a 71 4f 5a 73 52 55  3Sj/AJt/9JqOZsRU
3540: 55 5a 35 55 44 30 45 5a 71 43 70 4f 42 6a 6c 56  UZ5UD0EZqCpOBjlV
3550: 52 46 59 73 0a 20 20 20 20 32 4f 5a 2b 74 41 72  RFYs.    2OZ+tAr
3560: 37 7a 78 4e 31 7a 7a 6f 4d 6d 31 48 39 65 34 2f  7zxN1zzoMm1H9e4/
3570: 35 33 37 55 47 6b 67 47 44 74 30 6f 49 37 39 56  537UGkgGDt0oI79V
3580: 78 61 65 45 62 54 4c 30 39 6a 55 47 6b 67 48 64  xaeEbTL09jUGkgHd
3590: 4c 73 4f 51 71 71 69 6c 35 0a 20 20 20 20 55 46  LsOQqqil5.    UF
35a0: 52 66 4f 61 69 4a 31 71 67 78 7a 71 71 63 30 42  RfOaiJ1qgxzqqc0B
35b0: 53 2b 56 71 69 72 6c 6c 2f 73 77 2b 5a 71 74 6d  S+Vqirll/sw+Zqtm
35c0: 50 54 2f 39 6b 3d 0a 20 20 7d 5d 0a 7d 0a 77 61  PT/9k=.  }].}.wa
35d0: 70 70 2d 73 74 61 72 74 20 24 3a 3a 61 72 67 76  pp-start $::argv
35e0: 0a                                               .